sigs.k8s.io/kueue@v0.6.2/test/integration/controller/core/resourceflavor_controller_test.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package core 18 19 import ( 20 "github.com/onsi/ginkgo/v2" 21 "github.com/onsi/gomega" 22 corev1 "k8s.io/api/core/v1" 23 apimeta "k8s.io/apimachinery/pkg/api/meta" 24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 25 "sigs.k8s.io/controller-runtime/pkg/client" 26 27 kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1" 28 utiltesting "sigs.k8s.io/kueue/pkg/util/testing" 29 "sigs.k8s.io/kueue/test/integration/framework" 30 "sigs.k8s.io/kueue/test/util" 31 ) 32 33 // +kubebuilder:docs-gen:collapse=Imports 34 35 var _ = ginkgo.Describe("ResourceFlavor controller", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() { 36 var ns *corev1.Namespace 37 38 ginkgo.BeforeAll(func() { 39 fwk = &framework.Framework{CRDPath: crdPath, WebhookPath: webhookPath} 40 cfg = fwk.Init() 41 ctx, k8sClient = fwk.RunManager(cfg, managerSetup) 42 }) 43 ginkgo.AfterAll(func() { 44 fwk.Teardown() 45 }) 46 47 ginkgo.BeforeEach(func() { 48 ns = &corev1.Namespace{ 49 ObjectMeta: metav1.ObjectMeta{ 50 GenerateName: "core-resourceflavor-", 51 }, 52 } 53 gomega.Expect(k8sClient.Create(ctx, ns)).To(gomega.Succeed()) 54 }) 55 56 ginkgo.AfterEach(func() { 57 gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed()) 58 }) 59 60 ginkgo.When("one clusterQueue references resourceFlavors", func() { 61 var resourceFlavor *kueue.ResourceFlavor 62 var clusterQueue *kueue.ClusterQueue 63 64 ginkgo.BeforeEach(func() { 65 resourceFlavor = utiltesting.MakeResourceFlavor("flavor").Obj() 66 clusterQueue = utiltesting.MakeClusterQueue("foo"). 67 ResourceGroup(*utiltesting.MakeFlavorQuotas("flavor").Resource(corev1.ResourceCPU, "5").Obj()). 68 Obj() 69 70 gomega.Expect(k8sClient.Create(ctx, resourceFlavor)).To(gomega.Succeed()) 71 gomega.Expect(k8sClient.Create(ctx, clusterQueue)).To(gomega.Succeed()) 72 73 ginkgo.By("Wait for the queue to become active", func() { 74 gomega.Eventually(func() bool { 75 var cq kueue.ClusterQueue 76 err := k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterQueue), &cq) 77 if err != nil { 78 return false 79 } 80 return apimeta.IsStatusConditionTrue(cq.Status.Conditions, kueue.ClusterQueueActive) 81 }, util.Timeout, util.Interval).Should(gomega.BeTrue()) 82 }) 83 }) 84 85 ginkgo.AfterEach(func() { 86 util.ExpectClusterQueueToBeDeleted(ctx, k8sClient, clusterQueue, true) 87 util.ExpectResourceFlavorToBeDeleted(ctx, k8sClient, resourceFlavor, true) 88 }) 89 90 ginkgo.It("Should delete the resourceFlavor when the corresponding clusterQueue no longer uses the resourceFlavor", func() { 91 ginkgo.By("Try to delete resourceFlavor") 92 gomega.Expect(util.DeleteResourceFlavor(ctx, k8sClient, resourceFlavor)).To(gomega.Succeed()) 93 var rf kueue.ResourceFlavor 94 gomega.Eventually(func() []string { 95 gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(resourceFlavor), &rf)).To(gomega.Succeed()) 96 return rf.GetFinalizers() 97 }, util.Timeout, util.Interval).Should(gomega.BeComparableTo([]string{kueue.ResourceInUseFinalizerName})) 98 gomega.Expect(rf.GetDeletionTimestamp()).ShouldNot(gomega.BeNil()) 99 100 ginkgo.By("Update clusterQueue's cohort") 101 var cq kueue.ClusterQueue 102 gomega.Eventually(func() error { 103 gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterQueue), &cq)).To(gomega.Succeed()) 104 cq.Spec.Cohort = "foo-cohort" 105 return k8sClient.Update(ctx, &cq) 106 }, util.Timeout, util.Interval).Should(gomega.Succeed()) 107 108 gomega.Eventually(func() error { 109 return k8sClient.Get(ctx, client.ObjectKeyFromObject(resourceFlavor), &rf) 110 }, util.Timeout, util.Interval).Should(gomega.Succeed()) 111 112 ginkgo.By("Change clusterQueue's flavor") 113 gomega.Eventually(func() error { 114 err := k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterQueue), &cq) 115 if err != nil { 116 return err 117 } 118 cq.Spec.ResourceGroups[0].Flavors[0].Name = "alternate-flavor" 119 return k8sClient.Update(ctx, &cq) 120 }, util.Timeout, util.Interval).Should(gomega.Succeed()) 121 122 gomega.Eventually(func() error { 123 return k8sClient.Get(ctx, client.ObjectKeyFromObject(resourceFlavor), &rf) 124 }, util.Timeout, util.Interval).Should(utiltesting.BeNotFoundError()) 125 }) 126 127 ginkgo.It("Should delete the resourceFlavor when the corresponding clusterQueue is deleted", func() { 128 gomega.Expect(util.DeleteResourceFlavor(ctx, k8sClient, resourceFlavor)).To(gomega.Succeed()) 129 130 var rf kueue.ResourceFlavor 131 gomega.Eventually(func() []string { 132 gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(resourceFlavor), &rf)).To(gomega.Succeed()) 133 return rf.GetFinalizers() 134 }, util.Timeout, util.Interval).Should(gomega.BeComparableTo([]string{kueue.ResourceInUseFinalizerName})) 135 gomega.Expect(rf.GetDeletionTimestamp()).ShouldNot(gomega.BeNil()) 136 137 gomega.Expect(util.DeleteClusterQueue(ctx, k8sClient, clusterQueue)).To(gomega.Succeed()) 138 gomega.Eventually(func() error { 139 return k8sClient.Get(ctx, client.ObjectKeyFromObject(resourceFlavor), &rf) 140 }, util.Timeout, util.Interval).Should(utiltesting.BeNotFoundError()) 141 }) 142 }) 143 })