Skip to content

Commit e4689d5

Browse files
committed
Remove additional endpoint checks when DNS is unreachable
also, add nil check to dnsEndpoints.Subsets and GetEndpointPortByName
1 parent b418232 commit e4689d5

File tree

2 files changed

+42
-35
lines changed

2 files changed

+42
-35
lines changed

controllers/webspherelibertyapplication_controller.go

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -421,36 +421,39 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
421421
}
422422
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, dnsRule)
423423

424-
// If allowed, add an Egress rule to access the API server.
425-
// Otherwise, if the OpenShift DNS or K8s CoreDNS Egress rule does not provide permissive cluster-wide access
426-
// and the K8s API server could not be found, use a permissive cluster-wide Egress rule.
427-
if apiServerEndpoints, err := r.getEndpoints("kubernetes", "default"); err == nil {
428-
rule := networkingv1.NetworkPolicyEgressRule{}
429-
// Define the port
430-
port := networkingv1.NetworkPolicyPort{}
431-
port.Protocol = &apiServerEndpoints.Subsets[0].Ports[0].Protocol
432-
var portNumber intstr.IntOrString = intstr.FromInt((int)(apiServerEndpoints.Subsets[0].Ports[0].Port))
433-
port.Port = &portNumber
434-
rule.Ports = append(rule.Ports, port)
435-
436-
// Add the endpoint address as ipBlock entries
437-
for _, endpoint := range apiServerEndpoints.Subsets {
438-
for _, address := range endpoint.Addresses {
439-
peer := networkingv1.NetworkPolicyPeer{}
440-
ipBlock := networkingv1.IPBlock{}
441-
ipBlock.CIDR = address.IP + "/32"
442-
443-
peer.IPBlock = &ipBlock
444-
rule.To = append(rule.To, peer)
424+
// If the DNS rule is a specific Egress rule also check if another Egress rule can be created for the API server.
425+
// Otherwise, fallback to a permissive cluster-wide Egress rule.
426+
if !usingPermissiveRule {
427+
if apiServerEndpoints, err := r.getEndpoints("kubernetes", "default"); err == nil {
428+
rule := networkingv1.NetworkPolicyEgressRule{}
429+
// Define the port
430+
port := networkingv1.NetworkPolicyPort{}
431+
port.Protocol = &apiServerEndpoints.Subsets[0].Ports[0].Protocol
432+
var portNumber intstr.IntOrString = intstr.FromInt((int)(apiServerEndpoints.Subsets[0].Ports[0].Port))
433+
port.Port = &portNumber
434+
rule.Ports = append(rule.Ports, port)
435+
436+
// Add the endpoint address as ipBlock entries
437+
for _, endpoint := range apiServerEndpoints.Subsets {
438+
for _, address := range endpoint.Addresses {
439+
peer := networkingv1.NetworkPolicyPeer{}
440+
ipBlock := networkingv1.IPBlock{}
441+
ipBlock.CIDR = address.IP + "/32"
442+
443+
peer.IPBlock = &ipBlock
444+
rule.To = append(rule.To, peer)
445+
}
445446
}
447+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
448+
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
449+
} else {
450+
// The operator couldn't create a rule for the K8s API server so add a permissive Egress rule
451+
rule := networkingv1.NetworkPolicyEgressRule{}
452+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
453+
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
446454
}
447-
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
448-
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
449-
} else if !usingPermissiveRule {
450-
rule := networkingv1.NetworkPolicyEgressRule{}
451-
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
452-
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
453455
}
456+
454457
apiServerNetworkPolicy.Labels = ba.GetLabels()
455458
apiServerNetworkPolicy.Annotations = oputils.MergeMaps(apiServerNetworkPolicy.Annotations, ba.GetAnnotations())
456459
apiServerNetworkPolicy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}
@@ -948,11 +951,13 @@ func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace s
948951
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) (bool, networkingv1.NetworkPolicyEgressRule) {
949952
dnsRule := networkingv1.NetworkPolicyEgressRule{}
950953
if dnsEndpoints, err := r.getEndpoints(endpointsName, endpointsNamespace); err == nil {
951-
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
952-
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
953-
}
954-
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns-tcp"); endpointPort != nil {
955-
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
954+
if len(dnsEndpoints.Subsets) > 0 {
955+
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
956+
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
957+
}
958+
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns-tcp"); endpointPort != nil {
959+
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
960+
}
956961
}
957962
peer := networkingv1.NetworkPolicyPeer{}
958963
peer.NamespaceSelector = &metav1.LabelSelector{

utils/utils.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -789,9 +789,11 @@ func GetRequiredLabels(name string, instance string) map[string]string {
789789
}
790790

791791
func GetEndpointPortByName(endpointPorts *[]corev1.EndpointPort, name string) *corev1.EndpointPort {
792-
for _, endpointPort := range *endpointPorts {
793-
if endpointPort.Name == name {
794-
return &endpointPort
792+
if endpointPorts != nil {
793+
for _, endpointPort := range *endpointPorts {
794+
if endpointPort.Name == name {
795+
return &endpointPort
796+
}
795797
}
796798
}
797799
return nil

0 commit comments

Comments
 (0)