From 6bae9853ef647961e5b29842a98069e16949215f Mon Sep 17 00:00:00 2001 From: jcechace Date: Mon, 9 May 2022 13:23:29 +0200 Subject: [PATCH] DBZ-5095 Apicurio management refactoring --- .../AbstractOcpApicurioController.java | 82 -- .../registry/AbstractOcpApicurioDeployer.java | 95 --- .../tools/registry/OcpApicurioController.java | 73 +- .../tools/registry/OcpApicurioDeployer.java | 52 +- .../builders/FabricApicurioBuilder.java | 45 + .../crd/v1/apicurioregistries_crd.yaml | 549 ------------- .../crd/v1beta1/apicurioregistries_crd.yaml | 777 ------------------ ...pApicurioFixture.java => OcpApicurio.java} | 36 +- .../tests/db2/OcpAvroDb2ConnectorIT.java | 4 +- .../mongodb/OcpAvroMongoConnectorIT.java | 4 +- .../tests/mysql/OcpAvroMySqlConnectorIT.java | 4 +- .../oracle/OcpAvroOracleConnectorIT.java | 4 +- .../OcpAvroPostgreSqlConnectorIT.java | 4 +- .../OcpAvroSqlServerConnectorIT.java | 4 +- .../v1/010-registry-kafkasql.yaml | 10 - 15 files changed, 153 insertions(+), 1590 deletions(-) delete mode 100644 debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioController.java delete mode 100644 debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioDeployer.java create mode 100644 debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/builders/FabricApicurioBuilder.java delete mode 100644 debezium-testing/debezium-testing-system/src/main/resources/crd/v1/apicurioregistries_crd.yaml delete mode 100644 debezium-testing/debezium-testing-system/src/main/resources/crd/v1beta1/apicurioregistries_crd.yaml rename debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/{OcpApicurioFixture.java => OcpApicurio.java} (62%) delete mode 100644 debezium-testing/debezium-testing-system/src/test/resources/registry-resources/v1/010-registry-kafkasql.yaml diff --git a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioController.java b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioController.java deleted file mode 100644 index d6c553db7..000000000 --- a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioController.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Debezium Authors. - * - * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 - */ -package io.debezium.testing.system.tools.registry; - -import static io.debezium.testing.system.tools.WaitConditions.scaled; -import static org.awaitility.Awaitility.await; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -import io.apicurio.registry.operator.api.model.ApicurioRegistry; -import io.apicurio.registry.operator.api.model.ApicurioRegistryList; -import io.debezium.testing.system.tools.OpenShiftUtils; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; -import io.fabric8.kubernetes.client.dsl.Resource; -import io.fabric8.openshift.api.model.Route; -import io.fabric8.openshift.client.OpenShiftClient; - -import okhttp3.OkHttpClient; - -public abstract class AbstractOcpApicurioController implements RegistryController { - - public static final String APICURIO_NAME_LBL = "apicur.io/name"; - - protected final OpenShiftClient ocp; - protected final OkHttpClient http; - protected final String project; - protected final String name; - protected final OpenShiftUtils ocpUtils; - protected ApicurioRegistry registry; - - public AbstractOcpApicurioController(ApicurioRegistry registry, OpenShiftClient ocp, OkHttpClient http) { - this.registry = registry; - this.ocp = ocp; - this.http = http; - this.project = registry.getMetadata().getNamespace(); - this.name = registry.getMetadata().getName(); - this.ocpUtils = new OpenShiftUtils(ocp); - } - - protected String getRegistryAddress() { - Service s = getRegistryService(); - return "http://" + s.getMetadata().getName() + "." + project + ".svc.cluster.local:8080"; - } - - protected String getPublicRegistryAddress() { - await() - .atMost(scaled(30), TimeUnit.SECONDS) - .pollInterval(5, TimeUnit.SECONDS) - .pollDelay(5, TimeUnit.SECONDS) - .until(() -> !getRoutes().isEmpty()); - - return getRoutes().get(0).getSpec().getHost(); - } - - private List getRoutes() { - return ocp.routes().inNamespace(project) - .withLabel(APICURIO_NAME_LBL, name) - .list().getItems(); - } - - protected Service getRegistryService() { - List items = ocp.services().inNamespace(project).withLabel(APICURIO_NAME_LBL, name).list().getItems(); - if (items.isEmpty()) { - throw new IllegalStateException("No service for registry '" + registry.getMetadata().getName() + "'"); - } - - return items.get(0); - } - - @Override - public boolean undeploy() { - return registryOperation().delete(registry); - } - - protected abstract NonNamespaceOperation> registryOperation(); - -} diff --git a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioDeployer.java b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioDeployer.java deleted file mode 100644 index ee52e974e..000000000 --- a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/AbstractOcpApicurioDeployer.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Debezium Authors. - * - * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 - */ -package io.debezium.testing.system.tools.registry; - -import static io.debezium.testing.system.tools.ConfigProperties.APICURIO_CRD_VERSION; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.apicurio.registry.operator.api.model.ApicurioRegistry; -import io.apicurio.registry.operator.api.model.ApicurioRegistryList; -import io.debezium.testing.system.tools.AbstractOcpDeployer; -import io.debezium.testing.system.tools.Deployer; -import io.debezium.testing.system.tools.YAML; -import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; -import io.fabric8.kubernetes.client.dsl.Resource; -import io.fabric8.kubernetes.model.annotation.Version; -import io.fabric8.openshift.client.OpenShiftClient; - -import okhttp3.OkHttpClient; - -/** - * Deployment management for Apicurio service registry OCP deployment - * @author Jakub Cechacek - */ -public abstract class AbstractOcpApicurioDeployer extends AbstractOcpDeployer { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractOcpApicurioDeployer.class); - - protected final String yamlPath; - protected ApicurioRegistry registry; - - static { - Version version = ApicurioRegistry.class.getAnnotation(Version.class); - if (version == null || !APICURIO_CRD_VERSION.equalsIgnoreCase(version.value())) { - throw new IllegalStateException("Incompatible Apicurio model version"); - } - } - - public AbstractOcpApicurioDeployer( - String project, - String yamlPath, - OpenShiftClient ocp, - OkHttpClient http) { - super(project, ocp, http); - this.yamlPath = yamlPath; - } - - @Override - public C deploy() throws InterruptedException { - LOGGER.info("Deploying Apicurio Registry from " + yamlPath); - ApicurioRegistry registry = YAML.fromResource(yamlPath, ApicurioRegistry.class); - registry = registryOperation().createOrReplace(registry); - - C controller = getController(registry); - controller.waitForRegistry(); - - return controller; - } - - protected abstract C getController(ApicurioRegistry registry); - - protected abstract NonNamespaceOperation> registryOperation(); - - public abstract static class RegistryBuilder, D extends AbstractOcpApicurioDeployer> - implements Deployer.Builder { - - protected String project; - protected OpenShiftClient ocpClient; - protected OkHttpClient httpClient; - protected String yamlPath; - - public B withProject(String project) { - this.project = project; - return self(); - } - - public B withOcpClient(OpenShiftClient ocpClient) { - this.ocpClient = ocpClient; - return self(); - } - - public B withHttpClient(OkHttpClient httpClient) { - this.httpClient = httpClient; - return self(); - } - - public B withYamlPath(String yamlPath) { - this.yamlPath = yamlPath; - return self(); - } - } -} diff --git a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioController.java b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioController.java index 66dff9e16..431d1fb04 100644 --- a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioController.java +++ b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioController.java @@ -11,41 +11,79 @@ import static org.awaitility.Awaitility.await; import java.util.List; +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.apicurio.registry.operator.api.model.ApicurioRegistry; import io.apicurio.registry.operator.api.model.ApicurioRegistryList; +import io.debezium.testing.system.tools.OpenShiftUtils; import io.debezium.testing.system.tools.WaitConditions; -import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; +import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; -import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; +import io.fabric8.openshift.api.model.Route; import io.fabric8.openshift.client.OpenShiftClient; import okhttp3.OkHttpClient; /** * This class provides control over Apicurio registry instance deployed in OpenShift + * * @author Jakub Cechacek */ -public class OcpApicurioController extends AbstractOcpApicurioController implements RegistryController { - public static final String APICURIO_CRD_DESCRIPTOR = "/crd/v1/apicurioregistries_crd.yaml"; +public class OcpApicurioController implements RegistryController { private static final Logger LOGGER = LoggerFactory.getLogger(OcpApicurioController.class); + public static final String APICURIO_NAME_LBL = "apicur.io/name"; + + protected final OpenShiftClient ocp; + protected final OkHttpClient http; + protected final String project; + protected final String name; + protected final OpenShiftUtils ocpUtils; + protected ApicurioRegistry registry; + public OcpApicurioController(ApicurioRegistry registry, OpenShiftClient ocp, OkHttpClient http) { - super(registry, ocp, http); + this.registry = registry; + this.ocp = ocp; + this.http = http; + this.project = registry.getMetadata().getNamespace(); + this.name = registry.getMetadata().getName(); + this.ocpUtils = new OpenShiftUtils(ocp); } - @Override protected NonNamespaceOperation> registryOperation() { - CustomResourceDefinition crd = ocp.apiextensions().v1().customResourceDefinitions() - .load(OcpApicurioController.class.getResourceAsStream(APICURIO_CRD_DESCRIPTOR)) - .get(); - CustomResourceDefinitionContext context = CustomResourceDefinitionContext.fromCrd(crd); - return ocp.customResources(context, ApicurioRegistry.class, ApicurioRegistryList.class).inNamespace(project); + return ocp.resources(ApicurioRegistry.class, ApicurioRegistryList.class).inNamespace(project); + } + + protected String getPublicRegistryAddress() { + await().atMost(scaled(30), TimeUnit.SECONDS) + .pollInterval(5, TimeUnit.SECONDS) + .pollDelay(5, TimeUnit.SECONDS) + .until(() -> !getRoutes().isEmpty()); + + return getRoutes().get(0).getSpec().getHost(); + } + + private List getRoutes() { + return ocp.routes().inNamespace(project).withLabel(APICURIO_NAME_LBL, name).list().getItems(); + } + + protected Service getRegistryService() { + List items = ocp.services().inNamespace(project).withLabel(APICURIO_NAME_LBL, name).list().getItems(); + if (items.isEmpty()) { + throw new IllegalStateException("No service for registry '" + registry.getMetadata().getName() + "'"); + } + + return items.get(0); + } + + protected String getRegistryAddress() { + Service s = getRegistryService(); + return "http://" + s.getMetadata().getName() + "." + project + ".svc.cluster.local:8080"; } @Override @@ -60,14 +98,14 @@ public String getPublicRegistryApiAddress() { @Override public void waitForRegistry() throws InterruptedException { - LOGGER.info("Waiting for deployments of registry '" + name + "'"); - await() - .atMost(scaled(1), MINUTES) + LOGGER.info("Waiting for deployments of registry '" + name + "' in '" + project + "'"); + await().atMost(scaled(1), MINUTES) .pollInterval(5, SECONDS) .until(() -> !getRegistryDeployments(name).isEmpty()); Deployment deployment = getRegistryDeployments(name).get(0); - ocp.apps().deployments() + ocp.apps() + .deployments() .inNamespace(project) .withName(deployment.getMetadata().getName()) .waitUntilCondition(WaitConditions::deploymentAvailableCondition, scaled(5), MINUTES); @@ -78,4 +116,9 @@ public void waitForRegistry() throws InterruptedException { private List getRegistryDeployments(String name) { return ocp.apps().deployments().inNamespace(project).withLabel("app", name).list().getItems(); } + + @Override + public boolean undeploy() { + return registryOperation().delete(registry); + } } diff --git a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioDeployer.java b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioDeployer.java index 6ee7731e2..0defd3b01 100644 --- a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioDeployer.java +++ b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/OcpApicurioDeployer.java @@ -10,52 +10,48 @@ import io.apicurio.registry.operator.api.model.ApicurioRegistry; import io.apicurio.registry.operator.api.model.ApicurioRegistryList; -import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; +import io.debezium.testing.system.tools.AbstractOcpDeployer; +import io.debezium.testing.system.tools.registry.builders.FabricApicurioBuilder; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; -import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; import io.fabric8.openshift.client.OpenShiftClient; import okhttp3.OkHttpClient; /** * Deployment management for Apicurio service registry OCP deployment + * * @author Jakub Cechacek */ -public class OcpApicurioDeployer extends AbstractOcpApicurioDeployer { + +public class OcpApicurioDeployer extends AbstractOcpDeployer { + private static final Logger LOGGER = LoggerFactory.getLogger(OcpApicurioDeployer.class); - public static final String APICURIO_CRD_DESCRIPTOR = "/crd/v1/apicurioregistries_crd.yaml"; + private final FabricApicurioBuilder fabricBuilder; - private OcpApicurioDeployer( - String project, - String yamlPath, - OpenShiftClient ocp, - OkHttpClient http) { - super(project, yamlPath, ocp, http); - } - - protected NonNamespaceOperation> registryOperation() { - CustomResourceDefinition crd = ocp.apiextensions().v1().customResourceDefinitions() - .load(OcpApicurioDeployer.class.getResourceAsStream(APICURIO_CRD_DESCRIPTOR)) - .get(); - CustomResourceDefinitionContext context = CustomResourceDefinitionContext.fromCrd(crd); - return ocp.customResources(context, ApicurioRegistry.class, ApicurioRegistryList.class).inNamespace(project); + public OcpApicurioDeployer(String project, FabricApicurioBuilder fabricBuilder, OpenShiftClient ocp, OkHttpClient http) { + super(project, ocp, http); + this.fabricBuilder = fabricBuilder; } @Override + public OcpApicurioController deploy() throws InterruptedException { + LOGGER.info("Deploying Apicurio Registry to '" + project + "'"); + + ApicurioRegistry registry = fabricBuilder.build(); + registry = registryOperation().createOrReplace(registry); + + OcpApicurioController controller = getController(registry); + controller.waitForRegistry(); + + return controller; + } + protected OcpApicurioController getController(ApicurioRegistry registry) { return new OcpApicurioController(registry, ocp, http); } - public static class Builder extends AbstractOcpApicurioDeployer.RegistryBuilder { - - @Override - public OcpApicurioDeployer build() { - return new OcpApicurioDeployer( - project, - yamlPath, - ocpClient, - httpClient); - } + protected NonNamespaceOperation> registryOperation() { + return ocp.resources(ApicurioRegistry.class, ApicurioRegistryList.class).inNamespace(project); } } diff --git a/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/builders/FabricApicurioBuilder.java b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/builders/FabricApicurioBuilder.java new file mode 100644 index 000000000..88209fea0 --- /dev/null +++ b/debezium-testing/debezium-testing-system/src/main/java/io/debezium/testing/system/tools/registry/builders/FabricApicurioBuilder.java @@ -0,0 +1,45 @@ +package io.debezium.testing.system.tools.registry.builders; + +import io.apicurio.registry.operator.api.model.ApicurioRegistry; +import io.apicurio.registry.operator.api.model.ApicurioRegistryBuilder; +import io.debezium.testing.system.tools.fabric8.FabricBuilderWrapper; + +public class FabricApicurioBuilder + extends FabricBuilderWrapper { + protected FabricApicurioBuilder(ApicurioRegistryBuilder builder) { + super(builder); + } + + @Override + public ApicurioRegistry build() { + return builder.build(); + } + + private static FabricApicurioBuilder base() { + ApicurioRegistryBuilder builder = new ApicurioRegistryBuilder() + .withNewMetadata() + .withName("debezium-registry") + .endMetadata() + .withNewSpec() + .endSpec(); + + return new FabricApicurioBuilder(builder); + } + + public static FabricApicurioBuilder baseKafkaSql(String bootstrap) { + return base().withKafkaSqlConfiguration(bootstrap); + } + + public FabricApicurioBuilder withKafkaSqlConfiguration(String bootstrap) { + builder + .editSpec() + .withNewConfiguration() + .withNewKafkasql() + .withBootstrapServers(bootstrap) + .endKafkasql() + .endConfiguration() + .endSpec(); + + return self(); + } +} diff --git a/debezium-testing/debezium-testing-system/src/main/resources/crd/v1/apicurioregistries_crd.yaml b/debezium-testing/debezium-testing-system/src/main/resources/crd/v1/apicurioregistries_crd.yaml deleted file mode 100644 index c3a93bb39..000000000 --- a/debezium-testing/debezium-testing-system/src/main/resources/crd/v1/apicurioregistries_crd.yaml +++ /dev/null @@ -1,549 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.1 - creationTimestamp: null - labels: - apicur.io/name: apicurio-registry-operator - apicur.io/type: operator - apicur.io/version: 1.0.0-redhat.2 - name: apicurioregistries.registry.apicur.io -spec: - group: registry.apicur.io - names: - kind: ApicurioRegistry - listKind: ApicurioRegistryList - plural: apicurioregistries - singular: apicurioregistry - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: ApicurioRegistry represents an Apicurio Registry instance - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ApicurioRegistrySpec defines the desired state of ApicurioRegistry - properties: - configuration: - properties: - kafkasql: - properties: - bootstrapServers: - type: string - security: - properties: - scram: - properties: - mechanism: - type: string - passwordSecretName: - type: string - truststoreSecretName: - type: string - user: - type: string - type: object - tls: - properties: - keystoreSecretName: - type: string - truststoreSecretName: - type: string - type: object - type: object - type: object - logLevel: - type: string - persistence: - type: string - security: - properties: - keycloak: - properties: - apiClientId: - type: string - realm: - type: string - uiClientId: - type: string - url: - type: string - type: object - type: object - sql: - properties: - dataSource: - properties: - password: - type: string - url: - type: string - userName: - type: string - type: object - type: object - ui: - properties: - readOnly: - type: boolean - type: object - type: object - deployment: - properties: - affinity: - description: Affinity is a group of affinity scheduling rules. - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - properties: - preference: - description: A node selector term, associated with the corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements by node's fields. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements by node's fields. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - type: array - required: - - nodeSelectorTerms - type: object - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - type: object - host: - type: string - replicas: - format: int32 - type: integer - tolerations: - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - type: array - type: object - type: object - status: - description: ApicurioRegistryStatus defines the observed state of ApicurioRegistry - properties: - conditions: - description: List of status conditions. - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - info: - description: Information about the deployed application. - properties: - host: - type: string - type: object - managedResources: - description: List of resources managed by this operator. - items: - properties: - kind: - type: string - name: - type: string - namespace: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] \ No newline at end of file diff --git a/debezium-testing/debezium-testing-system/src/main/resources/crd/v1beta1/apicurioregistries_crd.yaml b/debezium-testing/debezium-testing-system/src/main/resources/crd/v1beta1/apicurioregistries_crd.yaml deleted file mode 100644 index 16d350a83..000000000 --- a/debezium-testing/debezium-testing-system/src/main/resources/crd/v1beta1/apicurioregistries_crd.yaml +++ /dev/null @@ -1,777 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: apicurioregistries.apicur.io -spec: - group: apicur.io - names: - kind: ApicurioRegistry - listKind: ApicurioRegistryList - plural: apicurioregistries - singular: apicurioregistry - scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - description: ApicurioRegistry is the Schema for the apicurioregistries API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ApicurioRegistrySpec defines the desired state of ApicurioRegistry - properties: - configuration: - properties: - dataSource: - properties: - password: - type: string - url: - type: string - userName: - type: string - type: object - infinispan: - properties: - clusterName: - type: string - type: object - kafka: - properties: - bootstrapServers: - type: string - type: object - logLevel: - type: string - persistence: - enum: - - mem - - jpa - - kafka - - streams - - infinispan - type: string - streams: - properties: - applicationId: - type: string - applicationServerPort: - type: string - bootstrapServers: - type: string - security: - properties: - scram: - properties: - mechanism: - type: string - passwordSecretName: - type: string - truststoreSecretName: - type: string - user: - type: string - type: object - tls: - properties: - keystoreSecretName: - type: string - truststoreSecretName: - type: string - type: object - type: object - type: object - ui: - properties: - readOnly: - type: boolean - type: object - type: object - deployment: - properties: - affinity: - description: Affinity is a group of affinity scheduling rules. - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the - pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if the node - matches the corresponding matchExpressions; the node(s) - with the highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects - (i.e. is also a no-op). - properties: - preference: - description: A node selector term, associated with - the corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - weight: - description: Weight associated with matching the corresponding - nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not - be scheduled onto the node. If the affinity requirements - specified by this field cease to be met at some point - during pod execution (e.g. due to an update), the system - may or may not try to eventually evict the pod from its - node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. - The terms are ORed. - items: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. - The TopologySelectorTerm type implements a subset - of the NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - type: array - required: - - nodeSelectorTerms - type: object - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate - this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if the node - has pods which matches the corresponding podAffinityTerm; - the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. - items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not - be scheduled onto the node. If the affinity requirements - specified by this field cease to be met at some point - during pod execution (e.g. due to a pod label update), - the system may or may not try to eventually evict the - pod from its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm are - intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located is - defined as running on a node whose value of the label - with key matches that of any node on which - a pod of the set of pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey matches - that of any node on which any of the selected pods - is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. - avoid putting this pod in the same node, zone, etc. as some - other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods - to nodes that satisfy the anti-affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to the - sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum are - the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. - items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the pod - will not be scheduled onto the node. If the anti-affinity - requirements specified by this field cease to be met at - some point during pod execution (e.g. due to a pod label - update), the system may or may not try to eventually evict - the pod from its node. When there are multiple elements, - the lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located is - defined as running on a node whose value of the label - with key matches that of any node on which - a pod of the set of pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey matches - that of any node on which any of the selected pods - is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - type: object - host: - type: string - replicas: - format: int32 - type: integer - tolerations: - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using the - matching operator . - properties: - effect: - description: Effect indicates the taint effect to match. Empty - means match all taint effects. When specified, allowed values - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the - value. Valid operators are Exists and Equal. Defaults to - Equal. Exists is equivalent to wildcard for value, so that - a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time - the toleration (which must be of effect NoExecute, otherwise - this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do - not evict). Zero and negative values will be treated as - 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - type: object - type: array - type: object - image: - properties: - name: - description: Registry string `json:"registry,omitempty"` Version string - `json:"version,omitempty"` Override string `json:"override,omitempty"` - type: string - type: object - type: object - status: - description: ApicurioRegistryStatus defines the observed state of ApicurioRegistry - properties: - deploymentName: - type: string - host: - type: string - image: - type: string - ingressName: - type: string - replicaCount: - format: int32 - type: integer - serviceName: - type: string - type: object - type: object - version: v1alpha1 - versions: - - name: v1alpha1 - served: true - storage: true diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurioFixture.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurio.java similarity index 62% rename from debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurioFixture.java rename to debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurio.java index c9100ec08..5c12b893b 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurioFixture.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/fixtures/registry/OcpApicurio.java @@ -5,6 +5,8 @@ */ package io.debezium.testing.system.fixtures.registry; +import static io.debezium.testing.system.tools.ConfigProperties.OCP_PROJECT_REGISTRY; + import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.extension.ExtensionContext; @@ -16,6 +18,7 @@ import io.debezium.testing.system.tools.registry.OcpApicurioController; import io.debezium.testing.system.tools.registry.OcpApicurioDeployer; import io.debezium.testing.system.tools.registry.RegistryController; +import io.debezium.testing.system.tools.registry.builders.FabricApicurioBuilder; import io.fabric8.openshift.client.OpenShiftClient; import fixture5.TestFixture; @@ -23,42 +26,31 @@ import okhttp3.OkHttpClient; @FixtureContext(requires = { OpenShiftClient.class, KafkaController.class }, provides = { RegistryController.class }, overrides = { KafkaAssertions.class }) -public class OcpApicurioFixture extends TestFixture { - - public static final String REGISTRY_DEPLOYMENT_PATH = "/registry-resources/v1/010-registry-kafkasql.yaml"; +public class OcpApicurio extends TestFixture { private final OpenShiftClient ocp; private final KafkaController kafkaController; private final String project; - public OcpApicurioFixture(@NotNull ExtensionContext.Store store) { + public OcpApicurio(@NotNull ExtensionContext.Store store) { super(store); this.ocp = retrieve(OpenShiftClient.class); this.kafkaController = retrieve(KafkaController.class); - this.project = ConfigProperties.OCP_PROJECT_REGISTRY; + this.project = OCP_PROJECT_REGISTRY; } @Override - public void setup() { + public void setup() throws Exception { + updateApicurioOperator(); - try { - updateApicurioOperator(); + FabricApicurioBuilder fabricBuilder = FabricApicurioBuilder + .baseKafkaSql(kafkaController.getBootstrapAddress()); - OcpApicurioDeployer deployer = new OcpApicurioDeployer.Builder() - .withOcpClient(ocp) - .withHttpClient(new OkHttpClient()) - .withProject(ConfigProperties.OCP_PROJECT_REGISTRY) - .withYamlPath(REGISTRY_DEPLOYMENT_PATH) - .build(); - - OcpApicurioController controller = deployer.deploy(); - store(RegistryController.class, controller); - store(KafkaAssertions.class, new AvroKafkaAssertions(kafkaController.getDefaultConsumerProperties())); - } - catch (Exception e) { - throw new IllegalStateException("Error while setting up Registry", e); - } + OcpApicurioDeployer deployer = new OcpApicurioDeployer(OCP_PROJECT_REGISTRY, fabricBuilder, ocp, new OkHttpClient()); + OcpApicurioController controller = deployer.deploy(); + store(RegistryController.class, controller); + store(KafkaAssertions.class, new AvroKafkaAssertions(kafkaController.getDefaultConsumerProperties())); } @Override diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/db2/OcpAvroDb2ConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/db2/OcpAvroDb2ConnectorIT.java index 77c27251c..12afd46a5 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/db2/OcpAvroDb2ConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/db2/OcpAvroDb2ConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.Db2Connector; import io.debezium.testing.system.fixtures.databases.ocp.OcpDb2Fixture; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; import io.debezium.testing.system.tools.kafka.KafkaController; @@ -30,7 +30,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpDb2Fixture.class) @Fixture(Db2Connector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mongodb/OcpAvroMongoConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mongodb/OcpAvroMongoConnectorIT.java index cf16a0b77..e1c66cefc 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mongodb/OcpAvroMongoConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mongodb/OcpAvroMongoConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.MongoConnector; import io.debezium.testing.system.fixtures.databases.ocp.OcpMongo; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; import io.debezium.testing.system.tools.kafka.KafkaController; @@ -30,7 +30,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpMongo.class) @Fixture(MongoConnector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mysql/OcpAvroMySqlConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mysql/OcpAvroMySqlConnectorIT.java index be1805896..062544d60 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mysql/OcpAvroMySqlConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/mysql/OcpAvroMySqlConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.MySqlConnector; import io.debezium.testing.system.fixtures.databases.ocp.OcpMySql; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; import io.debezium.testing.system.tools.kafka.KafkaController; @@ -30,7 +30,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpMySql.class) @Fixture(MySqlConnector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/oracle/OcpAvroOracleConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/oracle/OcpAvroOracleConnectorIT.java index 94a4752e6..43b5a0005 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/oracle/OcpAvroOracleConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/oracle/OcpAvroOracleConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.OracleConnector; import io.debezium.testing.system.fixtures.databases.ocp.OcpOracle; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; import io.debezium.testing.system.tools.kafka.KafkaController; @@ -30,7 +30,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpOracle.class) @Fixture(OracleConnector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/postgresql/OcpAvroPostgreSqlConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/postgresql/OcpAvroPostgreSqlConnectorIT.java index ec9af3c88..42f8e3c43 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/postgresql/OcpAvroPostgreSqlConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/postgresql/OcpAvroPostgreSqlConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.PostgreSqlConnector; import io.debezium.testing.system.fixtures.databases.ocp.OcpPostgreSql; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tests.mysql.MySqlTests; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; @@ -31,7 +31,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpPostgreSql.class) @Fixture(PostgreSqlConnector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/sqlserver/OcpAvroSqlServerConnectorIT.java b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/sqlserver/OcpAvroSqlServerConnectorIT.java index 0343a7722..212b30fe5 100644 --- a/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/sqlserver/OcpAvroSqlServerConnectorIT.java +++ b/debezium-testing/debezium-testing-system/src/test/java/io/debezium/testing/system/tests/sqlserver/OcpAvroSqlServerConnectorIT.java @@ -15,7 +15,7 @@ import io.debezium.testing.system.fixtures.connectors.SqlServerConnector; import io.debezium.testing.system.fixtures.databases.ocp.OcpSqlServer; import io.debezium.testing.system.fixtures.kafka.OcpKafka; -import io.debezium.testing.system.fixtures.registry.OcpApicurioFixture; +import io.debezium.testing.system.fixtures.registry.OcpApicurio; import io.debezium.testing.system.tools.kafka.ConnectorConfigBuilder; import io.debezium.testing.system.tools.kafka.KafkaConnectController; import io.debezium.testing.system.tools.kafka.KafkaController; @@ -30,7 +30,7 @@ @Tag("apicurio") @Fixture(OcpClient.class) @Fixture(OcpKafka.class) -@Fixture(OcpApicurioFixture.class) +@Fixture(OcpApicurio.class) @Fixture(OcpSqlServer.class) @Fixture(SqlServerConnector.class) @ExtendWith(FixtureExtension.class) diff --git a/debezium-testing/debezium-testing-system/src/test/resources/registry-resources/v1/010-registry-kafkasql.yaml b/debezium-testing/debezium-testing-system/src/test/resources/registry-resources/v1/010-registry-kafkasql.yaml deleted file mode 100644 index 911e9ae9d..000000000 --- a/debezium-testing/debezium-testing-system/src/test/resources/registry-resources/v1/010-registry-kafkasql.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: registry.apicur.io/v1 -kind: ApicurioRegistry -metadata: - name: debezium-registry -spec: - configuration: - logLevel: ${apicurio.log.level} - persistence: "kafkasql" - kafkasql: - bootstrapServers: "debezium-kafka-cluster-kafka-bootstrap.${ocp.project.debezium}.svc.cluster.local:9092" \ No newline at end of file