Skip to content

Commit 8de1c8e

Browse files
author
Per Goncalves da Silva
committed
Set Available condition to Unknown on archived revisions
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent e781e2d commit 8de1c8e

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

internal/operator-controller/controllers/clusterextensionrevision_controller.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
118118

119119
revision, opts, previous := toBoxcutterRevision(rev)
120120

121+
// nolint:nestif
121122
if !rev.DeletionTimestamp.IsZero() ||
122123
rev.Spec.LifecycleState == ocv1.ClusterExtensionRevisionLifecycleStateArchived {
123124
//
@@ -153,11 +154,25 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
153154
})
154155
return ctrl.Result{}, fmt.Errorf("error stopping informers: %v", err)
155156
}
157+
158+
// Ensure Available condition is set to Unknown before removing the finalizer when archiving
159+
if rev.Spec.LifecycleState == ocv1.ClusterExtensionRevisionLifecycleStateArchived &&
160+
!meta.IsStatusConditionPresentAndEqual(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable, metav1.ConditionUnknown) {
161+
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
162+
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
163+
Status: metav1.ConditionUnknown,
164+
Reason: ocv1.ClusterExtensionRevisionReasonArchived,
165+
Message: "revision is archived",
166+
ObservedGeneration: rev.Generation,
167+
})
168+
return ctrl.Result{}, nil
169+
}
170+
156171
if err := c.removeFinalizer(ctx, rev, clusterExtensionRevisionTeardownFinalizer); err != nil {
157172
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
158-
Type: "Available",
173+
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
159174
Status: metav1.ConditionFalse,
160-
Reason: "ReconcileFailure",
175+
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
161176
Message: err.Error(),
162177
ObservedGeneration: rev.Generation,
163178
})

internal/operator-controller/controllers/clusterextensionrevision_controller_test.go

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,40 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
544544
require.NotContains(t, "olm.operatorframework.io/teardown", rev.Finalizers)
545545
},
546546
},
547+
{
548+
name: "set Available condition to Unknown with reason Archived when archiving revision",
549+
revisionResult: mockRevisionResult{},
550+
existingObjs: func() []client.Object {
551+
ext := newTestClusterExtension()
552+
rev1 := newTestClusterExtensionRevision(clusterExtensionRevisionName)
553+
rev1.Finalizers = []string{
554+
"olm.operatorframework.io/teardown",
555+
}
556+
rev1.Spec.LifecycleState = ocv1.ClusterExtensionRevisionLifecycleStateArchived
557+
require.NoError(t, controllerutil.SetControllerReference(ext, rev1, testScheme))
558+
return []client.Object{rev1, ext}
559+
},
560+
revisionEngineTeardownFn: func(t *testing.T) func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
561+
return func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error) {
562+
return &mockRevisionTeardownResult{
563+
isComplete: true,
564+
}, nil
565+
}
566+
},
567+
validate: func(t *testing.T, c client.Client) {
568+
rev := &ocv1.ClusterExtensionRevision{}
569+
err := c.Get(t.Context(), client.ObjectKey{
570+
Name: clusterExtensionRevisionName,
571+
}, rev)
572+
require.NoError(t, err)
573+
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
574+
require.NotNil(t, cond)
575+
require.Equal(t, metav1.ConditionUnknown, cond.Status)
576+
require.Equal(t, ocv1.ClusterExtensionRevisionReasonArchived, cond.Reason)
577+
require.Equal(t, "revision is archived", cond.Message)
578+
require.Equal(t, int64(1), cond.ObservedGeneration)
579+
},
580+
},
547581
{
548582
name: "revision is torn down when in archived state and finalizer is removed",
549583
revisionResult: mockRevisionResult{},
@@ -554,6 +588,13 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
554588
"olm.operatorframework.io/teardown",
555589
}
556590
rev1.Spec.LifecycleState = ocv1.ClusterExtensionRevisionLifecycleStateArchived
591+
meta.SetStatusCondition(&rev1.Status.Conditions, metav1.Condition{
592+
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
593+
Status: metav1.ConditionUnknown,
594+
Reason: ocv1.ClusterExtensionRevisionReasonArchived,
595+
Message: "revision is archived",
596+
ObservedGeneration: rev1.Generation,
597+
})
557598
require.NoError(t, controllerutil.SetControllerReference(ext, rev1, testScheme))
558599
return []client.Object{rev1, ext}
559600
},
@@ -570,7 +611,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
570611
Name: clusterExtensionRevisionName,
571612
}, rev)
572613
require.NoError(t, err)
573-
require.NotContains(t, "olm.operatorframework.io/teardown", rev.Finalizers)
614+
require.NotContains(t, rev.Finalizers, "olm.operatorframework.io/teardown")
574615
},
575616
},
576617
{

0 commit comments

Comments
 (0)