func()

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
}