Skip to content

x-kubernetes-map-type=atomic is required if a containing array has x-kubernetes-list-type=set #752

@tatsuhiro-t

Description

@tatsuhiro-t

I encountered validation error when applying the generated CRD containing PodSpec which has new ResourceClaim in https://pkg.go.dev/k8s.io/api@v0.26.0/core/v1#ResourceRequirements added in k8s v1.26.
It sets +listType=set.

When applying generated CRD, I got the following error:

... .properties[spec].properties[initContainers].items.properties[resources].properties[claims].items.x-kubernetes-map-type: Invalid value: "null": must be atomic as item of a list with x-kubernetes-list-type=set

This validation seems to be happened at https://github.com/kubernetes/apiextensions-apiserver/blob/9746985976f9fee21736250e3afb0eae27026633/pkg/apis/apiextensions/validation/validation.go#L945

Adding x-kubernetes-map-type=atomic under items fixes this issue.

I'm wondering whether this is a lack of x-kubernetes-map-type=atomic in ResourceClaim, or something that CRD generator must deal with.

The following patch automatically adds x-kubernetes-map-type=atomic to items when x-kubernetes-list-type=set is seen, but I feel this is hacky and probably not a correct way:

--- a/pkg/crd/markers/topology.go
+++ b/pkg/crd/markers/topology.go
@@ -116,6 +116,14 @@ func (l ListType) ApplyToSchema(schema *apiext.JSONSchemaProps) error {
        }
        p := string(l)
        schema.XListType = &p
+
+       if l == "set" {
+               if itemSchema := schema.Items.Schema; itemSchema != nil {
+                       v := "atomic"
+                       itemSchema.XMapType = &v
+               }
+       }
+
        return nil
 }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions