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