@@ -13,6 +13,7 @@ import (
1313 "github.com/codeready-toolchain/host-operator/pkg/apis"
1414 tiertest "github.com/codeready-toolchain/host-operator/test/nstemplatetier"
1515 "github.com/codeready-toolchain/host-operator/test/tiertemplaterevision"
16+ "github.com/codeready-toolchain/toolchain-common/pkg/hash"
1617 "github.com/codeready-toolchain/toolchain-common/pkg/test"
1718 templatev1 "github.com/openshift/api/template/v1"
1819 "github.com/stretchr/testify/assert"
@@ -27,6 +28,7 @@ import (
2728 "k8s.io/apimachinery/pkg/util/validation"
2829 "k8s.io/client-go/kubernetes/scheme"
2930 runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
31+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3032 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3133)
3234
@@ -37,9 +39,7 @@ const (
3739func TestReconcile (t * testing.T ) {
3840 // given
3941 t .Run ("failures" , func (t * testing.T ) {
40-
4142 t .Run ("unable to get NSTemplateTier" , func (t * testing.T ) {
42-
4343 t .Run ("tier not found" , func (t * testing.T ) {
4444 // given
4545 base1nsTier := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates )
@@ -75,12 +75,11 @@ func TestReconcile(t *testing.T) {
7575 assert .Equal (t , reconcile.Result {}, res ) // no explicit requeue
7676 })
7777 })
78-
7978 })
8079
8180 t .Run ("revisions management" , func (t * testing.T ) {
8281 // given
83- base1nsTier := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates ,
82+ base1nsTier := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates , tiertest . WithFinalizer (),
8483 // the tiertemplate revision CR should have a copy of those parameters
8584 tiertest .WithParameter ("DEPLOYMENT_QUOTA" , "60" ),
8685 )
@@ -194,15 +193,14 @@ func TestReconcile(t *testing.T) {
194193 require .Len (t , ttrs .Items , len (tierTemplatesRefs )) // it's one TTR per each tiertemplate in the NSTemplateTier
195194 })
196195 })
197-
198196 })
199197
200198 t .Run ("revision field is set but TierTemplateRevision CRs are missing, they should be created" , func (t * testing.T ) {
201199 // given
202200 // the NSTemplateTier has already the status.revisions field populated
203201 // but the TierTemplateRevision CRs are missing
204202 tierTemplates := initTierTemplates (t , withTemplateObjects (crq ), base1nsTier .Name )
205- base1nsTierWithRevisions := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates ,
203+ base1nsTierWithRevisions := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates , tiertest . WithFinalizer (),
206204 // the tiertemplate revision CR should have a copy of those parameters
207205 tiertest .WithParameter ("DEPLOYMENT_QUOTA" , "60" ),
208206 )
@@ -240,7 +238,7 @@ func TestReconcile(t *testing.T) {
240238 // the TierTemplateRevision CRs are missing, and their name are based on the tier name.
241239 // Making the TierName already 63chars long we test that the TTR name stays within 63 chars
242240 veryLongTierName := "somerandomstringtomakethenamelongerthan63chars12345678912345678"
243- tierWithVeryLongName := tiertest .Tier (t , veryLongTierName , tiertest .NSTemplateTierSpecWithTierName (veryLongTierName ),
241+ tierWithVeryLongName := tiertest .Tier (t , veryLongTierName , tiertest .NSTemplateTierSpecWithTierName (veryLongTierName ), tiertest . WithFinalizer (),
244242 tiertest .WithParameter ("DEPLOYMENT_QUOTA" , "60" ),
245243 )
246244 tierTemplatesWithLongNames := initTierTemplates (t , withTemplateObjects (crq ), tierWithVeryLongName .Name )
@@ -264,7 +262,6 @@ func TestReconcile(t *testing.T) {
264262 })
265263
266264 t .Run ("errors" , func (t * testing.T ) {
267-
268265 t .Run ("error when TierTemplate is missing " , func (t * testing.T ) {
269266 // given
270267 // make sure revisions field is nill before starting the test
@@ -285,46 +282,69 @@ func TestReconcile(t *testing.T) {
285282 // and the TierTemplateRevision CRs are not created
286283 tiertemplaterevision .AssertThatTTRs (t , cl , base1nsTier .GetNamespace ()).DoNotExist ()
287284 })
288-
289285 })
290-
291286 })
292287
293- t .Run ("if being deleted, then do nothing " , func (t * testing.T ) {
288+ t .Run ("block deletion if used " , func (t * testing.T ) {
294289 // given
295290 tierBeingDeleted := base1nsTier .DeepCopy ()
296291 tierBeingDeleted .DeletionTimestamp = & metav1.Time {Time : time .Now ()}
297- tierBeingDeleted .Finalizers = []string {"dummy" }
298- r , req , cl := prepareReconcile (t , tierBeingDeleted .Name , tierBeingDeleted )
299- called := false
300- cl .MockGet = func (ctx context.Context , key runtimeclient.ObjectKey , obj runtimeclient.Object , opts ... runtimeclient.GetOption ) error {
301- if called {
302- return fmt .Errorf ("should not call Get more than once" )
303- }
304- called = true
305- return cl .Client .Get (ctx , key , obj , opts ... )
306- }
307- cl .MockCreate = func (ctx context.Context , obj runtimeclient.Object , opts ... runtimeclient.CreateOption ) error {
308- return fmt .Errorf ("should not call Create" )
292+ controllerutil .AddFinalizer (tierBeingDeleted , toolchainv1alpha1 .FinalizerName )
293+ space := & toolchainv1alpha1.Space {
294+ ObjectMeta : metav1.ObjectMeta {
295+ Name : "test-space" ,
296+ Namespace : tierBeingDeleted .Namespace ,
297+ Labels : map [string ]string {hash .TemplateTierHashLabelKey (tierBeingDeleted .Name ): "1234" },
298+ },
309299 }
310- cl .MockStatusUpdate = func (ctx context.Context , obj runtimeclient.Object , opts ... runtimeclient.SubResourceUpdateOption ) error {
311- return fmt .Errorf ("should not call StatusUpdate" )
300+
301+ r , req , cl := prepareReconcile (t , tierBeingDeleted .Name , tierBeingDeleted , space )
302+
303+ // when
304+ res , err := r .Reconcile (context .TODO (), req )
305+ inCluster := & toolchainv1alpha1.NSTemplateTier {}
306+ gerr := cl .Get (context .TODO (), runtimeclient .ObjectKeyFromObject (tierBeingDeleted ), inCluster )
307+
308+ // then
309+ require .Error (t , err )
310+ require .Empty (t , res )
311+ require .NoError (t , gerr )
312+ require .Len (t , inCluster .Finalizers , 1 )
313+ require .Contains (t , inCluster .Finalizers , toolchainv1alpha1 .FinalizerName )
314+ })
315+ t .Run ("space being deleted doesn't block tier deletion" , func (t * testing.T ) {
316+ // given
317+ tierBeingDeleted := base1nsTier .DeepCopy ()
318+ tierBeingDeleted .DeletionTimestamp = & metav1.Time {Time : time .Now ()}
319+ controllerutil .AddFinalizer (tierBeingDeleted , toolchainv1alpha1 .FinalizerName )
320+ space := & toolchainv1alpha1.Space {
321+ ObjectMeta : metav1.ObjectMeta {
322+ Name : "test-space" ,
323+ Namespace : tierBeingDeleted .Namespace ,
324+ Labels : map [string ]string {hash .TemplateTierHashLabelKey (tierBeingDeleted .Name ): "1234" },
325+ DeletionTimestamp : & metav1.Time {Time : time .Now ()},
326+ Finalizers : []string {"dummy" },
327+ },
312328 }
313329
330+ r , req , cl := prepareReconcile (t , tierBeingDeleted .Name , tierBeingDeleted , space )
331+
314332 // when
315333 res , err := r .Reconcile (context .TODO (), req )
334+ inCluster := & toolchainv1alpha1.NSTemplateTier {}
335+ gerr := cl .Get (context .TODO (), runtimeclient .ObjectKeyFromObject (tierBeingDeleted ), inCluster )
316336
317337 // then
318338 require .NoError (t , err )
319- assert .Empty (t , res .Requeue )
339+ require .Empty (t , res )
340+ require .True (t , errors .IsNotFound (gerr ))
320341 })
321342 })
322-
323343}
324344
325345func TestUpdateNSTemplateTier (t * testing.T ) {
326346 // given
327- base1nsTier := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates ,
347+ base1nsTier := tiertest .Base1nsTier (t , tiertest .CurrentBase1nsTemplates , tiertest . WithFinalizer (),
328348 // the tiertemplate revision CR should have a copy of those parameters
329349 tiertest .WithParameter ("DEPLOYMENT_QUOTA" , "60" ),
330350 )
@@ -454,13 +474,11 @@ func TestUpdateNSTemplateTier(t *testing.T) {
454474 HasStatusTierTemplateRevisions (tierTemplatesRefs ).Tier ()
455475 require .NotEqual (t , tierBeingUpdated .Status .Revisions , newNSTmplTier .Status .Revisions )
456476 })
457-
458477 })
459-
460478}
461479
462480func newTestCRQ (podsCount string ) unstructured.Unstructured {
463- var crq = unstructured.Unstructured {Object : map [string ]interface {}{
481+ crq : = unstructured.Unstructured {Object : map [string ]interface {}{
464482 "kind" : "ClusterResourceQuota" ,
465483 "metadata" : map [string ]interface {}{
466484 "name" : "for-{{.SPACE_NAME}}-deployments" ,
@@ -512,6 +530,7 @@ func prepareReconcile(t *testing.T, name string, initObjs ...runtimeclient.Objec
512530 Client : cl ,
513531 Scheme : s ,
514532 }
533+
515534 return r , reconcile.Request {
516535 NamespacedName : types.NamespacedName {
517536 Name : name ,
0 commit comments