Skip to content

Commit 36a0662

Browse files
authored
feat: Preserve user-managed fields when applying resources (#556)
**What problem does this PR solve?**: We want to preserve user-managed fields when we create/update specific resources. If a value in a user-managed field conflicts with our value, we want to alert the user by returning an error, rather than overwriting the value. This PR exposes the `ForceOwnership` option to callers, but does not change the behavior of existing callers. **Which issue(s) this PR fixes**: Fixes # **How Has This Been Tested?**: <!-- Please describe the tests that you ran to verify your changes. Provide output from the tests and any manual steps needed to replicate the tests. --> **Special notes for your reviewer**: <!-- Use this to provide any additional information to the reviewers. This may include: - Best way to review the PR. - Where the author wants the most review attention on. - etc. -->
1 parent db51743 commit 36a0662

File tree

17 files changed

+38
-34
lines changed

17 files changed

+38
-34
lines changed

common/pkg/k8s/client/apply.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,29 @@ import (
1010
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
1111
)
1212

13-
// ServerSideApply will apply (i.e. create or update) objects via server-side apply. This will overwrite any changes
14-
// that have been manually applied.
13+
const (
14+
// FieldOwner is the field manager name used for server-side apply.
15+
FieldOwner = "d2iq-cluster-api-runtime-extensions-nutanix"
16+
)
17+
18+
// ForceOwnership is an convenience alias of the same option in the controller-runtime client.
19+
var ForceOwnership = ctrlclient.ForceOwnership
20+
21+
// ServerSideApply will apply (i.e. create or update) objects via server-side apply.
1522
func ServerSideApply(
1623
ctx context.Context,
1724
c ctrlclient.Client,
18-
objs ...ctrlclient.Object,
25+
obj ctrlclient.Object,
26+
opts ...ctrlclient.PatchOption,
1927
) error {
20-
for i := range objs {
21-
err := c.Patch(
22-
ctx,
23-
objs[i],
24-
ctrlclient.Apply,
25-
ctrlclient.ForceOwnership,
26-
ctrlclient.FieldOwner("d2iq-cluster-api-runtime-extensions-nutanix"),
27-
)
28-
if err != nil {
29-
return fmt.Errorf("server-side apply failed: %w", err)
30-
}
28+
err := c.Patch(
29+
ctx,
30+
obj,
31+
ctrlclient.Apply,
32+
ctrlclient.FieldOwner(FieldOwner),
33+
)
34+
if err != nil {
35+
return fmt.Errorf("server-side apply failed: %w", err)
3136
}
32-
3337
return nil
3438
}

pkg/handlers/generic/lifecycle/ccm/aws/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (a *AWSCCM) Apply(
8787
}
8888

8989
ccmConfigMap := generateCCMConfigMapForCluster(ccmConfigMapForMinorVersion, cluster)
90-
if err = client.ServerSideApply(ctx, a.client, ccmConfigMap); err != nil {
90+
if err = client.ServerSideApply(ctx, a.client, ccmConfigMap, client.ForceOwnership); err != nil {
9191
log.Error(err, "failed to apply CCM configmap for cluster")
9292
return fmt.Errorf(
9393
"failed to apply AWS CCM manifests ConfigMap: %w",

pkg/handlers/generic/lifecycle/ccm/nutanix/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func (p *provider) Apply(
157157
)
158158
}
159159

160-
if err = client.ServerSideApply(ctx, p.client, hcp); err != nil {
160+
if err = client.ServerSideApply(ctx, p.client, hcp, client.ForceOwnership); err != nil {
161161
return fmt.Errorf("failed to apply nutanix-ccm installation HelmChartProxy: %w", err)
162162
}
163163

pkg/handlers/generic/lifecycle/clusterautoscaler/strategy_crs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (s crsStrategy) apply(
8181
Data: data,
8282
}
8383

84-
if err := client.ServerSideApply(ctx, s.client, cm); err != nil {
84+
if err := client.ServerSideApply(ctx, s.client, cm, client.ForceOwnership); err != nil {
8585
return fmt.Errorf(
8686
"failed to apply cluster-autoscaler installation ConfigMap: %w",
8787
err,

pkg/handlers/generic/lifecycle/clusterautoscaler/strategy_helmaddon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (s helmAddonStrategy) apply(
102102
)
103103
}
104104

105-
if err = client.ServerSideApply(ctx, s.client, hcp); err != nil {
105+
if err = client.ServerSideApply(ctx, s.client, hcp, client.ForceOwnership); err != nil {
106106
return fmt.Errorf("failed to apply cluster-autoscaler installation HelmChartProxy: %w", err)
107107
}
108108

pkg/handlers/generic/lifecycle/cni/calico/strategy_crs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (s crsStrategy) ensureCNICRSForCluster(
144144
)
145145
}
146146

147-
if err := client.ServerSideApply(ctx, s.client, cm); err != nil {
147+
if err := client.ServerSideApply(ctx, s.client, cm, client.ForceOwnership); err != nil {
148148
return fmt.Errorf(
149149
"failed to apply Calico CNI installation manifests ConfigMap: %w",
150150
err,
@@ -185,7 +185,7 @@ func (s crsStrategy) ensureTigeraOperatorConfigMap(
185185
}
186186

187187
tigeraConfigMap := generateTigeraOperatorConfigMap(defaultTigeraOperatorConfigMap, cluster)
188-
if err := client.ServerSideApply(ctx, s.client, tigeraConfigMap); err != nil {
188+
if err := client.ServerSideApply(ctx, s.client, tigeraConfigMap, client.ForceOwnership); err != nil {
189189
return nil, fmt.Errorf(
190190
"failed to apply Tigera Operator manifests ConfigMap: %w",
191191
err,

pkg/handlers/generic/lifecycle/cni/calico/strategy_helmaddon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func (s helmAddonStrategy) apply(
110110
)
111111
}
112112

113-
if err := client.ServerSideApply(ctx, s.client, hcp); err != nil {
113+
if err := client.ServerSideApply(ctx, s.client, hcp, client.ForceOwnership); err != nil {
114114
return fmt.Errorf("failed to apply Calico CNI installation HelmChartProxy: %w", err)
115115
}
116116

pkg/handlers/generic/lifecycle/cni/cilium/strategy_crs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (s crsStrategy) apply(
8080
BinaryData: defaultCiliumConfigMap.BinaryData,
8181
}
8282

83-
if err := client.ServerSideApply(ctx, s.client, cm); err != nil {
83+
if err := client.ServerSideApply(ctx, s.client, cm, client.ForceOwnership); err != nil {
8484
return fmt.Errorf(
8585
"failed to apply Cilium CNI installation ConfigMap: %w",
8686
err,

pkg/handlers/generic/lifecycle/cni/cilium/strategy_helmaddon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (s helmAddonStrategy) apply(
9494
)
9595
}
9696

97-
if err := client.ServerSideApply(ctx, s.client, hcp); err != nil {
97+
if err := client.ServerSideApply(ctx, s.client, hcp, client.ForceOwnership); err != nil {
9898
return fmt.Errorf("failed to apply Cilium CNI installation HelmChartProxy: %w", err)
9999
}
100100

pkg/handlers/generic/lifecycle/csi/aws-ebs/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (a *AWSEBS) handleCRSApply(ctx context.Context,
111111
}
112112
cluster := req.Cluster
113113
cm := generateAWSEBSCSIConfigMap(awsEBSCSIConfigMap, &cluster)
114-
if err := client.ServerSideApply(ctx, a.client, cm); err != nil {
114+
if err := client.ServerSideApply(ctx, a.client, cm, client.ForceOwnership); err != nil {
115115
return fmt.Errorf(
116116
"failed to apply AWS EBS CSI manifests ConfigMap: %w",
117117
err,

pkg/handlers/generic/lifecycle/csi/nutanix-csi/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func (n *NutanixCSI) handleHelmAddonApply(
185185
)
186186
}
187187

188-
if err = client.ServerSideApply(ctx, n.client, hcp); err != nil {
188+
if err = client.ServerSideApply(ctx, n.client, hcp, client.ForceOwnership); err != nil {
189189
return fmt.Errorf("failed to apply nutanix-csi installation HelmChartProxy: %w", err)
190190
}
191191

@@ -215,7 +215,7 @@ func (n *NutanixCSI) handleHelmAddonApply(
215215
},
216216
}
217217

218-
if err = client.ServerSideApply(ctx, n.client, snapshotChart); err != nil {
218+
if err = client.ServerSideApply(ctx, n.client, snapshotChart, client.ForceOwnership); err != nil {
219219
return fmt.Errorf(
220220
"failed to apply nutanix-csi-snapshot installation HelmChartProxy: %w",
221221
err,

pkg/handlers/generic/lifecycle/nfd/strategy_crs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (s crsStrategy) apply(
8080
BinaryData: defaultCM.BinaryData,
8181
}
8282

83-
if err := client.ServerSideApply(ctx, s.client, cm); err != nil {
83+
if err := client.ServerSideApply(ctx, s.client, cm, client.ForceOwnership); err != nil {
8484
return fmt.Errorf(
8585
"failed to apply NFD installation ConfigMap: %w",
8686
err,

pkg/handlers/generic/lifecycle/nfd/strategy_helmaddon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ image:
100100
)
101101
}
102102

103-
if err := client.ServerSideApply(ctx, s.client, hcp); err != nil {
103+
if err := client.ServerSideApply(ctx, s.client, hcp, client.ForceOwnership); err != nil {
104104
return fmt.Errorf("failed to apply NFD installation HelmChartProxy: %w", err)
105105
}
106106

pkg/handlers/generic/lifecycle/utils/scs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func CreateStorageClassOnRemote(
8585
return fmt.Errorf("error creating client for remote cluster: %w", err)
8686
}
8787
for _, sc := range allStorageClasses {
88-
err = client.ServerSideApply(ctx, remoteClient, sc)
88+
err = client.ServerSideApply(ctx, remoteClient, sc, client.ForceOwnership)
8989
if err != nil {
9090
return fmt.Errorf("error creating storage class %v on remote cluster %w", sc, err)
9191
}

pkg/handlers/generic/lifecycle/utils/secrets.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func CopySecretToRemoteCluster(
6464
return fmt.Errorf("error creating namespace on the remote cluster: %w", err)
6565
}
6666

67-
err = client.ServerSideApply(ctx, remoteClient, credentialsOnRemote)
67+
err = client.ServerSideApply(ctx, remoteClient, credentialsOnRemote, client.ForceOwnership)
6868
if err != nil {
6969
return fmt.Errorf("error creating Secret on the remote cluster: %w", err)
7070
}

pkg/handlers/generic/lifecycle/utils/utils.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func EnsureCRSForClusterFromObjects(
8585
return fmt.Errorf("failed to set owner reference: %w", err)
8686
}
8787

88-
err := client.ServerSideApply(ctx, c, crs)
88+
err := client.ServerSideApply(ctx, c, crs, client.ForceOwnership)
8989
if err != nil {
9090
return fmt.Errorf("failed to server side apply %w", err)
9191
}
@@ -110,7 +110,7 @@ func EnsureNamespace(ctx context.Context, c ctrlclient.Client, name string) erro
110110
return nil
111111
}
112112

113-
err := client.ServerSideApply(ctx, c, ns)
113+
err := client.ServerSideApply(ctx, c, ns, client.ForceOwnership)
114114
if err != nil {
115115
return fmt.Errorf("failed to server side apply %w", err)
116116
}

pkg/handlers/generic/mutation/imageregistries/credentials/inject.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ func createSecretIfNeeded(
349349
)
350350
}
351351
if credentialsSecret != nil {
352-
if err := client.ServerSideApply(ctx, c, credentialsSecret); err != nil {
352+
if err := client.ServerSideApply(ctx, c, credentialsSecret, client.ForceOwnership); err != nil {
353353
return fmt.Errorf("failed to apply Image Registry Credentials Secret: %w", err)
354354
}
355355
}

0 commit comments

Comments
 (0)