Skip to content

Commit 3c7214e

Browse files
committed
Use Patch operation for PV updates
1 parent 7a6acd9 commit 3c7214e

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

pkg/csi/service/common/commonco/k8sorchestrator/k8sorchestrator.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package k8sorchestrator
1919
import (
2020
"context"
2121
"crypto/sha256"
22+
"encoding/json"
2223
"errors"
2324
"fmt"
2425
"os"
@@ -44,6 +45,7 @@ import (
4445
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4546
"k8s.io/apimachinery/pkg/runtime"
4647
k8stypes "k8s.io/apimachinery/pkg/types"
48+
"k8s.io/apimachinery/pkg/util/strategicpatch"
4749
"k8s.io/client-go/informers"
4850
clientset "k8s.io/client-go/kubernetes"
4951
restclient "k8s.io/client-go/rest"
@@ -2229,11 +2231,36 @@ func (c *K8sOrchestrator) UpdatePersistentVolumeLabel(ctx context.Context,
22292231
if err != nil {
22302232
return fmt.Errorf("error getting PV %s from API server: %w", pvName, err)
22312233
}
2232-
if pv.Labels == nil {
2233-
pv.Labels = make(map[string]string)
2234+
2235+
oldData, err := json.Marshal(pv)
2236+
if err != nil {
2237+
errMsg := fmt.Sprintf("Failed to marshal PV %s: %v", pvName, err)
2238+
log.Error(errMsg)
2239+
return err
22342240
}
2235-
pv.Labels[key] = value
2236-
_, err = c.k8sClient.CoreV1().PersistentVolumes().Update(ctx, pv, metav1.UpdateOptions{})
2241+
2242+
newPV := pv.DeepCopy()
2243+
if newPV.Labels == nil {
2244+
newPV.Labels = make(map[string]string)
2245+
}
2246+
newPV.Labels[key] = value
2247+
2248+
newData, err := json.Marshal(newPV)
2249+
if err != nil {
2250+
errMsg := fmt.Sprintf("Failed to marshal updated PV %s with labels: %v", pvName, err)
2251+
log.Error(errMsg)
2252+
return err
2253+
}
2254+
2255+
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, pv)
2256+
if err != nil {
2257+
errMsg := fmt.Sprintf("Error creating two way merge patch for PV %s with error: %v", pvName, err)
2258+
log.Error(errMsg)
2259+
return err
2260+
}
2261+
2262+
_, err = c.k8sClient.CoreV1().PersistentVolumes().Patch(ctx, pv.Name, k8stypes.StrategicMergePatchType,
2263+
patchBytes, metav1.PatchOptions{})
22372264
if err != nil {
22382265
errMsg := fmt.Sprintf("error updating PV %s with labels %s/%s. Error: %v", pvName, key, value, err)
22392266
log.Error(errMsg)

pkg/kubernetes/kubernetes.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package kubernetes
1919
import (
2020
"context"
2121
"embed"
22+
"encoding/json"
2223
"flag"
2324
"fmt"
2425
"net"
@@ -40,6 +41,8 @@ import (
4041
"k8s.io/apimachinery/pkg/runtime"
4142
"k8s.io/apimachinery/pkg/runtime/schema"
4243
"k8s.io/apimachinery/pkg/runtime/serializer"
44+
k8stypes "k8s.io/apimachinery/pkg/types"
45+
"k8s.io/apimachinery/pkg/util/strategicpatch"
4346
"k8s.io/apimachinery/pkg/util/wait"
4447
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
4548
clientset "k8s.io/client-go/kubernetes"
@@ -728,8 +731,28 @@ func RetainPersistentVolume(ctx context.Context, k8sClient clientset.Interface,
728731
return err
729732
}
730733

731-
pv.Spec.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimRetain
732-
_, err = k8sClient.CoreV1().PersistentVolumes().Update(ctx, pv, metav1.UpdateOptions{})
734+
oldData, err := json.Marshal(pv)
735+
if err != nil {
736+
log.Errorf("Failed to marshal PV: %v, Error: %v", pv, err)
737+
return err
738+
}
739+
740+
newPV := pv.DeepCopy()
741+
newPV.Spec.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimRetain
742+
newData, err := json.Marshal(newPV)
743+
if err != nil {
744+
log.Errorf("Failed to marshal updated PV with reclaim policy: %v, Error: %v", newPV, err)
745+
return err
746+
}
747+
748+
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, pv)
749+
if err != nil {
750+
log.Errorf("Error creating two way merge patch for PV %q with error: %v", pv.Name, err)
751+
return err
752+
}
753+
754+
_, err = k8sClient.CoreV1().PersistentVolumes().Patch(ctx, pv.Name, k8stypes.StrategicMergePatchType,
755+
patchBytes, metav1.PatchOptions{})
733756
if err != nil {
734757
log.Errorf("Failed to set the reclaim policy to retain. Error: %s", err.Error())
735758
return err

0 commit comments

Comments
 (0)