Skip to content

Commit e83c9c9

Browse files
committed
Add SnippetsPolicy generator and validation logic
1 parent 5a3ebd5 commit e83c9c9

File tree

14 files changed

+536
-47
lines changed

14 files changed

+536
-47
lines changed

internal/controller/nginx/config/base_http_config.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net"
66
gotemplate "text/template"
77

8+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies"
89
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/shared"
910
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
1011
"github.com/nginx/nginx-gateway-fabric/v2/internal/framework/helpers"
@@ -28,9 +29,18 @@ type httpConfig struct {
2829
HTTP2 bool
2930
}
3031

31-
func executeBaseHTTPConfig(conf dataplane.Configuration) []executeResult {
32+
func newExecuteBaseHTTPConfigFunc(generator policies.Generator) executeFunc {
33+
return func(conf dataplane.Configuration) []executeResult {
34+
return executeBaseHTTPConfig(conf, generator)
35+
}
36+
}
37+
38+
func executeBaseHTTPConfig(conf dataplane.Configuration, generator policies.Generator) []executeResult {
3239
includes := createIncludesFromSnippets(conf.BaseHTTPConfig.Snippets)
3340

41+
policyIncludes := createIncludesFromPolicyGenerateResult(generator.GenerateForHTTP(conf.Policies))
42+
includes = append(includes, policyIncludes...)
43+
3444
hc := httpConfig{
3545
HTTP2: conf.BaseHTTPConfig.HTTP2,
3646
Includes: includes,

internal/controller/nginx/config/base_http_config_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
. "github.com/onsi/gomega"
1010

11+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/policiesfakes"
1112
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
1213
)
1314

@@ -69,7 +70,7 @@ func TestLoggingSettingsTemplate(t *testing.T) {
6970
Logging: dataplane.Logging{AccessLog: tt.accessLog},
7071
}
7172

72-
res := executeBaseHTTPConfig(conf)
73+
res := executeBaseHTTPConfig(conf, &policiesfakes.FakeGenerator{})
7374
g.Expect(res).To(HaveLen(1))
7475
httpConfig := string(res[0].data)
7576
for _, expectedOutput := range tt.expectedOutputs {
@@ -120,7 +121,7 @@ func TestExecuteBaseHttp_HTTP2(t *testing.T) {
120121
t.Parallel()
121122
g := NewWithT(t)
122123

123-
res := executeBaseHTTPConfig(test.conf)
124+
res := executeBaseHTTPConfig(test.conf, &policiesfakes.FakeGenerator{})
124125
g.Expect(res).To(HaveLen(1))
125126
g.Expect(test.expCount).To(Equal(strings.Count(string(res[0].data), expSubStr)))
126127
g.Expect(strings.Count(string(res[0].data), "map $http_host $gw_api_compliant_host {")).To(Equal(1))
@@ -150,7 +151,7 @@ func TestExecuteBaseHttp_Snippets(t *testing.T) {
150151

151152
g := NewWithT(t)
152153

153-
res := executeBaseHTTPConfig(conf)
154+
res := executeBaseHTTPConfig(conf, &policiesfakes.FakeGenerator{})
154155
g.Expect(res).To(HaveLen(3))
155156

156157
sort.Slice(
@@ -261,7 +262,7 @@ func TestExecuteBaseHttp_NginxReadinessProbePort(t *testing.T) {
261262
t.Parallel()
262263
g := NewWithT(t)
263264

264-
res := executeBaseHTTPConfig(test.conf)
265+
res := executeBaseHTTPConfig(test.conf, &policiesfakes.FakeGenerator{})
265266
g.Expect(res).To(HaveLen(1))
266267

267268
httpConfig := string(res[0].data)
@@ -377,7 +378,7 @@ func TestExecuteBaseHttp_DNSResolver(t *testing.T) {
377378
t.Parallel()
378379
g := NewWithT(t)
379380

380-
res := executeBaseHTTPConfig(test.conf)
381+
res := executeBaseHTTPConfig(test.conf, &policiesfakes.FakeGenerator{})
381382
g.Expect(res).To(HaveLen(1))
382383

383384
httpConfig := string(res[0].data)
@@ -435,7 +436,7 @@ func TestExecuteBaseHttp_GatewaySecretID(t *testing.T) {
435436
t.Parallel()
436437
g := NewWithT(t)
437438

438-
res := executeBaseHTTPConfig(test.conf)
439+
res := executeBaseHTTPConfig(test.conf, &policiesfakes.FakeGenerator{})
439440
g.Expect(res).To(HaveLen(1))
440441

441442
httpConfig := string(res[0].data)

internal/controller/nginx/config/generator.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies"
1616
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/clientsettings"
1717
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/observability"
18+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/snippetspolicy"
1819
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/upstreamsettings"
1920
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
2021
"github.com/nginx/nginx-gateway-fabric/v2/internal/framework/file"
@@ -125,6 +126,7 @@ func (g GeneratorImpl) Generate(conf dataplane.Configuration) []agent.File {
125126
policyGenerator := policies.NewCompositeGenerator(
126127
clientsettings.NewGenerator(),
127128
observability.NewGenerator(conf.Telemetry),
129+
&snippetspolicy.Generator{},
128130
)
129131

130132
files = append(files, g.executeConfigTemplates(conf, policyGenerator)...)
@@ -201,11 +203,11 @@ func (g GeneratorImpl) getExecuteFuncs(
201203
keepAliveCheck keepAliveChecker,
202204
) []executeFunc {
203205
return []executeFunc{
204-
executeMainConfig,
206+
newExecuteMainConfigFunc(generator),
205207
executeEventsConfig,
206-
executeBaseHTTPConfig,
207-
g.newExecuteServersFunc(generator, keepAliveCheck),
208+
newExecuteBaseHTTPConfigFunc(generator),
208209
newExecuteUpstreamsFunc(upstreams),
210+
newExecuteServersFunc(g.plus, generator, g.logger, keepAliveCheck),
209211
executeSplitClients,
210212
executeMaps,
211213
executeTelemetry,

internal/controller/nginx/config/main_config.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
filesHelper "github.com/nginx/agent/v3/pkg/files"
88

99
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/agent"
10+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies"
1011
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/shared"
1112
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
1213
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/graph"
@@ -25,9 +26,18 @@ type mainConfig struct {
2526
Conf dataplane.Configuration
2627
}
2728

28-
func executeMainConfig(conf dataplane.Configuration) []executeResult {
29+
func newExecuteMainConfigFunc(generator policies.Generator) executeFunc {
30+
return func(conf dataplane.Configuration) []executeResult {
31+
return executeMainConfig(conf, generator)
32+
}
33+
}
34+
35+
func executeMainConfig(conf dataplane.Configuration, generator policies.Generator) []executeResult {
2936
includes := createIncludesFromSnippets(conf.MainSnippets)
3037

38+
policyIncludes := createIncludesFromPolicyGenerateResult(generator.GenerateForMain(conf.Policies))
39+
includes = append(includes, policyIncludes...)
40+
3141
mc := mainConfig{
3242
Conf: conf,
3343
Includes: includes,

internal/controller/nginx/config/main_config_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
. "github.com/onsi/gomega"
88

9+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/policiesfakes"
910
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
1011
)
1112

@@ -44,7 +45,7 @@ func TestExecuteMainConfig_Telemetry(t *testing.T) {
4445
t.Parallel()
4546
g := NewWithT(t)
4647

47-
res := executeMainConfig(test.conf)
48+
res := executeMainConfig(test.conf, &policiesfakes.FakeGenerator{})
4849
g.Expect(res).To(HaveLen(1))
4950
g.Expect(res[0].dest).To(Equal(mainIncludesConfigFile))
5051
if test.expLoadModuleDirective {
@@ -67,7 +68,7 @@ func TestExecuteMainConfig_Logging(t *testing.T) {
6768

6869
g := NewWithT(t)
6970

70-
res := executeMainConfig(conf)
71+
res := executeMainConfig(conf, &policiesfakes.FakeGenerator{})
7172
g.Expect(res).To(HaveLen(1))
7273
g.Expect(res[0].dest).To(Equal(mainIncludesConfigFile))
7374

@@ -96,7 +97,7 @@ func TestExecuteMainConfig_Snippets(t *testing.T) {
9697

9798
g := NewWithT(t)
9899

99-
res := executeMainConfig(conf)
100+
res := executeMainConfig(conf, &policiesfakes.FakeGenerator{})
100101
g.Expect(res).To(HaveLen(4))
101102

102103
// sort results by filename
@@ -170,7 +171,7 @@ func TestExecuteMainConfig_WorkerConnections(t *testing.T) {
170171
t.Parallel()
171172
g := NewWithT(t)
172173

173-
res := executeMainConfig(test.conf)
174+
res := executeMainConfig(test.conf, &policiesfakes.FakeGenerator{})
174175
g.Expect(res).To(HaveLen(1))
175176
g.Expect(res[0].dest).To(Equal(mainIncludesConfigFile))
176177
g.Expect(string(res[0].data)).To(ContainSubstring("error_log stderr"))

internal/controller/nginx/config/policies/clientsettings/generator.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ keepalive_timeout {{ .KeepAlive.Timeout.Server }};
3939
`
4040

4141
// Generator generates nginx configuration based on a clientsettings policy.
42-
type Generator struct{}
42+
type Generator struct {
43+
policies.UnimplementedGenerator
44+
}
4345

4446
// NewGenerator returns a new instance of Generator.
4547
func NewGenerator() *Generator {

internal/controller/nginx/config/policies/generator.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import (
88
//
99
//counterfeiter:generate . Generator
1010
type Generator interface {
11+
// GenerateForMain generates policy configuration for the main block.
12+
GenerateForMain(policies []Policy) GenerateResultFiles
13+
// GenerateForHTTP generates policy configuration for the http block.
14+
GenerateForHTTP(policies []Policy) GenerateResultFiles
1115
// GenerateForServer generates policy configuration for the server block.
1216
GenerateForServer(policies []Policy, server http.Server) GenerateResultFiles
1317
// GenerateForLocation generates policy configuration for a normal location block.
@@ -35,6 +39,28 @@ func NewCompositeGenerator(generators ...Generator) *CompositeGenerator {
3539
return &CompositeGenerator{generators: generators}
3640
}
3741

42+
// GenerateForMain calls all policy generators for the main block.
43+
func (g *CompositeGenerator) GenerateForMain(policies []Policy) GenerateResultFiles {
44+
var compositeResult GenerateResultFiles
45+
46+
for _, generator := range g.generators {
47+
compositeResult = append(compositeResult, generator.GenerateForMain(policies)...)
48+
}
49+
50+
return compositeResult
51+
}
52+
53+
// GenerateForHTTP calls all policy generators for the http block.
54+
func (g *CompositeGenerator) GenerateForHTTP(policies []Policy) GenerateResultFiles {
55+
var compositeResult GenerateResultFiles
56+
57+
for _, generator := range g.generators {
58+
compositeResult = append(compositeResult, generator.GenerateForHTTP(policies)...)
59+
}
60+
61+
return compositeResult
62+
}
63+
3864
// GenerateForServer calls all policy generators for the server block.
3965
func (g *CompositeGenerator) GenerateForServer(policies []Policy, server http.Server) GenerateResultFiles {
4066
var compositeResult GenerateResultFiles
@@ -72,6 +98,14 @@ func (g *CompositeGenerator) GenerateForInternalLocation(policies []Policy) Gene
7298
// possible generations, in order to satisfy the Generator interface.
7399
type UnimplementedGenerator struct{}
74100

101+
func (u UnimplementedGenerator) GenerateForMain(_ []Policy) GenerateResultFiles {
102+
return nil
103+
}
104+
105+
func (u UnimplementedGenerator) GenerateForHTTP(_ []Policy) GenerateResultFiles {
106+
return nil
107+
}
108+
75109
func (u UnimplementedGenerator) GenerateForServer(_ []Policy, _ http.Server) GenerateResultFiles {
76110
return nil
77111
}

0 commit comments

Comments
 (0)