use of io.strimzi.api.annotations.ApiVersion in project strimzi by strimzi.
the class CrdGenerator method buildStatus.
private ObjectNode buildStatus(Crd.Spec crd, ApiVersion crApiVersion) {
ObjectNode status;
long length = Arrays.stream(crd.subresources().status()).filter(st -> ApiVersion.parseRange(st.apiVersion()).contains(crApiVersion)).count();
if (length == 1) {
status = nf.objectNode();
} else if (length > 1) {
err("Each custom resource definition can have only one status sub-resource.");
status = null;
} else {
status = null;
}
return status;
}
use of io.strimzi.api.annotations.ApiVersion in project strimzi 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;
}
use of io.strimzi.api.annotations.ApiVersion in project strimzi by strimzi.
the class CrdGenerator method buildAdditionalPrinterColumns.
private ArrayNode buildAdditionalPrinterColumns(Crd.Spec crd, ApiVersion crApiVersion) {
ArrayNode cols = nf.arrayNode();
if (crd.additionalPrinterColumns().length != 0) {
for (Crd.Spec.AdditionalPrinterColumn col : Arrays.stream(crd.additionalPrinterColumns()).filter(col -> crApiVersion == null || ApiVersion.parseRange(col.apiVersion()).contains(crApiVersion)).collect(Collectors.toList())) {
ObjectNode colNode = cols.addObject();
colNode.put("name", col.name());
colNode.put("description", col.description());
colNode.put(crdApiVersion.compareTo(V1) >= 0 ? "jsonPath" : "JSONPath", col.jsonPath());
colNode.put("type", col.type());
if (col.priority() != 0) {
colNode.put("priority", col.priority());
}
if (!col.format().isEmpty()) {
colNode.put("format", col.format());
}
}
}
return cols;
}
use of io.strimzi.api.annotations.ApiVersion in project strimzi by strimzi.
the class DocGenerator method main.
public static void main(String[] args) throws IOException, ClassNotFoundException {
Linker linker = null;
File out = null;
List<Class<? extends CustomResource>> classes = new ArrayList<>();
outer: for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.startsWith("-")) {
if ("--linker".equals(arg)) {
String className = args[++i];
Class<? extends Linker> linkerClass = classInherits(Class.forName(className), Linker.class);
if (linkerClass != null) {
try {
linker = linkerClass.getConstructor(String.class).newInstance(args[++i]);
} catch (ReflectiveOperationException e) {
throw new RuntimeException("--linker option can't be handled", e);
}
} else {
System.err.println(className + " is not a subclass of " + Linker.class.getName());
}
} else {
throw new RuntimeException("Unsupported option " + arg);
}
} else {
if (out == null) {
out = new File(arg);
} else {
String className = arg;
Class<? extends CustomResource> cls = classInherits(Class.forName(className), CustomResource.class);
if (cls != null) {
classes.add(cls);
} else {
System.err.println(className + " is not a subclass of " + CustomResource.class.getName());
}
}
}
}
ApiVersion crApiVersion = ApiVersion.V1BETA2;
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(out), StandardCharsets.UTF_8)) {
writer.append("// This file is auto-generated by ").append(DocGenerator.class.getName()).append(".").append(NL);
writer.append("// To change this documentation you need to edit the Java sources.").append(NL);
writer.append(NL);
DocGenerator dg = new DocGenerator(crApiVersion, 3, classes, writer, linker);
for (Class<? extends CustomResource> c : classes) {
dg.generate(c);
}
if (dg.numErrors > 0) {
System.err.println("There were " + dg.numErrors + " errors");
System.exit(1);
}
}
}
use of io.strimzi.api.annotations.ApiVersion in project strimzi by strimzi.
the class StructuralCrdIT method assertApiVersionsAreStructuralInApiextensionsV1.
private void assertApiVersionsAreStructuralInApiextensionsV1(String api, VersionRange<ApiVersion> shouldBeStructural) {
Pattern pattern = Pattern.compile("[^.]spec\\.versions\\[([0-9]+)\\]\\.[^,]*?");
CustomResourceDefinition crd = cluster.client().getClient().apiextensions().v1().customResourceDefinitions().withName(api).get();
// We can't make the following assertion because the current version of fabric8 always requests
// the CRD using v1beta1 api version, so the apiserver just replaces it and serves it.
// assertEquals(crdApiVersion, ApiVersion.parse(crd.getApiVersion().replace("apiextensions.k8s.io/", "")));
Set<ApiVersion> presentCrdApiVersions = crd.getSpec().getVersions().stream().map(v -> ApiVersion.parse(v.getName())).collect(Collectors.toSet());
assertTrue(presentCrdApiVersions.contains(shouldBeStructural.lower()), "CRD has versions " + presentCrdApiVersions + " which doesn't include " + shouldBeStructural.lower() + " which should be structural");
Map<Integer, ApiVersion> indexedVersions = new HashMap<>();
int i = 0;
for (CustomResourceDefinitionVersion version : crd.getSpec().getVersions()) {
indexedVersions.put(i, ApiVersion.parse(version.getName()));
}
Optional<CustomResourceDefinitionCondition> first = crd.getStatus().getConditions().stream().filter(cond -> "NonStructuralSchema".equals(cond.getType()) && "True".equals(cond.getStatus())).findFirst();
if (first.isPresent()) {
Matcher matcher = pattern.matcher(first.get().getMessage());
while (matcher.find()) {
Integer index = Integer.valueOf(matcher.group(1));
ApiVersion nonStructuralVersion = indexedVersions.get(index);
if (shouldBeStructural.contains(nonStructuralVersion)) {
fail(api + "/ " + nonStructuralVersion + " should be structural but there's a complaint about " + matcher.group());
}
}
}
}
Aggregations