CSIDriver: allow "StorageCapacity" to be modified

When originally introduced, the field was made immutable to be
consistent with the other fields. But in practice allowing it to be
toggled makes more sense, in particular when considering the rollout
of a CSI driver (let it run without using the published
CSIStorageCapacity object, then flip the field, or upgrading from a
driver without support to one which supports it).

The only consumer of this field, the kube-scheduler, can handle
mutation without problems because it always consults the informer
cache to get the current value.
This commit is contained in:
Patrick Ohly 2021-05-07 15:13:09 +02:00
parent 7dd4f1742f
commit dfaeacb51f
5 changed files with 16 additions and 10 deletions

View File

@ -357,7 +357,7 @@ type CSIDriverSpec struct {
// unset or false and it can be flipped later when storage // unset or false and it can be flipped later when storage
// capacity information has been published. // capacity information has been published.
// //
// This field is immutable. // This field was immutable in Kubernetes <= 1.22 and now is mutable.
// //
// This is a beta field and only available when the CSIStorageCapacity // This is a beta field and only available when the CSIStorageCapacity
// feature is enabled. The default is false. // feature is enabled. The default is false.

View File

@ -420,13 +420,13 @@ func ValidateCSIDriver(csiDriver *storage.CSIDriver) field.ErrorList {
// ValidateCSIDriverUpdate validates a CSIDriver. // ValidateCSIDriverUpdate validates a CSIDriver.
func ValidateCSIDriverUpdate(new, old *storage.CSIDriver) field.ErrorList { func ValidateCSIDriverUpdate(new, old *storage.CSIDriver) field.ErrorList {
allErrs := apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata")) allErrs := apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))
allErrs = append(allErrs, validateCSIDriverSpec(&new.Spec, field.NewPath("spec"))...)
// immutable fields should not be mutated. // immutable fields should not be mutated.
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.AttachRequired, old.Spec.AttachRequired, field.NewPath("spec", "attachedRequired"))...) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.AttachRequired, old.Spec.AttachRequired, field.NewPath("spec", "attachedRequired"))...)
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.FSGroupPolicy, old.Spec.FSGroupPolicy, field.NewPath("spec", "fsGroupPolicy"))...) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.FSGroupPolicy, old.Spec.FSGroupPolicy, field.NewPath("spec", "fsGroupPolicy"))...)
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.PodInfoOnMount, old.Spec.PodInfoOnMount, field.NewPath("spec", "podInfoOnMount"))...) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.PodInfoOnMount, old.Spec.PodInfoOnMount, field.NewPath("spec", "podInfoOnMount"))...)
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.VolumeLifecycleModes, old.Spec.VolumeLifecycleModes, field.NewPath("spec", "volumeLifecycleModes"))...) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.VolumeLifecycleModes, old.Spec.VolumeLifecycleModes, field.NewPath("spec", "volumeLifecycleModes"))...)
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.StorageCapacity, old.Spec.StorageCapacity, field.NewPath("spec", "storageCapacity"))...)
allErrs = append(allErrs, validateTokenRequests(new.Spec.TokenRequests, field.NewPath("spec", "tokenRequests"))...) allErrs = append(allErrs, validateTokenRequests(new.Spec.TokenRequests, field.NewPath("spec", "tokenRequests"))...)
return allErrs return allErrs

View File

@ -1965,6 +1965,12 @@ func TestCSIDriverValidationUpdate(t *testing.T) {
new.Spec.RequiresRepublish = &requiresRepublish new.Spec.RequiresRepublish = &requiresRepublish
}, },
}, },
{
name: "StorageCapacity changed",
modify: func(new *storage.CSIDriver) {
new.Spec.StorageCapacity = &notStorageCapacity
},
},
} }
for _, test := range successCases { for _, test := range successCases {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
@ -2061,18 +2067,18 @@ func TestCSIDriverValidationUpdate(t *testing.T) {
new.Spec.FSGroupPolicy = &fileFSGroupPolicy new.Spec.FSGroupPolicy = &fileFSGroupPolicy
}, },
}, },
{
name: "StorageCapacity changed",
modify: func(new *storage.CSIDriver) {
new.Spec.StorageCapacity = &notStorageCapacity
},
},
{ {
name: "TokenRequests invalidated", name: "TokenRequests invalidated",
modify: func(new *storage.CSIDriver) { modify: func(new *storage.CSIDriver) {
new.Spec.TokenRequests = []storage.TokenRequest{{Audience: gcp}, {Audience: gcp}} new.Spec.TokenRequests = []storage.TokenRequest{{Audience: gcp}, {Audience: gcp}}
}, },
}, },
{
name: "invalid nil StorageCapacity",
modify: func(new *storage.CSIDriver) {
new.Spec.StorageCapacity = nil
},
},
} }
for _, test := range errorCases { for _, test := range errorCases {

View File

@ -341,7 +341,7 @@ type CSIDriverSpec struct {
// unset or false and it can be flipped later when storage // unset or false and it can be flipped later when storage
// capacity information has been published. // capacity information has been published.
// //
// This field is immutable. // This field was immutable in Kubernetes <= 1.22 and now is mutable.
// //
// This is a beta field and only available when the CSIStorageCapacity // This is a beta field and only available when the CSIStorageCapacity
// feature is enabled. The default is false. // feature is enabled. The default is false.

View File

@ -362,7 +362,7 @@ type CSIDriverSpec struct {
// unset or false and it can be flipped later when storage // unset or false and it can be flipped later when storage
// capacity information has been published. // capacity information has been published.
// //
// This field is immutable. // This field was immutable in Kubernetes <= 1.22 and now is mutable.
// //
// This is a beta field and only available when the CSIStorageCapacity // This is a beta field and only available when the CSIStorageCapacity
// feature is enabled. The default is false. // feature is enabled. The default is false.