Skip to content

Commit c117100

Browse files
committed
Add SnippetsPolicies support to NGINX configuration
1 parent e83c9c9 commit c117100

File tree

8 files changed

+128
-2
lines changed

8 files changed

+128
-2
lines changed

charts/nginx-gateway-fabric/templates/clusterrole.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ rules:
132132
{{- if .Values.nginxGateway.snippetsFilters.enable }}
133133
- snippetsfilters
134134
{{- end }}
135+
{{- if .Values.nginxGateway.snippetsPolicies.enable }}
136+
- snippetspolicies
137+
{{- end }}
135138
verbs:
136139
- list
137140
- watch
@@ -145,6 +148,9 @@ rules:
145148
{{- if .Values.nginxGateway.snippetsFilters.enable }}
146149
- snippetsfilters/status
147150
{{- end }}
151+
{{- if .Values.nginxGateway.snippetsPolicies.enable }}
152+
- snippetspolicies/status
153+
{{- end }}
148154
verbs:
149155
- update
150156
{{- if .Values.nginxGateway.gwAPIInferenceExtension.enable }}

charts/nginx-gateway-fabric/templates/deployment.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ spec:
110110
{{- if .Values.nginxGateway.snippetsFilters.enable }}
111111
- --snippets-filters
112112
{{- end }}
113+
{{- if .Values.nginxGateway.snippetsPolicies.enable }}
114+
- --snippets-policies
115+
{{- end }}
113116
{{- if .Capabilities.APIVersions.Has "security.openshift.io/v1/SecurityContextConstraints" }}
114117
- --nginx-scc={{ include "nginx-gateway.scc-name" . }}-nginx
115118
{{- end}}

charts/nginx-gateway-fabric/values.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@ nginxGateway:
232232
# config for HTTPRoute and GRPCRoute resources.
233233
enable: false
234234

235+
snippetsPolicies:
236+
# -- Enable SnippetsPolicies feature. SnippetsPolicies allow inserting NGINX configuration into the generated NGINX
237+
# config for Gateway, HTTPRoute and GRPCRoute resources.
238+
enable: false
239+
235240
# -- The nginx section contains the configuration for all NGINX data plane deployments
236241
# installed by the NGINX Gateway Fabric control plane.
237242
nginx:

cmd/gateway/commands.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ func createControllerCommand() *cobra.Command {
9595
usageReportCASecretFlag = "usage-report-ca-secret" //nolint:gosec // not credentials
9696
usageReportEnforceInitialReportFlag = "usage-report-enforce-initial-report"
9797
snippetsFiltersFlag = "snippets-filters"
98+
snippetsPoliciesFlag = "snippets-policies"
9899
nginxSCCFlag = "nginx-scc"
99100
)
100101

@@ -156,7 +157,8 @@ func createControllerCommand() *cobra.Command {
156157

157158
disableProductTelemetry bool
158159

159-
snippetsFilters bool
160+
snippetsFilters bool
161+
snippetsPolicies bool
160162

161163
plus bool
162164
nginxDockerSecrets = stringSliceValidatingValue{
@@ -282,6 +284,7 @@ func createControllerCommand() *cobra.Command {
282284
Values: flagValues,
283285
},
284286
SnippetsFilters: snippetsFilters,
287+
SnippetsPolicies: snippetsPolicies,
285288
NginxDockerSecretNames: nginxDockerSecrets.values,
286289
AgentTLSSecretName: agentTLSSecretName.value,
287290
NGINXSCCName: nginxSCCName.value,
@@ -512,6 +515,14 @@ func createControllerCommand() *cobra.Command {
512515
"generated NGINX config for HTTPRoute and GRPCRoute resources.",
513516
)
514517

518+
cmd.Flags().BoolVar(
519+
&snippetsPolicies,
520+
snippetsPoliciesFlag,
521+
false,
522+
"Enable SnippetsPolicies feature. SnippetsPolicies allow inserting NGINX configuration into the "+
523+
"generated NGINX config for Gateway, HTTPRoute and GRPCRoute resources.",
524+
)
525+
515526
cmd.Flags().Var(
516527
&nginxSCCName,
517528
nginxSCCFlag,

cmd/gateway/commands_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ func TestControllerCmdFlagValidation(t *testing.T) {
163163
"--nginx-one-tls-skip-verify",
164164
"--endpoint-picker-disable-tls",
165165
"--endpoint-picker-tls-skip-verify",
166+
"--snippets-policies",
166167
},
167168
wantErr: false,
168169
},
@@ -417,6 +418,15 @@ func TestControllerCmdFlagValidation(t *testing.T) {
417418
},
418419
wantErr: true,
419420
},
421+
{
422+
name: "snippets-policies is not a bool",
423+
expectedErrPrefix: `invalid argument "not-a-bool" for "--snippets-policies" flag: strconv.ParseBool:` +
424+
` parsing "not-a-bool": invalid syntax`,
425+
args: []string{
426+
"--snippets-policies=not-a-bool",
427+
},
428+
wantErr: true,
429+
},
420430
{
421431
name: "nginx-scc is set to empty string",
422432
args: []string{

internal/controller/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ type Config struct {
5252
InferenceExtension bool
5353
// SnippetsFilters indicates if SnippetsFilters are enabled.
5454
SnippetsFilters bool
55+
// SnippetsPolicies indicates if SnippetsPolicies are enabled.
56+
SnippetsPolicies bool
5557
// EndpointPickerDisableTLS indicates if TLS is disabled for EndpointPicker communication.
5658
EndpointPickerDisableTLS bool
5759
// EndpointPickerTLSSkipVerify indicates if secure verification is skipped for EndpointPicker communication.

internal/controller/manager.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import (
4949
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies"
5050
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/clientsettings"
5151
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/observability"
52+
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/snippetspolicy"
5253
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/policies/upstreamsettings"
5354
ngxvalidation "github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/validation"
5455
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/provisioner"
@@ -124,7 +125,7 @@ func StartManager(cfg config.Config) error {
124125
mustExtractGVK := kinds.NewMustExtractGKV(scheme)
125126

126127
genericValidator := ngxvalidation.GenericValidator{}
127-
policyManager := createPolicyManager(mustExtractGVK, genericValidator)
128+
policyManager := createPolicyManager(cfg, mustExtractGVK, genericValidator)
128129

129130
plusSecrets, err := createPlusSecretMetadata(cfg, mgr.GetAPIReader())
130131
if err != nil {
@@ -321,6 +322,7 @@ func StartManager(cfg config.Config) error {
321322
}
322323

323324
func createPolicyManager(
325+
cfg config.Config,
324326
mustExtractGVK kinds.MustExtractGVK,
325327
validator validation.GenericValidator,
326328
) *policies.CompositeValidator {
@@ -339,6 +341,13 @@ func createPolicyManager(
339341
},
340342
}
341343

344+
if cfg.SnippetsPolicies {
345+
cfgs = append(cfgs, policies.ManagerConfig{
346+
GVK: mustExtractGVK(&ngfAPIv1alpha1.SnippetsPolicy{}),
347+
Validator: snippetspolicy.NewValidator(),
348+
})
349+
}
350+
342351
return policies.NewManager(mustExtractGVK, cfgs...)
343352
}
344353

@@ -586,6 +595,17 @@ func registerControllers(
586595
)
587596
}
588597

598+
if cfg.SnippetsPolicies {
599+
controllerRegCfgs = append(controllerRegCfgs,
600+
ctlrCfg{
601+
objectType: &ngfAPIv1alpha1.SnippetsPolicy{},
602+
options: []controller.Option{
603+
controller.WithK8sPredicate(k8spredicate.GenerationChangedPredicate{}),
604+
},
605+
},
606+
)
607+
}
608+
589609
for _, regCfg := range controllerRegCfgs {
590610
name := regCfg.objectType.GetObjectKind().GroupVersionKind().Kind
591611
if regCfg.name != "" {
@@ -791,6 +811,13 @@ func prepareFirstEventBatchPreparerArgs(cfg config.Config) ([]client.Object, []c
791811
)
792812
}
793813

814+
if cfg.SnippetsPolicies {
815+
objectLists = append(
816+
objectLists,
817+
&ngfAPIv1alpha1.SnippetsPolicyList{},
818+
)
819+
}
820+
794821
objectLists = append(objectLists, &gatewayv1.GatewayList{})
795822

796823
return objects, objectLists

internal/controller/manager_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,34 @@ func TestPrepareFirstEventBatchPreparerArgs(t *testing.T) {
154154
&ngfAPIv1alpha1.UpstreamSettingsPolicyList{},
155155
},
156156
},
157+
{
158+
name: "snippets policies enabled",
159+
cfg: config.Config{
160+
GatewayClassName: gcName,
161+
SnippetsPolicies: true,
162+
},
163+
expectedObjects: []client.Object{
164+
&gatewayv1.GatewayClass{ObjectMeta: metav1.ObjectMeta{Name: "nginx"}},
165+
},
166+
expectedObjectLists: []client.ObjectList{
167+
&apiv1.ServiceList{},
168+
&apiv1.SecretList{},
169+
&apiv1.NamespaceList{},
170+
&discoveryV1.EndpointSliceList{},
171+
&gatewayv1.HTTPRouteList{},
172+
&gatewayv1.BackendTLSPolicyList{},
173+
&apiv1.ConfigMapList{},
174+
&gatewayv1.GatewayList{},
175+
&gatewayv1beta1.ReferenceGrantList{},
176+
&ngfAPIv1alpha2.NginxProxyList{},
177+
partialObjectMetadataList,
178+
&gatewayv1.GRPCRouteList{},
179+
&ngfAPIv1alpha1.ClientSettingsPolicyList{},
180+
&ngfAPIv1alpha2.ObservabilityPolicyList{},
181+
&ngfAPIv1alpha1.SnippetsPolicyList{},
182+
&ngfAPIv1alpha1.UpstreamSettingsPolicyList{},
183+
},
184+
},
157185
{
158186
name: "experimental, inference, and snippets filters enabled",
159187
cfg: config.Config{
@@ -186,6 +214,40 @@ func TestPrepareFirstEventBatchPreparerArgs(t *testing.T) {
186214
&ngfAPIv1alpha1.UpstreamSettingsPolicyList{},
187215
},
188216
},
217+
{
218+
name: "all features enabled",
219+
cfg: config.Config{
220+
GatewayClassName: gcName,
221+
ExperimentalFeatures: true,
222+
InferenceExtension: true,
223+
SnippetsFilters: true,
224+
SnippetsPolicies: true,
225+
},
226+
expectedObjects: []client.Object{
227+
&gatewayv1.GatewayClass{ObjectMeta: metav1.ObjectMeta{Name: "nginx"}},
228+
},
229+
expectedObjectLists: []client.ObjectList{
230+
&apiv1.ServiceList{},
231+
&apiv1.SecretList{},
232+
&apiv1.NamespaceList{},
233+
&apiv1.ConfigMapList{},
234+
&discoveryV1.EndpointSliceList{},
235+
&gatewayv1.HTTPRouteList{},
236+
&gatewayv1.GatewayList{},
237+
&gatewayv1beta1.ReferenceGrantList{},
238+
&ngfAPIv1alpha2.NginxProxyList{},
239+
partialObjectMetadataList,
240+
&inference.InferencePoolList{},
241+
&gatewayv1.BackendTLSPolicyList{},
242+
&gatewayv1alpha2.TLSRouteList{},
243+
&gatewayv1.GRPCRouteList{},
244+
&ngfAPIv1alpha1.ClientSettingsPolicyList{},
245+
&ngfAPIv1alpha2.ObservabilityPolicyList{},
246+
&ngfAPIv1alpha1.SnippetsFilterList{},
247+
&ngfAPIv1alpha1.SnippetsPolicyList{},
248+
&ngfAPIv1alpha1.UpstreamSettingsPolicyList{},
249+
},
250+
},
189251
}
190252

191253
for _, test := range tests {

0 commit comments

Comments
 (0)