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/06/23 21:02:53 UTC

[camel-karavan] branch main updated: Statuses initial (#391)

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 d8faa09  Statuses initial (#391)
d8faa09 is described below

commit d8faa09e7a456761dbd579325846ddec2a6196b2
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Jun 23 17:02:48 2022 -0400

    Statuses initial (#391)
---
 karavan-app/pom.xml                                |  4 +-
 .../apache/camel/karavan/api/StatusResource.java   | 88 ++++++++++++++++++++++
 .../org/apache/camel/karavan/model/Project.java    |  1 -
 .../apache/camel/karavan/model/ProjectStatus.java  | 59 +++++++++++++++
 .../camel/karavan/service/InfinispanService.java   | 10 ++-
 .../camel/karavan/service/KubernetesService.java   |  1 -
 .../src/main/resources/application.properties      |  6 +-
 .../src/main/webapp/src/projects/ProjectPage.tsx   |  2 +-
 .../openshift/karavan-quarkus-task.yaml            |  4 +-
 karavan-builder/openshift/karavan-secret.yaml      |  2 +-
 10 files changed, 165 insertions(+), 12 deletions(-)

diff --git a/karavan-app/pom.xml b/karavan-app/pom.xml
index 9f6169f..9f9ade7 100644
--- a/karavan-app/pom.xml
+++ b/karavan-app/pom.xml
@@ -52,11 +52,11 @@
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-vertx</artifactId>
+            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
+            <artifactId>quarkus-rest-client-reactive-jackson</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
new file mode 100644
index 0000000..7523d8d
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.karavan.api;
+
+import io.vertx.core.CompositeFuture;
+import io.vertx.core.Future;
+import io.vertx.core.Vertx;
+import io.vertx.ext.web.client.HttpResponse;
+import io.vertx.ext.web.client.WebClient;
+import org.apache.camel.karavan.model.KaravanConfiguration;
+import org.apache.camel.karavan.model.ProjectStatus;
+import org.apache.camel.karavan.service.InfinispanService;
+
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@Path("/status")
+public class StatusResource {
+
+    @Inject
+    InfinispanService infinispanService;
+
+    @Inject
+    KaravanConfiguration configuration;
+
+    @Inject
+    Vertx vertx;
+
+    WebClient webClient;
+
+    public WebClient getWebClient() {
+        if (webClient == null){
+            webClient = WebClient.create(vertx);
+        }
+        return webClient;
+    }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/{projectId}")
+    public ProjectStatus getStatus(@HeaderParam("username") String username, @PathParam("projectId") String projectId) throws Exception {
+        ProjectStatus status = new ProjectStatus();
+        status.setProjectId(projectId);
+        status.setLastUpdate(System.currentTimeMillis());
+        Map<String, ProjectStatus.Status> statuses = new HashMap<>(configuration.environments().size());
+        Map<String, Future> responses = new HashMap<>(configuration.environments().size());
+        configuration.environments().forEach(e -> {
+            String url = String.format("http://%s.%s.%s/q/health", projectId, e.namespace(), e.cluster());
+            responses.put(e.name(), getWebClient().getAbs(url).timeout(3000).send());
+        });
+        CompositeFuture.join(new ArrayList<>(responses.values())).onComplete(e -> {
+            responses.forEach((env, event) -> {
+                System.out.println(env + " : " + event.toString());
+                if (event.succeeded()
+                        && event.result() instanceof HttpResponse
+                        && ((HttpResponse) event.result()).bodyAsJsonObject().getString("status").equals("UP")){
+                            statuses.put(env, ProjectStatus.Status.UP);
+                        } else {
+                            statuses.put(env, ProjectStatus.Status.DOWN);
+                        }
+            });
+        });
+        status.setStatuses(statuses);
+        return status;
+    }
+}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
index 174d5f6..3cd5702 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
@@ -46,7 +46,6 @@ public class Project {
         this.runtime = runtime;
     }
 
-
     public Project() {
     }
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStatus.java
new file mode 100644
index 0000000..b153a22
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStatus.java
@@ -0,0 +1,59 @@
+package org.apache.camel.karavan.model;
+
+import org.infinispan.protostream.annotations.ProtoEnumValue;
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+import java.util.Map;
+
+public class ProjectStatus {
+    public static final String CACHE = "project_statuses";
+    @ProtoField(number = 1)
+    String projectId;
+    @ProtoField(number = 2)
+    Map<String, Status> statuses;
+    @ProtoField(number = 3)
+    long lastUpdate;
+
+    public enum Status {
+        @ProtoEnumValue(number = 0, name = "DOWN")
+        DOWN,
+        @ProtoEnumValue(number = 1, name = "UP")
+        UP
+    }
+
+    @ProtoFactory
+
+    public ProjectStatus(String projectId, Map<String, Status> statuses, long lastUpdate) {
+        this.projectId = projectId;
+        this.statuses = statuses;
+        this.lastUpdate = lastUpdate;
+    }
+
+    public ProjectStatus() {
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public Map<String, Status> getStatuses() {
+        return statuses;
+    }
+
+    public void setStatuses(Map<String, Status> statuses) {
+        this.statuses = statuses;
+    }
+
+    public long getLastUpdate() {
+        return lastUpdate;
+    }
+
+    public void setLastUpdate(long lastUpdate) {
+        this.lastUpdate = lastUpdate;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java
index ad69299..7c4befb 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java
@@ -22,6 +22,7 @@ import org.apache.camel.karavan.KaravanLifecycleBean;
 import org.apache.camel.karavan.model.GroupedKey;
 import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.model.ProjectFile;
+import org.apache.camel.karavan.model.ProjectStatus;
 import org.eclipse.microprofile.config.Config;
 import org.eclipse.microprofile.config.ConfigProvider;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -45,7 +46,6 @@ import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 import java.util.List;
 import java.util.Map;
-import java.util.Random;
 import java.util.stream.Collectors;
 
 @ApplicationScoped
@@ -55,6 +55,8 @@ public class InfinispanService {
 
     BasicCache<GroupedKey, ProjectFile> files;
 
+    BasicCache<GroupedKey, ProjectStatus> statuses;
+
     @Inject
     RemoteCacheManager cacheManager;
 
@@ -87,10 +89,12 @@ public class InfinispanService {
                     .fetchPersistentState(true);
             projects = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(Project.CACHE, builder.build());
             files = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(ProjectFile.CACHE, builder.build());
+            statuses = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(ProjectStatus.CACHE, builder.build());
         } else {
             LOGGER.info("InfinispanService is starting in remote mode");
             projects = cacheManager.administration().getOrCreateCache(Project.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, Project.CACHE)));
             files = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, ProjectFile.CACHE)));
+            statuses = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, ProjectStatus.CACHE)));
         }
         if (ProfileManager.getLaunchMode().isDevOrTest()){
 //            generateDevProjects();
@@ -147,6 +151,10 @@ public class InfinispanService {
         return projects.get(GroupedKey.create(project, project));
     }
 
+    public Project getProjectStatus(String projectId) {
+        return projects.get(GroupedKey.create(projectId, projectId));
+    }
+
     private void generateDevProjects(){
         for (int i = 0; i < 10; i++){
             String projectId = "parcel-demo" + i;
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 9433c0e..71401df 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
@@ -41,7 +41,6 @@ import java.util.Objects;
 @ApplicationScoped
 public class KubernetesService {
 
-
     @ConfigProperty(name = "kubernetes.namespace", defaultValue = "localhost")
     String namespace;
 
diff --git a/karavan-app/src/main/resources/application.properties b/karavan-app/src/main/resources/application.properties
index ddf8e4d..4f09b60 100644
--- a/karavan-app/src/main/resources/application.properties
+++ b/karavan-app/src/main/resources/application.properties
@@ -22,13 +22,13 @@ karavan.config.runtime=QUARKUS
 karavan.config.runtime-version=2.10.0.Final
 karavan.config.environments[0].name=dev
 karavan.config.environments[0].namespace=karavan
-karavan.config.environments[0].cluster=kubernetes.default.svc
+karavan.config.environments[0].cluster=svc.cluster.local
 karavan.config.environments[1].name=test
 karavan.config.environments[1].namespace=test
-karavan.config.environments[1].cluster=kubernetes.default.svc
+karavan.config.environments[1].cluster=svc.cluster.local
 karavan.config.environments[2].name=prod
 karavan.config.environments[2].namespace=prod
-karavan.config.environments[2].cluster=kubernetes.default.svc
+karavan.config.environments[2].cluster=svc.cluster.local
 
 # Infinispan Server address
 #quarkus.infinispan-client.server-list=localhost:12345
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
index 2648f41..3436d66 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
+++ b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
@@ -403,7 +403,7 @@ export class ProjectPage extends React.Component<Props, State> {
                                 </Button>
                             </Td>
                             <Td modifier={"fitContent"}>
-                                <Button style={{padding: '0'}} variant={"plain"}
+                                <Button style={{padding: '0'}} variant={"plain"} isDisabled={file.name === 'application.properties'}
                                         onClick={e => this.openDeleteConfirmation(file)}>
                                     <DeleteIcon/>
                                 </Button>
diff --git a/karavan-builder/openshift/karavan-quarkus-task.yaml b/karavan-builder/openshift/karavan-quarkus-task.yaml
index 6e3a891..d9e9a79 100644
--- a/karavan-builder/openshift/karavan-quarkus-task.yaml
+++ b/karavan-builder/openshift/karavan-quarkus-task.yaml
@@ -48,11 +48,11 @@ spec:
             secretKeyRef:
               name: karavan
               key: git-username
-        - name: GIT_TOKEN
+        - name: GIT_PASSWORD
           valueFrom:
             secretKeyRef:
               name: karavan
-              key: git-token
+              key: git-password
     - name: rollout
       image: >-
         image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
diff --git a/karavan-builder/openshift/karavan-secret.yaml b/karavan-builder/openshift/karavan-secret.yaml
index c1b3187..779fd50 100644
--- a/karavan-builder/openshift/karavan-secret.yaml
+++ b/karavan-builder/openshift/karavan-secret.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
 metadata:
   name: karavan
 data:
-  git-token: ZGVtbw==
+  git-password: ZGVtbw==
   git-username: ZGVtbw==
 stringData:
   git-repository: https://github.com/mgubaidullin/karavan-demo.git