@@ -55,8 +55,10 @@ func ValidateCustomResourceDefinition(obj *apiextensions.CustomResourceDefinitio
55
55
return ret
56
56
}
57
57
58
+ allowDefaults , rejectDefaultsReason := allowDefaults (requestGV , nil )
58
59
opts := validationOptions {
59
- allowDefaults : allowDefaults (requestGV , nil ),
60
+ allowDefaults : allowDefaults ,
61
+ disallowDefaultsReason : rejectDefaultsReason ,
60
62
requireRecognizedConversionReviewVersion : true ,
61
63
requireImmutableNames : false ,
62
64
requireOpenAPISchema : requireOpenAPISchema (requestGV , nil ),
@@ -80,6 +82,8 @@ func ValidateCustomResourceDefinition(obj *apiextensions.CustomResourceDefinitio
80
82
type validationOptions struct {
81
83
// allowDefaults permits the validation schema to contain default attributes
82
84
allowDefaults bool
85
+ // disallowDefaultsReason gives a reason as to why allowDefaults is false (for better user feedback)
86
+ disallowDefaultsReason string
83
87
// requireRecognizedConversionReviewVersion requires accepted webhook conversion versions to contain a recognized version
84
88
requireRecognizedConversionReviewVersion bool
85
89
// requireImmutableNames disables changing spec.names
@@ -102,8 +106,10 @@ type validationOptions struct {
102
106
103
107
// ValidateCustomResourceDefinitionUpdate statically validates
104
108
func ValidateCustomResourceDefinitionUpdate (obj , oldObj * apiextensions.CustomResourceDefinition , requestGV schema.GroupVersion ) field.ErrorList {
109
+ allowDefaults , rejectDefaultsReason := allowDefaults (requestGV , & oldObj .Spec )
105
110
opts := validationOptions {
106
- allowDefaults : allowDefaults (requestGV , & oldObj .Spec ),
111
+ allowDefaults : allowDefaults ,
112
+ disallowDefaultsReason : rejectDefaultsReason ,
107
113
requireRecognizedConversionReviewVersion : oldObj .Spec .Conversion == nil || hasValidConversionReviewVersionOrEmpty (oldObj .Spec .Conversion .ConversionReviewVersions ),
108
114
requireImmutableNames : apiextensions .IsCRDConditionTrue (oldObj , apiextensions .Established ),
109
115
requireOpenAPISchema : requireOpenAPISchema (requestGV , & oldObj .Spec ),
@@ -661,6 +667,7 @@ func validateCustomResourceDefinitionValidation(customResourceValidation *apiext
661
667
662
668
openAPIV3Schema := & specStandardValidatorV3 {
663
669
allowDefaults : opts .allowDefaults ,
670
+ disallowDefaultsReason : opts .disallowDefaultsReason ,
664
671
requireValidPropertyType : opts .requireValidPropertyType ,
665
672
}
666
673
@@ -1110,16 +1117,17 @@ func allVersionsSpecifyOpenAPISchema(spec *apiextensions.CustomResourceDefinitio
1110
1117
return true
1111
1118
}
1112
1119
1113
- // allowDefaults returns true if the defaulting feature is enabled and the request group version allows adding defaults
1114
- func allowDefaults (requestGV schema.GroupVersion , oldCRDSpec * apiextensions.CustomResourceDefinitionSpec ) bool {
1120
+ // allowDefaults returns true if the defaulting feature is enabled and the request group version allows adding defaults,
1121
+ // or false and a reason for the user if defaults are not allowed.
1122
+ func allowDefaults (requestGV schema.GroupVersion , oldCRDSpec * apiextensions.CustomResourceDefinitionSpec ) (bool , string ) {
1115
1123
if oldCRDSpec != nil && specHasDefaults (oldCRDSpec ) {
1116
1124
// don't tighten validation on existing persisted data
1117
- return true
1125
+ return true , ""
1118
1126
}
1119
1127
if requestGV == apiextensionsv1beta1 .SchemeGroupVersion {
1120
- return false
1128
+ return false , "(cannot set default values in apiextensions.k8s.io/v1beta1 CRDs, must use apiextensions.k8s.io/v1)"
1121
1129
}
1122
- return true
1130
+ return true , ""
1123
1131
}
1124
1132
1125
1133
func specHasDefaults (spec * apiextensions.CustomResourceDefinitionSpec ) bool {
0 commit comments