Skip to content

Commit 33d442b

Browse files
authored
Fix events block crash (#3730) (#3733)
1 parent f8bbfdd commit 33d442b

File tree

10 files changed

+122
-42
lines changed

10 files changed

+122
-42
lines changed

internal/controller/nginx/conf/nginx-plus.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ worker_processes auto;
55

66
pid /var/run/nginx/nginx.pid;
77

8+
events {
9+
include /etc/nginx/events-includes/*.conf;
10+
}
11+
812
http {
913
include /etc/nginx/conf.d/*.conf;
1014
include /etc/nginx/mime.types;

internal/controller/nginx/conf/nginx.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ worker_processes auto;
55

66
pid /var/run/nginx/nginx.pid;
77

8+
events {
9+
include /etc/nginx/events-includes/*.conf;
10+
}
11+
812
http {
913
include /etc/nginx/conf.d/*.conf;
1014
include /etc/nginx/mime.types;

internal/controller/nginx/config/generator.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ const (
3838
// For example, these files include load_module directives and snippets that target the main context.
3939
mainIncludesFolder = configFolder + "/main-includes"
4040

41+
// eventsIncludesFolder is the folder where NGINX events context configuration files are stored.
42+
eventsIncludesFolder = configFolder + "/events-includes"
43+
4144
// secretsFolder is the folder where secrets (like TLS certs/keys) are stored.
4245
secretsFolder = configFolder + "/secrets"
4346

@@ -56,6 +59,9 @@ const (
5659
// mainIncludesConfigFile is the path to the file containing NGINX configuration in the main context.
5760
mainIncludesConfigFile = mainIncludesFolder + "/main.conf"
5861

62+
// eventsIncludesConfigFile is the path to the file containing NGINX events configuration.
63+
eventsIncludesConfigFile = eventsIncludesFolder + "/events.conf"
64+
5965
// mgmtIncludesFile is the path to the file containing the NGINX Plus mgmt config.
6066
mgmtIncludesFile = mainIncludesFolder + "/mgmt.conf"
6167

@@ -196,6 +202,7 @@ func (g GeneratorImpl) getExecuteFuncs(
196202
) []executeFunc {
197203
return []executeFunc{
198204
executeMainConfig,
205+
executeEventsConfig,
199206
executeBaseHTTPConfig,
200207
g.newExecuteServersFunc(generator, keepAliveCheck),
201208
newExecuteUpstreamsFunc(upstreams),

internal/controller/nginx/config/generator_test.go

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func TestGenerate(t *testing.T) {
147147

148148
files := generator.Generate(conf)
149149

150-
g.Expect(files).To(HaveLen(17))
150+
g.Expect(files).To(HaveLen(18))
151151
arrange := func(i, j int) bool {
152152
return files[i].Meta.Name < files[j].Meta.Name
153153
}
@@ -158,6 +158,7 @@ func TestGenerate(t *testing.T) {
158158
/etc/nginx/conf.d/http.conf
159159
/etc/nginx/conf.d/matches.json
160160
/etc/nginx/conf.d/plus-api.conf
161+
/etc/nginx/events-includes/events.conf
161162
/etc/nginx/includes/http_snippet1.conf
162163
/etc/nginx/includes/http_snippet2.conf
163164
/etc/nginx/includes/main_snippet1.conf
@@ -211,52 +212,56 @@ func TestGenerate(t *testing.T) {
211212
g.Expect(httpCfg).To(ContainSubstring("deny all;"))
212213
g.Expect(httpCfg).To(ContainSubstring("location = /dashboard.html {}"))
213214

215+
// events config file
216+
g.Expect(files[3].Meta.Name).To(Equal("/etc/nginx/events-includes/events.conf"))
217+
g.Expect(string(files[3].Contents)).To(ContainSubstring("worker_connections"))
218+
214219
// snippet include files
215220
// content is not checked in this test.
216-
g.Expect(files[3].Meta.Name).To(Equal("/etc/nginx/includes/http_snippet1.conf"))
217-
g.Expect(files[4].Meta.Name).To(Equal("/etc/nginx/includes/http_snippet2.conf"))
218-
g.Expect(files[5].Meta.Name).To(Equal("/etc/nginx/includes/main_snippet1.conf"))
219-
g.Expect(files[6].Meta.Name).To(Equal("/etc/nginx/includes/main_snippet2.conf"))
221+
g.Expect(files[4].Meta.Name).To(Equal("/etc/nginx/includes/http_snippet1.conf"))
222+
g.Expect(files[5].Meta.Name).To(Equal("/etc/nginx/includes/http_snippet2.conf"))
223+
g.Expect(files[6].Meta.Name).To(Equal("/etc/nginx/includes/main_snippet1.conf"))
224+
g.Expect(files[7].Meta.Name).To(Equal("/etc/nginx/includes/main_snippet2.conf"))
220225

221-
g.Expect(files[7].Meta.Name).To(Equal("/etc/nginx/main-includes/deployment_ctx.json"))
222-
deploymentCtx := string(files[7].Contents)
226+
g.Expect(files[8].Meta.Name).To(Equal("/etc/nginx/main-includes/deployment_ctx.json"))
227+
deploymentCtx := string(files[8].Contents)
223228
g.Expect(deploymentCtx).To(ContainSubstring("\"integration\":\"ngf\""))
224229
g.Expect(deploymentCtx).To(ContainSubstring("\"cluster_id\":\"test-uid\""))
225230
g.Expect(deploymentCtx).To(ContainSubstring("\"installation_id\":\"test-uid-replicaSet\""))
226231
g.Expect(deploymentCtx).To(ContainSubstring("\"cluster_node_count\":1"))
227232

228-
g.Expect(files[8].Meta.Name).To(Equal("/etc/nginx/main-includes/main.conf"))
229-
mainConfStr := string(files[8].Contents)
233+
g.Expect(files[9].Meta.Name).To(Equal("/etc/nginx/main-includes/main.conf"))
234+
mainConfStr := string(files[9].Contents)
230235
g.Expect(mainConfStr).To(ContainSubstring("load_module modules/ngx_otel_module.so;"))
231236
g.Expect(mainConfStr).To(ContainSubstring("include /etc/nginx/includes/main_snippet1.conf;"))
232237
g.Expect(mainConfStr).To(ContainSubstring("include /etc/nginx/includes/main_snippet2.conf;"))
233238

234-
g.Expect(files[9].Meta.Name).To(Equal("/etc/nginx/main-includes/mgmt.conf"))
235-
mgmtConf := string(files[9].Contents)
239+
g.Expect(files[10].Meta.Name).To(Equal("/etc/nginx/main-includes/mgmt.conf"))
240+
mgmtConf := string(files[10].Contents)
236241
g.Expect(mgmtConf).To(ContainSubstring("usage_report endpoint=test-endpoint"))
237242
g.Expect(mgmtConf).To(ContainSubstring("license_token /etc/nginx/secrets/license.jwt"))
238243
g.Expect(mgmtConf).To(ContainSubstring("deployment_context /etc/nginx/main-includes/deployment_ctx.json"))
239244
g.Expect(mgmtConf).To(ContainSubstring("ssl_trusted_certificate /etc/nginx/secrets/mgmt-ca.crt"))
240245
g.Expect(mgmtConf).To(ContainSubstring("ssl_certificate /etc/nginx/secrets/mgmt-tls.crt"))
241246
g.Expect(mgmtConf).To(ContainSubstring("ssl_certificate_key /etc/nginx/secrets/mgmt-tls.key"))
242247

243-
g.Expect(files[10].Meta.Name).To(Equal("/etc/nginx/secrets/license.jwt"))
244-
g.Expect(string(files[10].Contents)).To(Equal("license"))
248+
g.Expect(files[11].Meta.Name).To(Equal("/etc/nginx/secrets/license.jwt"))
249+
g.Expect(string(files[11].Contents)).To(Equal("license"))
245250

246-
g.Expect(files[11].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-ca.crt"))
247-
g.Expect(string(files[11].Contents)).To(Equal("ca"))
251+
g.Expect(files[12].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-ca.crt"))
252+
g.Expect(string(files[12].Contents)).To(Equal("ca"))
248253

249-
g.Expect(files[12].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-tls.crt"))
250-
g.Expect(string(files[12].Contents)).To(Equal("cert"))
254+
g.Expect(files[13].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-tls.crt"))
255+
g.Expect(string(files[13].Contents)).To(Equal("cert"))
251256

252-
g.Expect(files[13].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-tls.key"))
253-
g.Expect(string(files[13].Contents)).To(Equal("key"))
257+
g.Expect(files[14].Meta.Name).To(Equal("/etc/nginx/secrets/mgmt-tls.key"))
258+
g.Expect(string(files[14].Contents)).To(Equal("key"))
254259

255-
g.Expect(files[14].Meta.Name).To(Equal("/etc/nginx/secrets/test-certbundle.crt"))
256-
certBundle := string(files[14].Contents)
260+
g.Expect(files[15].Meta.Name).To(Equal("/etc/nginx/secrets/test-certbundle.crt"))
261+
certBundle := string(files[15].Contents)
257262
g.Expect(certBundle).To(Equal("test-cert"))
258263

259-
g.Expect(files[15]).To(Equal(agent.File{
264+
g.Expect(files[16]).To(Equal(agent.File{
260265
Meta: &pb.FileMeta{
261266
Name: "/etc/nginx/secrets/test-keypair.pem",
262267
Hash: filesHelper.GenerateHash([]byte("test-cert\ntest-key")),
@@ -266,9 +271,9 @@ func TestGenerate(t *testing.T) {
266271
Contents: []byte("test-cert\ntest-key"),
267272
}))
268273

269-
g.Expect(files[16].Meta.Name).To(Equal("/etc/nginx/stream-conf.d/stream.conf"))
270-
g.Expect(files[16].Meta.Permissions).To(Equal(file.RegularFileMode))
271-
streamCfg := string(files[16].Contents)
274+
g.Expect(files[17].Meta.Name).To(Equal("/etc/nginx/stream-conf.d/stream.conf"))
275+
g.Expect(files[17].Meta.Permissions).To(Equal(file.RegularFileMode))
276+
streamCfg := string(files[17].Contents)
272277
g.Expect(streamCfg).To(ContainSubstring("listen unix:/var/run/nginx/app.example.com-443.sock"))
273278
g.Expect(streamCfg).To(ContainSubstring("listen 443"))
274279
g.Expect(streamCfg).To(ContainSubstring("app.example.com unix:/var/run/nginx/app.example.com-443.sock"))

internal/controller/nginx/config/main_config.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import (
1515
)
1616

1717
var (
18-
mainConfigTemplate = gotemplate.Must(gotemplate.New("main").Parse(mainConfigTemplateText))
19-
mgmtConfigTemplate = gotemplate.Must(gotemplate.New("mgmt").Parse(mgmtConfigTemplateText))
18+
mainConfigTemplate = gotemplate.Must(gotemplate.New("main").Parse(mainConfigTemplateText))
19+
mgmtConfigTemplate = gotemplate.Must(gotemplate.New("mgmt").Parse(mgmtConfigTemplateText))
20+
eventsConfigTemplate = gotemplate.Must(gotemplate.New("events").Parse(eventsConfigTemplateText))
2021
)
2122

2223
type mainConfig struct {
@@ -42,6 +43,17 @@ func executeMainConfig(conf dataplane.Configuration) []executeResult {
4243
return results
4344
}
4445

46+
func executeEventsConfig(conf dataplane.Configuration) []executeResult {
47+
eventsData := helpers.MustExecuteTemplate(eventsConfigTemplate, conf)
48+
49+
return []executeResult{
50+
{
51+
dest: eventsIncludesConfigFile,
52+
data: eventsData,
53+
},
54+
}
55+
}
56+
4557
type mgmtConf struct {
4658
Endpoint string
4759
Resolver string

internal/controller/nginx/config/main_config_template.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ load_module modules/ngx_otel_module.so;
77
88
error_log stderr {{ .Conf.Logging.ErrorLevel }};
99
10-
events {
11-
worker_connections {{ .Conf.WorkerConnections }};
12-
}
1310
1411
{{ range $i := .Includes -}}
1512
include {{ $i.Name }};
1613
{{ end -}}
1714
`
1815

16+
const eventsConfigTemplateText = `
17+
worker_connections {{ .WorkerConnections }};
18+
`
19+
1920
const mgmtConfigTemplateText = `
2021
mgmt {
2122
{{- if .Endpoint }}

internal/controller/nginx/config/main_config_test.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,44 @@ func TestExecuteMainConfig_WorkerConnections(t *testing.T) {
173173
res := executeMainConfig(test.conf)
174174
g.Expect(res).To(HaveLen(1))
175175
g.Expect(res[0].dest).To(Equal(mainIncludesConfigFile))
176+
g.Expect(string(res[0].data)).To(ContainSubstring("error_log stderr"))
177+
})
178+
}
179+
}
180+
181+
func TestExecuteEventsConfig_WorkerConnections(t *testing.T) {
182+
t.Parallel()
183+
184+
tests := []struct {
185+
name string
186+
expWorkerConnections string
187+
conf dataplane.Configuration
188+
}{
189+
{
190+
name: "custom worker connections",
191+
conf: dataplane.Configuration{
192+
WorkerConnections: 2048,
193+
},
194+
expWorkerConnections: "worker_connections 2048;",
195+
},
196+
{
197+
name: "default worker connections",
198+
conf: dataplane.Configuration{
199+
WorkerConnections: dataplane.DefaultWorkerConnections,
200+
},
201+
expWorkerConnections: "worker_connections 1024;",
202+
},
203+
}
204+
205+
for _, test := range tests {
206+
t.Run(test.name, func(t *testing.T) {
207+
t.Parallel()
208+
g := NewWithT(t)
209+
210+
res := executeEventsConfig(test.conf)
211+
g.Expect(res).To(HaveLen(1))
212+
g.Expect(res[0].dest).To(Equal(eventsIncludesConfigFile))
176213
g.Expect(string(res[0].data)).To(ContainSubstring(test.expWorkerConnections))
177-
g.Expect(string(res[0].data)).To(ContainSubstring("events {"))
178214
})
179215
}
180216
}

internal/controller/provisioner/objects.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,11 @@ func (p *NginxProvisioner) buildNginxConfigMaps(
396396
"WorkerConnections": workerConnections,
397397
}
398398

399+
// Create events ConfigMap data using template
400+
eventsFields := map[string]interface{}{
401+
"WorkerConnections": workerConnections,
402+
}
403+
399404
bootstrapCM := &corev1.ConfigMap{
400405
ObjectMeta: metav1.ObjectMeta{
401406
Name: ngxIncludesConfigMapName,
@@ -404,7 +409,8 @@ func (p *NginxProvisioner) buildNginxConfigMaps(
404409
Annotations: objectMeta.Annotations,
405410
},
406411
Data: map[string]string{
407-
"main.conf": string(helpers.MustExecuteTemplate(mainTemplate, mainFields)),
412+
"main.conf": string(helpers.MustExecuteTemplate(mainTemplate, mainFields)),
413+
"events.conf": string(helpers.MustExecuteTemplate(eventsTemplate, eventsFields)),
408414
},
409415
}
410416

@@ -826,6 +832,7 @@ func (p *NginxProvisioner) buildNginxPodTemplateSpec(
826832
{MountPath: "/etc/nginx/conf.d", Name: "nginx-conf"},
827833
{MountPath: "/etc/nginx/stream-conf.d", Name: "nginx-stream-conf"},
828834
{MountPath: "/etc/nginx/main-includes", Name: "nginx-main-includes"},
835+
{MountPath: "/etc/nginx/events-includes", Name: "nginx-events-includes"},
829836
{MountPath: "/etc/nginx/secrets", Name: "nginx-secrets"},
830837
{MountPath: "/var/run/nginx", Name: "nginx-run"},
831838
{MountPath: "/var/cache/nginx", Name: "nginx-cache"},
@@ -845,6 +852,8 @@ func (p *NginxProvisioner) buildNginxPodTemplateSpec(
845852
"--destination", "/etc/nginx-agent",
846853
"--source", "/includes/main.conf",
847854
"--destination", "/etc/nginx/main-includes",
855+
"--source", "/includes/events.conf",
856+
"--destination", "/etc/nginx/events-includes",
848857
},
849858
Env: []corev1.EnvVar{
850859
{
@@ -861,6 +870,7 @@ func (p *NginxProvisioner) buildNginxPodTemplateSpec(
861870
{MountPath: "/etc/nginx-agent", Name: "nginx-agent"},
862871
{MountPath: "/includes", Name: "nginx-includes-bootstrap"},
863872
{MountPath: "/etc/nginx/main-includes", Name: "nginx-main-includes"},
873+
{MountPath: "/etc/nginx/events-includes", Name: "nginx-events-includes"},
864874
},
865875
SecurityContext: &corev1.SecurityContext{
866876
Capabilities: &corev1.Capabilities{
@@ -927,6 +937,7 @@ func (p *NginxProvisioner) buildNginxPodTemplateSpec(
927937
{Name: "nginx-conf", VolumeSource: emptyDirVolumeSource},
928938
{Name: "nginx-stream-conf", VolumeSource: emptyDirVolumeSource},
929939
{Name: "nginx-main-includes", VolumeSource: emptyDirVolumeSource},
940+
{Name: "nginx-events-includes", VolumeSource: emptyDirVolumeSource},
930941
{Name: "nginx-secrets", VolumeSource: emptyDirVolumeSource},
931942
{Name: "nginx-run", VolumeSource: emptyDirVolumeSource},
932943
{Name: "nginx-cache", VolumeSource: emptyDirVolumeSource},

internal/controller/provisioner/objects_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,7 +1275,7 @@ func TestBuildNginxConfigMaps_WorkerConnections(t *testing.T) {
12751275

12761276
bootstrapCM, ok := configMaps[0].(*corev1.ConfigMap)
12771277
g.Expect(ok).To(BeTrue())
1278-
g.Expect(bootstrapCM.Data["main.conf"]).To(ContainSubstring("worker_connections 1024;"))
1278+
g.Expect(bootstrapCM.Data["events.conf"]).To(ContainSubstring("worker_connections 1024;"))
12791279

12801280
// Test with default worker connections (empty NginxProxy config)
12811281
nProxyCfgEmpty := &graph.EffectiveNginxProxy{}
@@ -1284,7 +1284,7 @@ func TestBuildNginxConfigMaps_WorkerConnections(t *testing.T) {
12841284

12851285
bootstrapCM, ok = configMaps[0].(*corev1.ConfigMap)
12861286
g.Expect(ok).To(BeTrue())
1287-
g.Expect(bootstrapCM.Data["main.conf"]).To(ContainSubstring("worker_connections 1024;"))
1287+
g.Expect(bootstrapCM.Data["events.conf"]).To(ContainSubstring("worker_connections 1024;"))
12881288

12891289
// Test with custom worker connections
12901290
nProxyCfg := &graph.EffectiveNginxProxy{
@@ -1296,7 +1296,7 @@ func TestBuildNginxConfigMaps_WorkerConnections(t *testing.T) {
12961296

12971297
bootstrapCM, ok = configMaps[0].(*corev1.ConfigMap)
12981298
g.Expect(ok).To(BeTrue())
1299-
g.Expect(bootstrapCM.Data["main.conf"]).To(ContainSubstring("worker_connections 2048;"))
1299+
g.Expect(bootstrapCM.Data["events.conf"]).To(ContainSubstring("worker_connections 2048;"))
13001300
}
13011301

13021302
func TestBuildNginxConfigMaps_AgentFields(t *testing.T) {

internal/controller/provisioner/templates.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ package provisioner
33
import gotemplate "text/template"
44

55
var (
6-
mainTemplate = gotemplate.Must(gotemplate.New("main").Parse(mainTemplateText))
7-
mgmtTemplate = gotemplate.Must(gotemplate.New("mgmt").Parse(mgmtTemplateText))
8-
agentTemplate = gotemplate.Must(gotemplate.New("agent").Parse(agentTemplateText))
6+
mainTemplate = gotemplate.Must(gotemplate.New("main").Parse(mainTemplateText))
7+
mgmtTemplate = gotemplate.Must(gotemplate.New("mgmt").Parse(mgmtTemplateText))
8+
agentTemplate = gotemplate.Must(gotemplate.New("agent").Parse(agentTemplateText))
9+
eventsTemplate = gotemplate.Must(gotemplate.New("events").Parse(eventsTemplateText))
910
)
1011

1112
const mainTemplateText = `
12-
error_log stderr {{ .ErrorLevel }};
13+
error_log stderr {{ .ErrorLevel }};`
1314

14-
events {
15-
worker_connections {{ .WorkerConnections }};
16-
}`
15+
const eventsTemplateText = `
16+
worker_connections {{ .WorkerConnections }};`
1717

1818
const mgmtTemplateText = `mgmt {
1919
{{- if .UsageEndpoint }}

0 commit comments

Comments
 (0)