@@ -88,17 +88,15 @@ func (r *genericNetworkReconciler) Reconcile(ctx context.Context, req ctrl.Reque
8888 // Request object not found, could have been deleted after reconcile request.
8989 // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
9090 // Return and don't requeue
91- return reconcile.Result {}, nil
91+ return reconcile.Result {}, r . garbageCollect ( ctx )
9292 }
9393 // Error reading the object - requeue the request.
9494 return reconcile.Result {}, err
9595 }
9696
97- if instance == nil {
98- // Request object not found, could have been deleted after reconcile request.
99- // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
100- // Return and don't requeue
101- return reconcile.Result {}, nil
97+ err = r .cleanOldFinalizers (ctx , instance )
98+ if err != nil {
99+ return reconcile.Result {}, err
102100 }
103101
104102 if instance .NetworkNamespace () != "" && instance .GetNamespace () != vars .Namespace {
@@ -112,20 +110,6 @@ func (r *genericNetworkReconciler) Reconcile(ctx context.Context, req ctrl.Reque
112110 return reconcile.Result {}, nil
113111 }
114112
115- // examine DeletionTimestamp to determine if object is under deletion
116- if instance .GetDeletionTimestamp ().IsZero () {
117- // The object is not being deleted, so if it does not have our finalizer,
118- // then lets add the finalizer and update the object. This is equivalent
119- // registering our finalizer.
120- err = r .updateFinalizers (ctx , instance )
121- if err != nil {
122- return reconcile.Result {}, err
123- }
124- } else {
125- // The object is being deleted
126- err = r .cleanResourcesAndFinalizers (ctx , instance )
127- return reconcile.Result {}, err
128- }
129113 raw , err := instance .RenderNetAttDef ()
130114 if err != nil {
131115 return reconcile.Result {}, err
@@ -286,61 +270,69 @@ func (r *genericNetworkReconciler) namespaceHandlerCreate(ctx context.Context, e
286270 })
287271}
288272
289- // deleteNetAttDef deletes the generated net-att-def CR
290- func (r * genericNetworkReconciler ) deleteNetAttDef (ctx context.Context , cr NetworkCRInstance ) error {
291- // Fetch the NetworkAttachmentDefinition instance
292- namespace := cr .NetworkNamespace ()
293- if namespace == "" {
294- namespace = cr .GetNamespace ()
295- }
296- instance := & netattdefv1.NetworkAttachmentDefinition {ObjectMeta : metav1.ObjectMeta {Name : cr .GetName (), Namespace : namespace }}
297- err := r .Delete (ctx , instance )
273+ // garbageCollect searches all NetworkAttachmentDefinition objects that has a `sriovnetwork.openshift.io/owner`
274+ // annotation pointing to non existing objects
275+ func (r * genericNetworkReconciler ) garbageCollect (ctx context.Context ) error {
276+ logger := log .Log .WithName ("garbageCollect" )
277+
278+ netAttachDefs := & netattdefv1.NetworkAttachmentDefinitionList {}
279+ err := r .Client .List (ctx , netAttachDefs )
298280 if err != nil {
299- if errors .IsNotFound (err ) {
300- return nil
301- }
302- return err
281+ return fmt .Errorf ("garbageCollect: failed to list NetworkAttachmentDefinition: %w" , err )
303282 }
304- return nil
305- }
283+ logger .Info ("xxx" )
306284
307- func (r * genericNetworkReconciler ) updateFinalizers (ctx context.Context , instance NetworkCRInstance ) error {
308- if instance .GetNamespace () != vars .Namespace {
309- // If the resource is in a namespace different than the operator one, then the NetworkAttachmentDefinition will
310- // be created in the same namespace and its deletion can be handled by OwnerReferences. There is no need for finalizers
311- return nil
312- }
285+ for _ , netAttDef := range netAttachDefs .Items {
286+ logger .Info ("xxx1" , "obj" , netAttDef )
313287
314- instanceFinalizers := instance .GetFinalizers ()
315- if ! sriovnetworkv1 .StringInArray (sriovnetworkv1 .NETATTDEFFINALIZERNAME , instanceFinalizers ) {
316- instance .SetFinalizers (append (instanceFinalizers , sriovnetworkv1 .NETATTDEFFINALIZERNAME ))
317- if err := r .Update (ctx , instance ); err != nil {
318- return err
288+ owner , ok := netAttDef .GetAnnotations ()[consts .OwnerRefAnnotation ]
289+ if ! ok {
290+ continue
291+ }
292+
293+ obj , namespace , name , err := sriovnetworkv1 .StringToOwnerRef (owner )
294+ if err != nil {
295+ logger .Error (err , "bad value for `sriovnetwork.openshift.io/owner`" , "owner" , owner )
296+ continue
297+ }
298+
299+ err = r .Get (ctx , types.NamespacedName {Name : name , Namespace : namespace }, obj )
300+ if err != nil {
301+ if ! errors .IsNotFound (err ) {
302+ logger .Error (err , "failed to get owner object" , "owner" , owner )
303+ continue
304+ }
305+
306+ logger .Info ("owner object not found. deleting NetworkAttachmentDefinition" , "obj" , netAttDef )
307+
308+ err := r .Delete (ctx , & netAttDef )
309+ if err != nil {
310+ logger .Error (err , "can't delete NetworkAttachmentDefinition" , "obj" , netAttDef )
311+ }
319312 }
320313 }
321314
322315 return nil
323316}
324317
325- func (r * genericNetworkReconciler ) cleanResourcesAndFinalizers (ctx context.Context , instance NetworkCRInstance ) error {
318+ func (r * genericNetworkReconciler ) cleanOldFinalizers (ctx context.Context , instance NetworkCRInstance ) error {
326319 instanceFinalizers := instance .GetFinalizers ()
327320
328- if sriovnetworkv1 .StringInArray (sriovnetworkv1 .NETATTDEFFINALIZERNAME , instanceFinalizers ) {
329- // our finalizer is present, so lets handle any external dependency
330- log .FromContext (ctx ).Info ("delete NetworkAttachmentDefinition CR" , "Namespace" , instance .NetworkNamespace (), "Name" , instance .GetName ())
331- if err := r .deleteNetAttDef (ctx , instance ); err != nil {
332- // if fail to delete the external dependency here, return with error
333- // so that it can be retried
321+ if ! sriovnetworkv1 .StringInArray (sriovnetworkv1 .NETATTDEFFINALIZERNAME , instanceFinalizers ) {
322+ return nil
323+ }
324+
325+ // remove our finalizer from the list and update it.
326+ newFinalizers , found := sriovnetworkv1 .RemoveString (sriovnetworkv1 .NETATTDEFFINALIZERNAME , instanceFinalizers )
327+ if found {
328+ logger := log .Log .WithName ("cleanFinalizers" )
329+
330+ instance .SetFinalizers (newFinalizers )
331+ logger .Info ("Updating network instance to remove finalizer `netattdef.finalizers.sriovnetwork.openshift.io`" , "obj" , instance )
332+ if err := r .Update (ctx , instance ); err != nil {
334333 return err
335334 }
336- // remove our finalizer from the list and update it.
337- newFinalizers , found := sriovnetworkv1 .RemoveString (sriovnetworkv1 .NETATTDEFFINALIZERNAME , instanceFinalizers )
338- if found {
339- instance .SetFinalizers (newFinalizers )
340- if err := r .Update (ctx , instance ); err != nil {
341- return err
342- }
343- }
344335 }
336+
345337 return nil
346338}
0 commit comments