Search in sources :

Example 46 with KafkaConnectStatus

use of io.strimzi.api.kafka.model.status.KafkaConnectStatus in project strimzi-kafka-operator by strimzi.

the class KafkaConnectAssemblyOperator method createOrUpdate.

@Override
protected Future<KafkaConnectStatus> createOrUpdate(Reconciliation reconciliation, KafkaConnect kafkaConnect) {
    KafkaConnectCluster connect;
    KafkaConnectBuild build;
    KafkaConnectStatus kafkaConnectStatus = new KafkaConnectStatus();
    try {
        connect = KafkaConnectCluster.fromCrd(reconciliation, kafkaConnect, versions);
        build = KafkaConnectBuild.fromCrd(reconciliation, kafkaConnect, versions);
    } catch (Exception e) {
        LOGGER.warnCr(reconciliation, e);
        StatusUtils.setStatusConditionAndObservedGeneration(kafkaConnect, kafkaConnectStatus, Future.failedFuture(e));
        return Future.failedFuture(new ReconciliationException(kafkaConnectStatus, e));
    }
    Promise<KafkaConnectStatus> createOrUpdatePromise = Promise.promise();
    String namespace = reconciliation.namespace();
    Map<String, String> annotations = new HashMap<>(2);
    boolean connectHasZeroReplicas = connect.getReplicas() == 0;
    final AtomicReference<String> image = new AtomicReference<>();
    final AtomicReference<String> desiredLogging = new AtomicReference<>();
    String initCrbName = KafkaConnectResources.initContainerClusterRoleBindingName(kafkaConnect.getMetadata().getName(), namespace);
    ClusterRoleBinding initCrb = connect.generateClusterRoleBinding();
    LOGGER.debugCr(reconciliation, "Updating Kafka Connect cluster");
    connectServiceAccount(reconciliation, namespace, KafkaConnectResources.serviceAccountName(connect.getCluster()), connect).compose(i -> connectInitClusterRoleBinding(reconciliation, initCrbName, initCrb)).compose(i -> connectNetworkPolicy(reconciliation, namespace, connect, isUseResources(kafkaConnect))).compose(i -> connectBuildOperator.reconcile(reconciliation, namespace, connect.getName(), build)).compose(buildInfo -> {
        if (buildInfo != null) {
            annotations.put(Annotations.STRIMZI_IO_CONNECT_BUILD_REVISION, buildInfo.getBuildRevision());
            image.set(buildInfo.getImage());
        }
        return Future.succeededFuture();
    }).compose(i -> deploymentOperations.scaleDown(reconciliation, namespace, connect.getName(), connect.getReplicas())).compose(i -> serviceOperations.reconcile(reconciliation, namespace, connect.getServiceName(), connect.generateService())).compose(i -> generateMetricsAndLoggingConfigMap(reconciliation, namespace, connect)).compose(logAndMetricsConfigMap -> {
        String logging = logAndMetricsConfigMap.getData().get(AbstractModel.ANCILLARY_CM_KEY_LOG_CONFIG);
        annotations.put(Annotations.ANNO_STRIMZI_LOGGING_DYNAMICALLY_UNCHANGEABLE_HASH, Util.hashStub(Util.getLoggingDynamicallyUnmodifiableEntries(logging)));
        desiredLogging.set(logging);
        return configMapOperations.reconcile(reconciliation, namespace, connect.getAncillaryConfigMapName(), logAndMetricsConfigMap);
    }).compose(i -> kafkaConnectJmxSecret(reconciliation, namespace, kafkaConnect.getMetadata().getName(), connect)).compose(i -> pfa.hasPodDisruptionBudgetV1() ? podDisruptionBudgetOperator.reconcile(reconciliation, namespace, connect.getName(), connect.generatePodDisruptionBudget()) : Future.succeededFuture()).compose(i -> !pfa.hasPodDisruptionBudgetV1() ? podDisruptionBudgetV1Beta1Operator.reconcile(reconciliation, namespace, connect.getName(), connect.generatePodDisruptionBudgetV1Beta1()) : Future.succeededFuture()).compose(i -> generateAuthHash(namespace, kafkaConnect.getSpec())).compose(hash -> {
        annotations.put(Annotations.ANNO_STRIMZI_AUTH_HASH, Integer.toString(hash));
        Deployment deployment = generateDeployment(connect, image.get(), annotations);
        return deploymentOperations.reconcile(reconciliation, namespace, connect.getName(), deployment);
    }).compose(i -> deploymentOperations.scaleUp(reconciliation, namespace, connect.getName(), connect.getReplicas())).compose(i -> deploymentOperations.waitForObserved(reconciliation, namespace, connect.getName(), 1_000, operationTimeoutMs)).compose(i -> connectHasZeroReplicas ? Future.succeededFuture() : deploymentOperations.readiness(reconciliation, namespace, connect.getName(), 1_000, operationTimeoutMs)).compose(i -> reconcileConnectors(reconciliation, kafkaConnect, kafkaConnectStatus, connectHasZeroReplicas, desiredLogging.get(), connect.getDefaultLogConfig())).onComplete(reconciliationResult -> {
        StatusUtils.setStatusConditionAndObservedGeneration(kafkaConnect, kafkaConnectStatus, reconciliationResult);
        if (!connectHasZeroReplicas) {
            kafkaConnectStatus.setUrl(KafkaConnectResources.url(connect.getCluster(), namespace, KafkaConnectCluster.REST_API_PORT));
        }
        kafkaConnectStatus.setReplicas(connect.getReplicas());
        kafkaConnectStatus.setLabelSelector(connect.getSelectorLabels().toSelectorString());
        if (reconciliationResult.succeeded()) {
            createOrUpdatePromise.complete(kafkaConnectStatus);
        } else {
            createOrUpdatePromise.fail(new ReconciliationException(kafkaConnectStatus, reconciliationResult.cause()));
        }
    });
    return createOrUpdatePromise.future();
}
Also used : KafkaConnectStatus(io.strimzi.api.kafka.model.status.KafkaConnectStatus) ReconciliationException(io.strimzi.operator.common.ReconciliationException) ClusterRoleBinding(io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding) LabelSelector(io.fabric8.kubernetes.api.model.LabelSelector) Annotations(io.strimzi.operator.common.Annotations) HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) KafkaConnector(io.strimzi.api.kafka.model.KafkaConnector) Resource(io.fabric8.kubernetes.client.dsl.Resource) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KafkaConnectStatus(io.strimzi.api.kafka.model.status.KafkaConnectStatus) Map(java.util.Map) ResourceOperatorSupplier(io.strimzi.operator.cluster.operator.resource.ResourceOperatorSupplier) ReconciliationException(io.strimzi.operator.common.ReconciliationException) AsyncResult(io.vertx.core.AsyncResult) AbstractModel(io.strimzi.operator.cluster.model.AbstractModel) Operator(io.strimzi.operator.common.Operator) StatusUtils(io.strimzi.operator.common.operator.resource.StatusUtils) KafkaConnect(io.strimzi.api.kafka.model.KafkaConnect) ReconciliationLogger(io.strimzi.operator.common.ReconciliationLogger) CertSecretSource(io.strimzi.api.kafka.model.CertSecretSource) KafkaConnectBuild(io.strimzi.operator.cluster.model.KafkaConnectBuild) DeploymentOperator(io.strimzi.operator.common.operator.resource.DeploymentOperator) Promise(io.vertx.core.Promise) KafkaVersion(io.strimzi.operator.cluster.model.KafkaVersion) Vertx(io.vertx.core.Vertx) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) Future(io.vertx.core.Future) Collectors(java.util.stream.Collectors) Reconciliation(io.strimzi.operator.common.Reconciliation) NamespaceAndName(io.strimzi.operator.common.model.NamespaceAndName) KafkaConnectCluster(io.strimzi.operator.cluster.model.KafkaConnectCluster) List(java.util.List) Util(io.strimzi.operator.common.Util) Labels(io.strimzi.operator.common.model.Labels) KafkaConnectorStatus(io.strimzi.api.kafka.model.status.KafkaConnectorStatus) KubernetesClient(io.fabric8.kubernetes.client.KubernetesClient) Optional(java.util.Optional) KafkaConnectList(io.strimzi.api.kafka.KafkaConnectList) Handler(io.vertx.core.Handler) LabelSelectorRequirement(io.fabric8.kubernetes.api.model.LabelSelectorRequirement) Deployment(io.fabric8.kubernetes.api.model.apps.Deployment) KafkaConnectSpec(io.strimzi.api.kafka.model.KafkaConnectSpec) KafkaClientAuthentication(io.strimzi.api.kafka.model.authentication.KafkaClientAuthentication) PlatformFeaturesAvailability(io.strimzi.operator.PlatformFeaturesAvailability) Collections(java.util.Collections) ClusterOperatorConfig(io.strimzi.operator.cluster.ClusterOperatorConfig) KafkaConnectResources(io.strimzi.api.kafka.model.KafkaConnectResources) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ClusterRoleBinding(io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding) Deployment(io.fabric8.kubernetes.api.model.apps.Deployment) KafkaConnectCluster(io.strimzi.operator.cluster.model.KafkaConnectCluster) AtomicReference(java.util.concurrent.atomic.AtomicReference) ReconciliationException(io.strimzi.operator.common.ReconciliationException) KafkaConnectBuild(io.strimzi.operator.cluster.model.KafkaConnectBuild)

Example 47 with KafkaConnectStatus

use of io.strimzi.api.kafka.model.status.KafkaConnectStatus in project strimzi-kafka-operator by strimzi.

the class CustomResourceStatusIsolatedST method assertKafkaConnectStatus.

void assertKafkaConnectStatus(long expectedObservedGeneration, String expectedUrl) {
    KafkaConnectStatus kafkaConnectStatus = KafkaConnectResource.kafkaConnectClient().inNamespace(clusterOperator.getDeploymentNamespace()).withName(CUSTOM_RESOURCE_STATUS_CLUSTER_NAME).get().getStatus();
    assertThat("Kafka Connect cluster status has incorrect Observed Generation", kafkaConnectStatus.getObservedGeneration(), is(expectedObservedGeneration));
    assertThat("Kafka Connect cluster status has incorrect URL", kafkaConnectStatus.getUrl(), is(expectedUrl));
    validateConnectPlugins(kafkaConnectStatus.getConnectorPlugins());
}
Also used : KafkaConnectStatus(io.strimzi.api.kafka.model.status.KafkaConnectStatus)

Example 48 with KafkaConnectStatus

use of io.strimzi.api.kafka.model.status.KafkaConnectStatus in project strimzi-kafka-operator by strimzi.

the class ConnectIsolatedST method testScaleConnectWithoutConnectorToZero.

@ParallelNamespaceTest
@Tag(SCALABILITY)
void testScaleConnectWithoutConnectorToZero(ExtensionContext extensionContext) {
    final String namespaceName = StUtils.getNamespaceBasedOnRbac(clusterOperator.getDeploymentNamespace(), extensionContext);
    final String clusterName = mapWithClusterNames.get(extensionContext.getDisplayName());
    resourceManager.createResource(extensionContext, KafkaTemplates.kafkaEphemeral(clusterName, 3).build());
    resourceManager.createResource(extensionContext, KafkaConnectTemplates.kafkaConnectWithFilePlugin(namespaceName, clusterName, 2).build());
    final String connectDeploymentName = KafkaConnectResources.deploymentName(clusterName);
    List<Pod> connectPods = kubeClient(namespaceName).listPods(Labels.STRIMZI_NAME_LABEL, KafkaConnectResources.deploymentName(clusterName));
    assertThat(connectPods.size(), is(2));
    // scale down
    LOGGER.info("Scaling KafkaConnect down to zero");
    KafkaConnectResource.replaceKafkaConnectResourceInSpecificNamespace(clusterName, kafkaConnect -> kafkaConnect.getSpec().setReplicas(0), namespaceName);
    KafkaConnectUtils.waitForConnectReady(namespaceName, clusterName);
    PodUtils.waitForPodsReady(kubeClient(namespaceName).getDeploymentSelectors(namespaceName, connectDeploymentName), 0, true);
    connectPods = kubeClient(namespaceName).listPods(Labels.STRIMZI_NAME_LABEL, KafkaConnectResources.deploymentName(clusterName));
    KafkaConnectStatus connectStatus = KafkaConnectResource.kafkaConnectClient().inNamespace(namespaceName).withName(clusterName).get().getStatus();
    assertThat(connectPods.size(), is(0));
    assertThat(connectStatus.getConditions().get(0).getType(), is(Ready.toString()));
}
Also used : KafkaConnectStatus(io.strimzi.api.kafka.model.status.KafkaConnectStatus) Pod(io.fabric8.kubernetes.api.model.Pod) Matchers.containsString(org.hamcrest.Matchers.containsString) ParallelNamespaceTest(io.strimzi.systemtest.annotations.ParallelNamespaceTest) Tag(org.junit.jupiter.api.Tag)

Aggregations

KafkaConnectStatus (io.strimzi.api.kafka.model.status.KafkaConnectStatus)48 KafkaConnect (io.strimzi.api.kafka.model.KafkaConnect)44 KafkaConnectResources (io.strimzi.api.kafka.model.KafkaConnectResources)44 KafkaConnector (io.strimzi.api.kafka.model.KafkaConnector)44 Annotations (io.strimzi.operator.common.Annotations)44 List (java.util.List)44 ConfigMap (io.fabric8.kubernetes.api.model.ConfigMap)42 KubernetesClient (io.fabric8.kubernetes.client.KubernetesClient)42 PlatformFeaturesAvailability (io.strimzi.operator.PlatformFeaturesAvailability)42 KafkaConnectCluster (io.strimzi.operator.cluster.model.KafkaConnectCluster)42 ResourceOperatorSupplier (io.strimzi.operator.cluster.operator.resource.ResourceOperatorSupplier)42 Reconciliation (io.strimzi.operator.common.Reconciliation)42 Util (io.strimzi.operator.common.Util)42 Future (io.vertx.core.Future)42 Vertx (io.vertx.core.Vertx)42 Optional (java.util.Optional)42 Deployment (io.fabric8.kubernetes.api.model.apps.Deployment)40 NetworkPolicy (io.fabric8.kubernetes.api.model.networking.v1.NetworkPolicy)40 KafkaConnectorList (io.strimzi.api.kafka.KafkaConnectorList)40 KafkaVersion (io.strimzi.operator.cluster.model.KafkaVersion)40