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 <marat.gubaidul...@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