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 21:01:49 UTC

[camel-karavan] branch main updated: First version started on Openshift

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


The following commit(s) were added to refs/heads/main by this push:
     new 102167c  First version started on Openshift
102167c is described below

commit 102167c4413bc7b11282ed2ee34a6df12bda84fa
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Oct 13 17:01:41 2022 -0400

    First version started on Openshift
---
 .../camel/karavan/service/KubernetesService.java   |  2 +-
 .../java/org/apache/camel/karavan/Karavan.java     |  9 ----
 .../apache/camel/karavan/KaravanDeployment.java    | 49 +++++++++++++++-------
 .../apache/camel/karavan/KaravanReconciler.java    | 41 +++++++++---------
 .../org/apache/camel/karavan/KaravanRoute.java     | 48 +++++++++++++++++++++
 .../src/main/resources/application.properties      |  8 ++++
 6 files changed, 110 insertions(+), 47 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
index ed8e785..7962f66 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
@@ -134,7 +134,7 @@ public class KubernetesService {
                 .withNamespace(namespace)
                 .build();
 
-        PipelineRef ref = new PipelineRefBuilder().withName("karavan-quarkus").build();
+        PipelineRef ref = new PipelineRefBuilder().withName("karavan-pipeline-build-quarkus").build();
 
         PipelineRunSpec spec = new PipelineRunSpecBuilder()
                 .withPipelineRef(ref)
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/Karavan.java b/karavan-operator/src/main/java/org/apache/camel/karavan/Karavan.java
index ac95084..978b6c9 100644
--- a/karavan-operator/src/main/java/org/apache/camel/karavan/Karavan.java
+++ b/karavan-operator/src/main/java/org/apache/camel/karavan/Karavan.java
@@ -10,14 +10,5 @@ import io.fabric8.kubernetes.model.annotation.*;
 @Plural(Constants.PLURAL_NAME)
 public class Karavan extends CustomResource<KaravanSpec, KaravanStatus> implements Namespaced {
 
-    @Override
-    protected KaravanSpec initSpec() {
-        return new KaravanSpec();
-    }
-
-    @Override
-    protected KaravanStatus initStatus() {
-        return new KaravanStatus();
-    }
 }
 
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanDeployment.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanDeployment.java
index 979775d..1c6b6c9 100644
--- a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanDeployment.java
+++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanDeployment.java
@@ -1,12 +1,16 @@
 package org.apache.camel.karavan;
 
+import io.fabric8.kubernetes.api.model.EnvVar;
+import io.fabric8.kubernetes.api.model.EnvVarBuilder;
 import io.fabric8.kubernetes.api.model.EnvVarSourceBuilder;
+import io.fabric8.kubernetes.api.model.ObjectFieldSelector;
 import io.fabric8.kubernetes.api.model.ObjectFieldSelectorBuilder;
 import io.fabric8.kubernetes.api.model.OwnerReference;
 import io.fabric8.kubernetes.api.model.OwnerReferenceBuilder;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource;
 import io.fabric8.kubernetes.api.model.Quantity;
 import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
+import io.fabric8.kubernetes.api.model.SecretKeySelector;
 import io.fabric8.kubernetes.api.model.VolumeBuilder;
 import io.fabric8.kubernetes.api.model.VolumeMountBuilder;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
@@ -16,6 +20,8 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernete
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 public class KaravanDeployment extends CRUDKubernetesDependentResource<Deployment, Karavan> {
@@ -24,7 +30,7 @@ public class KaravanDeployment extends CRUDKubernetesDependentResource<Deploymen
     String version;
 
     @ConfigProperty(name = "karavan.image")
-    String image;
+    String baseImage;
 
     @Inject
     KaravanReconciler karavanReconciler;
@@ -36,6 +42,31 @@ public class KaravanDeployment extends CRUDKubernetesDependentResource<Deploymen
     @Override
     @SuppressWarnings("unchecked")
     public Deployment desired(Karavan karavan, Context<Karavan> context) {
+
+        String image = baseImage + ":" + version;
+        List<EnvVar> envVarList = new ArrayList<>();
+
+        envVarList.add(
+                new EnvVar("KUBERNETES_NAMESPACE", null, new EnvVarSourceBuilder().withFieldRef(new ObjectFieldSelector("","metadata.namespace")).build())
+        );
+        if (karavan.getSpec().getAuth() == "basic") {
+            image = baseImage + "-basic:" + version;
+            envVarList.add(
+                    new EnvVar("MASTER_PASSWORD", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("master-password","karavan", false)).build())
+            );
+        } else if (karavan.getSpec().getAuth() == "oidc") {
+            image = baseImage + "-oidc:" + version;
+            envVarList.add(
+                    new EnvVar("OIDC_FRONTEND_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-frontend-url","karavan", false)).build())
+            );
+            envVarList.add(
+                    new EnvVar("OIDC_SERVER_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-server-url","karavan", false)).build())
+            );
+            envVarList.add(
+                    new EnvVar("OIDC_SECRET", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-secret","karavan", false)).build())
+            );
+        }
+
         return new DeploymentBuilder()
                 .withNewMetadata()
                 .withName(Constants.NAME)
@@ -58,13 +89,9 @@ public class KaravanDeployment extends CRUDKubernetesDependentResource<Deploymen
                 .withNewSpec()
                     .addNewContainer()
                         .withName(Constants.NAME)
-//                        .withImage(getImageName(karavan))
-                        .withImage("ghcr.io/apache/camel-karavan:3.18.4") // TODO: set correct version after
+                        .withImage(image)
                         .withImagePullPolicy("Always")
-                        .addNewEnv()
-                            .withName("KUBERNETES_NAMESPACE")
-                            .withValueFrom(new EnvVarSourceBuilder().withFieldRef(new ObjectFieldSelectorBuilder().withFieldPath("metadata.namespace").build()).build())
-                        .endEnv()
+                        .withEnv(envVarList)
                         .addNewPort()
                             .withContainerPort(8080)
                             .withName(Constants.NAME)
@@ -80,14 +107,6 @@ public class KaravanDeployment extends CRUDKubernetesDependentResource<Deploymen
                 .build();
     }
 
-    private String getImageName(Karavan karavan) {
-        String auth = karavan.getSpec().getAuth();
-        switch (auth){
-            case "oidc": return image + "-oidc:" + version;
-            case "basic": return image + "-basic:" + version;
-            default: return image + ":" + version;
-        }
-    }
 
     private OwnerReference createOwnerReference(Karavan resource) {
         final var metadata = resource.getMetadata();
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 50e85c0..761ddde 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
@@ -5,7 +5,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import io.javaoperatorsdk.operator.api.reconciler.Context;
-import io.javaoperatorsdk.operator.api.reconciler.ContextInitializer;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
@@ -16,31 +15,29 @@ import java.util.Map;
 
 import static io.javaoperatorsdk.operator.api.reconciler.Constants.WATCH_ALL_NAMESPACES;
 
-@ControllerConfiguration(namespaces = WATCH_ALL_NAMESPACES, name = "karavan", 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),
+@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(type = KaravanRoute.class, dependsOn = "service", reconcilePrecondition = KaravanRoute.class)
 //        @Dependent(type = IngressDependent.class, dependsOn = "service", readyPostcondition = IngressDependent.class)
-})
-public class KaravanReconciler implements Reconciler<Karavan>, ContextInitializer<Karavan> {
+        })
+public class KaravanReconciler implements Reconciler<Karavan> {
 
     static final Logger log = LoggerFactory.getLogger(KaravanReconciler.class);
 
     @ConfigProperty(name = "karavan.version")
     String version;
 
-    @Override
-    public void initContext(Karavan karavan, Context<Karavan> context) {
-
-    }
 
     @Override
     public UpdateControl<Karavan> reconcile(Karavan karavan, Context<Karavan> context) throws Exception {
@@ -53,8 +50,8 @@ public class KaravanReconciler implements Reconciler<Karavan>, ContextInitialize
 ////                        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);
+        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());
@@ -68,7 +65,7 @@ public class KaravanReconciler implements Reconciler<Karavan>, ContextInitialize
                 "app", name,
                 "app.kubernetes.io/name", name,
                 "app.kubernetes.io/version", version,
-                "app.kubernetes.io/part-of",  Constants.NAME
+                "app.kubernetes.io/part-of", Constants.NAME
         ));
         result.putAll(labels);
         return result;
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanRoute.java b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanRoute.java
new file mode 100644
index 0000000..9dff643
--- /dev/null
+++ b/karavan-operator/src/main/java/org/apache/camel/karavan/KaravanRoute.java
@@ -0,0 +1,48 @@
+package org.apache.camel.karavan;
+
+import io.fabric8.kubernetes.api.model.IntOrString;
+import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.openshift.api.model.Route;
+import io.fabric8.openshift.api.model.RouteBuilder;
+import io.fabric8.openshift.api.model.RoutePort;
+import io.fabric8.openshift.api.model.RouteTargetReferenceBuilder;
+import io.fabric8.openshift.client.OpenShiftClient;
+import io.javaoperatorsdk.operator.api.reconciler.Context;
+import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
+import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
+
+import javax.inject.Inject;
+import java.util.Map;
+
+public class KaravanRoute extends CRUDKubernetesDependentResource<Route, Karavan> implements Condition<Route, Karavan> {
+
+    @Inject
+    KaravanReconciler karavanReconciler;
+
+    public KaravanRoute() {
+        super(Route.class);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Route desired(Karavan karavan, Context<Karavan> context) {
+        return new RouteBuilder()
+                .withNewMetadata()
+                .withName(Constants.NAME)
+                .withNamespace(karavan.getMetadata().getNamespace())
+                .withLabels(karavanReconciler.getLabels(Constants.NAME, Map.of()))
+                .endMetadata()
+                .withNewSpec()
+                .withPort(new RoutePort(new IntOrString(8080)))
+                .withTo(new RouteTargetReferenceBuilder().withKind("Service").withName(Constants.NAME).build())
+                .endSpec()
+                .build();
+    }
+
+    @Override
+    public boolean isMet(Karavan karavan, Route route, Context<Karavan> context) {
+        KubernetesClient kubernetesClient = new DefaultKubernetesClient();
+        return kubernetesClient.isAdaptable(OpenShiftClient.class);
+    }
+}
diff --git a/karavan-operator/src/main/resources/application.properties b/karavan-operator/src/main/resources/application.properties
index 4d1ad1f..792e254 100644
--- a/karavan-operator/src/main/resources/application.properties
+++ b/karavan-operator/src/main/resources/application.properties
@@ -1,6 +1,14 @@
 # set to true to automatically apply CRDs to the cluster when they get regenerated
 quarkus.operator-sdk.crd.apply=true
 quarkus.operator-sdk.crd.validate=false
+quarkus.operator-sdk.crd.versions=v1
+quarkus.operator-sdk.crd.generate=true
+quarkus.operator-sdk.bundle.channels=alpha
+quarkus.operator-sdk.bundle.package-name=camel-karavan-operator
+
+quarkus.kubernetes-client.trust-certs=true
+quarkus.kubernetes.namespace=openshift-operators
+quarkus.kubernetes.service-account=camel-karavan-operator
 
 quarkus.container-image.build=true
 quarkus.container-image.builder=jib