@@ -279,3 +279,104 @@ func TestPolicyServerValidateSigstoreTrustConfig(t *testing.T) {
279279 })
280280 }
281281}
282+
283+ func TestValidatePorts (t * testing.T ) {
284+ tests := []struct {
285+ name string
286+ webhookPort * int32
287+ readiness * int32
288+ metrics * int32
289+ defaultMetricsPort int32
290+ errContains string
291+ }{
292+ {
293+ name : "all defaults, no conflict" ,
294+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
295+ errContains : "" ,
296+ },
297+ {
298+ name : "webhookPort equals readinessProbePort" ,
299+ webhookPort : ptr.To [int32 ](8081 ),
300+ readiness : ptr.To [int32 ](8081 ),
301+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
302+ errContains : "readinessProbePort must differ from webhookPort" ,
303+ },
304+ {
305+ name : "webhookPort equals metricsPort" ,
306+ webhookPort : ptr.To [int32 ](8080 ),
307+ metrics : ptr.To [int32 ](8080 ),
308+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
309+ errContains : "metricsPort must differ from webhookPort" ,
310+ },
311+ {
312+ name : "readinessProbePort equals metricsPort" ,
313+ readiness : ptr.To [int32 ](9000 ),
314+ metrics : ptr.To [int32 ](9000 ),
315+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
316+ errContains : "metricsPort must differ from readinessProbePort" ,
317+ },
318+ {
319+ name : "all three ports the same" ,
320+ webhookPort : ptr.To [int32 ](9999 ),
321+ readiness : ptr.To [int32 ](9999 ),
322+ metrics : ptr.To [int32 ](9999 ),
323+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
324+ errContains : "readinessProbePort must differ from webhookPort" ,
325+ },
326+ {
327+ name : "all three ports distinct custom values" ,
328+ webhookPort : ptr.To [int32 ](9443 ),
329+ readiness : ptr.To [int32 ](9081 ),
330+ metrics : ptr.To [int32 ](9080 ),
331+ defaultMetricsPort : constants .PolicyServerMetricsPort ,
332+ errContains : "" ,
333+ },
334+ {
335+ // When the controller default metrics port is overridden via env var to 9090,
336+ // a PolicyServer with readinessProbePort=9090 (and no explicit metricsPort)
337+ // must be rejected because the effective metrics port is 9090.
338+ name : "readinessProbePort conflicts with env-var-configured default metrics port" ,
339+ readiness : ptr.To [int32 ](9090 ),
340+ defaultMetricsPort : 9090 ,
341+ errContains : "metricsPort must differ from readinessProbePort" ,
342+ },
343+ {
344+ // When the controller default metrics port is overridden via env var to 9090,
345+ // a PolicyServer with no explicit port overrides should be valid.
346+ name : "all defaults with non-standard env-var default metrics port, no conflict" ,
347+ defaultMetricsPort : 9090 ,
348+ errContains : "" ,
349+ },
350+ }
351+
352+ for _ , test := range tests {
353+ t .Run (test .name , func (t * testing.T ) {
354+ k8sClient := fake .NewClientBuilder ().Build ()
355+ builder := NewPolicyServerFactory ()
356+ if test .webhookPort != nil {
357+ builder = builder .WithWebhookPort (* test .webhookPort )
358+ }
359+ if test .readiness != nil {
360+ builder = builder .WithReadinessProbePort (* test .readiness )
361+ }
362+ if test .metrics != nil {
363+ builder = builder .WithMetricsPort (* test .metrics )
364+ }
365+ policyServer := builder .Build ()
366+
367+ validator := policyServerValidator {
368+ deploymentsNamespace : "default" ,
369+ defaultMetricsPort : test .defaultMetricsPort ,
370+ k8sClient : k8sClient ,
371+ logger : logr .Discard (),
372+ }
373+ err := validator .validate (t .Context (), policyServer )
374+
375+ if test .errContains != "" {
376+ require .ErrorContains (t , err , test .errContains )
377+ } else {
378+ require .NoError (t , err )
379+ }
380+ })
381+ }
382+ }
0 commit comments