@@ -412,3 +412,104 @@ func TestPolicyServerValidateNamespacedPoliciesCapabilities(t *testing.T) {
412412 })
413413 }
414414}
415+
416+ func TestValidatePorts (t * testing.T ) {
417+ tests := []struct {
418+ name string
419+ webhookPort * int32
420+ readiness * int32
421+ metrics * int32
422+ defaultMetricsPort int32
423+ errContains string
424+ }{
425+ {
426+ name : "all defaults, no conflict" ,
427+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
428+ errContains : "" ,
429+ },
430+ {
431+ name : "webhookPort equals readinessProbePort" ,
432+ webhookPort : ptr.To [int32 ](8081 ),
433+ readiness : ptr.To [int32 ](8081 ),
434+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
435+ errContains : "readinessProbePort must differ from webhookPort" ,
436+ },
437+ {
438+ name : "webhookPort equals metricsPort" ,
439+ webhookPort : ptr.To [int32 ](8080 ),
440+ metrics : ptr.To [int32 ](8080 ),
441+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
442+ errContains : "metricsPort must differ from webhookPort" ,
443+ },
444+ {
445+ name : "readinessProbePort equals metricsPort" ,
446+ readiness : ptr.To [int32 ](9000 ),
447+ metrics : ptr.To [int32 ](9000 ),
448+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
449+ errContains : "metricsPort must differ from readinessProbePort" ,
450+ },
451+ {
452+ name : "all three ports the same" ,
453+ webhookPort : ptr.To [int32 ](9999 ),
454+ readiness : ptr.To [int32 ](9999 ),
455+ metrics : ptr.To [int32 ](9999 ),
456+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
457+ errContains : "readinessProbePort must differ from webhookPort" ,
458+ },
459+ {
460+ name : "all three ports distinct custom values" ,
461+ webhookPort : ptr.To [int32 ](9443 ),
462+ readiness : ptr.To [int32 ](9081 ),
463+ metrics : ptr.To [int32 ](9080 ),
464+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
465+ errContains : "" ,
466+ },
467+ {
468+ // When the controller default metrics port is overridden via env var to 9090,
469+ // a PolicyServer with readinessProbePort=9090 (and no explicit metricsPort)
470+ // must be rejected because the effective metrics port is 9090.
471+ name : "readinessProbePort conflicts with env-var-configured default metrics port" ,
472+ readiness : ptr.To [int32 ](9090 ),
473+ defaultMetricsPort : 9090 ,
474+ errContains : "metricsPort must differ from readinessProbePort" ,
475+ },
476+ {
477+ // When the controller default metrics port is overridden via env var to 9090,
478+ // a PolicyServer with no explicit port overrides should be valid.
479+ name : "all defaults with non-standard env-var default metrics port, no conflict" ,
480+ defaultMetricsPort : 9090 ,
481+ errContains : "" ,
482+ },
483+ }
484+
485+ for _ , test := range tests {
486+ t .Run (test .name , func (t * testing.T ) {
487+ k8sClient := fake .NewClientBuilder ().Build ()
488+ builder := NewPolicyServerFactory ()
489+ if test .webhookPort != nil {
490+ builder = builder .WithWebhookPort (* test .webhookPort )
491+ }
492+ if test .readiness != nil {
493+ builder = builder .WithReadinessProbePort (* test .readiness )
494+ }
495+ if test .metrics != nil {
496+ builder = builder .WithMetricsPort (* test .metrics )
497+ }
498+ policyServer := builder .Build ()
499+
500+ validator := policyServerValidator {
501+ deploymentsNamespace : "default" ,
502+ defaultMetricsPort : test .defaultMetricsPort ,
503+ k8sClient : k8sClient ,
504+ logger : logr .Discard (),
505+ }
506+ err := validator .validate (t .Context (), policyServer )
507+
508+ if test .errContains != "" {
509+ require .ErrorContains (t , err , test .errContains )
510+ } else {
511+ require .NoError (t , err )
512+ }
513+ })
514+ }
515+ }
0 commit comments