Skip to content

Commit 3c763ec

Browse files
authored
feat: Support XValidations (CEL) for CC variables (#916)
Updating to support latest features in Cluster API 1.8.
1 parent a1c17f7 commit 3c763ec

File tree

1 file changed

+56
-8
lines changed

1 file changed

+56
-8
lines changed

common/pkg/capi/clustertopology/variables/fromcrdyaml.go

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package variables
55

66
import (
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

Comments
 (0)