@@ -41,15 +41,18 @@ func NewServiceReconciler(cloud aws.Cloud, k8sClient client.Client, eventRecorde
41
41
annotationParser := annotations .NewSuffixAnnotationParser (serviceAnnotationPrefix )
42
42
trackingProvider := tracking .NewDefaultProvider (serviceTagPrefix , config .ClusterName )
43
43
elbv2TaggingManager := elbv2 .NewDefaultTaggingManager (cloud .ELBV2 (), cloud .VpcID (), config .FeatureGates , logger )
44
+ serviceUtils := service .NewServiceUtils (annotationParser , serviceFinalizer , config .ServiceConfig .LoadBalancerClass , config .FeatureGates )
44
45
modelBuilder := service .NewDefaultModelBuilder (annotationParser , subnetsResolver , vpcInfoProvider , cloud .VpcID (), trackingProvider ,
45
- elbv2TaggingManager , config .ClusterName , config .DefaultTags , config .ExternalManagedTags , config .DefaultSSLPolicy )
46
+ elbv2TaggingManager , config .ClusterName , config .DefaultTags , config .ExternalManagedTags , config .DefaultSSLPolicy , serviceUtils )
46
47
stackMarshaller := deploy .NewDefaultStackMarshaller ()
47
48
stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , config , serviceTagPrefix , logger )
48
49
return & serviceReconciler {
49
- k8sClient : k8sClient ,
50
- eventRecorder : eventRecorder ,
51
- finalizerManager : finalizerManager ,
52
- annotationParser : annotationParser ,
50
+ k8sClient : k8sClient ,
51
+ eventRecorder : eventRecorder ,
52
+ finalizerManager : finalizerManager ,
53
+ annotationParser : annotationParser ,
54
+ loadBalancerClass : config .ServiceConfig .LoadBalancerClass ,
55
+ serviceUtils : serviceUtils ,
53
56
54
57
modelBuilder : modelBuilder ,
55
58
stackMarshaller : stackMarshaller ,
@@ -61,10 +64,12 @@ func NewServiceReconciler(cloud aws.Cloud, k8sClient client.Client, eventRecorde
61
64
}
62
65
63
66
type serviceReconciler struct {
64
- k8sClient client.Client
65
- eventRecorder record.EventRecorder
66
- finalizerManager k8s.FinalizerManager
67
- annotationParser annotations.Parser
67
+ k8sClient client.Client
68
+ eventRecorder record.EventRecorder
69
+ finalizerManager k8s.FinalizerManager
70
+ annotationParser annotations.Parser
71
+ loadBalancerClass string
72
+ serviceUtils service.ServiceUtils
68
73
69
74
modelBuilder service.ModelBuilder
70
75
stackMarshaller deploy.StackMarshaller
@@ -87,13 +92,17 @@ func (r *serviceReconciler) reconcile(ctx context.Context, req ctrl.Request) err
87
92
if err := r .k8sClient .Get (ctx , req .NamespacedName , svc ); err != nil {
88
93
return client .IgnoreNotFound (err )
89
94
}
90
- if ! svc .DeletionTimestamp .IsZero () {
91
- return r .cleanupLoadBalancerResources (ctx , svc )
95
+ stack , lb , err := r .buildModel (ctx , svc )
96
+ if err != nil {
97
+ return err
92
98
}
93
- return r .reconcileLoadBalancerResources (ctx , svc )
99
+ if lb == nil {
100
+ return r .cleanupLoadBalancerResources (ctx , svc , stack )
101
+ }
102
+ return r .reconcileLoadBalancerResources (ctx , svc , stack , lb )
94
103
}
95
104
96
- func (r * serviceReconciler ) buildAndDeployModel (ctx context.Context , svc * corev1.Service ) (core.Stack , * elbv2model.LoadBalancer , error ) {
105
+ func (r * serviceReconciler ) buildModel (ctx context.Context , svc * corev1.Service ) (core.Stack , * elbv2model.LoadBalancer , error ) {
97
106
stack , lb , err := r .modelBuilder .Build (ctx , svc )
98
107
if err != nil {
99
108
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
@@ -105,22 +114,25 @@ func (r *serviceReconciler) buildAndDeployModel(ctx context.Context, svc *corev1
105
114
return nil , nil , err
106
115
}
107
116
r .logger .Info ("successfully built model" , "model" , stackJSON )
117
+ return stack , lb , nil
118
+ }
108
119
109
- if err = r .stackDeployer .Deploy (ctx , stack ); err != nil {
120
+ func (r * serviceReconciler ) deployModel (ctx context.Context , svc * corev1.Service , stack core.Stack ) error {
121
+ if err := r .stackDeployer .Deploy (ctx , stack ); err != nil {
110
122
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedDeployModel , fmt .Sprintf ("Failed deploy model due to %v" , err ))
111
- return nil , nil , err
123
+ return err
112
124
}
113
125
r .logger .Info ("successfully deployed model" , "service" , k8s .NamespacedName (svc ))
114
126
115
- return stack , lb , nil
127
+ return nil
116
128
}
117
129
118
- func (r * serviceReconciler ) reconcileLoadBalancerResources (ctx context.Context , svc * corev1.Service ) error {
130
+ func (r * serviceReconciler ) reconcileLoadBalancerResources (ctx context.Context , svc * corev1.Service , stack core. Stack , lb * elbv2model. LoadBalancer ) error {
119
131
if err := r .finalizerManager .AddFinalizers (ctx , svc , serviceFinalizer ); err != nil {
120
132
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add finalizer due to %v" , err ))
121
133
return err
122
134
}
123
- _ , lb , err := r .buildAndDeployModel (ctx , svc )
135
+ err := r .deployModel (ctx , svc , stack )
124
136
if err != nil {
125
137
return err
126
138
}
@@ -137,12 +149,16 @@ func (r *serviceReconciler) reconcileLoadBalancerResources(ctx context.Context,
137
149
return nil
138
150
}
139
151
140
- func (r * serviceReconciler ) cleanupLoadBalancerResources (ctx context.Context , svc * corev1.Service ) error {
152
+ func (r * serviceReconciler ) cleanupLoadBalancerResources (ctx context.Context , svc * corev1.Service , stack core. Stack ) error {
141
153
if k8s .HasFinalizer (svc , serviceFinalizer ) {
142
- _ , _ , err := r .buildAndDeployModel (ctx , svc )
154
+ err := r .deployModel (ctx , svc , stack )
143
155
if err != nil {
144
156
return err
145
157
}
158
+ if err = r .cleanupServiceStatus (ctx , svc ); err != nil {
159
+ r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedCleanupStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
160
+ return err
161
+ }
146
162
if err := r .finalizerManager .RemoveFinalizers (ctx , svc , serviceFinalizer ); err != nil {
147
163
r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedRemoveFinalizer , fmt .Sprintf ("Failed remove finalizer due to %v" , err ))
148
164
return err
@@ -168,6 +184,15 @@ func (r *serviceReconciler) updateServiceStatus(ctx context.Context, lbDNS strin
168
184
return nil
169
185
}
170
186
187
+ func (r * serviceReconciler ) cleanupServiceStatus (ctx context.Context , svc * corev1.Service ) error {
188
+ svcOld := svc .DeepCopy ()
189
+ svc .Status .LoadBalancer = corev1.LoadBalancerStatus {}
190
+ if err := r .k8sClient .Status ().Patch (ctx , svc , client .MergeFrom (svcOld )); err != nil {
191
+ return errors .Wrapf (err , "failed to cleanup service status: %v" , k8s .NamespacedName (svc ))
192
+ }
193
+ return nil
194
+ }
195
+
171
196
func (r * serviceReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager ) error {
172
197
c , err := controller .New (controllerName , mgr , controller.Options {
173
198
MaxConcurrentReconciles : r .maxConcurrentReconciles ,
@@ -183,8 +208,8 @@ func (r *serviceReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manag
183
208
}
184
209
185
210
func (r * serviceReconciler ) setupWatches (_ context.Context , c controller.Controller ) error {
186
- svcEventHandler := eventhandlers .NewEnqueueRequestForServiceEvent (r .eventRecorder , r . annotationParser ,
187
- r .logger .WithName ("eventHandlers" ).WithName ("service" ))
211
+ svcEventHandler := eventhandlers .NewEnqueueRequestForServiceEvent (r .eventRecorder ,
212
+ r .serviceUtils , r . logger .WithName ("eventHandlers" ).WithName ("service" ))
188
213
if err := c .Watch (& source.Kind {Type : & corev1.Service {}}, svcEventHandler ); err != nil {
189
214
return err
190
215
}
0 commit comments