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
}