You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2022/10/13 23:01:50 UTC

[camel-karavan] 01/02: Task and Pipeline fixes

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 <ma...@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;
         }
     }
 }