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;
}