Skip to content

Commit b6155ee

Browse files
committed
Add DNS network policy for OCP
1 parent 392ae73 commit b6155ee

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

controllers/webspherelibertyapplication_controller.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,7 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
398398
common.StatusConditionTypeReconciled, instance)
399399
}
400400

401-
// Kube API Server NetworkPolicy (credit to Martin Smithson)
402-
reqLogger.Info("Start API Server Network Policy Reconcile")
401+
// Kube API Server NetworkPolicy (based upon impl. by Martin Smithson)
403402
apiServerNetworkPolicy := &networkingv1.NetworkPolicy{ObjectMeta: metav1.ObjectMeta{
404403
Name: instance.Name + "-egress-apiserver-access",
405404
Namespace: instance.Namespace,
@@ -409,8 +408,30 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
409408
OperatorAllowAPIServerAccessLabel: "true",
410409
},
411410
}
411+
// Add OpenShift DNS NetworkPolicy (if applicable)
412+
if r.IsOpenShift() {
413+
dnsRule := networkingv1.NetworkPolicyEgressRule{}
414+
if dnsEndpoints, err := r.getEndpoints("dns-default", "openshift-dns"); err == nil {
415+
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
416+
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
417+
}
418+
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns-tcp"); endpointPort != nil {
419+
dnsRule.Ports = append(dnsRule.Ports, lutils.CreateNetworkPolicyPortFromEndpointPort(endpointPort))
420+
}
421+
reqLogger.Info("Found endpoints for dns-default service in the openshift-dns namespace")
422+
} else {
423+
peer := networkingv1.NetworkPolicyPeer{}
424+
peer.NamespaceSelector = &metav1.LabelSelector{
425+
MatchLabels: map[string]string{},
426+
}
427+
dnsRule.To = append(dnsRule.To, peer)
428+
reqLogger.Info("Failed to retrieve endpoints for dns-default service in the openshift-dns namespace. Using more permissive rule.")
429+
}
430+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, dnsRule)
431+
}
432+
412433
rule := networkingv1.NetworkPolicyEgressRule{}
413-
if apiServerEndpoints, err := r.getKubeAPIServerEndpoints(); err == nil {
434+
if apiServerEndpoints, err := r.getEndpoints("kubernetes", "default"); err == nil {
414435
// Define the port
415436
port := networkingv1.NetworkPolicyPort{}
416437
port.Protocol = &apiServerEndpoints.Subsets[0].Ports[0].Protocol
@@ -941,9 +962,7 @@ func shouldDeleteRoute(ba common.BaseComponent) bool {
941962
return false
942963
}
943964

944-
func (r *ReconcileWebSphereLiberty) getKubeAPIServerEndpoints() (*corev1.Endpoints, error) {
945-
serviceName := "kubernetes"
946-
namespace := "default"
965+
func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace string) (*corev1.Endpoints, error) {
947966
endpoints := &corev1.Endpoints{}
948967
if err := r.GetClient().Get(context.TODO(), types.NamespacedName{Name: serviceName, Namespace: namespace}, endpoints); err != nil {
949968
return nil, err

utils/utils.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"strconv"
2626
"strings"
2727

28+
networkingv1 "k8s.io/api/networking/v1"
29+
2830
wlv1 "github.com/WASdev/websphere-liberty-operator/api/v1"
2931
rcoutils "github.com/application-stacks/runtime-component-operator/utils"
3032
routev1 "github.com/openshift/api/route/v1"
@@ -34,6 +36,7 @@ import (
3436
"k8s.io/apimachinery/pkg/api/resource"
3537
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3638
"k8s.io/apimachinery/pkg/types"
39+
"k8s.io/apimachinery/pkg/util/intstr"
3740
"k8s.io/client-go/kubernetes"
3841
"k8s.io/client-go/kubernetes/scheme"
3942
"k8s.io/client-go/rest"
@@ -784,3 +787,20 @@ func GetRequiredLabels(name string, instance string) map[string]string {
784787
requiredLabels["app.kubernetes.io/managed-by"] = "websphere-liberty-operator"
785788
return requiredLabels
786789
}
790+
791+
func GetEndpointPortByName(endpointPorts *[]corev1.EndpointPort, name string) *corev1.EndpointPort {
792+
for _, endpointPort := range *endpointPorts {
793+
if endpointPort.Name == name {
794+
return &endpointPort
795+
}
796+
}
797+
return nil
798+
}
799+
800+
func CreateNetworkPolicyPortFromEndpointPort(endpointPort *corev1.EndpointPort) networkingv1.NetworkPolicyPort {
801+
port := networkingv1.NetworkPolicyPort{}
802+
port.Protocol = &endpointPort.Protocol
803+
var portNumber intstr.IntOrString = intstr.FromInt((int)(endpointPort.Port))
804+
port.Port = &portNumber
805+
return port
806+
}

0 commit comments

Comments
 (0)