@@ -2,13 +2,14 @@ package controllers_test
22
33import (
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\n Object 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