in pkg/crd/crdgeneration/dcl2crdgeneration.go [251:337]
func (a *DCL2CRDGenerator) dclSchemaToSpecJSONSchema(path []string, schema *openapi.Schema, isCollectionItemSchema bool) (string, *apiextensions.JSONSchemaProps, error) {
field := pathslice.Base(path)
if !schema.ReadOnly && extension.IsReferenceField(schema) {
refFieldName, err := extension.GetReferenceFieldName(path, schema)
if err != nil {
return "", nil, fmt.Errorf("error resolving the name for reference field %s: %w", field, err)
}
refSchema, err := a.handleReferenceField(path, schema)
if err != nil {
return "", nil, fmt.Errorf("error resolving the reference schema for field %v: %w", field, err)
}
refSchema, err = prependImmutableToDescriptionIfImmutable(refSchema, schema)
if err != nil {
return "", nil, fmt.Errorf("error prepending Immutable to description of field %v if field is immutable: %w", field, err)
}
return refFieldName, refSchema, nil
}
isSensitive, err := extension.IsSensitiveField(schema)
if err != nil {
return "", nil, fmt.Errorf("error checking sensitivity for field %v: %w", field, err)
}
if !schema.ReadOnly && isSensitive {
s := crdboilerplate.GetSensitiveFieldSchemaBoilerplate()
s.Description = schema.Description
jsonSchema, err := prependImmutableToDescriptionIfImmutable(&s, schema)
if err != nil {
return "", nil, fmt.Errorf("error prepending Immutable to description of field %v if field is immutable: %w", field, err)
}
return field, jsonSchema, nil
}
jsonSchema := &apiextensions.JSONSchemaProps{}
jsonSchema.Type = schema.Type
jsonSchema.Description = schema.Description
jsonSchema.Format = schema.Format
jsonSchema, err = prependImmutableToDescriptionIfImmutable(jsonSchema, schema)
if err != nil {
return "", nil, fmt.Errorf("error prepending Immutable to description of field %v if field is immutable: %w", field, err)
}
fieldName := field
switch schema.Type {
case "object":
// The field additionalProperties is mutually exclusive with properties in CustomResourceDefinition
if schema.AdditionalProperties != nil {
_, s, err := a.dclSchemaToSpecJSONSchema(path, schema.AdditionalProperties, true)
if err != nil {
return "", nil, err
}
jsonSchema.AdditionalProperties = &apiextensions.JSONSchemaPropsOrBool{
Schema: s,
}
break
}
jsonSchema.Properties = make(map[string]apiextensions.JSONSchemaProps)
required := make([]string, 0)
for k, v := range schema.Properties {
if !v.ReadOnly || isCollectionItemSchema {
fieldName, s, err := a.dclSchemaToSpecJSONSchema(append(path, k), v, isCollectionItemSchema)
if err != nil {
return "", nil, err
}
jsonSchema.Properties[fieldName] = *s
if isRequiredField(schema, k) {
required = slice.IncludeString(required, fieldName)
}
}
}
if len(required) != 0 {
jsonSchema.Required = required
}
case "array":
f, itemSchema, err := a.dclSchemaToSpecJSONSchema(path, schema.Items, true)
if err != nil {
return "", nil, err
}
fieldName = f
jsonSchema.Items = &apiextensions.JSONSchemaPropsOrArray{
Schema: itemSchema,
}
case "boolean", "number", "string", "integer":
jsonSchema.Type = schema.Type
default:
log.Fatalf("unknown schema type %v for field %v", schema.Type, field)
}
return fieldName, jsonSchema, nil
}