func deployOperator()

in oracle/controllers/testhelpers/envtest.go [559:674]


func deployOperator(ctx context.Context, k8sClient client.Client, CPNamespace, DPNamespace string) (func() error, error) {
	var agentImageTag, agentImageRepo, agentImageProject string
	if agentImageTag = os.Getenv("PROW_IMAGE_TAG"); agentImageTag == "" {
		return nil, errors.New("PROW_IMAGE_TAG envvar was not set. Did you try to test without make?")
	}
	if agentImageRepo = os.Getenv("PROW_IMAGE_REPO"); agentImageRepo == "" {
		return nil, errors.New("PROW_IMAGE_REPO envar was not set. Did you try to test without make?")
	}
	if agentImageProject = os.Getenv("PROW_PROJECT"); agentImageProject == "" {
		return nil, errors.New("PROW_PROJECT envar was not set. Did you try to test without make?")
	}

	dbInitImage := fmt.Sprintf("%s/%s/%s:%s", agentImageRepo, agentImageProject, dbInitImage, agentImageTag)
	loggingSidecarImage := fmt.Sprintf("%s/%s/%s:%s", agentImageRepo, agentImageProject, loggingSidecarImage, agentImageTag)
	monitoringAgentImage := fmt.Sprintf("%s/%s/%s:%s", agentImageRepo, agentImageProject, monitoringAgentImage, agentImageTag)
	operatorImage := fmt.Sprintf("%s/%s/%s:%s", agentImageRepo, agentImageProject, operatorImage, agentImageTag)
	// Global modified for usage in pitr test.
	PitrAgentImage = fmt.Sprintf("%s/%s/%s:%s", agentImageRepo, agentImageProject, PitrAgentImage, agentImageTag)

	objs, err := readYamls([]string{
		"config/manager/manager.yaml",
		"config/rbac/role.yaml",
		"config/rbac/role_binding.yaml",
	})
	if err != nil {
		return nil, err
	}

	// minimal set of operator.yaml we need to deploy.
	var d *appsv1.Deployment
	var cr *rbacv1.ClusterRole
	var crb *rbacv1.ClusterRoleBinding
	for _, obj := range objs {
		if _, ok := obj.(*appsv1.Deployment); ok {
			d = obj.(*appsv1.Deployment)
		}
		if _, ok := obj.(*rbacv1.ClusterRole); ok {
			if cr != nil {
				return nil, fmt.Errorf("test needs to be updated to handle multiple ClusterRoles")
			}
			cr = obj.(*rbacv1.ClusterRole)
		}
		if _, ok := obj.(*rbacv1.ClusterRoleBinding); ok {
			if crb != nil {
				return nil, fmt.Errorf("test needs to be updated to handle multiple ClusterRoleBindings")
			}
			crb = obj.(*rbacv1.ClusterRoleBinding)
		}
	}

	//Check DPNamespace against CPNamespace. If they're different, create the DPNamespace.
	if CPNamespace != DPNamespace {
		By("Deploying data plane in " + DPNamespace)
		nsObj := &corev1.Namespace{
			ObjectMeta: metav1.ObjectMeta{
				Name: DPNamespace,
			},
		}
		ctx := context.Background()
		Expect(k8sClient.Create(ctx, nsObj)).Should(Succeed())
	}

	// Add in our overrides.
	cr.ObjectMeta.Name = "manager-role-" + CPNamespace
	crb.ObjectMeta.Name = "manager-rolebinding-" + CPNamespace
	crb.RoleRef.Name = cr.ObjectMeta.Name
	crb.Subjects[0].Namespace = CPNamespace
	d.Namespace = CPNamespace
	d.Spec.Template.Spec.Containers[0].Image = operatorImage
	d.Spec.Template.Spec.Containers[0].ImagePullPolicy = corev1.PullAlways
	d.Spec.Template.Spec.Containers[0].Args = []string{
		"--logtostderr=true",
		"--enable-leader-election=false",
		"--namespace=" + DPNamespace,
		"--db_init_image_uri=" + dbInitImage,
		"--logging_sidecar_image_uri=" + loggingSidecarImage,
		"--monitoring_agent_image_uri=" + monitoringAgentImage,
	}

	// Ensure account has cluster admin to create ClusterRole/Binding. You
	// can figure out the k8s account name from a GCE service account name
	// using the `uniqueId` property from `gcloud iam service-accounts
	// describe some@service.account`.
	if err := k8sClient.Create(ctx, cr); err != nil {
		return nil, err
	}
	if err := k8sClient.Create(ctx, crb); err != nil {
		k8sClient.Delete(ctx, cr)
		return nil, err
	}
	if err := k8sClient.Create(ctx, d); err != nil {
		k8sClient.Delete(ctx, cr)
		k8sClient.Delete(ctx, crb)
		return nil, err
	}

	// Ensure deployment succeeds.
	instKey := client.ObjectKey{Namespace: CPNamespace, Name: d.Name}
	Eventually(func() int {
		err := k8sClient.Get(ctx, instKey, d)
		if err != nil {
			return 0
		}
		return int(d.Status.ReadyReplicas)
	}, 10*time.Minute, 5*time.Second).Should(Equal(1))

	return func() error {
		if err := k8sClient.Delete(ctx, cr); err != nil {
			return err
		}
		if err := k8sClient.Delete(ctx, crb); err != nil {
			return err
		}
		return nil
	}, nil
}