77 "github.com/go-logr/logr"
88 "github.com/pkg/errors"
99 corev1 "k8s.io/api/core/v1"
10+ "k8s.io/apimachinery/pkg/types"
1011 "k8s.io/client-go/tools/record"
1112 "sigs.k8s.io/aws-load-balancer-controller/controllers/service/eventhandlers"
1213 "sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
@@ -37,14 +38,17 @@ const (
3738func NewServiceReconciler (cloud aws.Cloud , k8sClient client.Client , eventRecorder record.EventRecorder ,
3839 finalizerManager k8s.FinalizerManager , networkingSGManager networking.SecurityGroupManager ,
3940 networkingSGReconciler networking.SecurityGroupReconciler , subnetsResolver networking.SubnetsResolver ,
40- vpcInfoProvider networking.VPCInfoProvider , controllerConfig config.ControllerConfig , logger logr.Logger ) * serviceReconciler {
41+ vpcInfoProvider networking.VPCInfoProvider , controllerConfig config.ControllerConfig ,
42+ backendSGProvider networking.BackendSGProvider , sgResolver networking.SecurityGroupResolver , logger logr.Logger ) * serviceReconciler {
4143
4244 annotationParser := annotations .NewSuffixAnnotationParser (serviceAnnotationPrefix )
4345 trackingProvider := tracking .NewDefaultProvider (serviceTagPrefix , controllerConfig .ClusterName )
4446 elbv2TaggingManager := elbv2 .NewDefaultTaggingManager (cloud .ELBV2 (), cloud .VpcID (), controllerConfig .FeatureGates , cloud .RGT (), logger )
4547 serviceUtils := service .NewServiceUtils (annotationParser , serviceFinalizer , controllerConfig .ServiceConfig .LoadBalancerClass , controllerConfig .FeatureGates )
4648 modelBuilder := service .NewDefaultModelBuilder (annotationParser , subnetsResolver , vpcInfoProvider , cloud .VpcID (), trackingProvider ,
47- elbv2TaggingManager , controllerConfig .FeatureGates , controllerConfig .ClusterName , controllerConfig .DefaultTags , controllerConfig .ExternalManagedTags , controllerConfig .DefaultSSLPolicy , controllerConfig .DefaultTargetType , controllerConfig .FeatureGates .Enabled (config .EnableIPTargetType ), serviceUtils )
49+ elbv2TaggingManager , cloud .EC2 (), controllerConfig .FeatureGates , controllerConfig .ClusterName , controllerConfig .DefaultTags , controllerConfig .ExternalManagedTags ,
50+ controllerConfig .DefaultSSLPolicy , controllerConfig .DefaultTargetType , controllerConfig .FeatureGates .Enabled (config .EnableIPTargetType ), serviceUtils ,
51+ backendSGProvider , sgResolver , controllerConfig .EnableBackendSecurityGroup , controllerConfig .DisableRestrictedSGRules )
4852 stackMarshaller := deploy .NewDefaultStackMarshaller ()
4953 stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , controllerConfig , serviceTagPrefix , logger )
5054 return & serviceReconciler {
@@ -54,6 +58,7 @@ func NewServiceReconciler(cloud aws.Cloud, k8sClient client.Client, eventRecorde
5458 annotationParser : annotationParser ,
5559 loadBalancerClass : controllerConfig .ServiceConfig .LoadBalancerClass ,
5660 serviceUtils : serviceUtils ,
61+ backendSGProvider : backendSGProvider ,
5762
5863 modelBuilder : modelBuilder ,
5964 stackMarshaller : stackMarshaller ,
@@ -71,6 +76,7 @@ type serviceReconciler struct {
7176 annotationParser annotations.Parser
7277 loadBalancerClass string
7378 serviceUtils service.ServiceUtils
79+ backendSGProvider networking.BackendSGProvider
7480
7581 modelBuilder service.ModelBuilder
7682 stackMarshaller deploy.StackMarshaller
@@ -93,29 +99,29 @@ func (r *serviceReconciler) reconcile(ctx context.Context, req ctrl.Request) err
9399 if err := r .k8sClient .Get (ctx , req .NamespacedName , svc ); err != nil {
94100 return client .IgnoreNotFound (err )
95101 }
96- stack , lb , err := r .buildModel (ctx , svc )
102+ stack , lb , backendSGRequired , err := r .buildModel (ctx , svc )
97103 if err != nil {
98104 return err
99105 }
100106 if lb == nil {
101107 return r .cleanupLoadBalancerResources (ctx , svc , stack )
102108 }
103- return r .reconcileLoadBalancerResources (ctx , svc , stack , lb )
109+ return r .reconcileLoadBalancerResources (ctx , svc , stack , lb , backendSGRequired )
104110}
105111
106- func (r * serviceReconciler ) buildModel (ctx context.Context , svc * corev1.Service ) (core.Stack , * elbv2model.LoadBalancer , error ) {
107- stack , lb , err := r .modelBuilder .Build (ctx , svc )
112+ func (r * serviceReconciler ) buildModel (ctx context.Context , svc * corev1.Service ) (core.Stack , * elbv2model.LoadBalancer , bool , error ) {
113+ stack , lb , backendSGRequired , err := r .modelBuilder .Build (ctx , svc )
108114 if err != nil {
109115 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
110- return nil , nil , err
116+ return nil , nil , false , err
111117 }
112118 stackJSON , err := r .stackMarshaller .Marshal (stack )
113119 if err != nil {
114120 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
115- return nil , nil , err
121+ return nil , nil , false , err
116122 }
117123 r .logger .Info ("successfully built model" , "model" , stackJSON )
118- return stack , lb , nil
124+ return stack , lb , backendSGRequired , nil
119125}
120126
121127func (r * serviceReconciler ) deployModel (ctx context.Context , svc * corev1.Service , stack core.Stack ) error {
@@ -128,7 +134,8 @@ func (r *serviceReconciler) deployModel(ctx context.Context, svc *corev1.Service
128134 return nil
129135}
130136
131- func (r * serviceReconciler ) reconcileLoadBalancerResources (ctx context.Context , svc * corev1.Service , stack core.Stack , lb * elbv2model.LoadBalancer ) error {
137+ func (r * serviceReconciler ) reconcileLoadBalancerResources (ctx context.Context , svc * corev1.Service , stack core.Stack ,
138+ lb * elbv2model.LoadBalancer , backendSGRequired bool ) error {
132139 if err := r .finalizerManager .AddFinalizers (ctx , svc , serviceFinalizer ); err != nil {
133140 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add finalizer due to %v" , err ))
134141 return err
@@ -142,6 +149,12 @@ func (r *serviceReconciler) reconcileLoadBalancerResources(ctx context.Context,
142149 return err
143150 }
144151
152+ if ! backendSGRequired {
153+ if err := r .backendSGProvider .Release (ctx , networking .ResourceTypeService , []types.NamespacedName {k8s .NamespacedName (svc )}); err != nil {
154+ return err
155+ }
156+ }
157+
145158 if err = r .updateServiceStatus (ctx , lbDNS , svc ); err != nil {
146159 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
147160 return err
@@ -156,6 +169,9 @@ func (r *serviceReconciler) cleanupLoadBalancerResources(ctx context.Context, sv
156169 if err != nil {
157170 return err
158171 }
172+ if err := r .backendSGProvider .Release (ctx , networking .ResourceTypeService , []types.NamespacedName {k8s .NamespacedName (svc )}); err != nil {
173+ return err
174+ }
159175 if err = r .cleanupServiceStatus (ctx , svc ); err != nil {
160176 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedCleanupStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
161177 return err
0 commit comments