@@ -641,9 +641,11 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
641641 existingObjs func () []client.Object
642642 revisionResult machinery.RevisionResult
643643 revisionEngineTeardownFn func (* testing.T ) func (context.Context , machinerytypes.Revision , ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error )
644+ revisionEngineFactoryErr error
644645 validate func (* testing.T , client.Client )
645646 trackingCacheFreeFn func (context.Context , client.Object ) error
646647 expectedErr string
648+ expectedResult ctrl.Result
647649 }{
648650 {
649651 name : "teardown finalizer is removed" ,
@@ -775,6 +777,109 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
775777 require .Equal (t , int64 (1 ), cond .ObservedGeneration )
776778 },
777779 },
780+ {
781+ name : "set Progressing:True:Retrying and requeue when archived revision teardown is incomplete" ,
782+ revisionResult : mockRevisionResult {},
783+ existingObjs : func () []client.Object {
784+ ext := newTestClusterExtension ()
785+ rev1 := newTestClusterExtensionRevision (t , clusterExtensionRevisionName , ext , testScheme )
786+ rev1 .Finalizers = []string {
787+ "olm.operatorframework.io/teardown" ,
788+ }
789+ rev1 .Spec .LifecycleState = ocv1 .ClusterExtensionRevisionLifecycleStateArchived
790+ return []client.Object {rev1 , ext }
791+ },
792+ revisionEngineTeardownFn : func (t * testing.T ) func (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error ) {
793+ return func (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error ) {
794+ return & mockRevisionTeardownResult {
795+ isComplete : false ,
796+ }, nil
797+ }
798+ },
799+ expectedResult : ctrl.Result {RequeueAfter : 5 * time .Second },
800+ validate : func (t * testing.T , c client.Client ) {
801+ rev := & ocv1.ClusterExtensionRevision {}
802+ err := c .Get (t .Context (), client.ObjectKey {
803+ Name : clusterExtensionRevisionName ,
804+ }, rev )
805+ require .NoError (t , err )
806+ cond := meta .FindStatusCondition (rev .Status .Conditions , ocv1 .ClusterExtensionRevisionTypeProgressing )
807+ require .NotNil (t , cond )
808+ require .Equal (t , metav1 .ConditionTrue , cond .Status )
809+ require .Equal (t , ocv1 .ClusterExtensionRevisionReasonRetrying , cond .Reason )
810+ require .Equal (t , "tearing down revision" , cond .Message )
811+
812+ // Finalizer should still be present
813+ require .Contains (t , rev .Finalizers , "olm.operatorframework.io/teardown" )
814+ },
815+ },
816+ {
817+ name : "return error and set retrying conditions when archived revision teardown fails" ,
818+ revisionResult : mockRevisionResult {},
819+ existingObjs : func () []client.Object {
820+ ext := newTestClusterExtension ()
821+ rev1 := newTestClusterExtensionRevision (t , clusterExtensionRevisionName , ext , testScheme )
822+ rev1 .Finalizers = []string {
823+ "olm.operatorframework.io/teardown" ,
824+ }
825+ rev1 .Spec .LifecycleState = ocv1 .ClusterExtensionRevisionLifecycleStateArchived
826+ return []client.Object {rev1 , ext }
827+ },
828+ revisionEngineTeardownFn : func (t * testing.T ) func (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error ) {
829+ return func (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error ) {
830+ return nil , fmt .Errorf ("teardown failed: connection refused" )
831+ }
832+ },
833+ expectedErr : "error tearing down revision" ,
834+ validate : func (t * testing.T , c client.Client ) {
835+ rev := & ocv1.ClusterExtensionRevision {}
836+ err := c .Get (t .Context (), client.ObjectKey {
837+ Name : clusterExtensionRevisionName ,
838+ }, rev )
839+ require .NoError (t , err )
840+ cond := meta .FindStatusCondition (rev .Status .Conditions , ocv1 .ClusterExtensionRevisionTypeProgressing )
841+ require .NotNil (t , cond )
842+ require .Equal (t , metav1 .ConditionTrue , cond .Status )
843+ require .Equal (t , ocv1 .ClusterExtensionRevisionReasonRetrying , cond .Reason )
844+ require .Contains (t , cond .Message , "teardown failed: connection refused" )
845+
846+ // Finalizer should still be present
847+ require .Contains (t , rev .Finalizers , "olm.operatorframework.io/teardown" )
848+ },
849+ },
850+ {
851+ name : "return error and set retrying conditions when factory fails to create engine during archived teardown" ,
852+ revisionResult : mockRevisionResult {},
853+ existingObjs : func () []client.Object {
854+ ext := newTestClusterExtension ()
855+ rev1 := newTestClusterExtensionRevision (t , clusterExtensionRevisionName , ext , testScheme )
856+ rev1 .Finalizers = []string {
857+ "olm.operatorframework.io/teardown" ,
858+ }
859+ rev1 .Spec .LifecycleState = ocv1 .ClusterExtensionRevisionLifecycleStateArchived
860+ return []client.Object {rev1 , ext }
861+ },
862+ revisionEngineTeardownFn : func (t * testing.T ) func (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error ) {
863+ return nil
864+ },
865+ revisionEngineFactoryErr : fmt .Errorf ("token getter failed" ),
866+ expectedErr : "failed to create revision engine" ,
867+ validate : func (t * testing.T , c client.Client ) {
868+ rev := & ocv1.ClusterExtensionRevision {}
869+ err := c .Get (t .Context (), client.ObjectKey {
870+ Name : clusterExtensionRevisionName ,
871+ }, rev )
872+ require .NoError (t , err )
873+ cond := meta .FindStatusCondition (rev .Status .Conditions , ocv1 .ClusterExtensionRevisionTypeProgressing )
874+ require .NotNil (t , cond )
875+ require .Equal (t , metav1 .ConditionTrue , cond .Status )
876+ require .Equal (t , ocv1 .ClusterExtensionRevisionReasonRetrying , cond .Reason )
877+ require .Contains (t , cond .Message , "token getter failed" )
878+
879+ // Finalizer should still be present
880+ require .Contains (t , rev .Finalizers , "olm.operatorframework.io/teardown" )
881+ },
882+ },
778883 {
779884 name : "revision is torn down when in archived state and finalizer is removed" ,
780885 revisionResult : mockRevisionResult {},
@@ -833,9 +938,10 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
833938 },
834939 teardown : tc .revisionEngineTeardownFn (t ),
835940 }
941+ factory := & mockRevisionEngineFactory {engine : mockEngine , createErr : tc .revisionEngineFactoryErr }
836942 result , err := (& controllers.ClusterExtensionRevisionReconciler {
837943 Client : testClient ,
838- RevisionEngineFactory : & mockRevisionEngineFactory { engine : mockEngine } ,
944+ RevisionEngineFactory : factory ,
839945 TrackingCache : & mockTrackingCache {
840946 client : testClient ,
841947 freeFn : tc .trackingCacheFreeFn ,
@@ -847,7 +953,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_Deletion(t *testing.T) {
847953 })
848954
849955 // reconcile cluster extension revision
850- require .Equal (t , ctrl. Result {} , result )
956+ require .Equal (t , tc . expectedResult , result )
851957 if tc .expectedErr != "" {
852958 require .Contains (t , err .Error (), tc .expectedErr )
853959 } else {
0 commit comments