diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index 29862d73d5b..a74b6320501 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -17,6 +17,9 @@ limitations under the License. package persistentvolume import ( + "fmt" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" nodeapi "k8s.io/kubernetes/pkg/api/node" @@ -24,6 +27,10 @@ import ( "k8s.io/kubernetes/pkg/features" ) +const ( + deprecatedStorageClassAnnotationsMsg = `deprecated since v1.8; use "storageClassName" attribute instead` +) + // DropDisabledFields removes disabled fields from the pv spec. // This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pv spec. func DropDisabledFields(pvSpec *api.PersistentVolumeSpec, oldPVSpec *api.PersistentVolumeSpec) { @@ -49,12 +56,22 @@ func GetWarningsForPersistentVolume(pv *api.PersistentVolume) []string { if pv == nil { return nil } - return warningsForPersistentVolumeSpecAndMeta(nil, &pv.Spec) + return warningsForPersistentVolumeSpecAndMeta(nil, &pv.Spec, &pv.ObjectMeta) } -func warningsForPersistentVolumeSpecAndMeta(fieldPath *field.Path, pvSpec *api.PersistentVolumeSpec) []string { +func warningsForPersistentVolumeSpecAndMeta(fieldPath *field.Path, pvSpec *api.PersistentVolumeSpec, pvMeta *metav1.ObjectMeta) []string { var warnings []string + if _, ok := pvMeta.Annotations[api.BetaStorageClassAnnotation]; ok { + warnings = append(warnings, + fmt.Sprintf( + "%s: %s", + fieldPath.Child("metadata", "annotations").Key(api.BetaStorageClassAnnotation), + deprecatedStorageClassAnnotationsMsg, + ), + ) + } + if pvSpec.NodeAffinity != nil && pvSpec.NodeAffinity.Required != nil { termFldPath := fieldPath.Child("spec", "nodeAffinity", "required", "nodeSelectorTerms") // use of deprecated node labels in node affinity diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index 1780a944356..5a652ec5eb3 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -146,6 +146,9 @@ func TestWarnings(t *testing.T) { template: &api.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", + Annotations: map[string]string{ + api.BetaStorageClassAnnotation: "", + }, }, Spec: api.PersistentVolumeSpec{ NodeAffinity: &api.VolumeNodeAffinity{ @@ -169,6 +172,7 @@ func TestWarnings(t *testing.T) { }, }, expected: []string{ + `metadata.annotations[volume.beta.kubernetes.io/storage-class]: deprecated since v1.8; use "storageClassName" attribute instead`, `spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].key: beta.kubernetes.io/os is deprecated since v1.14; use "kubernetes.io/os" instead`, }, }, diff --git a/pkg/api/persistentvolumeclaim/util.go b/pkg/api/persistentvolumeclaim/util.go index 1304c1fe048..0fa4c7e7f62 100644 --- a/pkg/api/persistentvolumeclaim/util.go +++ b/pkg/api/persistentvolumeclaim/util.go @@ -26,8 +26,9 @@ import ( ) const ( - pvc string = "PersistentVolumeClaim" - volumeSnapshot string = "VolumeSnapshot" + pvc string = "PersistentVolumeClaim" + volumeSnapshot string = "VolumeSnapshot" + deprecatedStorageClassAnnotationsMsg = `deprecated since v1.8; use "storageClassName" attribute instead` ) // DropDisabledFields removes disabled fields from the pvc spec. @@ -197,11 +198,25 @@ func allocatedResourcesInUse(oldPVC *core.PersistentVolumeClaim) bool { } func GetWarningsForPersistentVolumeClaim(pv *core.PersistentVolumeClaim) []string { + var warnings []string + if pv == nil { return nil } - return GetWarningsForPersistentVolumeClaimSpec(field.NewPath("spec"), pv.Spec) + if _, ok := pv.ObjectMeta.Annotations[core.BetaStorageClassAnnotation]; ok { + warnings = append(warnings, + fmt.Sprintf( + "%s: %s", + field.NewPath("metadata", "annotations").Key(core.BetaStorageClassAnnotation), + deprecatedStorageClassAnnotationsMsg, + ), + ) + } + + warnings = append(warnings, GetWarningsForPersistentVolumeClaimSpec(field.NewPath("spec"), pv.Spec)...) + + return warnings } func GetWarningsForPersistentVolumeClaimSpec(fieldPath *field.Path, pvSpec core.PersistentVolumeClaimSpec) []string { diff --git a/pkg/api/persistentvolumeclaim/util_test.go b/pkg/api/persistentvolumeclaim/util_test.go index ebbb0fecb5c..38253b1fb4b 100644 --- a/pkg/api/persistentvolumeclaim/util_test.go +++ b/pkg/api/persistentvolumeclaim/util_test.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/sets" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/apis/core" @@ -556,6 +557,20 @@ func TestWarnings(t *testing.T) { }, expected: nil, }, + { + name: "storageclass annotations warning", + template: &core.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Annotations: map[string]string{ + core.BetaStorageClassAnnotation: "", + }, + }, + }, + expected: []string{ + `metadata.annotations[volume.beta.kubernetes.io/storage-class]: deprecated since v1.8; use "storageClassName" attribute instead`, + }, + }, } for _, tc := range testcases {