func()

in controllers/dsmaster_controller.go [462:520]


func (r *DSMasterReconciler) createServiceAccountIfNotExists(ctx context.Context, cluster *dsv1alpha1.DSMaster) (err error) {

	masterLogger.Info("start create service account.")

	sa := &corev1.ServiceAccount{
		ObjectMeta: metav1.ObjectMeta{
			Name:      dsv1alpha1.DsServiceAccount,
			Namespace: cluster.Namespace,
		},
	}

	err = r.Create(ctx, sa)

	if err != nil {
		masterLogger.Error(err, "create service account error")
		return err
	}
	// binding the sa
	err = controllerutil.SetControllerReference(cluster, sa, r.Scheme)
	if err != nil {
		masterLogger.Error(err, "sa SetControllerReference error")
		return err
	}

	ro := &v1.Role{}
	namespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsRole}
	if err := r.Client.Get(ctx, namespacedName, ro); err != nil {
		if apierrors.IsNotFound(err) && !apierrors.IsAlreadyExists(err) {
			// Remote may already exist, so we will return err, for the next time, this code will not execute
			ro := r.createRole(cluster)
			if err := controllerutil.SetControllerReference(cluster, ro, r.Scheme); err != nil {
				masterLogger.Info("set controller role  error")
				return err
			}
			masterLogger.Info("set  role  begin")
			if err := r.Client.Create(ctx, ro); err != nil {
				return err
			}
		}
	}

	rb := &v1.RoleBinding{}
	rbNamespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsRoleBinding}
	if err := r.Client.Get(ctx, rbNamespacedName, rb); err != nil {
		if apierrors.IsNotFound(err) && !apierrors.IsAlreadyExists(err) {
			rb := r.createRoleBinding(cluster)
			if err := controllerutil.SetControllerReference(cluster, rb, r.Scheme); err != nil {
				masterLogger.Info("set controller  rolebinding error")
				return err
			}

			masterLogger.Info("set  rolebinding  begin")
			if err := r.Client.Create(ctx, rb); err != nil {
				return err
			}
		}
	}
	return nil
}