@@ -5,6 +5,7 @@ package variables
55
66import (
77 "fmt"
8+ "math"
89
910 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1011 "k8s.io/apimachinery/pkg/runtime"
@@ -71,6 +72,39 @@ func ConvertAPIExtensionsToJSONSchemaProps(
7172) (* clusterv1.JSONSchemaProps , field.ErrorList ) {
7273 var allErrs field.ErrorList
7374
75+ // Check if minimum/maximum is a whole number that we can convert to int64 without loss of precision.
76+ var maximumAsInt64Ptr , minimumAsInt64Ptr * int64
77+ if schema .Maximum != nil {
78+ maximumAsFloat64 := ptr .Deref (schema .Maximum , 0.0 )
79+ if math .Ceil (maximumAsFloat64 ) == maximumAsFloat64 {
80+ maximumAsInt64Ptr = ptr .To (int64 (maximumAsFloat64 ))
81+ } else {
82+ allErrs = append (
83+ allErrs ,
84+ field .Invalid (
85+ fldPath .Child ("maximum" ),
86+ maximumAsFloat64 ,
87+ "ClusterClass variables only support a whole number for maximum" ,
88+ ),
89+ )
90+ }
91+ }
92+ if schema .Minimum != nil {
93+ minimumAsFloat64 := ptr .Deref (schema .Minimum , 0.0 )
94+ if math .Ceil (minimumAsFloat64 ) == minimumAsFloat64 {
95+ minimumAsInt64Ptr = ptr .To (int64 (minimumAsFloat64 ))
96+ } else {
97+ allErrs = append (
98+ allErrs ,
99+ field .Invalid (
100+ fldPath .Child ("minimum" ),
101+ minimumAsFloat64 ,
102+ "ClusterClass variables only support a whole number for minimum" ,
103+ ),
104+ )
105+ }
106+ }
107+
74108 props := & clusterv1.JSONSchemaProps {
75109 Type : schema .Type ,
76110 Required : schema .Required ,
@@ -81,20 +115,17 @@ func ConvertAPIExtensionsToJSONSchemaProps(
81115 MaxLength : schema .MaxLength ,
82116 MinLength : schema .MinLength ,
83117 Pattern : schema .Pattern ,
118+ Maximum : maximumAsInt64Ptr ,
119+ Minimum : minimumAsInt64Ptr ,
84120 ExclusiveMaximum : schema .ExclusiveMaximum ,
85121 ExclusiveMinimum : schema .ExclusiveMinimum ,
86122 XPreserveUnknownFields : ptr .Deref (schema .XPreserveUnknownFields , false ),
87123 Default : schema .Default ,
88124 Enum : schema .Enum ,
89125 Example : schema .Example ,
90- }
91-
92- if schema .Maximum != nil {
93- props .Maximum = ptr .To (int64 (* schema .Maximum ))
94- }
95-
96- if schema .Minimum != nil {
97- props .Minimum = ptr .To (int64 (* schema .Minimum ))
126+ Description : schema .Description ,
127+ MaxProperties : schema .MaxProperties ,
128+ MinProperties : schema .MinProperties ,
98129 }
99130
100131 if schema .AdditionalProperties != nil && schema .AdditionalProperties .Schema != nil {
@@ -157,5 +188,22 @@ func ConvertAPIExtensionsToJSONSchemaProps(
157188 }
158189 }
159190
191+ if schema .XValidations != nil {
192+ props .XValidations = make ([]clusterv1.ValidationRule , 0 , len (schema .XValidations ))
193+ for _ , v := range schema .XValidations {
194+ reason := ""
195+ if v .Reason != nil {
196+ reason = string (* v .Reason )
197+ }
198+ props .XValidations = append (props .XValidations , clusterv1.ValidationRule {
199+ Rule : v .Rule ,
200+ Message : v .Message ,
201+ MessageExpression : v .MessageExpression ,
202+ Reason : clusterv1 .FieldValueErrorReason (reason ),
203+ FieldPath : v .FieldPath ,
204+ })
205+ }
206+ }
207+
160208 return props , allErrs
161209}
0 commit comments