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 2021/11/23 00:46:12 UTC

[camel-karavan] branch main updated: Custom kamelets (#117)

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 54b821e  Custom kamelets (#117)
54b821e is described below

commit 54b821e7f9127ce13ac271248659655bb0042208
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Mon Nov 22 19:46:06 2021 -0500

    Custom kamelets (#117)
    
    * Load custom Kamelets
    
    * Fixed #114
---
 karavan-app/src/main/docker/Dockerfile.distroless  |  2 +-
 karavan-app/src/main/docker/Dockerfile.legacy-jar  |  3 ++-
 karavan-app/src/main/docker/Dockerfile.multistage  |  2 +-
 .../apache/camel/karavan/api/KameletResources.java | 25 ++++++++++++++++++----
 .../camel/karavan/service/FileSystemService.java   |  3 ++-
 .../src/main/resources/application.properties      |  3 ++-
 karavan-app/src/main/webapp/src/Main.tsx           |  1 -
 karavan-designer/src/designer/api/KameletApi.tsx   | 11 +++++++---
 karavan-vscode/package.json                        |  5 +++++
 karavan-vscode/src/extension.ts                    | 10 ++++++++-
 10 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/karavan-app/src/main/docker/Dockerfile.distroless b/karavan-app/src/main/docker/Dockerfile.distroless
index 1c5d0a1..4400d07 100644
--- a/karavan-app/src/main/docker/Dockerfile.distroless
+++ b/karavan-app/src/main/docker/Dockerfile.distroless
@@ -14,7 +14,7 @@
 #  limitations under the License.
 FROM gcr.io/distroless/java:11
 COPY target/*-runner.jar /deployments/karavan.jar
-COPY src/main/resources/kamelets/* /deployments/kamelets/
+COPY src/main/resources/kamelets/* /deployments/kamelets-buildin/
 COPY src/main/resources/components/* /deployments/components/
 WORKDIR /deployments
 CMD ["karavan.jar"]
\ No newline at end of file
diff --git a/karavan-app/src/main/docker/Dockerfile.legacy-jar b/karavan-app/src/main/docker/Dockerfile.legacy-jar
index d183342..ccbfa74 100644
--- a/karavan-app/src/main/docker/Dockerfile.legacy-jar
+++ b/karavan-app/src/main/docker/Dockerfile.legacy-jar
@@ -33,7 +33,8 @@ RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \
 
 # Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size.
 ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
-COPY src/main/resources/kamelets/* /deployments/kamelets/
+COPY src/main/resources/kamelets/* /deployments/kamelets-buildin/
+COPY src/main/resources/components/* /deployments/components/
 COPY target/*-runner.jar /deployments/app.jar
 
 EXPOSE 8080
diff --git a/karavan-app/src/main/docker/Dockerfile.multistage b/karavan-app/src/main/docker/Dockerfile.multistage
index e6d1c6d..95c08dd 100644
--- a/karavan-app/src/main/docker/Dockerfile.multistage
+++ b/karavan-app/src/main/docker/Dockerfile.multistage
@@ -37,7 +37,7 @@ RUN ./mvnw clean package -Pnative -f karavan-app
 ## Stage 2 : create the docker final image
 FROM quay.io/quarkus/quarkus-distroless-image:1.0
 COPY --chown=nonroot --from=build /code/karavan-app/target/*-runner /deployments/application
-COPY --chown=nonroot --from=build /code/karavan-app/src/main/resources/kamelets/* /deployments/kamelets/
+COPY --chown=nonroot --from=build /code/karavan-app/src/main/resources/kamelets/* /deployments/kamelets-buildin/
 COPY --chown=nonroot --from=build /code/karavan-app/src/main/resources/components/* /deployments/components/
 
 EXPOSE 8080
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
index 79c0064..67e1fff 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
@@ -25,6 +25,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -32,8 +33,11 @@ import java.util.stream.Collectors;
 @Path("/kamelet")
 public class KameletResources {
 
-    @ConfigProperty(name = "karavan.folder.kamelets")
-    String kamelets;
+    @ConfigProperty(name = "karavan.folder.kamelets-buildin")
+    String kameletsBuildin;
+
+    @ConfigProperty(name = "karavan.folder.kamelets-custom")
+    String kameletsCustom;
 
     @Inject
     Vertx vertx;
@@ -41,7 +45,16 @@ public class KameletResources {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public List<String> getList() {
-        return vertx.fileSystem().readDirBlocking(Paths.get(kamelets).toString())
+        List<String> kameletList = getList(kameletsBuildin);
+        if (Files.exists(Paths.get(kameletsCustom))) {
+            List<String> customKameletList = getList(kameletsCustom);
+            kameletList.addAll(customKameletList);
+        }
+        return kameletList;
+    }
+
+    public List<String> getList(String folder) {
+        return vertx.fileSystem().readDirBlocking(Paths.get(folder).toString())
                 .stream()
                 .filter(s -> s.endsWith(".yaml"))
                 .map(s -> {
@@ -54,6 +67,10 @@ public class KameletResources {
     @Produces(MediaType.TEXT_PLAIN)
     @Path("/{name}")
     public String getYaml(@PathParam("name") String name) {
-        return vertx.fileSystem().readFileBlocking(Paths.get(kamelets, name).toString()).toString();
+        if (Files.exists(Paths.get(kameletsBuildin, name))) {
+            return vertx.fileSystem().readFileBlocking(Paths.get(kameletsBuildin, name).toString()).toString();
+        } else {
+            return vertx.fileSystem().readFileBlocking(Paths.get(kameletsCustom, name).toString()).toString();
+        }
     }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/FileSystemService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/FileSystemService.java
index 31fcff5..320cd19 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/FileSystemService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/FileSystemService.java
@@ -51,7 +51,7 @@ public class FileSystemService {
         LOGGER.info("Creating folder " + name);
         if (!Files.exists(Paths.get(name))) {
             Path path = Files.createDirectory(Path.of(name));
-            LOGGER.info("Folder " + path + " created");
+            LOGGER.info("Folder " + path.toAbsolutePath() + " created");
         } else {
             getIntegrationList().forEach(s -> LOGGER.info("Integration found: " + s));
         }
@@ -80,6 +80,7 @@ public class FileSystemService {
     }
 
     public void saveIntegrationsFile(String name, String yaml) throws GitAPIException, IOException {
+        System.out.println(integrations);
         vertx.fileSystem().writeFileBlocking(Paths.get(integrations, name).toString(), Buffer.buffer(yaml));
     }
 
diff --git a/karavan-app/src/main/resources/application.properties b/karavan-app/src/main/resources/application.properties
index 9035ce1..d3f20b5 100644
--- a/karavan-app/src/main/resources/application.properties
+++ b/karavan-app/src/main/resources/application.properties
@@ -1,7 +1,8 @@
 karavan.version=0.0.7
 
-karavan.folder.kamelets=kamelets
 karavan.folder.components=components
+karavan.folder.kamelets-buildin=kamelets-buildin
+karavan.folder.kamelets-custom=kamelets
 
 karavan.mode=local
 karavan.folder.integrations=integrations
diff --git a/karavan-app/src/main/webapp/src/Main.tsx b/karavan-app/src/main/webapp/src/Main.tsx
index 6e7d8a6..f89d9be 100644
--- a/karavan-app/src/main/webapp/src/Main.tsx
+++ b/karavan-app/src/main/webapp/src/Main.tsx
@@ -110,7 +110,6 @@ export class Main extends React.Component<Props, State> {
             this.onGetIntegrations();
         }
         this.setState({
-            isNavOpen: result.itemId !== 'designer',
             pageId: result.itemId,
         });
     };
diff --git a/karavan-designer/src/designer/api/KameletApi.tsx b/karavan-designer/src/designer/api/KameletApi.tsx
index 24c0169..97fa38d 100644
--- a/karavan-designer/src/designer/api/KameletApi.tsx
+++ b/karavan-designer/src/designer/api/KameletApi.tsx
@@ -47,7 +47,12 @@ export const KameletApi = {
     },
 
     getKamelets: (): KameletModel[] => {
-        return Kamelets;
+        return Kamelets.sort((a, b) => {
+            if (a.title().toLowerCase() < b.title().toLowerCase()) {
+                return -1;
+            }
+            return a.title().toLowerCase() > b.title().toLowerCase() ? 1 : 0;
+        });
     },
 
     jsonToKamelet: (json: string) => {
@@ -73,10 +78,10 @@ export const KameletApi = {
     saveKamelets: (kameletYamls: string[]) => {
         const kamelets:KameletModel[] = kameletYamls.map(text => KameletApi.yamlToKamelet(text));
         Kamelets.push(...kamelets.sort((a, b) => {
-                if (a.spec.definition.title < b.spec.definition.title) {
+                if (a.spec.definition.title.toLowerCase() < b.spec.definition.title.toLowerCase()) {
                     return -1;
                 }
-                return a.spec.definition.title > b.spec.definition.title ? 1 : 0;
+                return a.spec.definition.title.toLowerCase() > b.spec.definition.title.toLowerCase() ? 1 : 0;
             })
         );
     },
diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json
index 24e9b38..8dd259d 100644
--- a/karavan-vscode/package.json
+++ b/karavan-vscode/package.json
@@ -71,6 +71,11 @@
           "type": "boolean",
           "default": "true",
           "description": "Reload routes on change"
+        },
+        "Karavan.kameletsPath": {
+          "type": "string",
+          "default": "",
+          "description": "Custom Kamelets Path"
         }
       }
     },
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index 38c00dd..139e62a 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -21,6 +21,7 @@ import { CamelYaml } from "../designer/api/CamelYaml";
 import { CamelUi } from "../designer/api/CamelUi";
 import * as jsyaml from 'js-yaml';
 import { Integration } from "../designer/model/CamelModel";
+import { homedir } from "os";
 
 const KARAVAN_LOADED = "karavan:loaded";
 const KARAVAN_PANELS: Map<any, string> = new Map<string, string>();
@@ -131,7 +132,6 @@ function openKaravanWebView(context: vscode.ExtensionContext, webviewContent: st
     // Handle messages from the webview
     panel.webview.onDidReceiveMessage(
         message => {
-            console.log(message);
             switch (message.command) {
                 case 'save':
                     if (vscode.workspace.workspaceFolders) {
@@ -179,6 +179,14 @@ function createIntegration(context: vscode.ExtensionContext, webviewContent: str
 function readKamelets(context: vscode.ExtensionContext): string[] {
     const dir = path.join(context.extensionPath, 'kamelets');
     const yamls: string[] = fs.readdirSync(dir).filter(file => file.endsWith("yaml")).map(file => fs.readFileSync(dir + "/" + file, 'utf-8'));
+    try {
+        const kameletsPath:string = vscode.workspace.getConfiguration().get("Karavan.kameletsPath") || '';
+        const kameletsDir = path.isAbsolute(kameletsPath) ? kameletsPath : path.resolve(kameletsPath);
+        const customKamelets: string[] = fs.readdirSync(kameletsDir).filter(file => file.endsWith("yaml")).map(file => fs.readFileSync(kameletsDir + "/" + file, 'utf-8'));
+        if (customKamelets && customKamelets.length > 0) yamls.push(...customKamelets);
+    } catch(e) {
+
+    }
     return yamls;
 }