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-31 05:33:41 -04:00
const (
deprecatedStorageClassAnnotationsMsg = ` deprecated since v1.8; use "storageClassName" attribute instead `
)
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
}
2023-07-20 05:08:48 -04:00
// DropDisabledStatusFields removes disabled fields from the pv status.
// This should be called from PrepareForUpdate for all resources containing a pv status.
func DropDisabledStatusFields ( oldStatus , newStatus * api . PersistentVolumeStatus ) {
if ! utilfeature . DefaultFeatureGate . Enabled ( features . PersistentVolumeLastPhaseTransitionTime ) && oldStatus . LastPhaseTransitionTime . IsZero ( ) {
newStatus . LastPhaseTransitionTime = nil
}
}
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
}
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
2023-03-31 05:33:41 -04:00
if _ , ok := pvMeta . Annotations [ api . BetaStorageClassAnnotation ] ; ok {
warnings = append ( warnings ,
fmt . Sprintf (
"%s: %s" ,
fieldPath . Child ( "metadata" , "annotations" ) . Key ( api . BetaStorageClassAnnotation ) ,
deprecatedStorageClassAnnotationsMsg ,
) ,
)
}
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 {
2022-05-24 23:41:51 -04:00
warnings = append ( warnings , nodeapi . GetWarningsForNodeSelectorTerm ( term , 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
}