@@ -425,36 +425,39 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
425425		}
426426		apiServerNetworkPolicy .Spec .Egress  =  append (apiServerNetworkPolicy .Spec .Egress , dnsRule )
427427
428- 		// If allowed, add an Egress rule to access the API server. 
429- 		// Otherwise, if the OpenShift DNS or K8s CoreDNS Egress rule does not provide permissive cluster-wide access 
430- 		// and the K8s API server could not be found, use a permissive cluster-wide Egress rule. 
431- 		if  apiServerEndpoints , err  :=  r .getEndpoints ("kubernetes" , "default" ); err  ==  nil  {
432- 			rule  :=  networkingv1.NetworkPolicyEgressRule {}
433- 			// Define the port 
434- 			port  :=  networkingv1.NetworkPolicyPort {}
435- 			port .Protocol  =  & apiServerEndpoints .Subsets [0 ].Ports [0 ].Protocol 
436- 			var  portNumber  intstr.IntOrString  =  intstr .FromInt ((int )(apiServerEndpoints .Subsets [0 ].Ports [0 ].Port ))
437- 			port .Port  =  & portNumber 
438- 			rule .Ports  =  append (rule .Ports , port )
439- 
440- 			// Add the endpoint address as ipBlock entries 
441- 			for  _ , endpoint  :=  range  apiServerEndpoints .Subsets  {
442- 				for  _ , address  :=  range  endpoint .Addresses  {
443- 					peer  :=  networkingv1.NetworkPolicyPeer {}
444- 					ipBlock  :=  networkingv1.IPBlock {}
445- 					ipBlock .CIDR  =  address .IP  +  "/32" 
446- 
447- 					peer .IPBlock  =  & ipBlock 
448- 					rule .To  =  append (rule .To , peer )
428+ 		// If the DNS rule is a specific Egress rule also check if another Egress rule can be created for the API server. 
429+ 		// Otherwise, fallback to a permissive cluster-wide Egress rule. 
430+ 		if  ! usingPermissiveRule  {
431+ 			if  apiServerEndpoints , err  :=  r .getEndpoints ("kubernetes" , "default" ); err  ==  nil  {
432+ 				rule  :=  networkingv1.NetworkPolicyEgressRule {}
433+ 				// Define the port 
434+ 				port  :=  networkingv1.NetworkPolicyPort {}
435+ 				port .Protocol  =  & apiServerEndpoints .Subsets [0 ].Ports [0 ].Protocol 
436+ 				var  portNumber  intstr.IntOrString  =  intstr .FromInt ((int )(apiServerEndpoints .Subsets [0 ].Ports [0 ].Port ))
437+ 				port .Port  =  & portNumber 
438+ 				rule .Ports  =  append (rule .Ports , port )
439+ 
440+ 				// Add the endpoint address as ipBlock entries 
441+ 				for  _ , endpoint  :=  range  apiServerEndpoints .Subsets  {
442+ 					for  _ , address  :=  range  endpoint .Addresses  {
443+ 						peer  :=  networkingv1.NetworkPolicyPeer {}
444+ 						ipBlock  :=  networkingv1.IPBlock {}
445+ 						ipBlock .CIDR  =  address .IP  +  "/32" 
446+ 
447+ 						peer .IPBlock  =  & ipBlock 
448+ 						rule .To  =  append (rule .To , peer )
449+ 					}
449450				}
451+ 				apiServerNetworkPolicy .Spec .Egress  =  append (apiServerNetworkPolicy .Spec .Egress , rule )
452+ 				reqLogger .Info ("Found endpoints for kubernetes service in the default namespace" )
453+ 			} else  {
454+ 				// The operator couldn't create a rule for the K8s API server so add a permissive Egress rule 
455+ 				rule  :=  networkingv1.NetworkPolicyEgressRule {}
456+ 				apiServerNetworkPolicy .Spec .Egress  =  append (apiServerNetworkPolicy .Spec .Egress , rule )
457+ 				reqLogger .Info ("Found endpoints for kubernetes service in the default namespace" )
450458			}
451- 			apiServerNetworkPolicy .Spec .Egress  =  append (apiServerNetworkPolicy .Spec .Egress , rule )
452- 			reqLogger .Info ("Found endpoints for kubernetes service in the default namespace" )
453- 		} else  if  ! usingPermissiveRule  {
454- 			rule  :=  networkingv1.NetworkPolicyEgressRule {}
455- 			apiServerNetworkPolicy .Spec .Egress  =  append (apiServerNetworkPolicy .Spec .Egress , rule )
456- 			reqLogger .Info ("Found endpoints for kubernetes service in the default namespace" )
457459		}
460+ 
458461		apiServerNetworkPolicy .Labels  =  ba .GetLabels ()
459462		apiServerNetworkPolicy .Annotations  =  oputils .MergeMaps (apiServerNetworkPolicy .Annotations , ba .GetAnnotations ())
460463		apiServerNetworkPolicy .Spec .PolicyTypes  =  []networkingv1.PolicyType {networkingv1 .PolicyTypeEgress }
@@ -953,11 +956,13 @@ func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace s
953956func  (r  * ReconcileWebSphereLiberty ) getDNSEgressRule (reqLogger  logr.Logger , endpointsName  string , endpointsNamespace  string ) (bool , networkingv1.NetworkPolicyEgressRule ) {
954957	dnsRule  :=  networkingv1.NetworkPolicyEgressRule {}
955958	if  dnsEndpoints , err  :=  r .getEndpoints (endpointsName , endpointsNamespace ); err  ==  nil  {
956- 		if  endpointPort  :=  lutils .GetEndpointPortByName (& dnsEndpoints .Subsets [0 ].Ports , "dns" ); endpointPort  !=  nil  {
957- 			dnsRule .Ports  =  append (dnsRule .Ports , lutils .CreateNetworkPolicyPortFromEndpointPort (endpointPort ))
958- 		}
959- 		if  endpointPort  :=  lutils .GetEndpointPortByName (& dnsEndpoints .Subsets [0 ].Ports , "dns-tcp" ); endpointPort  !=  nil  {
960- 			dnsRule .Ports  =  append (dnsRule .Ports , lutils .CreateNetworkPolicyPortFromEndpointPort (endpointPort ))
959+ 		if  len (dnsEndpoints .Subsets ) >  0  {
960+ 			if  endpointPort  :=  lutils .GetEndpointPortByName (& dnsEndpoints .Subsets [0 ].Ports , "dns" ); endpointPort  !=  nil  {
961+ 				dnsRule .Ports  =  append (dnsRule .Ports , lutils .CreateNetworkPolicyPortFromEndpointPort (endpointPort ))
962+ 			}
963+ 			if  endpointPort  :=  lutils .GetEndpointPortByName (& dnsEndpoints .Subsets [0 ].Ports , "dns-tcp" ); endpointPort  !=  nil  {
964+ 				dnsRule .Ports  =  append (dnsRule .Ports , lutils .CreateNetworkPolicyPortFromEndpointPort (endpointPort ))
965+ 			}
961966		}
962967		peer  :=  networkingv1.NetworkPolicyPeer {}
963968		peer .NamespaceSelector  =  & metav1.LabelSelector {
0 commit comments