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;
}
}
}