Skip to content

Commit 0c36df6

Browse files
perdasilvaPer Goncalves da Silva
andauthored
Refactor Boxcutter controller to rely on kubernetes for resource cleanup (#2451)
Signed-off-by: Per Goncalves da Silva <pegoncal@redhat.com> Co-authored-by: Per Goncalves da Silva <pegoncal@redhat.com>
1 parent 3c247ee commit 0c36df6

2 files changed

Lines changed: 2 additions & 120 deletions

File tree

internal/operator-controller/controllers/clusterextensionrevision_controller.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
141141
}
142142

143143
if !rev.DeletionTimestamp.IsZero() || rev.Spec.LifecycleState == ocv1.ClusterExtensionRevisionLifecycleStateArchived {
144-
return c.teardown(ctx, rev, revision)
144+
return c.teardown(ctx, rev)
145145
}
146146

147147
revVersion := rev.GetAnnotations()[labels.BundleVersionKey]
@@ -275,33 +275,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
275275
return ctrl.Result{}, nil
276276
}
277277

278-
func (c *ClusterExtensionRevisionReconciler) teardown(ctx context.Context, rev *ocv1.ClusterExtensionRevision, revision *boxcutter.Revision) (ctrl.Result, error) {
279-
l := log.FromContext(ctx)
280-
281-
revisionEngine, err := c.RevisionEngineFactory.CreateRevisionEngine(ctx, rev)
282-
if err != nil {
283-
markAsAvailableUnknown(rev, ocv1.ClusterExtensionRevisionReasonReconciling, err.Error())
284-
return ctrl.Result{}, fmt.Errorf("failed to create revision engine for teardown: %v", err)
285-
}
286-
287-
tres, err := revisionEngine.Teardown(ctx, *revision)
288-
if err != nil {
289-
if tres != nil {
290-
l.V(1).Info("teardown failure report", "report", tres.String())
291-
}
292-
markAsAvailableUnknown(rev, ocv1.ClusterExtensionRevisionReasonReconciling, err.Error())
293-
return ctrl.Result{}, fmt.Errorf("revision teardown: %v", err)
294-
}
295-
296-
// Log detailed teardown reports only in debug mode (V(1)) to reduce verbosity.
297-
l.V(1).Info("teardown report", "report", tres.String())
298-
if !tres.IsComplete() {
299-
// TODO: If it is not complete, it seems like it would be good to update
300-
// the status in some way to tell the user that the teardown is still
301-
// in progress.
302-
return ctrl.Result{}, nil
303-
}
304-
278+
func (c *ClusterExtensionRevisionReconciler) teardown(ctx context.Context, rev *ocv1.ClusterExtensionRevision) (ctrl.Result, error) {
305279
if err := c.TrackingCache.Free(ctx, rev); err != nil {
306280
markAsAvailableUnknown(rev, ocv1.ClusterExtensionRevisionReasonReconciling, err.Error())
307281
return ctrl.Result{}, fmt.Errorf("error stopping informers: %v", err)

internal/operator-controller/controllers/clusterextensionrevision_controller_test.go

Lines changed: 0 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -697,40 +697,6 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
697697
require.True(t, apierrors.IsNotFound(err))
698698
},
699699
},
700-
{
701-
name: "set Available:Unknown:Reconciling and surface tear down errors when deleted",
702-
revisionResult: mockRevisionResult{},
703-
existingObjs: func() []client.Object {
704-
ext := newTestClusterExtension()
705-
rev1 := newTestClusterExtensionRevision(t, clusterExtensionRevisionName, ext, testScheme)
706-
rev1.Finalizers = []string{
707-
"olm.operatorframework.io/teardown",
708-
}
709-
rev1.DeletionTimestamp = &metav1.Time{Time: time.Now()}
710-
return []client.Object{rev1, ext}
711-
},
712-
revisionEngineTeardownFn: func(t *testing.T) func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
713-
return func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
714-
return nil, fmt.Errorf("some teardown error")
715-
}
716-
},
717-
expectedErr: "some teardown error",
718-
validate: func(t *testing.T, c client.Client) {
719-
t.Log("cluster revision is not deleted and still contains finalizer")
720-
rev := &ocv1.ClusterExtensionRevision{}
721-
err := c.Get(t.Context(), client.ObjectKey{
722-
Name: clusterExtensionRevisionName,
723-
}, rev)
724-
require.NoError(t, err)
725-
require.NotContains(t, "olm.operatorframework.io/teardown", rev.Finalizers)
726-
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
727-
require.NotNil(t, cond)
728-
require.Equal(t, metav1.ConditionUnknown, cond.Status)
729-
require.Equal(t, ocv1.ClusterExtensionRevisionReasonReconciling, cond.Reason)
730-
require.Equal(t, "some teardown error", cond.Message)
731-
require.Equal(t, int64(1), cond.ObservedGeneration)
732-
},
733-
},
734700
{
735701
name: "set Available:Unknown:Reconciling and surface tracking cache cleanup errors when deleted",
736702
revisionResult: mockRevisionResult{},
@@ -851,34 +817,6 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
851817
require.NotContains(t, rev.Finalizers, "olm.operatorframework.io/teardown")
852818
},
853819
},
854-
{
855-
name: "surfaces revision teardown error when in archived state",
856-
revisionResult: mockRevisionResult{},
857-
existingObjs: func() []client.Object {
858-
ext := newTestClusterExtension()
859-
rev1 := newTestClusterExtensionRevision(t, clusterExtensionRevisionName, ext, testScheme)
860-
rev1.Finalizers = []string{
861-
"olm.operatorframework.io/teardown",
862-
}
863-
rev1.Spec.LifecycleState = ocv1.ClusterExtensionRevisionLifecycleStateArchived
864-
return []client.Object{rev1, ext}
865-
},
866-
revisionEngineTeardownFn: func(t *testing.T) func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
867-
return func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
868-
return nil, fmt.Errorf("some teardown error")
869-
}
870-
},
871-
expectedErr: "some teardown error",
872-
validate: func(t *testing.T, c client.Client) {
873-
t.Log("cluster revision is not deleted and still contains finalizer")
874-
rev := &ocv1.ClusterExtensionRevision{}
875-
err := c.Get(t.Context(), client.ObjectKey{
876-
Name: clusterExtensionRevisionName,
877-
}, rev)
878-
require.NoError(t, err)
879-
require.NotContains(t, "olm.operatorframework.io/teardown", rev.Finalizers)
880-
},
881-
},
882820
} {
883821
t.Run(tc.name, func(t *testing.T) {
884822
// create extension and cluster extension
@@ -1439,34 +1377,4 @@ func Test_ClusterExtensionRevisionReconciler_getScopedClient_Errors(t *testing.T
14391377
require.Contains(t, err.Error(), "failed to create revision engine")
14401378
require.Contains(t, err.Error(), "token getter failed")
14411379
})
1442-
1443-
t.Run("factory fails during teardown", func(t *testing.T) {
1444-
ext := newTestClusterExtension()
1445-
rev := newTestClusterExtensionRevision(t, "test-rev", ext, testScheme)
1446-
rev.DeletionTimestamp = &metav1.Time{Time: time.Now()}
1447-
rev.Finalizers = []string{"olm.operatorframework.io/teardown"}
1448-
1449-
testClient := fake.NewClientBuilder().
1450-
WithScheme(testScheme).
1451-
WithObjects(ext, rev).
1452-
Build()
1453-
1454-
failingFactory := &mockRevisionEngineFactory{
1455-
createErr: errors.New("serviceaccount not found"),
1456-
}
1457-
1458-
reconciler := &controllers.ClusterExtensionRevisionReconciler{
1459-
Client: testClient,
1460-
RevisionEngineFactory: failingFactory,
1461-
TrackingCache: &mockTrackingCache{client: testClient},
1462-
}
1463-
1464-
_, err := reconciler.Reconcile(t.Context(), ctrl.Request{
1465-
NamespacedName: types.NamespacedName{Name: "test-rev"},
1466-
})
1467-
1468-
require.Error(t, err)
1469-
require.Contains(t, err.Error(), "failed to create revision engine for teardown")
1470-
require.Contains(t, err.Error(), "serviceaccount not found")
1471-
})
14721380
}

0 commit comments

Comments
 (0)