mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
allow pvc spec StorageClass name mutation if the feature is enabled
This commit is contained in:
parent
0f0d61f91c
commit
f051cc7e0e
@ -2171,7 +2171,7 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl
|
|||||||
oldPvcClone.Spec.VolumeName = newPvcClone.Spec.VolumeName // +k8s:verify-mutation:reason=clone
|
oldPvcClone.Spec.VolumeName = newPvcClone.Spec.VolumeName // +k8s:verify-mutation:reason=clone
|
||||||
}
|
}
|
||||||
|
|
||||||
if validateStorageClassUpgrade(oldPvcClone.Annotations, newPvcClone.Annotations,
|
if validateStorageClassUpgradeFromAnnotation(oldPvcClone.Annotations, newPvcClone.Annotations,
|
||||||
oldPvcClone.Spec.StorageClassName, newPvcClone.Spec.StorageClassName) {
|
oldPvcClone.Spec.StorageClassName, newPvcClone.Spec.StorageClassName) {
|
||||||
newPvcClone.Spec.StorageClassName = nil
|
newPvcClone.Spec.StorageClassName = nil
|
||||||
metav1.SetMetaDataAnnotation(&newPvcClone.ObjectMeta, core.BetaStorageClassAnnotation, oldPvcClone.Annotations[core.BetaStorageClassAnnotation])
|
metav1.SetMetaDataAnnotation(&newPvcClone.ObjectMeta, core.BetaStorageClassAnnotation, oldPvcClone.Annotations[core.BetaStorageClassAnnotation])
|
||||||
@ -2179,6 +2179,13 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl
|
|||||||
// storageclass annotation should be immutable after creation
|
// storageclass annotation should be immutable after creation
|
||||||
// TODO: remove Beta when no longer needed
|
// TODO: remove Beta when no longer needed
|
||||||
allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], oldPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], v1.BetaStorageClassAnnotation, field.NewPath("metadata"))...)
|
allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], oldPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], v1.BetaStorageClassAnnotation, field.NewPath("metadata"))...)
|
||||||
|
|
||||||
|
// If update from annotation to attribute failed we can attempt try to validate update from nil value.
|
||||||
|
if validateStorageClassUpgradeFromNil(oldPvc.Annotations, oldPvc.Spec.StorageClassName, newPvc.Spec.StorageClassName, opts) {
|
||||||
|
newPvcClone.Spec.StorageClassName = oldPvcClone.Spec.StorageClassName // +k8s:verify-mutation:reason=clone
|
||||||
|
}
|
||||||
|
// TODO: add a specific error with a hint that storage class name can not be changed
|
||||||
|
// (instead of letting spec comparison below return generic field forbidden error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// lets make sure storage values are same.
|
// lets make sure storage values are same.
|
||||||
@ -2219,7 +2226,7 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl
|
|||||||
// 2. The old pvc's StorageClassName is not set
|
// 2. The old pvc's StorageClassName is not set
|
||||||
// 3. The new pvc's StorageClassName is set and equal to the old value in annotation
|
// 3. The new pvc's StorageClassName is set and equal to the old value in annotation
|
||||||
// 4. If the new pvc's StorageClassAnnotation is set,it must be equal to the old pv/pvc's StorageClassAnnotation
|
// 4. If the new pvc's StorageClassAnnotation is set,it must be equal to the old pv/pvc's StorageClassAnnotation
|
||||||
func validateStorageClassUpgrade(oldAnnotations, newAnnotations map[string]string, oldScName, newScName *string) bool {
|
func validateStorageClassUpgradeFromAnnotation(oldAnnotations, newAnnotations map[string]string, oldScName, newScName *string) bool {
|
||||||
oldSc, oldAnnotationExist := oldAnnotations[core.BetaStorageClassAnnotation]
|
oldSc, oldAnnotationExist := oldAnnotations[core.BetaStorageClassAnnotation]
|
||||||
newScInAnnotation, newAnnotationExist := newAnnotations[core.BetaStorageClassAnnotation]
|
newScInAnnotation, newAnnotationExist := newAnnotations[core.BetaStorageClassAnnotation]
|
||||||
return oldAnnotationExist /* condition 1 */ &&
|
return oldAnnotationExist /* condition 1 */ &&
|
||||||
@ -2228,6 +2235,20 @@ func validateStorageClassUpgrade(oldAnnotations, newAnnotations map[string]strin
|
|||||||
(!newAnnotationExist || newScInAnnotation == oldSc) /* condition 4 */
|
(!newAnnotationExist || newScInAnnotation == oldSc) /* condition 4 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide an upgrade path from PVC with nil storage class. We allow update of
|
||||||
|
// StorageClassName only if following four conditions are met at the same time:
|
||||||
|
// 1. RetroactiveDefaultStorageClass FeatureGate is enabled
|
||||||
|
// 2. The new pvc's StorageClassName is not nil
|
||||||
|
// 3. The old pvc's StorageClassName is nil
|
||||||
|
// 4. The old pvc either does not have beta annotation set, or the beta annotation matches new pvc's StorageClassName
|
||||||
|
func validateStorageClassUpgradeFromNil(oldAnnotations map[string]string, oldScName, newScName *string, opts PersistentVolumeClaimSpecValidationOptions) bool {
|
||||||
|
oldAnnotation, oldAnnotationExist := oldAnnotations[core.BetaStorageClassAnnotation]
|
||||||
|
return opts.EnableRetroactiveDefaultStorageClass /* condition 1 */ &&
|
||||||
|
newScName != nil /* condition 2 */ &&
|
||||||
|
oldScName == nil /* condition 3 */ &&
|
||||||
|
(!oldAnnotationExist || *newScName == oldAnnotation) /* condition 4 */
|
||||||
|
}
|
||||||
|
|
||||||
var resizeStatusSet = sets.NewString(string(core.PersistentVolumeClaimNoExpansionInProgress),
|
var resizeStatusSet = sets.NewString(string(core.PersistentVolumeClaimNoExpansionInProgress),
|
||||||
string(core.PersistentVolumeClaimControllerExpansionInProgress),
|
string(core.PersistentVolumeClaimControllerExpansionInProgress),
|
||||||
string(core.PersistentVolumeClaimControllerExpansionFailed),
|
string(core.PersistentVolumeClaimControllerExpansionFailed),
|
||||||
|
Loading…
Reference in New Issue
Block a user