Search in sources :

Example 11 with ApiVersion

use of io.strimzi.api.annotations.ApiVersion in project strimzi by strimzi.

the class CrdGenerator method buildSpec.

@SuppressWarnings("NPathComplexity")
private ObjectNode buildSpec(ApiVersion crdApiVersion, Crd.Spec crd, Class<? extends CustomResource> crdClass) {
    checkKubeVersionsSupportCrdVersion(crdApiVersion);
    ObjectNode result = nf.objectNode();
    result.put("group", crd.group());
    ArrayNode versions = nf.arrayNode();
    // Kube apiserver with CRD v1beta1 is picky about only using per-version subresources, schemas and printercolumns
    // if they actually differ across the versions. If they're the same, it insists these things are
    // declared top level
    // With CRD v1 they have to be per-version :face-with-rolling-eyes:
    Map<ApiVersion, ObjectNode> subresources = buildSubresources(crd);
    boolean perVersionSubResources = needsPerVersion("subresources", subresources);
    Map<ApiVersion, ObjectNode> schemas = buildSchemas(crd, crdClass);
    boolean perVersionSchemas = needsPerVersion("schemas", schemas);
    Map<ApiVersion, ArrayNode> printerColumns = buildPrinterColumns(crd);
    boolean perVersionPrinterColumns = needsPerVersion("additionalPrinterColumns", printerColumns);
    result.set("names", buildNames(crd.names()));
    result.put("scope", crd.scope());
    if (!perVersionPrinterColumns) {
        ArrayNode cols = printerColumns.values().iterator().next();
        if (!cols.isEmpty()) {
            result.set("additionalPrinterColumns", cols);
        }
    }
    if (!perVersionSubResources) {
        ObjectNode subresource = subresources.values().iterator().next();
        if (!subresource.isEmpty()) {
            result.set("subresources", subresource);
        }
    }
    if (conversionStrategy instanceof WebhookConversionStrategy) {
        // "Webhook": must be None if spec.preserveUnknownFields is true
        result.put("preserveUnknownFields", false);
    }
    result.set("conversion", buildConversion(crdApiVersion));
    for (Crd.Spec.Version version : crd.versions()) {
        ApiVersion crApiVersion = ApiVersion.parse(version.name());
        if (!shouldIncludeVersion(crApiVersion)) {
            continue;
        }
        ObjectNode versionNode = versions.addObject();
        versionNode.put("name", crApiVersion.toString());
        versionNode.put("served", servedVersion != null ? servedVersion.contains(crApiVersion) : version.served());
        versionNode.put("storage", storageVersion != null ? crApiVersion.equals(storageVersion) : version.storage());
        if (perVersionSubResources) {
            ObjectNode subresourcesForVersion = subresources.get(crApiVersion);
            if (!subresourcesForVersion.isEmpty()) {
                versionNode.set("subresources", subresourcesForVersion);
            }
        }
        if (perVersionPrinterColumns) {
            ArrayNode cols = printerColumns.get(crApiVersion);
            if (!cols.isEmpty()) {
                versionNode.set("additionalPrinterColumns", cols);
            }
        }
        if (perVersionSchemas) {
            versionNode.set("schema", schemas.get(crApiVersion));
        }
    }
    result.set("versions", versions);
    if (crdApiVersion.compareTo(V1) < 0 && targetKubeVersions.intersects(KubeVersion.parseRange("1.11-1.15"))) {
        result.put("version", Arrays.stream(crd.versions()).map(v -> ApiVersion.parse(v.name())).filter(this::shouldIncludeVersion).findFirst().map(ApiVersion::toString).orElseThrow());
    }
    if (!perVersionSchemas) {
        result.set("validation", schemas.values().iterator().next());
    }
    return result;
}
Also used : JsonProperty(com.fasterxml.jackson.annotation.JsonProperty) Arrays(java.util.Arrays) YAMLGenerator(com.fasterxml.jackson.dataformat.yaml.YAMLGenerator) VersionRange(io.strimzi.api.annotations.VersionRange) Crd(io.strimzi.crdgenerator.annotations.Crd) Alternative(io.strimzi.crdgenerator.annotations.Alternative) Example(io.strimzi.crdgenerator.annotations.Example) YAMLMapper(com.fasterxml.jackson.dataformat.yaml.YAMLMapper) Locale(java.util.Locale) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) Property.properties(io.strimzi.crdgenerator.Property.properties) JsonNode(com.fasterxml.jackson.databind.JsonNode) Method(java.lang.reflect.Method) Collections.emptyList(java.util.Collections.emptyList) Collection(java.util.Collection) Property.hasAnyGetterAndAnySetter(io.strimzi.crdgenerator.Property.hasAnyGetterAndAnySetter) Pattern(io.strimzi.crdgenerator.annotations.Pattern) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) TextNode(com.fasterxml.jackson.databind.node.TextNode) Objects(java.util.Objects) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) MinimumItems(io.strimzi.crdgenerator.annotations.MinimumItems) Base64(java.util.Base64) List(java.util.List) JsonTypeInfo(com.fasterxml.jackson.annotation.JsonTypeInfo) Type(io.strimzi.crdgenerator.annotations.Type) JsonNodeFactory(com.fasterxml.jackson.databind.node.JsonNodeFactory) Modifier(java.lang.reflect.Modifier) Writer(java.io.Writer) Annotation(java.lang.annotation.Annotation) Minimum(io.strimzi.crdgenerator.annotations.Minimum) Property.sortedProperties(io.strimzi.crdgenerator.Property.sortedProperties) ApiVersion(io.strimzi.api.annotations.ApiVersion) Maximum(io.strimzi.crdgenerator.annotations.Maximum) AnnotatedElement(java.lang.reflect.AnnotatedElement) CustomResource(io.fabric8.kubernetes.client.CustomResource) JsonPropertyOrder(com.fasterxml.jackson.annotation.JsonPropertyOrder) HashMap(java.util.HashMap) Function(java.util.function.Function) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) KubeVersion(io.strimzi.api.annotations.KubeVersion) OutputStreamWriter(java.io.OutputStreamWriter) ContainerNode(com.fasterxml.jackson.databind.node.ContainerNode) Property.subtypes(io.strimzi.crdgenerator.Property.subtypes) Modifier.isAbstract(java.lang.reflect.Modifier.isAbstract) Collections.emptyMap(java.util.Collections.emptyMap) Files(java.nio.file.Files) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) Description(io.strimzi.crdgenerator.annotations.Description) Integer.parseInt(java.lang.Integer.parseInt) File(java.io.File) V1(io.strimzi.api.annotations.ApiVersion.V1) ParameterizedType(java.lang.reflect.ParameterizedType) TreeMap(java.util.TreeMap) OneOf(io.strimzi.crdgenerator.annotations.OneOf) JsonInclude(com.fasterxml.jackson.annotation.JsonInclude) Alternation(io.strimzi.crdgenerator.annotations.Alternation) ApiVersion(io.strimzi.api.annotations.ApiVersion) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode)

Example 12 with ApiVersion

use of io.strimzi.api.annotations.ApiVersion in project strimzi-kafka-operator by strimzi.

the class CrdGenerator method buildScale.

private ObjectNode buildScale(Crd.Spec crd, ApiVersion crApiVersion) {
    ObjectNode scaleNode;
    Crd.Spec.Subresources.Scale[] scales = crd.subresources().scale();
    if (scales.length > 1 && !KubeVersion.supportsSchemaPerVersion(targetKubeVersions)) {
        err("Multiple scales specified but " + targetKubeVersions.lower() + " doesn't support schema per version");
    }
    List<Crd.Spec.Subresources.Scale> filteredScales = Arrays.stream(scales).filter(sc -> ApiVersion.parseRange(sc.apiVersion()).contains(crApiVersion)).collect(Collectors.toList());
    if (filteredScales.size() == 1) {
        scaleNode = nf.objectNode();
        Crd.Spec.Subresources.Scale scale = filteredScales.get(0);
        scaleNode.put("specReplicasPath", scale.specReplicasPath());
        scaleNode.put("statusReplicasPath", scale.statusReplicasPath());
        if (!scale.labelSelectorPath().isEmpty()) {
            scaleNode.put("labelSelectorPath", scale.labelSelectorPath());
        }
    } else if (filteredScales.size() > 1 && KubeVersion.supportsSchemaPerVersion(targetKubeVersions)) {
        throw new RuntimeException("Each custom resource definition can have only one scale sub-resource.");
    } else {
        scaleNode = null;
    }
    return scaleNode;
}
Also used : JsonProperty(com.fasterxml.jackson.annotation.JsonProperty) Arrays(java.util.Arrays) YAMLGenerator(com.fasterxml.jackson.dataformat.yaml.YAMLGenerator) VersionRange(io.strimzi.api.annotations.VersionRange) Crd(io.strimzi.crdgenerator.annotations.Crd) Alternative(io.strimzi.crdgenerator.annotations.Alternative) Example(io.strimzi.crdgenerator.annotations.Example) YAMLMapper(com.fasterxml.jackson.dataformat.yaml.YAMLMapper) Locale(java.util.Locale) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) Property.properties(io.strimzi.crdgenerator.Property.properties) JsonNode(com.fasterxml.jackson.databind.JsonNode) Method(java.lang.reflect.Method) Collections.emptyList(java.util.Collections.emptyList) Collection(java.util.Collection) Property.hasAnyGetterAndAnySetter(io.strimzi.crdgenerator.Property.hasAnyGetterAndAnySetter) Pattern(io.strimzi.crdgenerator.annotations.Pattern) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) TextNode(com.fasterxml.jackson.databind.node.TextNode) Objects(java.util.Objects) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) MinimumItems(io.strimzi.crdgenerator.annotations.MinimumItems) Base64(java.util.Base64) List(java.util.List) JsonTypeInfo(com.fasterxml.jackson.annotation.JsonTypeInfo) Type(io.strimzi.crdgenerator.annotations.Type) JsonNodeFactory(com.fasterxml.jackson.databind.node.JsonNodeFactory) Modifier(java.lang.reflect.Modifier) Writer(java.io.Writer) Annotation(java.lang.annotation.Annotation) Minimum(io.strimzi.crdgenerator.annotations.Minimum) Property.sortedProperties(io.strimzi.crdgenerator.Property.sortedProperties) ApiVersion(io.strimzi.api.annotations.ApiVersion) Maximum(io.strimzi.crdgenerator.annotations.Maximum) AnnotatedElement(java.lang.reflect.AnnotatedElement) CustomResource(io.fabric8.kubernetes.client.CustomResource) JsonPropertyOrder(com.fasterxml.jackson.annotation.JsonPropertyOrder) HashMap(java.util.HashMap) Function(java.util.function.Function) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) KubeVersion(io.strimzi.api.annotations.KubeVersion) OutputStreamWriter(java.io.OutputStreamWriter) ContainerNode(com.fasterxml.jackson.databind.node.ContainerNode) Property.subtypes(io.strimzi.crdgenerator.Property.subtypes) Modifier.isAbstract(java.lang.reflect.Modifier.isAbstract) Collections.emptyMap(java.util.Collections.emptyMap) Files(java.nio.file.Files) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) Description(io.strimzi.crdgenerator.annotations.Description) Integer.parseInt(java.lang.Integer.parseInt) File(java.io.File) V1(io.strimzi.api.annotations.ApiVersion.V1) ParameterizedType(java.lang.reflect.ParameterizedType) TreeMap(java.util.TreeMap) OneOf(io.strimzi.crdgenerator.annotations.OneOf) JsonInclude(com.fasterxml.jackson.annotation.JsonInclude) Alternation(io.strimzi.crdgenerator.annotations.Alternation) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) Crd(io.strimzi.crdgenerator.annotations.Crd)

Aggregations

ApiVersion (io.strimzi.api.annotations.ApiVersion)12 CustomResource (io.fabric8.kubernetes.client.CustomResource)10 VersionRange (io.strimzi.api.annotations.VersionRange)10 File (java.io.File)10 FileOutputStream (java.io.FileOutputStream)10 OutputStreamWriter (java.io.OutputStreamWriter)10 JsonInclude (com.fasterxml.jackson.annotation.JsonInclude)8 JsonProperty (com.fasterxml.jackson.annotation.JsonProperty)8 JsonPropertyOrder (com.fasterxml.jackson.annotation.JsonPropertyOrder)8 JsonTypeInfo (com.fasterxml.jackson.annotation.JsonTypeInfo)8 JsonNode (com.fasterxml.jackson.databind.JsonNode)8 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)8 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)8 ContainerNode (com.fasterxml.jackson.databind.node.ContainerNode)8 JsonNodeFactory (com.fasterxml.jackson.databind.node.JsonNodeFactory)8 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)8 TextNode (com.fasterxml.jackson.databind.node.TextNode)8 YAMLGenerator (com.fasterxml.jackson.dataformat.yaml.YAMLGenerator)8 YAMLMapper (com.fasterxml.jackson.dataformat.yaml.YAMLMapper)8 V1 (io.strimzi.api.annotations.ApiVersion.V1)8