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  })