Skip to content

Commit 29e4f84

Browse files
committed
Merge branch 'master' into feature/rotate-on-args-change
2 parents 3dca070 + 69775c2 commit 29e4f84

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

pkg/util/k8sutil/storageclass.go

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,67 @@
2323
package k8sutil
2424

2525
import (
26-
"fmt"
2726
"strconv"
27+
"time"
2828

29+
"github.com/arangodb/arangosync/pkg/retry"
2930
"k8s.io/api/storage/v1"
30-
"k8s.io/apimachinery/pkg/types"
31+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3132
storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1"
3233
)
3334

34-
const (
35-
annStorageClassIsDefault = "storageclass.kubernetes.io/is-default-class"
35+
var (
36+
annStorageClassIsDefault = []string{
37+
// Make sure first entry is the one we'll put in
38+
"storageclass.kubernetes.io/is-default-class",
39+
"storageclass.beta.kubernetes.io/is-default-class",
40+
}
3641
)
3742

3843
// StorageClassIsDefault returns true if the given storage class is marked default,
3944
// false otherwise.
4045
func StorageClassIsDefault(sc *v1.StorageClass) bool {
41-
value, found := sc.GetObjectMeta().GetAnnotations()[annStorageClassIsDefault]
42-
if !found {
43-
return false
44-
}
45-
boolValue, err := strconv.ParseBool(value)
46-
if err != nil {
47-
return false
46+
for _, key := range annStorageClassIsDefault {
47+
if value, found := sc.GetObjectMeta().GetAnnotations()[key]; found {
48+
if boolValue, err := strconv.ParseBool(value); err == nil && boolValue {
49+
return true
50+
}
51+
}
4852
}
49-
return boolValue
53+
return false
5054
}
5155

5256
// PatchStorageClassIsDefault changes the default flag of the given storage class.
5357
func PatchStorageClassIsDefault(cli storagev1.StorageV1Interface, name string, isDefault bool) error {
54-
jsonPatch := fmt.Sprintf(`{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"%v"}}}`, isDefault)
55-
if _, err := cli.StorageClasses().Patch(name, types.StrategicMergePatchType, []byte(jsonPatch)); err != nil {
58+
stcs := cli.StorageClasses()
59+
op := func() error {
60+
// Fetch current version of StorageClass
61+
current, err := stcs.Get(name, metav1.GetOptions{})
62+
if IsNotFound(err) {
63+
return retry.Permanent(maskAny(err))
64+
} else if err != nil {
65+
return maskAny(err)
66+
}
67+
// Tweak annotations
68+
ann := current.GetAnnotations()
69+
if ann == nil {
70+
ann = make(map[string]string)
71+
}
72+
for _, key := range annStorageClassIsDefault {
73+
delete(ann, key)
74+
}
75+
ann[annStorageClassIsDefault[0]] = strconv.FormatBool(isDefault)
76+
current.SetAnnotations(ann)
77+
// Save StorageClass
78+
if _, err := stcs.Update(current); IsConflict(err) {
79+
// StorageClass has been modified since we read it
80+
return maskAny(err)
81+
} else if err != nil {
82+
return retry.Permanent(maskAny(err))
83+
}
84+
return nil
85+
}
86+
if err := retry.Retry(op, time.Second*15); err != nil {
5687
return maskAny(err)
5788
}
5889
return nil

0 commit comments

Comments
 (0)