@@ -15,8 +15,6 @@ package crds
1515
1616import (
1717 "context"
18- "fmt"
19- "strings"
2018 "time"
2119
2220 "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1alpha1"
@@ -28,7 +26,6 @@ import (
2826 "github.com/go-logr/logr"
2927 "github.com/prometheus/client_golang/prometheus"
3028 v1 "k8s.io/api/core/v1"
31- "k8s.io/apimachinery/pkg/api/errors"
3229 apierrors "k8s.io/apimachinery/pkg/api/errors"
3330 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3431 "k8s.io/apimachinery/pkg/runtime"
@@ -133,8 +130,8 @@ func (r *CNINodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
133130
134131 if cniNode .GetDeletionTimestamp ().IsZero () {
135132 cniNodeCopy := cniNode .DeepCopy ()
136- shouldPatch , err := r .ensureTagsAndLabels (cniNodeCopy , node , nodeFound )
137- shouldPatch = r . ensureFinalizer (cniNodeCopy ) || shouldPatch
133+ shouldPatch , err := r .ensureTagsAndLabels (cniNodeCopy , node )
134+ shouldPatch = controllerutil . AddFinalizer (cniNodeCopy , config . NodeTerminationFinalizer ) || shouldPatch
138135
139136 if shouldPatch {
140137 r .log .Info ("patching CNINode to add fields Tags, Labels and finalizer" , "cninode" , cniNode .Name )
@@ -147,24 +144,26 @@ func (r *CNINodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
147144 }
148145 }
149146 return ctrl.Result {}, err
150-
151147 } else { // CNINode is marked for deletion
152148 if ! nodeFound {
153149 // node is also deleted, proceed with running the cleanup routine and remove the finalizer
154-
155150 // run cleanup for Linux nodes only
156151 if val , ok := cniNode .ObjectMeta .Labels [config .NodeLabelOS ]; ok && val == config .OSLinux {
157152 r .log .Info ("running the finalizer routine on cniNode" , "cniNode" , cniNode .Name )
158153 // run cleanup when node id is present
159154 if nodeID , ok := cniNode .Spec .Tags [config .NetworkInterfaceNodeIDKey ]; ok && nodeID != "" {
160- if err := r .newResourceCleaner (nodeID , r .eC2Wrapper , r .vpcId , r .log ).DeleteLeakedResources (); err != nil {
161- r .log .Error (err , "failed to cleanup resources during node termination" )
162- ec2API .NodeTerminationENICleanupFailure .Inc ()
163- }
155+ go func (nodeID string ) {
156+ childCtx , cancel := context .WithTimeout (ctx , config .NodeTerminationTimeout )
157+ defer cancel ()
158+ if err := r .newResourceCleaner (nodeID , r .eC2Wrapper , r .vpcId , r .log ).DeleteLeakedResources (childCtx ); err != nil {
159+ r .log .Error (err , "failed to cleanup resources during node termination" )
160+ ec2API .NodeTerminationENICleanupFailure .Inc ()
161+ }
162+ }(nodeID )
164163 }
165164 }
166165
167- if err := r .removeFinalizers (ctx , cniNode , config .NodeTerminationFinalizer ); err != nil {
166+ if err := r .removeFinalizer (ctx , cniNode , config .NodeTerminationFinalizer ); err != nil {
168167 r .log .Error (err , "failed to remove finalizer on CNINode, will retry" , "cniNode" , cniNode .Name , "finalizer" , config .NodeTerminationFinalizer )
169168 if apierrors .IsConflict (err ) {
170169 return ctrl.Result {Requeue : true }, nil
@@ -188,7 +187,7 @@ func (r *CNINodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
188187 Spec : cniNode .Spec ,
189188 }
190189
191- if err := r .removeFinalizers (ctx , cniNode , config .NodeTerminationFinalizer ); err != nil {
190+ if err := r .removeFinalizer (ctx , cniNode , config .NodeTerminationFinalizer ); err != nil {
192191 r .log .Error (err , "failed to remove finalizer on CNINode, will retry" )
193192 return ctrl.Result {}, err
194193 }
@@ -233,7 +232,7 @@ func (r *CNINodeReconciler) waitTillCNINodeDeleted(nameSpacedCNINode types.Names
233232 oldCNINode := & v1alpha1.CNINode {}
234233
235234 return wait .PollUntilContextTimeout (context .TODO (), 500 * time .Millisecond , time .Second * 3 , true , func (ctx context.Context ) (bool , error ) {
236- if err := r .Client .Get (ctx , nameSpacedCNINode , oldCNINode ); err != nil && errors .IsNotFound (err ) {
235+ if err := r .Client .Get (ctx , nameSpacedCNINode , oldCNINode ); err != nil && apierrors .IsNotFound (err ) {
237236 return true , nil
238237 }
239238 return false , nil
@@ -248,17 +247,7 @@ func (r *CNINodeReconciler) createCNINodeFromObj(ctx context.Context, newCNINode
248247 })
249248}
250249
251- func (r * CNINodeReconciler ) GetNodeID (node * v1.Node ) (string , error ) {
252- if node .Spec .ProviderID == "" {
253- return "" , fmt .Errorf ("provider ID is not set for node %s" , node .Name )
254- }
255- if idx := strings .LastIndex (node .Spec .ProviderID , "/" ); idx != - 1 && idx < len (node .Spec .ProviderID )- 1 {
256- return node .Spec .ProviderID [idx + 1 :], nil
257- }
258- return "" , fmt .Errorf ("invalid provider ID format for node %s, with providerId" , node .Spec .ProviderID )
259- }
260-
261- func (r * CNINodeReconciler ) ensureTagsAndLabels (cniNode * v1alpha1.CNINode , node * v1.Node , nodeFound bool ) (bool , error ) {
250+ func (r * CNINodeReconciler ) ensureTagsAndLabels (cniNode * v1alpha1.CNINode , node * v1.Node ) (bool , error ) {
262251 shouldPatch := false
263252 var err error
264253 if cniNode .Spec .Tags == nil {
@@ -269,11 +258,11 @@ func (r *CNINodeReconciler) ensureTagsAndLabels(cniNode *v1alpha1.CNINode, node
269258 cniNode .Spec .Tags [config .VPCCNIClusterNameKey ] = r .clusterName
270259 shouldPatch = true
271260 }
272- if nodeFound {
261+ if node != nil {
273262 var nodeID string
274- nodeID , err = r .GetNodeID (node )
263+ nodeID , err = utils .GetNodeID (node )
275264
276- if cniNode .Spec .Tags [config .NetworkInterfaceNodeIDKey ] != nodeID {
265+ if nodeID != "" && cniNode .Spec .Tags [config .NetworkInterfaceNodeIDKey ] != nodeID {
277266 cniNode .Spec .Tags [config .NetworkInterfaceNodeIDKey ] = nodeID
278267 shouldPatch = true
279268 }
@@ -290,28 +279,12 @@ func (r *CNINodeReconciler) ensureTagsAndLabels(cniNode *v1alpha1.CNINode, node
290279 return shouldPatch , err
291280}
292281
293- func (r * CNINodeReconciler ) ensureFinalizer (cniNode * v1alpha1.CNINode ) bool {
294- shouldPatch := false
295- if ! controllerutil .ContainsFinalizer (cniNode , config .NodeTerminationFinalizer ) {
296- r .log .Info ("adding finalizer" , "object" , cniNode .GetObjectKind ().GroupVersionKind ().Kind , "name" , cniNode .GetName (), "finalizer" , config .NodeTerminationFinalizer )
297- controllerutil .AddFinalizer (cniNode , config .NodeTerminationFinalizer )
298- shouldPatch = true
299- }
300- return shouldPatch
301- }
302-
303- func (r * CNINodeReconciler ) removeFinalizers (ctx context.Context , cniNode * v1alpha1.CNINode , finalizer string ) error {
282+ func (r * CNINodeReconciler ) removeFinalizer (ctx context.Context , cniNode * v1alpha1.CNINode , finalizer string ) error {
304283 cniNodeCopy := cniNode .DeepCopy ()
305- needsUpdate := false
306284
307- if controllerutil .ContainsFinalizer (cniNodeCopy , finalizer ) {
285+ if controllerutil .RemoveFinalizer (cniNodeCopy , finalizer ) {
308286 r .log .Info ("removing finalizer for cninode" , "name" , cniNode .GetName (), "finalizer" , finalizer )
309- controllerutil .RemoveFinalizer (cniNodeCopy , finalizer )
310- needsUpdate = true
311- }
312-
313- if ! needsUpdate {
314- return nil
287+ return r .Client .Patch (ctx , cniNodeCopy , client .MergeFromWithOptions (cniNode , client.MergeFromWithOptimisticLock {}))
315288 }
316- return r . Client . Patch ( ctx , cniNodeCopy , client . MergeFromWithOptions ( cniNode , client. MergeFromWithOptimisticLock {}))
289+ return nil
317290}
0 commit comments