@@ -58,6 +58,7 @@ type ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite st
58
58
EffectivePolicyIntentsReconciler * intents_reconcilers.ServiceEffectivePolicyIntentsReconciler
59
59
podWatcher * pod_reconcilers.PodWatcher
60
60
defaultDenyReconciler * protected_service_reconcilers.DefaultDenyReconciler
61
+ netpolHandler * external_traffic.NetworkPolicyHandler
61
62
}
62
63
63
64
func (s * ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite ) SetupSuite () {
@@ -105,7 +106,7 @@ func (s *ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuit
105
106
Namespace : ingressControllerNamespace ,
106
107
Name : ingressControllerName ,
107
108
},
108
- })
109
+ }, false )
109
110
s .defaultDenyReconciler = protected_service_reconcilers .NewDefaultDenyReconciler (s .Mgr .GetClient (), netpolHandler , true )
110
111
netpolReconciler := networkpolicy .NewReconciler (s .Mgr .GetClient (), s .TestEnv .Scheme , netpolHandler , []string {}, goset .NewSet [string ](), true , defaultActive , []networkpolicy.IngressRuleBuilder {builders .NewIngressNetpolBuilder (), builders .NewPortNetworkPolicyReconciler (s .Mgr .GetClient ())}, nil )
111
112
serviceIdResolver := serviceidresolver .NewResolver (s .Mgr .GetClient ())
@@ -123,6 +124,8 @@ func (s *ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuit
123
124
s .IngressReconciler .InjectRecorder (recorder )
124
125
s .Require ().NoError (err )
125
126
127
+ s .netpolHandler = netpolHandler
128
+
126
129
controller := gomock .NewController (s .T ())
127
130
serviceEffectivePolicyReconciler := podreconcilersmocks .NewMockGroupReconciler (controller )
128
131
s .podWatcher = pod_reconcilers .NewPodWatcher (s .Mgr .GetClient (), recorder , []string {}, true , true , goset .NewSet [string ](), & mocks.MockIntentsReconcilerForTestEnv {}, serviceEffectivePolicyReconciler )
@@ -899,7 +902,7 @@ func (s *ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuit
899
902
Name : ingressControllerName ,
900
903
Kind : "Deployment" ,
901
904
},
902
- })
905
+ }, false )
903
906
endpointReconcilerWithEnforcementDisabled := external_traffic .NewEndpointsReconciler (s .Mgr .GetClient (), netpolHandler )
904
907
recorder := record .NewFakeRecorder (10 )
905
908
endpointReconcilerWithEnforcementDisabled .InjectRecorder (recorder )
@@ -925,6 +928,145 @@ func (s *ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuit
925
928
}
926
929
}
927
930
931
+ func (s * ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite ) TestNetworkPolicyForAWSALBExemption_enabled () {
932
+ serviceName := "ingress-service"
933
+ ingressName := "test-ingress-alb"
934
+ ingressNamespace := s .TestNamespace
935
+ s .netpolHandler .SetIngressControllerALBAllowAll (true )
936
+
937
+ // Add Ingress with the annotation "alb.ingress.kubernetes.io/scheme": "internet-facing"
938
+ ingress := s .AddIngressWithAnnotation (ingressName , ingressNamespace , serviceName , map [string ]string {
939
+ "alb.ingress.kubernetes.io/scheme" : "internet-facing" ,
940
+ })
941
+
942
+ intents , err := s .AddIntents ("test-intents" , "test-client" , "Deployment" , []otterizev2alpha1.Target {{
943
+ Service : & otterizev2alpha1.ServiceTarget {Name : ingress .Spec .Rules [0 ].HTTP .Paths [0 ].Backend .Service .Name },
944
+ },
945
+ })
946
+ s .Require ().NoError (err )
947
+
948
+ _ , err = s .EffectivePolicyIntentsReconciler .Reconcile (context .Background (), ctrl.Request {
949
+ NamespacedName : types.NamespacedName {
950
+ Namespace : intents .Namespace ,
951
+ Name : intents .Name ,
952
+ },
953
+ })
954
+
955
+ s .Require ().NoError (err )
956
+
957
+ // Reconcile the ingress
958
+ res , err := s .IngressReconciler .Reconcile (context .Background (), ctrl.Request {
959
+ NamespacedName : types.NamespacedName {Namespace : ingressNamespace , Name : ingressName },
960
+ })
961
+ s .Require ().NoError (err )
962
+ s .Require ().Empty (res )
963
+
964
+ // Verify that the network policy allows all ingress traffic
965
+ np := & v1.NetworkPolicy {}
966
+ policyName := fmt .Sprintf (external_traffic .OtterizeExternalNetworkPolicyNameTemplate , serviceName )
967
+ s .WaitUntilCondition (func (assert * assert.Assertions ) {
968
+ err := s .Mgr .GetClient ().Get (context .Background (), types.NamespacedName {Namespace : ingressNamespace , Name : policyName }, np )
969
+ assert .NoError (err )
970
+ assert .NotEmpty (np )
971
+ assert .Len (np .Spec .Ingress , 1 )
972
+ if len (np .Spec .Ingress ) == 1 {
973
+ assert .Len (np .Spec .Ingress [0 ].From , 0 ) // Allow all ingress traffic
974
+ }
975
+ })
976
+ }
977
+
978
+ func (s * ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite ) TestNetworkPolicyForAWSALBExemption_disabled () {
979
+ serviceName := "ingress-service"
980
+ ingressName := "test-ingress-alb"
981
+ ingressNamespace := s .TestNamespace
982
+ s .netpolHandler .SetIngressControllerALBAllowAll (false )
983
+
984
+ // Add Ingress with the annotation "alb.ingress.kubernetes.io/scheme": "internet-facing"
985
+ ingress := s .AddIngressWithAnnotation (ingressName , ingressNamespace , serviceName , map [string ]string {
986
+ "alb.ingress.kubernetes.io/scheme" : "internet-facing" ,
987
+ })
988
+
989
+ intents , err := s .AddIntents ("test-intents" , "test-client" , "Deployment" , []otterizev2alpha1.Target {{
990
+ Service : & otterizev2alpha1.ServiceTarget {Name : ingress .Spec .Rules [0 ].HTTP .Paths [0 ].Backend .Service .Name },
991
+ },
992
+ })
993
+ s .Require ().NoError (err )
994
+
995
+ _ , err = s .EffectivePolicyIntentsReconciler .Reconcile (context .Background (), ctrl.Request {
996
+ NamespacedName : types.NamespacedName {
997
+ Namespace : intents .Namespace ,
998
+ Name : intents .Name ,
999
+ },
1000
+ })
1001
+
1002
+ s .Require ().NoError (err )
1003
+
1004
+ // Reconcile the ingress
1005
+ res , err := s .IngressReconciler .Reconcile (context .Background (), ctrl.Request {
1006
+ NamespacedName : types.NamespacedName {Namespace : ingressNamespace , Name : ingressName },
1007
+ })
1008
+ s .Require ().NoError (err )
1009
+ s .Require ().Empty (res )
1010
+
1011
+ // Verify that the network policy allows all ingress traffic
1012
+ np := & v1.NetworkPolicy {}
1013
+ policyName := fmt .Sprintf (external_traffic .OtterizeExternalNetworkPolicyNameTemplate , serviceName )
1014
+ s .WaitUntilCondition (func (assert * assert.Assertions ) {
1015
+ err := s .Mgr .GetClient ().Get (context .Background (), types.NamespacedName {Namespace : ingressNamespace , Name : policyName }, np )
1016
+ assert .NoError (err )
1017
+ assert .NotEmpty (np )
1018
+ assert .Len (np .Spec .Ingress , 1 )
1019
+ if len (np .Spec .Ingress ) == 1 {
1020
+ assert .Len (np .Spec .Ingress [0 ].From , 1 ) // Only allow traffic from the ingress controller
1021
+ }
1022
+ })
1023
+ }
1024
+
1025
+ func (s * ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite ) AddIngressWithAnnotation (name , namespace , serviceName string , annotations map [string ]string ) * v1.Ingress {
1026
+ ingress := & v1.Ingress {
1027
+ ObjectMeta : metav1.ObjectMeta {
1028
+ Name : name ,
1029
+ Namespace : namespace ,
1030
+ Annotations : annotations ,
1031
+ },
1032
+ Spec : v1.IngressSpec {
1033
+ Rules : []v1.IngressRule {
1034
+ {
1035
+ Host : "example.com" ,
1036
+ IngressRuleValue : v1.IngressRuleValue {
1037
+ HTTP : & v1.HTTPIngressRuleValue {
1038
+ Paths : []v1.HTTPIngressPath {
1039
+ {
1040
+ Path : "/" ,
1041
+ PathType : lo .ToPtr (v1 .PathTypePrefix ),
1042
+ Backend : v1.IngressBackend {
1043
+ Service : & v1.IngressServiceBackend {
1044
+ Name : serviceName ,
1045
+ Port : v1.ServiceBackendPort {
1046
+ Number : 80 ,
1047
+ },
1048
+ },
1049
+ },
1050
+ },
1051
+ },
1052
+ },
1053
+ },
1054
+ },
1055
+ },
1056
+ },
1057
+ }
1058
+ s .Require ().NoError (s .Mgr .GetClient ().Create (context .Background (), ingress ))
1059
+ s .WaitForObjectToBeCreated (ingress )
1060
+
1061
+ s .AddDeploymentWithService (serviceName , []string {"3.3.3.3" }, map [string ]string {"app" : "test" }, nil )
1062
+
1063
+ // the ingress reconciler expect the pod watcher labels in order to work
1064
+ _ , err := s .podWatcher .Reconcile (context .Background (), ctrl.Request {NamespacedName : types.NamespacedName {Namespace : s .TestNamespace , Name : serviceName + "-0" }})
1065
+ s .Require ().NoError (err )
1066
+
1067
+ return ingress
1068
+ }
1069
+
928
1070
func TestExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite (t * testing.T ) {
929
1071
suite .Run (t , new (ExternalNetworkPolicyReconcilerWithIngressControllersConfiguredTestSuite ))
930
1072
}
0 commit comments