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
}