Skip to content

Commit 4418b49

Browse files
committed
Update if AlreadyExists
Adds code to the client calls for Create to run an Update if the object already exists. This allows us to bypass issues where the object was not found in cache but already exists in the cluster. Signed-off-by: Daniel Franz <[email protected]>
1 parent be20100 commit 4418b49

11 files changed

+66
-11
lines changed

Diff for: pkg/lib/operatorclient/apiservice.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
apierrors "k8s.io/apimachinery/pkg/api/errors"
78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
89
"k8s.io/apimachinery/pkg/types"
910
"k8s.io/klog"
@@ -12,7 +13,11 @@ import (
1213

1314
// CreateAPIService creates the APIService.
1415
func (c *Client) CreateAPIService(ig *apiregistrationv1.APIService) (*apiregistrationv1.APIService, error) {
15-
return c.ApiregistrationV1Interface().ApiregistrationV1().APIServices().Create(context.TODO(), ig, metav1.CreateOptions{})
16+
createdAS, err := c.ApiregistrationV1Interface().ApiregistrationV1().APIServices().Create(context.TODO(), ig, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateAPIService(ig)
19+
}
20+
return createdAS, err
1621
}
1722

1823
// GetAPIService returns the existing APIService.

Diff for: pkg/lib/operatorclient/clusterrole.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@ import (
55
"fmt"
66

77
rbacv1 "k8s.io/api/rbac/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
"k8s.io/klog"
1112
)
1213

1314
// CreateClusterRole creates the ClusterRole.
1415
func (c *Client) CreateClusterRole(r *rbacv1.ClusterRole) (*rbacv1.ClusterRole, error) {
15-
return c.RbacV1().ClusterRoles().Create(context.TODO(), r, metav1.CreateOptions{})
16+
createdClusterRole, err := c.RbacV1().ClusterRoles().Create(context.TODO(), r, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateClusterRole(r)
19+
}
20+
return createdClusterRole, err
1621
}
1722

1823
// GetClusterRole returns the existing ClusterRole.

Diff for: pkg/lib/operatorclient/clusterrolebinding.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
rbacv1 "k8s.io/api/rbac/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
acv1 "k8s.io/client-go/applyconfigurations/rbac/v1"
@@ -18,7 +19,11 @@ func (c *Client) ApplyClusterRoleBinding(applyConfig *acv1.ClusterRoleBindingApp
1819

1920
// CreateRoleBinding creates the roleBinding.
2021
func (c *Client) CreateClusterRoleBinding(ig *rbacv1.ClusterRoleBinding) (*rbacv1.ClusterRoleBinding, error) {
21-
return c.RbacV1().ClusterRoleBindings().Create(context.TODO(), ig, metav1.CreateOptions{})
22+
createdCRB, err := c.RbacV1().ClusterRoleBindings().Create(context.TODO(), ig, metav1.CreateOptions{})
23+
if err != nil && apierrors.IsAlreadyExists(err) {
24+
return c.UpdateClusterRoleBinding(ig)
25+
}
26+
return createdCRB, err
2227
}
2328

2429
// GetRoleBinding returns the existing roleBinding.

Diff for: pkg/lib/operatorclient/configmap.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@ import (
55
"fmt"
66

77
corev1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
"k8s.io/klog"
1112
)
1213

1314
// CreateConfigMap creates the ConfigMap.
1415
func (c *Client) CreateConfigMap(ig *corev1.ConfigMap) (*corev1.ConfigMap, error) {
15-
return c.CoreV1().ConfigMaps(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
16+
createdCM, err := c.CoreV1().ConfigMaps(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateConfigMap(ig)
19+
}
20+
return createdCM, err
1621
}
1722

1823
// GetConfigMap returns the existing ConfigMap.

Diff for: pkg/lib/operatorclient/customresources.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
"k8s.io/apimachinery/pkg/api/errors"
12+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1213
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1314
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1415
"k8s.io/apimachinery/pkg/util/wait"
@@ -104,7 +105,11 @@ func (c *Client) CreateCustomResourceRawIfNotFound(apiGroup, version, namespace,
104105
return false, err
105106
}
106107
err = c.CreateCustomResourceRaw(apiGroup, version, namespace, kind, data)
107-
if err != nil {
108+
if err != nil && apierrors.IsAlreadyExists(err) {
109+
if err = c.UpdateCustomResourceRaw(apiGroup, version, namespace, kind, name, data); err != nil {
110+
return false, err
111+
}
112+
} else if err != nil {
108113
return false, err
109114
}
110115
return true, nil

Diff for: pkg/lib/operatorclient/deployment.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ func (c *Client) GetDeployment(namespace, name string) (*appsv1.Deployment, erro
2828
// CreateDeployment creates the Deployment object.
2929
func (c *Client) CreateDeployment(dep *appsv1.Deployment) (*appsv1.Deployment, error) {
3030
klog.V(4).Infof("[CREATE Deployment]: %s:%s", dep.Namespace, dep.Name)
31-
return c.AppsV1().Deployments(dep.Namespace).Create(context.TODO(), dep, metav1.CreateOptions{})
31+
createdDep, err := c.AppsV1().Deployments(dep.Namespace).Create(context.TODO(), dep, metav1.CreateOptions{})
32+
if err != nil && apierrors.IsAlreadyExists(err) {
33+
updatedDep, _, err := c.UpdateDeployment(dep)
34+
return updatedDep, err
35+
}
36+
return createdDep, err
3237
}
3338

3439
// DeleteDeployment deletes the Deployment object.

Diff for: pkg/lib/operatorclient/role.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@ import (
55
"fmt"
66

77
rbacv1 "k8s.io/api/rbac/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
"k8s.io/klog"
1112
)
1213

1314
// CreateRole creates the role.
1415
func (c *Client) CreateRole(r *rbacv1.Role) (*rbacv1.Role, error) {
15-
return c.RbacV1().Roles(r.GetNamespace()).Create(context.TODO(), r, metav1.CreateOptions{})
16+
createdRole, err := c.RbacV1().Roles(r.GetNamespace()).Create(context.TODO(), r, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateRole(r)
19+
}
20+
return createdRole, err
1621
}
1722

1823
// GetRole returns the existing role.

Diff for: pkg/lib/operatorclient/rolebinding.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
rbacv1 "k8s.io/api/rbac/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
acv1 "k8s.io/client-go/applyconfigurations/rbac/v1"
@@ -18,7 +19,11 @@ func (c *Client) ApplyRoleBinding(applyConfig *acv1.RoleBindingApplyConfiguratio
1819

1920
// CreateRoleBinding creates the roleBinding.
2021
func (c *Client) CreateRoleBinding(ig *rbacv1.RoleBinding) (*rbacv1.RoleBinding, error) {
21-
return c.RbacV1().RoleBindings(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
22+
createdRB, err := c.RbacV1().RoleBindings(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
23+
if err != nil && apierrors.IsAlreadyExists(err) {
24+
return c.UpdateRoleBinding(ig)
25+
}
26+
return createdRB, err
2227
}
2328

2429
// GetRoleBinding returns the existing roleBinding.

Diff for: pkg/lib/operatorclient/secret.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@ import (
55
"fmt"
66

77
v1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
"k8s.io/klog"
1112
)
1213

1314
// CreateSecret creates the Secret.
1415
func (c *Client) CreateSecret(ig *v1.Secret) (*v1.Secret, error) {
15-
return c.CoreV1().Secrets(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
16+
createdSecret, err := c.CoreV1().Secrets(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateSecret(ig)
19+
}
20+
return createdSecret, err
1621
}
1722

1823
// GetSecret returns the existing Secret.

Diff for: pkg/lib/operatorclient/service.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
v1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
acv1 "k8s.io/client-go/applyconfigurations/core/v1"
@@ -18,7 +19,11 @@ func (c *Client) ApplyService(applyConfig *acv1.ServiceApplyConfiguration, apply
1819

1920
// CreateService creates the Service.
2021
func (c *Client) CreateService(ig *v1.Service) (*v1.Service, error) {
21-
return c.CoreV1().Services(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
22+
createdService, err := c.CoreV1().Services(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
23+
if err != nil && apierrors.IsAlreadyExists(err) {
24+
return c.UpdateService(ig)
25+
}
26+
return createdService, err
2227
}
2328

2429
// GetService returns the existing Service.

Diff for: pkg/lib/operatorclient/serviceaccount.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@ import (
55
"fmt"
66

77
v1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/types"
1011
"k8s.io/klog"
1112
)
1213

1314
// CreateServiceAccount creates the serviceAccount.
1415
func (c *Client) CreateServiceAccount(ig *v1.ServiceAccount) (*v1.ServiceAccount, error) {
15-
return c.CoreV1().ServiceAccounts(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
16+
createdSA, err := c.CoreV1().ServiceAccounts(ig.GetNamespace()).Create(context.TODO(), ig, metav1.CreateOptions{})
17+
if err != nil && apierrors.IsAlreadyExists(err) {
18+
return c.UpdateServiceAccount(ig)
19+
}
20+
return createdSA, err
1621
}
1722

1823
// GetServiceAccount returns the existing serviceAccount.

0 commit comments

Comments
 (0)