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  }