Skip to content

Commit 53de030

Browse files
author
Per Goncalves da Silva
committed
Add additional revision controller unit tests
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 99def37 commit 53de030

File tree

1 file changed

+134
-11
lines changed

1 file changed

+134
-11
lines changed

internal/operator-controller/controllers/clusterextensionrevision_controller_test.go

Lines changed: 134 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ package controllers_test
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"testing"
78
"time"
89

910
"github.com/stretchr/testify/require"
1011
corev1 "k8s.io/api/core/v1"
11-
"k8s.io/apimachinery/pkg/api/errors"
12+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1213
"k8s.io/apimachinery/pkg/api/meta"
1314
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1415
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -32,18 +33,19 @@ import (
3233
"github.com/operator-framework/operator-controller/internal/operator-controller/labels"
3334
)
3435

35-
func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *testing.T) {
36+
func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionReconciliation(t *testing.T) {
3637
const (
3738
clusterExtensionRevisionName = "test-ext-1"
3839
)
3940

4041
testScheme := newScheme(t)
4142

4243
for _, tc := range []struct {
43-
name string
44-
existingObjs func() []client.Object
45-
revisionResult machinery.RevisionResult
46-
validate func(*testing.T, client.Client)
44+
name string
45+
existingObjs func() []client.Object
46+
revisionResult machinery.RevisionResult
47+
revisionReconcileErr error
48+
validate func(*testing.T, client.Client)
4749
}{
4850
{
4951
name: "sets teardown finalizer",
@@ -87,8 +89,10 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
8789
},
8890
},
8991
{
90-
name: "set Available:False:ProbeFailure condition when probe failures are detected",
92+
name: "set Available:False:ProbeFailure condition when probe failures are detected and revision is in transition ",
9193
revisionResult: mockRevisionResult{
94+
inTransition: true,
95+
isComplete: false,
9296
phases: []machinery.PhaseResult{
9397
mockPhaseResult{
9498
name: "somephase",
@@ -175,6 +179,121 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
175179
require.Equal(t, int64(1), cond.ObservedGeneration)
176180
},
177181
},
182+
{
183+
name: "set Available:False:ProbeFailure condition when probe failures are detected and revision is not in transition",
184+
revisionResult: mockRevisionResult{
185+
inTransition: false,
186+
isComplete: false,
187+
phases: []machinery.PhaseResult{
188+
mockPhaseResult{
189+
name: "somephase",
190+
isComplete: false,
191+
objects: []machinery.ObjectResult{
192+
mockObjectResult{
193+
success: true,
194+
probes: map[string]machinery.ObjectProbeResult{
195+
boxcutter.ProgressProbeType: {
196+
Success: true,
197+
},
198+
},
199+
},
200+
mockObjectResult{
201+
success: false,
202+
object: func() client.Object {
203+
obj := &corev1.Service{
204+
ObjectMeta: metav1.ObjectMeta{
205+
Name: "my-service",
206+
Namespace: "my-namespace",
207+
},
208+
}
209+
obj.SetGroupVersionKind(corev1.SchemeGroupVersion.WithKind("Service"))
210+
return obj
211+
}(),
212+
probes: map[string]machinery.ObjectProbeResult{
213+
boxcutter.ProgressProbeType: {
214+
Success: false,
215+
Messages: []string{
216+
"something bad happened",
217+
"something worse happened",
218+
},
219+
},
220+
},
221+
},
222+
},
223+
},
224+
mockPhaseResult{
225+
name: "someotherphase",
226+
isComplete: false,
227+
objects: []machinery.ObjectResult{
228+
mockObjectResult{
229+
success: false,
230+
object: func() client.Object {
231+
obj := &corev1.ConfigMap{
232+
ObjectMeta: metav1.ObjectMeta{
233+
Name: "my-configmap",
234+
Namespace: "my-namespace",
235+
},
236+
}
237+
obj.SetGroupVersionKind(corev1.SchemeGroupVersion.WithKind("ConfigMap"))
238+
return obj
239+
}(),
240+
probes: map[string]machinery.ObjectProbeResult{
241+
boxcutter.ProgressProbeType: {
242+
Success: false,
243+
Messages: []string{
244+
"we have a problem",
245+
},
246+
},
247+
},
248+
},
249+
},
250+
},
251+
},
252+
},
253+
existingObjs: func() []client.Object {
254+
ext := newTestClusterExtension()
255+
rev1 := newTestClusterExtensionRevision(clusterExtensionRevisionName)
256+
require.NoError(t, controllerutil.SetControllerReference(ext, rev1, testScheme))
257+
return []client.Object{ext, rev1}
258+
},
259+
validate: func(t *testing.T, c client.Client) {
260+
rev := &ocv1.ClusterExtensionRevision{}
261+
err := c.Get(t.Context(), client.ObjectKey{
262+
Name: clusterExtensionRevisionName,
263+
}, rev)
264+
require.NoError(t, err)
265+
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
266+
require.NotNil(t, cond)
267+
require.Equal(t, metav1.ConditionFalse, cond.Status)
268+
require.Equal(t, ocv1.ClusterExtensionRevisionReasonProbeFailure, cond.Reason)
269+
require.Equal(t, "Object Service.v1 my-namespace/my-service: something bad happened and something worse happened\nObject ConfigMap.v1 my-namespace/my-configmap: we have a problem", cond.Message)
270+
require.Equal(t, int64(1), cond.ObservedGeneration)
271+
},
272+
},
273+
{
274+
name: "set Progressing:True:RolloutError when there's an error reconciling the revision",
275+
revisionReconcileErr: errors.New("some error"),
276+
277+
existingObjs: func() []client.Object {
278+
ext := newTestClusterExtension()
279+
rev1 := newTestClusterExtensionRevision(clusterExtensionRevisionName)
280+
require.NoError(t, controllerutil.SetControllerReference(ext, rev1, testScheme))
281+
return []client.Object{ext, rev1}
282+
},
283+
validate: func(t *testing.T, c client.Client) {
284+
rev := &ocv1.ClusterExtensionRevision{}
285+
err := c.Get(t.Context(), client.ObjectKey{
286+
Name: clusterExtensionRevisionName,
287+
}, rev)
288+
require.NoError(t, err)
289+
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.TypeProgressing)
290+
require.NotNil(t, cond)
291+
require.Equal(t, metav1.ConditionTrue, cond.Status)
292+
require.Equal(t, ocv1.ClusterExtensionRevisionReasonRolloutError, cond.Reason)
293+
require.Equal(t, "some error", cond.Message)
294+
require.Equal(t, int64(1), cond.ObservedGeneration)
295+
},
296+
},
178297
{
179298
name: "set Progressing:True:RollingOut condition while revision is transitioning",
180299
revisionResult: mockRevisionResult{
@@ -317,7 +436,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
317436
Client: testClient,
318437
RevisionEngine: &mockRevisionEngine{
319438
reconcile: func(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionReconcileOption) (machinery.RevisionResult, error) {
320-
return tc.revisionResult, nil
439+
return tc.revisionResult, tc.revisionReconcileErr
321440
},
322441
},
323442
TrackingCache: &mockTrackingCache{},
@@ -327,9 +446,13 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
327446
},
328447
})
329448

330-
// reconcile cluster extensionr evision
449+
// reconcile cluster extension revision
331450
require.Equal(t, ctrl.Result{}, result)
332-
require.NoError(t, err)
451+
if tc.revisionReconcileErr == nil {
452+
require.NoError(t, err)
453+
} else {
454+
require.Contains(t, err.Error(), tc.revisionReconcileErr.Error())
455+
}
333456

334457
// validate test case
335458
tc.validate(t, testClient)
@@ -517,7 +640,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
517640
Name: clusterExtensionRevisionName,
518641
}, rev)
519642
require.Error(t, err)
520-
require.True(t, errors.IsNotFound(err))
643+
require.True(t, apierrors.IsNotFound(err))
521644
},
522645
},
523646
{

0 commit comments

Comments
 (0)