sigs.k8s.io/kueue@v0.6.2/test/integration/multikueue/suite_test.go (about) 1 /* 2 Copyright 2023 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 multikueue 18 19 import ( 20 "context" 21 "path/filepath" 22 "testing" 23 "time" 24 25 "github.com/onsi/ginkgo/v2" 26 "github.com/onsi/gomega" 27 corev1 "k8s.io/api/core/v1" 28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 29 "k8s.io/client-go/rest" 30 "k8s.io/client-go/tools/clientcmd" 31 clientcmdapi "k8s.io/client-go/tools/clientcmd/api" 32 "sigs.k8s.io/controller-runtime/pkg/client" 33 "sigs.k8s.io/controller-runtime/pkg/manager" 34 35 config "sigs.k8s.io/kueue/apis/config/v1beta1" 36 "sigs.k8s.io/kueue/pkg/cache" 37 "sigs.k8s.io/kueue/pkg/constants" 38 "sigs.k8s.io/kueue/pkg/controller/admissionchecks/multikueue" 39 "sigs.k8s.io/kueue/pkg/controller/core" 40 "sigs.k8s.io/kueue/pkg/controller/core/indexer" 41 workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job" 42 workloadjobset "sigs.k8s.io/kueue/pkg/controller/jobs/jobset" 43 "sigs.k8s.io/kueue/pkg/queue" 44 "sigs.k8s.io/kueue/pkg/webhooks" 45 "sigs.k8s.io/kueue/test/integration/framework" 46 // +kubebuilder:scaffold:imports 47 ) 48 49 type cluster struct { 50 cfg *rest.Config 51 client client.Client 52 ctx context.Context 53 fwk *framework.Framework 54 } 55 56 func (c *cluster) kubeConfigBytes() ([]byte, error) { 57 cfg := clientcmdapi.Config{ 58 Kind: "config", 59 APIVersion: "v1", 60 Clusters: map[string]*clientcmdapi.Cluster{ 61 "default-cluster": { 62 Server: c.cfg.Host, 63 CertificateAuthorityData: c.cfg.CAData, 64 }, 65 }, 66 AuthInfos: map[string]*clientcmdapi.AuthInfo{ 67 "default-user": { 68 ClientCertificateData: c.cfg.CertData, 69 ClientKeyData: c.cfg.KeyData, 70 }, 71 }, 72 Contexts: map[string]*clientcmdapi.Context{ 73 "default-context": { 74 Cluster: "default-cluster", 75 AuthInfo: "default-user", 76 }, 77 }, 78 CurrentContext: "default-context", 79 } 80 return clientcmd.Write(cfg) 81 } 82 83 var ( 84 managerTestCluster cluster 85 worker1TestCluster cluster 86 worker2TestCluster cluster 87 managersConfigNamespace *corev1.Namespace 88 ) 89 90 func TestMultiKueue(t *testing.T) { 91 gomega.RegisterFailHandler(ginkgo.Fail) 92 93 ginkgo.RunSpecs(t, 94 "Multikueue Suite", 95 ) 96 } 97 98 func createCluster(setupFnc framework.ManagerSetup) cluster { 99 c := cluster{} 100 c.fwk = &framework.Framework{ 101 CRDPath: filepath.Join("..", "..", "..", "config", "components", "crd", "bases"), 102 WebhookPath: filepath.Join("..", "..", "..", "config", "components", "webhook"), 103 DepCRDPaths: []string{filepath.Join("..", "..", "..", "dep-crds", "jobset-operator")}, 104 } 105 c.cfg = c.fwk.Init() 106 c.ctx, c.client = c.fwk.RunManager(c.cfg, setupFnc) 107 return c 108 } 109 110 var _ = ginkgo.BeforeSuite(func() { 111 managerTestCluster = createCluster(managerAndMultiKueueSetup) 112 worker1TestCluster = createCluster(managerSetup) 113 worker2TestCluster = createCluster(managerSetup) 114 }) 115 116 var _ = ginkgo.AfterSuite(func() { 117 managerTestCluster.fwk.Teardown() 118 worker1TestCluster.fwk.Teardown() 119 worker2TestCluster.fwk.Teardown() 120 }) 121 122 func managerSetup(mgr manager.Manager, ctx context.Context) { 123 err := indexer.Setup(ctx, mgr.GetFieldIndexer()) 124 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 125 126 cCache := cache.New(mgr.GetClient()) 127 queues := queue.NewManager(mgr.GetClient(), cCache) 128 129 configuration := &config.Configuration{} 130 mgr.GetScheme().Default(configuration) 131 132 failedCtrl, err := core.SetupControllers(mgr, queues, cCache, configuration) 133 gomega.Expect(err).ToNot(gomega.HaveOccurred(), "controller", failedCtrl) 134 135 failedWebhook, err := webhooks.Setup(mgr) 136 gomega.Expect(err).ToNot(gomega.HaveOccurred(), "webhook", failedWebhook) 137 138 err = workloadjob.SetupIndexes(ctx, mgr.GetFieldIndexer()) 139 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 140 141 jobReconciler := workloadjob.NewReconciler( 142 mgr.GetClient(), 143 mgr.GetEventRecorderFor(constants.JobControllerName)) 144 err = jobReconciler.SetupWithManager(mgr) 145 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 146 147 err = workloadjob.SetupWebhook(mgr) 148 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 149 150 err = workloadjobset.SetupIndexes(ctx, mgr.GetFieldIndexer()) 151 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 152 153 jobsetReconciler := workloadjobset.NewReconciler( 154 mgr.GetClient(), 155 mgr.GetEventRecorderFor(constants.JobControllerName)) 156 err = jobsetReconciler.SetupWithManager(mgr) 157 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 158 159 err = workloadjobset.SetupJobSetWebhook(mgr) 160 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 161 } 162 163 func managerAndMultiKueueSetup(mgr manager.Manager, ctx context.Context) { 164 managerSetup(mgr, ctx) 165 166 managersConfigNamespace = &corev1.Namespace{ 167 ObjectMeta: metav1.ObjectMeta{ 168 Name: "kueue-system", 169 }, 170 } 171 gomega.Expect(mgr.GetClient().Create(ctx, managersConfigNamespace)).To(gomega.Succeed()) 172 173 err := multikueue.SetupIndexer(ctx, mgr.GetFieldIndexer(), managersConfigNamespace.Name) 174 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 175 176 err = multikueue.SetupControllers(mgr, managersConfigNamespace.Name, multikueue.WithGCInterval(2*time.Second)) 177 gomega.Expect(err).NotTo(gomega.HaveOccurred()) 178 }