func initK8sCluster()

in oracle/controllers/testhelpers/envtest.go [306:388]


func initK8sCluster(namespace *string) (envtest.Environment, context.Context, client.Client) {
	CdToRoot(nil)
	klog.SetOutput(GinkgoWriter)
	logf.SetLogger(klogr.NewWithOptions(klogr.WithFormat(klogr.FormatKlog)))

	log := logf.FromContext(nil)
	// Generate credentials for our test cluster.
	Expect(os.Setenv("KUBECONFIG", fmt.Sprintf("/tmp/.kubectl/config-%v", *namespace))).Should(Succeed())

	// Allow local runs to target their own GKE cluster to prevent collisions with Prow.
	var targetProject, targetCluster, targetZone string
	if targetProject = os.Getenv("PROW_PROJECT"); targetProject == "" {
		Expect(errors.New("PROW_PROJECT envvar was not set. Did you try to test without make?")).NotTo(HaveOccurred())
	}
	if targetCluster = os.Getenv("PROW_CLUSTER"); targetCluster == "" {
		Expect(errors.New("PROW_CLUSTER envar was not set. Did you try to test without make?")).NotTo(HaveOccurred())
	}
	if targetZone = os.Getenv("PROW_CLUSTER_ZONE"); targetZone == "" {
		Expect(errors.New("PROW_CLUSTER_ZONE envar was not set. Did you try to test without make?")).NotTo(HaveOccurred())
	}

	// Set up k8s credentials.
	// This operation might need retrying when executing tests in parallel.
	Expect(retry.OnError(retry.DefaultBackoff, func(error) bool { return true }, func() error {
		cmdGetCreds := exec.Command("gcloud", "container", "clusters", "get-credentials", targetCluster, "--project="+targetProject, "--zone="+targetZone)
		out, err := cmdGetCreds.CombinedOutput()
		log.Info("gcloud get-credentials", "output", string(out))
		return err
	})).Should(Succeed())

	// load the test gcp project config
	cfg, err := config.GetConfig()
	log.Info("Load kubectl config")
	Expect(err).NotTo(HaveOccurred())

	trueValue := true
	env := envtest.Environment{
		UseExistingCluster: &trueValue,
		Config:             cfg,
		CRDDirectoryPaths: []string{
			filepath.Join("config", "crd", "bases"),
		},
		CRDInstallOptions: envtest.CRDInstallOptions{CleanUpAfterUse: false},
	}

	var CRDBackoff = wait.Backoff{
		Steps:    6,
		Duration: 100 * time.Millisecond,
		Factor:   5.0,
		Jitter:   0.1,
	}

	// env.Start() may fail on the same set of CRDs during parallel execution
	// need to retry in that case.
	Expect(retry.OnError(CRDBackoff, func(error) bool { return true }, func() error {
		_, err = env.Start()
		if err != nil {
			log.Error(err, "Envtest startup failed: CRD conflict, retrying")
		}
		return err
	})).Should(Succeed())

	err = v1alpha1.AddToScheme(scheme.Scheme)
	Expect(err).NotTo(HaveOccurred())

	err = snapv1.AddToScheme(scheme.Scheme)
	Expect(err).NotTo(HaveOccurred())

	k8sClient, err := client.New(cfg, client.Options{})
	Expect(err).NotTo(HaveOccurred())

	nsObj := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: *namespace,
			Labels: map[string]string{
				"control-plane": "controller-manager",
			},
		},
	}
	ctx := context.Background()
	Expect(k8sClient.Create(ctx, nsObj)).Should(Succeed())
	return env, ctx, k8sClient
}