@@ -5,6 +5,7 @@ package variables
5
5
6
6
import (
7
7
"fmt"
8
+ "math"
8
9
9
10
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10
11
"k8s.io/apimachinery/pkg/runtime"
@@ -71,6 +72,39 @@ func ConvertAPIExtensionsToJSONSchemaProps(
71
72
) (* clusterv1.JSONSchemaProps , field.ErrorList ) {
72
73
var allErrs field.ErrorList
73
74
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
+
74
108
props := & clusterv1.JSONSchemaProps {
75
109
Type : schema .Type ,
76
110
Required : schema .Required ,
@@ -81,20 +115,17 @@ func ConvertAPIExtensionsToJSONSchemaProps(
81
115
MaxLength : schema .MaxLength ,
82
116
MinLength : schema .MinLength ,
83
117
Pattern : schema .Pattern ,
118
+ Maximum : maximumAsInt64Ptr ,
119
+ Minimum : minimumAsInt64Ptr ,
84
120
ExclusiveMaximum : schema .ExclusiveMaximum ,
85
121
ExclusiveMinimum : schema .ExclusiveMinimum ,
86
122
XPreserveUnknownFields : ptr .Deref (schema .XPreserveUnknownFields , false ),
87
123
Default : schema .Default ,
88
124
Enum : schema .Enum ,
89
125
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 ,
98
129
}
99
130
100
131
if schema .AdditionalProperties != nil && schema .AdditionalProperties .Schema != nil {
@@ -157,5 +188,22 @@ func ConvertAPIExtensionsToJSONSchemaProps(
157
188
}
158
189
}
159
190
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
+
160
208
return props , allErrs
161
209
}
0 commit comments