diff --git a/controllers/object_controls.go b/controllers/object_controls.go index b436bcab1..5fb6abef0 100644 --- a/controllers/object_controls.go +++ b/controllers/object_controls.go @@ -36,6 +36,7 @@ import ( corev1 "k8s.io/api/core/v1" nodev1 "k8s.io/api/node/v1" nodev1beta1 "k8s.io/api/node/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -367,18 +368,27 @@ func Role(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if apierrors.IsAlreadyExists(err) { - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) + existingRole := &rbacv1.Role{} + err := n.client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, existingRole) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) if err != nil { - logger.Info("Couldn't update", "Error", err) + logger.Info("Couldn't create", "Error", err) return gpuv1.NotReady, err } return gpuv1.Ready, nil } - logger.Info("Couldn't create", "Error", err) + logger.Info("Couldn't get existing Role", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingRole.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) return gpuv1.NotReady, err } @@ -418,18 +428,27 @@ func RoleBinding(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if apierrors.IsAlreadyExists(err) { - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) + existingRoleBinding := &rbacv1.RoleBinding{} + err := n.client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, existingRoleBinding) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) if err != nil { - logger.Info("Couldn't update", "Error", err) + logger.Info("Couldn't create", "Error", err) return gpuv1.NotReady, err } return gpuv1.Ready, nil } - logger.Info("Couldn't create", "Error", err) + logger.Info("Couldn't get existing RoleBinding", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingRoleBinding.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) return gpuv1.NotReady, err } @@ -459,18 +478,27 @@ func ClusterRole(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if apierrors.IsAlreadyExists(err) { - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) + existingClusterRole := &rbacv1.ClusterRole{} + err := n.client.Get(ctx, types.NamespacedName{Name: obj.Name}, existingClusterRole) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) if err != nil { - logger.Info("Couldn't update", "Error", err) + logger.Info("Couldn't create", "Error", err) return gpuv1.NotReady, err } return gpuv1.Ready, nil } - logger.Info("Couldn't create", "Error", err) + logger.Info("Couldn't get existing ClusterRole", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingClusterRole.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) return gpuv1.NotReady, err } @@ -504,18 +532,27 @@ func ClusterRoleBinding(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if apierrors.IsAlreadyExists(err) { - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) + existingClusterRoleBinding := &rbacv1.ClusterRoleBinding{} + err := n.client.Get(ctx, types.NamespacedName{Name: obj.Name}, existingClusterRoleBinding) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) if err != nil { - logger.Info("Couldn't update", "Error", err) + logger.Info("Couldn't create", "Error", err) return gpuv1.NotReady, err } return gpuv1.Ready, nil } - logger.Info("Couldn't create", "Error", err) + logger.Info("Couldn't get existing ClusterRoleBinding", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingClusterRoleBinding.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) return gpuv1.NotReady, err } @@ -580,18 +617,28 @@ func createConfigMap(n ClusterPolicyController, configMapIdx int) (gpuv1.State, return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if !apierrors.IsAlreadyExists(err) { - logger.Info("Couldn't create", "Error", err) - return gpuv1.NotReady, err + existingConfigMap := &corev1.ConfigMap{} + err := n.client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, existingConfigMap) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) + if err != nil { + logger.Info("Couldn't create", "Error", err) + return gpuv1.NotReady, err + } + return gpuv1.Ready, nil } - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) - if err != nil { - logger.Info("Couldn't update", "Error", err) - return gpuv1.NotReady, err - } + logger.Info("Couldn't get existing ConfigMap", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingConfigMap.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) + return gpuv1.NotReady, err } return gpuv1.Ready, nil @@ -4003,18 +4050,27 @@ func Deployment(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.NotReady, err } - if err := n.client.Create(ctx, obj); err != nil { - if apierrors.IsAlreadyExists(err) { - logger.Info("Found Resource, updating...") - err = n.client.Update(ctx, obj) + existingDeployment := &appsv1.Deployment{} + err := n.client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, existingDeployment) + if err != nil { + if apierrors.IsNotFound(err) { + err = n.client.Create(ctx, obj) if err != nil { - logger.Info("Couldn't update", "Error", err) + logger.Info("Couldn't create", "Error", err) return gpuv1.NotReady, err } return isDeploymentReady(obj.Name, n), nil } - logger.Info("Couldn't create", "Error", err) + logger.Info("Couldn't get existing Deployment", "Error", err) + return gpuv1.NotReady, err + } + + logger.Info("Found Resource, updating...") + obj.ResourceVersion = existingDeployment.ResourceVersion + err = n.client.Update(ctx, obj) + if err != nil { + logger.Info("Couldn't update", "Error", err) return gpuv1.NotReady, err } @@ -4608,6 +4664,7 @@ func DaemonSet(n ClusterPolicyController) (gpuv1.State, error) { changed := isDaemonsetSpecChanged(found, obj) if changed { logger.Info("DaemonSet is different, updating", "name", obj.Name) + obj.ResourceVersion = found.ResourceVersion err = n.client.Update(ctx, obj) if err != nil { return gpuv1.NotReady, err