Skip to content

Commit 9442b14

Browse files
authored
Merge pull request #3775 from chethanv28/revert-patch-cr-changes
Revert "Use Patch operation for CnsFileAccessConfig updates"
2 parents 3af0175 + 66324ff commit 9442b14

File tree

8 files changed

+63
-64
lines changed

8 files changed

+63
-64
lines changed

pkg/kubernetes/kubernetes.go

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package kubernetes
1919
import (
2020
"context"
2121
"embed"
22-
"encoding/json"
2322
"flag"
2423
"fmt"
2524
"net"
@@ -38,8 +37,6 @@ import (
3837
"k8s.io/apimachinery/pkg/runtime"
3938
"k8s.io/apimachinery/pkg/runtime/schema"
4039
"k8s.io/apimachinery/pkg/runtime/serializer"
41-
apitypes "k8s.io/apimachinery/pkg/types"
42-
"k8s.io/apimachinery/pkg/util/strategicpatch"
4340
"k8s.io/apimachinery/pkg/util/wait"
4441
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
4542
clientset "k8s.io/client-go/kubernetes"
@@ -830,46 +827,3 @@ func RemoveFinalizer(ctx context.Context, c client.Client, obj client.Object, fi
830827
log.Info("Removing finalizer from object.")
831828
return c.Update(ctx, obj)
832829
}
833-
834-
// PatchObject patches a Kubernetes object using strategic merge patch.
835-
// This function creates a patch between the original and modified objects and applies it using the client.
836-
// It returns an error if the patch operation fails.
837-
func PatchObject(ctx context.Context, k8sClient client.Client, original, modified client.Object) error {
838-
log := logger.GetLogger(ctx)
839-
840-
// Marshal the original object
841-
oldData, err := json.Marshal(original)
842-
if err != nil {
843-
log.Errorf("PatchObject: Failed to marshal original object %s/%s: %v",
844-
original.GetNamespace(), original.GetName(), err)
845-
return err
846-
}
847-
848-
// Marshal the modified object
849-
newData, err := json.Marshal(modified)
850-
if err != nil {
851-
log.Errorf("PatchObject: Failed to marshal modified object %s/%s: %v",
852-
modified.GetNamespace(), modified.GetName(), err)
853-
return err
854-
}
855-
856-
// Create strategic merge patch
857-
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, original)
858-
if err != nil {
859-
log.Errorf("PatchObject: Error creating strategic merge patch for object %s/%s: %v",
860-
original.GetNamespace(), original.GetName(), err)
861-
return err
862-
}
863-
864-
// Apply the patch
865-
patch := client.RawPatch(apitypes.StrategicMergePatchType, patchBytes)
866-
if err := k8sClient.Patch(ctx, original, patch); err != nil {
867-
log.Errorf("PatchObject: Failed to patch object %s/%s: %v",
868-
original.GetNamespace(), original.GetName(), err)
869-
return err
870-
}
871-
872-
log.Debugf("PatchObject: Successfully patched object %s/%s",
873-
original.GetNamespace(), original.GetName())
874-
return nil
875-
}

pkg/syncer/cnsoperator/controller/cnsfileaccessconfig/cnsfileaccessconfig_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ func addPvcFinalizer(ctx context.Context,
532532
pvc.Namespace)
533533
}
534534

535-
err = k8s.PatchObject(ctx, client, original, pvc)
535+
err = util.PatchObject(ctx, client, original, pvc)
536536
if err != nil {
537537
return fmt.Errorf("failed to add finalizer %s on PVC %s in namespace %s", cnsoperatortypes.CNSPvcFinalizer,
538538
instance.Spec.PvcName, instance.Namespace)
@@ -606,7 +606,7 @@ func removeFinalizerFromPVC(ctx context.Context, client client.Client,
606606
return err
607607
}
608608

609-
err = k8s.PatchObject(ctx, client, original, pvc)
609+
err = util.PatchObject(ctx, client, original, pvc)
610610
if err != nil {
611611
return fmt.Errorf("failed to remove finalizer %s from PVC %s in namespace %s",
612612
cnsoperatortypes.CNSPvcFinalizer, pvcName, pvc.Namespace)
@@ -875,7 +875,7 @@ func updateCnsFileAccessConfig(ctx context.Context, client client.Client,
875875
instance *v1a1.CnsFileAccessConfig) error {
876876
log := logger.GetLogger(ctx)
877877
original := instance.DeepCopy()
878-
err := k8s.PatchObject(ctx, client, original, instance)
878+
err := util.PatchObject(ctx, client, original, instance)
879879
if err != nil {
880880
log.Errorf("failed to patch CnsFileAccessConfig instance: %q on namespace: %q. Error: %+v",
881881
instance.Name, instance.Namespace, err)

pkg/syncer/cnsoperator/controller/cnsvolumemetadata/cnsvolumemetadata_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/common"
2929
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/common/commonco"
3030
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/logger"
31-
k8s "sigs.k8s.io/vsphere-csi-driver/v3/pkg/kubernetes"
3231
cnsoperatorutil "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/util"
3332

3433
"github.com/davecgh/go-spew/spew"
@@ -56,6 +55,7 @@ import (
5655
volumes "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/cns-lib/volume"
5756
cnsvsphere "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/cns-lib/vsphere"
5857
csitypes "sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/types"
58+
k8s "sigs.k8s.io/vsphere-csi-driver/v3/pkg/kubernetes"
5959
cnsoperatortypes "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/types"
6060
)
6161

@@ -234,7 +234,7 @@ func (r *ReconcileCnsVolumeMetadata) Reconcile(ctx context.Context,
234234
recordEvent(ctx, r, instance, v1.EventTypeWarning, msg)
235235
// Update instance.status fields with the errors per volume.
236236
original := instance.DeepCopy()
237-
if err = k8s.PatchObject(ctx, r.client, original, instance); err != nil {
237+
if err = cnsoperatorutil.PatchObject(ctx, r.client, original, instance); err != nil {
238238
msg := fmt.Sprintf("ReconcileCnsVolumeMetadata: Failed to patch status for %q. "+
239239
"Err: %v.", instance.Name, err)
240240
recordEvent(ctx, r, instance, v1.EventTypeWarning, msg)
@@ -249,7 +249,7 @@ func (r *ReconcileCnsVolumeMetadata) Reconcile(ctx context.Context,
249249
log.Debugf("ReconcileCnsVolumeMetadata: Removing finalizer %q for instance %q", finalizer, instance.Name)
250250
original := instance.DeepCopy()
251251
instance.Finalizers = append(instance.Finalizers[:index], instance.Finalizers[index+1:]...)
252-
if err = k8s.PatchObject(ctx, r.client, original, instance); err != nil {
252+
if err = cnsoperatorutil.PatchObject(ctx, r.client, original, instance); err != nil {
253253
msg := fmt.Sprintf("ReconcileCnsVolumeMetadata: Failed to remove finalizer %q for %q. "+
254254
"Err: %v. Requeueing request.", finalizer, instance.Name, err)
255255
recordEvent(ctx, r, instance, v1.EventTypeWarning, msg)
@@ -280,7 +280,7 @@ func (r *ReconcileCnsVolumeMetadata) Reconcile(ctx context.Context,
280280
if !isFinalizerSet {
281281
original := instance.DeepCopy()
282282
instance.Finalizers = append(instance.Finalizers, cnsoperatortypes.CNSFinalizer)
283-
if err = k8s.PatchObject(ctx, r.client, original, instance); err != nil {
283+
if err = cnsoperatorutil.PatchObject(ctx, r.client, original, instance); err != nil {
284284
msg := fmt.Sprintf("ReconcileCnsVolumeMetadata: Failed to add finalizer %q for %q. "+
285285
"Err: %v. Requeueing request.", cnsoperatortypes.CNSFinalizer, instance.Name, err)
286286
recordEvent(ctx, r, instance, v1.EventTypeWarning, msg)
@@ -297,7 +297,7 @@ func (r *ReconcileCnsVolumeMetadata) Reconcile(ctx context.Context,
297297
// Update instance.status fields on supervisor API server and requeue
298298
// the request.
299299
original := instance.DeepCopy()
300-
_ = k8s.PatchObject(ctx, r.client, original, instance)
300+
_ = cnsoperatorutil.PatchObject(ctx, r.client, original, instance)
301301
return reconcile.Result{RequeueAfter: timeout}, nil
302302
}
303303
// Successfully updated CNS.
@@ -307,7 +307,7 @@ func (r *ReconcileCnsVolumeMetadata) Reconcile(ctx context.Context,
307307
recordEvent(ctx, r, instance, v1.EventTypeNormal, msg)
308308
// Update instance.status fields on supervisor API server.
309309
original := instance.DeepCopy()
310-
if err = k8s.PatchObject(ctx, r.client, original, instance); err != nil {
310+
if err = cnsoperatorutil.PatchObject(ctx, r.client, original, instance); err != nil {
311311
msg := fmt.Sprintf("ReconcileCnsVolumeMetadata: Failed to patch status for %q. "+
312312
"Err: %v. Requeueing request.", instance.Name, err)
313313
recordEvent(ctx, r, instance, v1.EventTypeWarning, msg)

pkg/syncer/cnsoperator/controller/cnsvolumemetadata/cnsvolumemetadata_controller_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import (
2929

3030
cnsoperatorapis "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
3131
cnsvolumemetadatav1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator/cnsvolumemetadata/v1alpha1"
32-
k8s "sigs.k8s.io/vsphere-csi-driver/v3/pkg/kubernetes"
3332
cnsoperatortypes "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/types"
33+
cnsoperatorutil "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/util"
3434
)
3535

3636
func TestCnsVolumeMetadata_PatchOperations(t *testing.T) {
@@ -211,7 +211,7 @@ func TestCnsVolumeMetadata_PatchOperations(t *testing.T) {
211211
fakeClient, original, modified := tt.setupFunc()
212212

213213
// Execute the patch operation using our common utility
214-
err := k8s.PatchObject(ctx, fakeClient, original, modified)
214+
err := cnsoperatorutil.PatchObject(ctx, fakeClient, original, modified)
215215

216216
// Validate results
217217
if tt.expectError {
@@ -253,7 +253,7 @@ func TestCnsVolumeMetadata_PatchErrorHandling(t *testing.T) {
253253
modified.Finalizers = append(modified.Finalizers, cnsoperatortypes.CNSFinalizer)
254254

255255
// Execute the patch operation - should fail
256-
err := k8s.PatchObject(ctx, fakeClient, original, modified)
256+
err := cnsoperatorutil.PatchObject(ctx, fakeClient, original, modified)
257257
assert.Error(t, err)
258258
assert.Contains(t, err.Error(), "not found")
259259
})
@@ -282,7 +282,7 @@ func TestCnsVolumeMetadata_PatchErrorHandling(t *testing.T) {
282282
}
283283

284284
// This should succeed as the objects are valid
285-
err := k8s.PatchObject(ctx, fakeClient, original, modified)
285+
err := cnsoperatorutil.PatchObject(ctx, fakeClient, original, modified)
286286
assert.NoError(t, err)
287287

288288
// Verify the patch was applied

pkg/syncer/cnsoperator/util/util.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package util
1818

1919
import (
2020
"context"
21+
"encoding/json"
2122
"errors"
2223
"fmt"
2324
"os"
@@ -30,6 +31,7 @@ import (
3031
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3132
"k8s.io/apimachinery/pkg/runtime/schema"
3233
apitypes "k8s.io/apimachinery/pkg/types"
34+
"k8s.io/apimachinery/pkg/util/strategicpatch"
3335
"k8s.io/client-go/dynamic"
3436
"sigs.k8s.io/controller-runtime/pkg/client"
3537
cnsvsphere "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/cns-lib/vsphere"
@@ -397,3 +399,46 @@ func GetMaxWorkerThreads(ctx context.Context, key string, defaultVal int) int {
397399
}
398400
return workerThreads
399401
}
402+
403+
// PatchObject patches a Kubernetes object using strategic merge patch.
404+
// This function creates a patch between the original and modified objects and applies it using the client.
405+
// It returns an error if the patch operation fails.
406+
func PatchObject(ctx context.Context, k8sClient client.Client, original, modified client.Object) error {
407+
log := logger.GetLogger(ctx)
408+
409+
// Marshal the original object
410+
oldData, err := json.Marshal(original)
411+
if err != nil {
412+
log.Errorf("PatchObject: Failed to marshal original object %s/%s: %v",
413+
original.GetNamespace(), original.GetName(), err)
414+
return err
415+
}
416+
417+
// Marshal the modified object
418+
newData, err := json.Marshal(modified)
419+
if err != nil {
420+
log.Errorf("PatchObject: Failed to marshal modified object %s/%s: %v",
421+
modified.GetNamespace(), modified.GetName(), err)
422+
return err
423+
}
424+
425+
// Create strategic merge patch
426+
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, original)
427+
if err != nil {
428+
log.Errorf("PatchObject: Error creating strategic merge patch for object %s/%s: %v",
429+
original.GetNamespace(), original.GetName(), err)
430+
return err
431+
}
432+
433+
// Apply the patch
434+
patch := client.RawPatch(apitypes.StrategicMergePatchType, patchBytes)
435+
if err := k8sClient.Patch(ctx, original, patch); err != nil {
436+
log.Errorf("PatchObject: Failed to patch object %s/%s: %v",
437+
original.GetNamespace(), original.GetName(), err)
438+
return err
439+
}
440+
441+
log.Debugf("PatchObject: Successfully patched object %s/%s",
442+
original.GetNamespace(), original.GetName())
443+
return nil
444+
}

pkg/syncer/cnsoperator/util/util_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
ctrlruntimefake "sigs.k8s.io/controller-runtime/pkg/client/fake"
3333
cnsoperatorapis "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
3434
cnsvolumemetadatav1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator/cnsvolumemetadata/v1alpha1"
35-
k8s "sigs.k8s.io/vsphere-csi-driver/v3/pkg/kubernetes"
3635
)
3736

3837
func TestGetSnatIpFromNamespaceNetworkInfo(t *testing.T) {
@@ -346,7 +345,7 @@ func TestPatchObject(t *testing.T) {
346345
t.Run(tt.name, func(t *testing.T) {
347346
fakeClient, original, modified := tt.setupFunc()
348347

349-
err := k8s.PatchObject(ctx, fakeClient, original, modified)
348+
err := PatchObject(ctx, fakeClient, original, modified)
350349

351350
if tt.expectError {
352351
assert.Error(t, err)

pkg/syncer/pvcsi_fullsync.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
cnsconfig "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/config"
4242
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/prometheus"
4343
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/logger"
44+
cnsoperatorutil "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/util"
4445
)
4546

4647
var (
@@ -145,7 +146,7 @@ func PvcsiFullSync(ctx context.Context, metadataSyncer *metadataSyncInformer) er
145146
log.Infof("FullSync: Patching CnsVolumeMetadata %v on the supervisor cluster", guestObject.Name)
146147
original := supervisorObject.DeepCopy()
147148
supervisorObject.Spec = guestObject.Spec
148-
if err := k8s.PatchObject(ctx, metadataSyncer.cnsOperatorClient, original,
149+
if err := cnsoperatorutil.PatchObject(ctx, metadataSyncer.cnsOperatorClient, original,
149150
supervisorObject); err != nil {
150151
log.Warnf("FullSync: Failed to patch CnsVolumeMetadata %v. Err: %v", supervisorObject.Name, err)
151152
}

pkg/syncer/pvcsi_metadatasyncer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
cnsvolumemetadatav1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator/cnsvolumemetadata/v1alpha1"
2929
cnsconfig "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/config"
3030
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/logger"
31-
k8s "sigs.k8s.io/vsphere-csi-driver/v3/pkg/kubernetes"
31+
cnsoperatorutil "sigs.k8s.io/vsphere-csi-driver/v3/pkg/syncer/cnsoperator/util"
3232
)
3333

3434
// pvcsiVolumeUpdated updates persistent volume claim and persistent volume
@@ -80,7 +80,7 @@ func pvcsiVolumeUpdated(ctx context.Context, resourceType interface{},
8080
newMetadata.ResourceVersion = currentMetadata.ResourceVersion
8181
newMetadata.Namespace = supervisorNamespace
8282
log.Debugf("pvCSI VolumeUpdated: Invoking patch on CnsVolumeMetadata with spec: %+v", spew.Sdump(newMetadata))
83-
if err := k8s.PatchObject(ctx, metadataSyncer.cnsOperatorClient, currentMetadata,
83+
if err := cnsoperatorutil.PatchObject(ctx, metadataSyncer.cnsOperatorClient, currentMetadata,
8484
newMetadata); err != nil {
8585
log.Errorf("pvCSI VolumeUpdated: Failed to patch CnsVolumeMetadata: %v. Error: %v", newMetadata.Name, err)
8686
return

0 commit comments

Comments
 (0)