Skip to content

Commit fff50df

Browse files
kabicinKirby Chin
authored andcommitted
Remove additional endpoint checks when DNS is unreachable
also, add nil check to dnsEndpoints.Subsets and GetEndpointPortByName
1 parent 0946593 commit fff50df

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
@@ -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
953956
func (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{

utils/utils.go

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

778778
func GetEndpointPortByName(endpointPorts *[]corev1.EndpointPort, name string) *corev1.EndpointPort {
779-
for _, endpointPort := range *endpointPorts {
780-
if endpointPort.Name == name {
781-
return &endpointPort
779+
if endpointPorts != nil {
780+
for _, endpointPort := range *endpointPorts {
781+
if endpointPort.Name == name {
782+
return &endpointPort
783+
}
782784
}
783785
}
784786
return nil

0 commit comments

Comments
 (0)