This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
commit 90d44184bb6f2fc6cdbfe995ab1fff60b91937a2 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Thu Oct 13 18:47:53 2022 -0400 Task and Pipeline fixes --- .../java/org/apache/camel/karavan/Constants.java | 2 +- .../org/apache/camel/karavan/KaravanPvcJbang.java | 6 +-- .../apache/camel/karavan/KaravanReconciler.java | 51 ++++++++++------------ .../camel/karavan/KaravanTektonPipeline.java | 30 +++++++------ .../apache/camel/karavan/KaravanTektonTask.java | 49 +++++++++++++++------ 5 files changed, 80 insertions(+), 58 deletions(-) diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/Constants.java b/karavan-operator/src/main/java/org/apache/camel/karavan/Constants.java index 400b454..e79c734 100644 --- a/karavan-operator/src/main/java/org/apache/camel/karavan/Constants.java +++ b/karavan-operator/src/main/java/org/apache/camel/karavan/Constants.java @@ -13,7 +13,7 @@ public final class Constants { public static final String ROLEBINDING_KARAVAN_VIEW = "karavan-view"; public static final String PVC_DATA = "karavan-data"; public static final String PVC_M2_CACHE = "karavan-m2-cache"; - public static final String PVC_JBANG = "karavan-jbang-cache"; + public static final String PVC_JBANG_CACHE = "karavan-jbang-cache"; public static final String PIPELINE_BUILD_QUARKUS = "karavan-pipeline-build-quarkus"; public static final String TASK_BUILD_QUARKUS = "karavan-task-build-quarkus"; diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanPvcJbang.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanPvcJbang.java index 16d79dd..81609fa 100644 --- a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanPvcJbang.java +++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanPvcJbang.java @@ -26,9 +26,9 @@ public class KaravanPvcJbang extends CRUDKubernetesDependentResource<PersistentV public PersistentVolumeClaim desired(Karavan karavan, Context<Karavan> context) { return new PersistentVolumeClaimBuilder() .withNewMetadata() - .withName(Constants.PVC_JBANG) + .withName(Constants.PVC_JBANG_CACHE) .withNamespace(karavan.getMetadata().getNamespace()) - .withLabels(karavanReconciler.getLabels(Constants.PVC_JBANG, Map.of())) + .withLabels(karavanReconciler.getLabels(Constants.PVC_JBANG_CACHE, Map.of())) .endMetadata() .withNewSpec() .withResources(new ResourceRequirementsBuilder().withRequests(Map.of("storage", new Quantity("2Gi"))).build()) @@ -39,7 +39,7 @@ public class KaravanPvcJbang extends CRUDKubernetesDependentResource<PersistentV } public ReconcileResult<PersistentVolumeClaim> reconcile(Karavan karavan, Context<Karavan> context) { - PersistentVolumeClaim pvc = getKubernetesClient().persistentVolumeClaims().inNamespace(karavan.getMetadata().getNamespace()).withName(Constants.PVC_JBANG).get(); + PersistentVolumeClaim pvc = getKubernetesClient().persistentVolumeClaims().inNamespace(karavan.getMetadata().getNamespace()).withName(Constants.PVC_JBANG_CACHE).get(); if (pvc == null) { var desired = desired(karavan, context); var createdResource = handleCreate(desired, karavan, context); diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanReconciler.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanReconciler.java index 761ddde..c0e4fc6 100644 --- a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanReconciler.java +++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanReconciler.java @@ -10,6 +10,7 @@ import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; +import java.time.Duration; import java.util.HashMap; import java.util.Map; @@ -17,19 +18,18 @@ import static io.javaoperatorsdk.operator.api.reconciler.Constants.WATCH_ALL_NAM @ControllerConfiguration(namespaces = WATCH_ALL_NAMESPACES, name = "camel-karavan-operator", dependents = { - @Dependent(type = KaravanServiceAccount.class), - @Dependent(type = KaravanRole.class), - @Dependent(type = KaravanRoleBinding.class), - @Dependent(type = KaravanRoleBindingView.class), - @Dependent(type = KaravanPvcData.class, name = Constants.PVC_DATA), - @Dependent(type = KaravanPvcM2Cache.class, name = Constants.PVC_M2_CACHE), - @Dependent(type = KaravanPvcJbang.class, name = Constants.PVC_JBANG), - @Dependent(type = KaravanTektonTask.class), - @Dependent(type = KaravanTektonPipeline.class), - @Dependent(type = KaravanDeployment.class), - @Dependent(name = "service", type = KaravanService.class), + @Dependent(name = "sa", type = KaravanServiceAccount.class), + @Dependent(name = "role", type = KaravanRole.class), + @Dependent(name = "role-binding", type = KaravanRoleBinding.class, dependsOn = {"role", "sa"}), + @Dependent(name = "role-binding-view", type = KaravanRoleBindingView.class), + @Dependent(name = Constants.PVC_DATA, type = KaravanPvcData.class), + @Dependent(name = Constants.PVC_M2_CACHE, type = KaravanPvcM2Cache.class), + @Dependent(name = Constants.PVC_JBANG_CACHE, type = KaravanPvcJbang.class), + @Dependent(name = Constants.TASK_BUILD_QUARKUS, type = KaravanTektonTask.class, dependsOn = {Constants.PVC_JBANG_CACHE, Constants.PVC_M2_CACHE}), + @Dependent(name = Constants.PIPELINE_BUILD_QUARKUS, type = KaravanTektonPipeline.class, dependsOn = {Constants.TASK_BUILD_QUARKUS, Constants.PVC_JBANG_CACHE, Constants.PVC_M2_CACHE}), + @Dependent(name = "deployment", type = KaravanDeployment.class, dependsOn = {Constants.PVC_DATA}), + @Dependent(name = "service", type = KaravanService.class, dependsOn = "deployment"), @Dependent(type = KaravanRoute.class, dependsOn = "service", reconcilePrecondition = KaravanRoute.class) -// @Dependent(type = IngressDependent.class, dependsOn = "service", readyPostcondition = IngressDependent.class) }) public class KaravanReconciler implements Reconciler<Karavan> { @@ -38,26 +38,23 @@ public class KaravanReconciler implements Reconciler<Karavan> { @ConfigProperty(name = "karavan.version") String version; - @Override public UpdateControl<Karavan> reconcile(Karavan karavan, Context<Karavan> context) throws Exception { final var name = karavan.getMetadata().getName(); final var namespace = karavan.getMetadata().getNamespace(); // retrieve the workflow reconciliation result and re-schedule if we have dependents that are not yet ready -// return context.managedDependentResourceContext().getWorkflowReconcileResult() -// .map(wrs -> { -// if (wrs.allDependentResourcesReady()) { -//// final var url = IngressDependent.getExposedURL( -//// context.getSecondaryResource(Ingress.class).orElseThrow()); -// log.info("App {} is exposed and ready to be used at {}", name, namespace); - karavan.setStatus(new KaravanStatus(KaravanStatus.State.READY)); - return UpdateControl.updateStatus(karavan); -// } else { -// final var duration = Duration.ofSeconds(5); -// log.info("App {} is not ready yet, rescheduling reconciliation after {}s", name, duration.toSeconds()); -// return UpdateControl.<Karavan> noUpdate().rescheduleAfter(duration); -// } -// }).orElseThrow(); + return context.managedDependentResourceContext().getWorkflowReconcileResult() + .map(wrs -> { + if (wrs.allDependentResourcesReady()) { + log.info("Karavan is exposed and ready to be used at '{}' namespace", namespace); + karavan.setStatus(new KaravanStatus(KaravanStatus.State.READY)); + return UpdateControl.updateStatus(karavan); + } else { + final var duration = Duration.ofSeconds(5); + log.info("Karavan is not ready yet, rescheduling reconciliation after {}s", name, duration.toSeconds()); + return UpdateControl.<Karavan>noUpdate().rescheduleAfter(duration); + } + }).orElseThrow(); } protected Map<String, String> getLabels(String name, Map<String, String> labels) { diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonPipeline.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonPipeline.java index 13f0007..b8f11d5 100644 --- a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonPipeline.java +++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonPipeline.java @@ -1,32 +1,22 @@ package org.apache.camel.karavan; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.EnvVarSourceBuilder; -import io.fabric8.tekton.pipeline.v1beta1.Param; +import io.fabric8.tekton.client.DefaultTektonClient; import io.fabric8.tekton.pipeline.v1beta1.ParamBuilder; import io.fabric8.tekton.pipeline.v1beta1.ParamSpecBuilder; import io.fabric8.tekton.pipeline.v1beta1.Pipeline; import io.fabric8.tekton.pipeline.v1beta1.PipelineBuilder; -import io.fabric8.tekton.pipeline.v1beta1.PipelineTask; import io.fabric8.tekton.pipeline.v1beta1.PipelineTaskBuilder; import io.fabric8.tekton.pipeline.v1beta1.PipelineWorkspaceDeclaration; -import io.fabric8.tekton.pipeline.v1beta1.StepBuilder; import io.fabric8.tekton.pipeline.v1beta1.Task; -import io.fabric8.tekton.pipeline.v1beta1.TaskBuilder; -import io.fabric8.tekton.pipeline.v1beta1.TaskRef; import io.fabric8.tekton.pipeline.v1beta1.TaskRefBuilder; -import io.fabric8.tekton.pipeline.v1beta1.WorkspaceDeclaration; import io.fabric8.tekton.pipeline.v1beta1.WorkspacePipelineTaskBinding; import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import org.eclipse.microprofile.config.inject.ConfigProperty; import javax.inject.Inject; -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.Map; -import java.util.stream.Collectors; public class KaravanTektonPipeline extends CRUDKubernetesDependentResource<Pipeline, Karavan> { @@ -61,15 +51,27 @@ public class KaravanTektonPipeline extends CRUDKubernetesDependentResource<Pipel .withTaskRef(new TaskRefBuilder().withKind("Task").withName(Constants.TASK_BUILD_QUARKUS).build()) .withWorkspaces( new WorkspacePipelineTaskBinding(Constants.PVC_M2_CACHE, "", Constants.PVC_M2_CACHE), - new WorkspacePipelineTaskBinding(Constants.PVC_JBANG, "", Constants.PVC_JBANG) + new WorkspacePipelineTaskBinding(Constants.PVC_JBANG_CACHE, "", Constants.PVC_JBANG_CACHE) ) .build() ) .withWorkspaces( new PipelineWorkspaceDeclaration("Maven Cache", Constants.PVC_M2_CACHE, false), - new PipelineWorkspaceDeclaration("JBang Cache", Constants.PVC_JBANG, false) + new PipelineWorkspaceDeclaration("JBang Cache", Constants.PVC_JBANG_CACHE, false) ) .endSpec() .build(); } + + @Override + public ReconcileResult<Pipeline> reconcile(Karavan karavan, Context<Karavan> context) { + Pipeline pipeline = new DefaultTektonClient(getKubernetesClient()).v1beta1().pipelines().inNamespace(karavan.getMetadata().getNamespace()).withName(Constants.PIPELINE_BUILD_QUARKUS).get(); + if (pipeline == null) { + var desired = desired(karavan, context); + var createdResource = handleCreate(desired, karavan, context); + return ReconcileResult.resourceCreated(createdResource); + } else { + return ReconcileResult.noOperation(pipeline); + } + } } diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonTask.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonTask.java index 70d7782..cc7de42 100644 --- a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonTask.java +++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanTektonTask.java @@ -3,16 +3,18 @@ package org.apache.camel.karavan; import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.EnvVarSourceBuilder; import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.rbac.Role; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.tekton.pipeline.v1beta1.ArrayOrString; -import io.fabric8.tekton.pipeline.v1beta1.ParamSpec; +import io.fabric8.openshift.client.OpenShiftClient; +import io.fabric8.tekton.client.DefaultTektonClient; import io.fabric8.tekton.pipeline.v1beta1.ParamSpecBuilder; import io.fabric8.tekton.pipeline.v1beta1.StepBuilder; import io.fabric8.tekton.pipeline.v1beta1.Task; import io.fabric8.tekton.pipeline.v1beta1.TaskBuilder; import io.fabric8.tekton.pipeline.v1beta1.WorkspaceDeclaration; import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -23,7 +25,6 @@ import java.io.InputStreamReader; import java.util.Map; import java.util.stream.Collectors; - public class KaravanTektonTask extends CRUDKubernetesDependentResource<Task, Karavan> { @Inject @@ -79,19 +80,37 @@ public class KaravanTektonTask extends CRUDKubernetesDependentResource<Task, Kar ) .withWorkspaces( new WorkspaceDeclaration("Maven Cache", "/root/.m2", Constants.PVC_M2_CACHE, false, false), - new WorkspaceDeclaration("JBang Cache", "/jbang/.jbang/cache", Constants.PVC_JBANG, false, false) + new WorkspaceDeclaration("JBang Cache", "/jbang/.jbang/cache", Constants.PVC_JBANG_CACHE, false, false) ) .endSpec() .build(); } + @Override + public ReconcileResult<Task> reconcile(Karavan karavan, Context<Karavan> context) { + Task task = new DefaultTektonClient(getKubernetesClient()).v1beta1().tasks().inNamespace(karavan.getMetadata().getNamespace()).withName(Constants.TASK_BUILD_QUARKUS).get(); + if (task == null) { + var desired = desired(karavan, context); + var createdResource = handleCreate(desired, karavan, context); + return ReconcileResult.resourceCreated(createdResource); + } else { + return ReconcileResult.noOperation(task); + } + } + protected String getScript(Karavan karavan) { - boolean removeImageRegistry = !secretHasImageRegistry(karavan); + String imageRegistry = getImageRegistry(karavan); try { InputStream inputStream = KaravanTektonTask.class.getResourceAsStream("/karavan-quarkus-builder-script.sh"); String data = new BufferedReader(new InputStreamReader(inputStream)) .lines() - .filter(s -> !(removeImageRegistry && s.contains("Dquarkus.container-image.registry=${IMAGE_REGISTRY}"))) + .map(s -> { + if (s.contains("quarkus.container-image.registry")) { + return s.replace("${IMAGE_REGISTRY}", imageRegistry); + } else { + return s; + } + }) .collect(Collectors.joining(System.getProperty("line.separator"))); return data; } catch (Exception e) { @@ -99,18 +118,22 @@ public class KaravanTektonTask extends CRUDKubernetesDependentResource<Task, Kar } } - protected boolean secretHasImageRegistry(Karavan karavan) { + protected String getImageRegistry(Karavan karavan) { + String defaultValue = "${IMAGE_REGISTRY}"; + String key = "image-registry"; try { KubernetesClient kubernetesClient = new DefaultKubernetesClient(); + boolean isOpenshift = kubernetesClient.isAdaptable(OpenShiftClient.class); Secret secret = kubernetesClient.secrets().inNamespace(karavan.getMetadata().getNamespace()).withName(Constants.NAME).get(); - if (secret != null) { - String imageRegistry = secret.getStringData().get("image-registry"); - System.out.println("imageRegistry = " +imageRegistry); - return imageRegistry != null; + if (secret != null && secret.getData().containsKey(key)) { + return defaultValue; + } else if (isOpenshift) { + return "image-registry.openshift-image-registry.svc:5000"; + } else { + return defaultValue; } - return false; } catch (Exception e) { - return false; + return defaultValue; } } }