7
7
"github.com/go-logr/logr"
8
8
"github.com/pkg/errors"
9
9
corev1 "k8s.io/api/core/v1"
10
+ "k8s.io/apimachinery/pkg/types"
10
11
"k8s.io/client-go/tools/record"
11
12
"sigs.k8s.io/aws-load-balancer-controller/controllers/service/eventhandlers"
12
13
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
@@ -37,14 +38,17 @@ const (
37
38
func NewServiceReconciler (cloud aws.Cloud , k8sClient client.Client , eventRecorder record.EventRecorder ,
38
39
finalizerManager k8s.FinalizerManager , networkingSGManager networking.SecurityGroupManager ,
39
40
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 {
41
43
42
44
annotationParser := annotations .NewSuffixAnnotationParser (serviceAnnotationPrefix )
43
45
trackingProvider := tracking .NewDefaultProvider (serviceTagPrefix , controllerConfig .ClusterName )
44
46
elbv2TaggingManager := elbv2 .NewDefaultTaggingManager (cloud .ELBV2 (), cloud .VpcID (), controllerConfig .FeatureGates , cloud .RGT (), logger )
45
47
serviceUtils := service .NewServiceUtils (annotationParser , serviceFinalizer , controllerConfig .ServiceConfig .LoadBalancerClass , controllerConfig .FeatureGates )
46
48
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 )
48
52
stackMarshaller := deploy .NewDefaultStackMarshaller ()
49
53
stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , controllerConfig , serviceTagPrefix , logger )
50
54
return & serviceReconciler {
@@ -54,6 +58,7 @@ func NewServiceReconciler(cloud aws.Cloud, k8sClient client.Client, eventRecorde
54
58
annotationParser : annotationParser ,
55
59
loadBalancerClass : controllerConfig .ServiceConfig .LoadBalancerClass ,
56
60
serviceUtils : serviceUtils ,
61
+ backendSGProvider : backendSGProvider ,
57
62
58
63
modelBuilder : modelBuilder ,
59
64
stackMarshaller : stackMarshaller ,
@@ -71,6 +76,7 @@ type serviceReconciler struct {
71
76
annotationParser annotations.Parser
72
77
loadBalancerClass string
73
78
serviceUtils service.ServiceUtils
79
+ backendSGProvider networking.BackendSGProvider
74
80
75
81
modelBuilder service.ModelBuilder
76
82
stackMarshaller deploy.StackMarshaller
@@ -93,29 +99,29 @@ func (r *serviceReconciler) reconcile(ctx context.Context, req ctrl.Request) err
93
99
if err := r .k8sClient .Get (ctx , req .NamespacedName , svc ); err != nil {
94
100
return client .IgnoreNotFound (err )
95
101
}
96
- stack , lb , err := r .buildModel (ctx , svc )
102
+ stack , lb , backendSGRequired , err := r .buildModel (ctx , svc )
97
103
if err != nil {
98
104
return err
99
105
}
100
106
if lb == nil {
101
107
return r .cleanupLoadBalancerResources (ctx , svc , stack )
102
108
}
103
- return r .reconcileLoadBalancerResources (ctx , svc , stack , lb )
109
+ return r .reconcileLoadBalancerResources (ctx , svc , stack , lb , backendSGRequired )
104
110
}
105
111
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 )
108
114
if err != nil {
109
115
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
111
117
}
112
118
stackJSON , err := r .stackMarshaller .Marshal (stack )
113
119
if err != nil {
114
120
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
116
122
}
117
123
r .logger .Info ("successfully built model" , "model" , stackJSON )
118
- return stack , lb , nil
124
+ return stack , lb , backendSGRequired , nil
119
125
}
120
126
121
127
func (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
128
134
return nil
129
135
}
130
136
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 {
132
139
if err := r .finalizerManager .AddFinalizers (ctx , svc , serviceFinalizer ); err != nil {
133
140
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add finalizer due to %v" , err ))
134
141
return err
@@ -142,6 +149,12 @@ func (r *serviceReconciler) reconcileLoadBalancerResources(ctx context.Context,
142
149
return err
143
150
}
144
151
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
+
145
158
if err = r .updateServiceStatus (ctx , lbDNS , svc ); err != nil {
146
159
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
147
160
return err
@@ -156,6 +169,9 @@ func (r *serviceReconciler) cleanupLoadBalancerResources(ctx context.Context, sv
156
169
if err != nil {
157
170
return err
158
171
}
172
+ if err := r .backendSGProvider .Release (ctx , networking .ResourceTypeService , []types.NamespacedName {k8s .NamespacedName (svc )}); err != nil {
173
+ return err
174
+ }
159
175
if err = r .cleanupServiceStatus (ctx , svc ); err != nil {
160
176
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedCleanupStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
161
177
return err
0 commit comments