2022-04-01 11:57:04 -04:00
/ *
2022-05-24 23:41:51 -04:00
Copyright 2017 The Kubernetes Authors .
2022-04-01 11:57:04 -04:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package persistentvolume
import (
2023-03-31 05:33:41 -04:00
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2022-03-07 02:40:02 -05:00
"k8s.io/apimachinery/pkg/util/validation/field"
2022-03-07 05:17:28 -05:00
utilfeature "k8s.io/apiserver/pkg/util/feature"
2022-03-07 02:40:02 -05:00
nodeapi "k8s.io/kubernetes/pkg/api/node"
2022-04-01 11:57:04 -04:00
api "k8s.io/kubernetes/pkg/apis/core"
2022-03-07 05:17:28 -05:00
"k8s.io/kubernetes/pkg/features"
2022-04-01 11:57:04 -04:00
)
2023-03-10 08:03:41 -05:00
// DropDisabledSpecFields removes disabled fields from the pv spec.
2022-03-07 05:17:28 -05:00
// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pv spec.
2023-03-10 08:03:41 -05:00
func DropDisabledSpecFields ( pvSpec * api . PersistentVolumeSpec , oldPVSpec * api . PersistentVolumeSpec ) {
2023-10-30 22:12:02 -04:00
if ! utilfeature . DefaultFeatureGate . Enabled ( features . VolumeAttributesClass ) {
if oldPVSpec == nil || oldPVSpec . VolumeAttributesClassName == nil {
pvSpec . VolumeAttributesClassName = nil
}
}
2022-03-07 05:17:28 -05:00
}
2022-05-24 23:41:51 -04:00
func GetWarningsForPersistentVolume ( pv * api . PersistentVolume ) [ ] string {
2022-03-07 02:40:02 -05:00
if pv == nil {
return nil
2022-04-01 11:57:04 -04:00
}
2023-03-31 05:33:41 -04:00
return warningsForPersistentVolumeSpecAndMeta ( nil , & pv . Spec , & pv . ObjectMeta )
2022-04-01 11:57:04 -04:00
}
2024-05-11 06:04:33 -04:00
var deprecatedAnnotations = [ ] struct {
key string
message string
} {
{
key : ` volume.beta.kubernetes.io/storage-class ` ,
message : ` deprecated since v1.8; use "storageClassName" attribute instead ` ,
} ,
{
key : ` volume.beta.kubernetes.io/mount-options ` ,
message : ` deprecated since v1.31; use "mountOptions" attribute instead ` ,
} ,
}
2023-03-31 05:33:41 -04:00
func warningsForPersistentVolumeSpecAndMeta ( fieldPath * field . Path , pvSpec * api . PersistentVolumeSpec , pvMeta * metav1 . ObjectMeta ) [ ] string {
2022-03-07 02:40:02 -05:00
var warnings [ ] string
2024-05-11 06:04:33 -04:00
// use of deprecated annotations
for _ , deprecated := range deprecatedAnnotations {
if _ , exists := pvMeta . Annotations [ deprecated . key ] ; exists {
warnings = append ( warnings , fmt . Sprintf ( "%s: %s" , fieldPath . Child ( "metadata" , "annotations" ) . Key ( deprecated . key ) , deprecated . message ) )
}
2023-03-31 05:33:41 -04:00
}
2023-12-15 04:50:37 -05:00
if pvSpec . PersistentVolumeReclaimPolicy == api . PersistentVolumeReclaimRecycle {
warnings = append ( warnings , fmt . Sprintf ( "%s: The Recycle reclaim policy is deprecated. Instead, the recommended approach is to use dynamic provisioning." , fieldPath . Child ( "spec" , "persistentVolumeReclaimPolicy" ) ) )
}
2022-03-07 05:17:28 -05:00
if pvSpec . NodeAffinity != nil && pvSpec . NodeAffinity . Required != nil {
termFldPath := fieldPath . Child ( "spec" , "nodeAffinity" , "required" , "nodeSelectorTerms" )
// use of deprecated node labels in node affinity
for i , term := range pvSpec . NodeAffinity . Required . NodeSelectorTerms {
2024-10-23 05:28:27 -04:00
warnings = append ( warnings , nodeapi . GetWarningsForNodeSelectorTerm ( term , false , termFldPath . Index ( i ) ) ... )
2022-03-07 02:40:02 -05:00
}
2022-04-01 11:57:04 -04:00
}
2023-05-04 05:41:14 -04:00
// If we are on deprecated volume plugin
if pvSpec . CephFS != nil {
2023-06-16 10:17:03 -04:00
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.28, non-functional in v1.31+" , fieldPath . Child ( "spec" , "cephfs" ) ) )
2023-05-04 05:41:14 -04:00
}
2023-06-08 04:06:53 -04:00
if pvSpec . PhotonPersistentDisk != nil {
2023-06-16 10:17:03 -04:00
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.11, non-functional in v1.16+" , fieldPath . Child ( "spec" , "photonPersistentDisk" ) ) )
2023-06-08 04:06:53 -04:00
}
if pvSpec . ScaleIO != nil {
2023-06-16 10:17:03 -04:00
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.16, non-functional in v1.22+" , fieldPath . Child ( "spec" , "scaleIO" ) ) )
2023-06-08 04:06:53 -04:00
}
if pvSpec . StorageOS != nil {
2023-06-16 10:17:03 -04:00
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.22, non-functional in v1.25+" , fieldPath . Child ( "spec" , "storageOS" ) ) )
2023-06-08 04:06:53 -04:00
}
if pvSpec . Glusterfs != nil {
2023-06-16 10:15:36 -04:00
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.25, non-functional in v1.26+" , fieldPath . Child ( "spec" , "glusterfs" ) ) )
}
if pvSpec . RBD != nil {
warnings = append ( warnings , fmt . Sprintf ( "%s: deprecated in v1.28, non-functional in v1.31+" , fieldPath . Child ( "spec" , "rbd" ) ) )
2023-06-08 04:06:53 -04:00
}
2022-03-07 02:40:02 -05:00
return warnings
2022-04-01 11:57:04 -04:00
}