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/10/20 01:41:23 UTC

[camel-karavan] 02/02: Deploy project

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

commit c70c1bd1c68ed17f3c50c37e83e2740f9374743e
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Wed Oct 19 21:41:10 2022 -0400

    Deploy project
---
 karavan-vscode/package.json     | 58 +++++++++++++++++++++++++++++------------
 karavan-vscode/src/extension.ts |  8 +++++-
 karavan-vscode/src/jbang.ts     | 54 ++++++++++++++++++++++++++++++++------
 karavan-vscode/src/utils.ts     |  2 +-
 4 files changed, 95 insertions(+), 27 deletions(-)

diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json
index 85e9a13..6db1b1e 100644
--- a/karavan-vscode/package.json
+++ b/karavan-vscode/package.json
@@ -42,6 +42,7 @@
     "onCommand:karavan.create-crd",
     "onCommand:karavan.create-yaml",
     "onCommand:karavan.create-application",
+    "onCommand:karavan.deploy",
     "onCommand:karavan.open",
     "onCommand:karavan.open-file",
     "onCommand:karavan.jbang-run-file",
@@ -186,7 +187,7 @@
             "type": "string"
           },
           "default": [
-            "quarkus.container-image.group=${KUBERNETES_NAMESPACE}",
+            "quarkus.container-image.group=${NAMESPACE}",
             "quarkus.container-image.name=$NAME",
             "quarkus.container-image.builder=jib",
             "quarkus.container-image.build=true",
@@ -212,7 +213,7 @@
             "quarkus.kubernetes.labels.\"app.openshift.io/runtime\"=camel",
             "quarkus.kubernetes-client.trust-certs=true",
             "quarkus.kubernetes-client.master-url=kubernetes.default.svc",
-            "quarkus.kubernetes-client.namespace=${KUBERNETES_NAMESPACE}",
+            "quarkus.kubernetes-client.namespace=${NAMESPACE}",
             "quarkus.kubernetes-client.token=${TOKEN}",
             "quarkus.openshift.deployment-kind=Deployment",
             "quarkus.openshift.add-version-to-label-selectors=false",
@@ -268,6 +269,11 @@
         "title": "Karavan: Export",
         "icon": "$(export)"
       },
+      {
+        "command": "karavan.deploy",
+        "title": "Karavan: Deploy",
+        "icon": "$(layers)"
+      },
       {
         "command": "karavan.generate-rest",
         "title": "Karavan: Generate REST API"
@@ -303,35 +309,48 @@
       "explorer/context": [
         {
           "command": "karavan.create-crd",
-          "when": "explorerResourceIsFolder || explorerResourceIsRoot"
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@1"
         },
         {
           "command": "karavan.create-yaml",
-          "when": "explorerResourceIsFolder || explorerResourceIsRoot"
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@2"
         },
         {
           "command": "karavan.create-application",
-          "when": "explorerResourceIsFolder || explorerResourceIsRoot"
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@3"
         },
         {
           "command": "karavan.open",
-          "when": "resourceExtname == .yaml"
+          "when": "resourceExtname == .yaml",
+          "group": "karavan@4"
         },
         {
           "command": "karavan.jbang-run-file",
-          "when": "resourceExtname == .yaml"
+          "when": "resourceExtname == .yaml",
+          "group": "karavan@5"
         },
         {
           "command": "karavan.jbang-run-project",
-          "when": "explorerResourceIsFolder || explorerResourceIsRoot"
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@6"
         },
         {
           "command": "karavan.jbang-export",
-          "when": "explorerResourceIsFolder || explorerResourceIsRoot"
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@7"
+        },
+        {
+          "command": "karavan.deploy",
+          "when": "explorerResourceIsFolder || explorerResourceIsRoot",
+          "group": "karavan@8"
         },
         {
           "command": "karavan.generate-rest",
-          "when": "resourceExtname == .json"
+          "when": "resourceExtname == .json",
+          "group": "karavan@9"
         }
       ],
       "editor/title": [
@@ -348,24 +367,29 @@
       ],
       "view/title": [
         {
-          "command": "integrations.refresh",
+          "command": "karavan.jbang-run-project",
           "when": "view == integrations",
-          "group": "navigation@4"
+          "group": "navigation@1"
         },
         {
-          "command": "karavan.jbang-run-project",
+          "command": "karavan.deploy",
           "when": "view == integrations",
-          "group": "navigation@1"
+          "group": "navigation@2"
         },
         {
-          "command": "karavan.create-crd",
+          "command": "karavan.jbang-export",
           "when": "view == integrations",
           "group": "navigation@3"
         },
         {
-          "command": "karavan.jbang-export",
+          "command": "karavan.create-crd",
           "when": "view == integrations",
-          "group": "navigation@2"
+          "group": "navigation@4"
+        },
+        {
+          "command": "integrations.refresh",
+          "when": "view == integrations",
+          "group": "navigation@5"
         },
         {
           "command": "openapi.refresh",
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index bef26f8..8b54520 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -145,6 +145,12 @@ export function activate(context: ExtensionContext) {
     });
     context.subscriptions.push(exportCommand);
 
+    // Deploy project
+    const deployCommand = commands.registerCommand("karavan.deploy", (...args: any[]) => {
+        jbang.camelDeploy(rootPath + path.sep + ".export");
+    });
+    context.subscriptions.push(deployCommand);
+
     // Run Integration in designer command
     const run = commands.registerCommand("karavan.jbang-run-file", (...args: any[]) => designer.jbangRun(args[0].fsPath));
     context.subscriptions.push(run);
@@ -155,7 +161,7 @@ export function activate(context: ExtensionContext) {
     });
     context.subscriptions.push(runProjectCommand);
 
-    // Generate RST API from OpenAPI specification command
+    // Generate REST API from OpenAPI specification command
     const generateOptions = ["Create new CRD", "Create new YAML", "Add to existing file"];
     const generateRest = commands.registerCommand('karavan.generate-rest', async (...args: any[]) => {
         const openApi: OpenApiItem = args[0];
diff --git a/karavan-vscode/src/jbang.ts b/karavan-vscode/src/jbang.ts
index 612e583..c9e3c02 100644
--- a/karavan-vscode/src/jbang.ts
+++ b/karavan-vscode/src/jbang.ts
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { workspace, window, Terminal } from "vscode";
+import { workspace, window, Terminal, ThemeIcon } from "vscode";
 import * as path from "path";
 import * as shell from 'shelljs';
 import { CamelDefinitionYaml } from "core/api/CamelDefinitionYaml";
@@ -23,7 +23,7 @@ import * as utils from "./utils";
 const TERMINALS: Map<string, Terminal> = new Map<string, Terminal>();
 
 export async function camelJbangGenerate(rootPath: string, openApiFullPath: string, fullPath: string, add: boolean, crd?: boolean, generateRoutes?: boolean) {
-    let command = prepareCommand("generate rest -i " + openApiFullPath); 
+    let command = prepareCommand("generate rest -i " + openApiFullPath);
     if (generateRoutes === true) command = command + " --routes";
     executeJbangCommand(rootPath, command, (code, stdout, stderr) => {
         console.log('Exit code:', code);
@@ -80,7 +80,7 @@ export function camelJbangRun(filename?: string) {
     const maxMessages: number = workspace.getConfiguration().get("camel.maxMessages") || -1;
     const kameletsPath: string | undefined = workspace.getConfiguration().get("Karavan.kameletsPath");
     const dev: boolean = workspace.getConfiguration().get("camel.dev") || false;
-    const cmd = (filename ? "run " + filename : "run * ") 
+    const cmd = (filename ? "run " + filename : "run * ")
         + (maxMessages > -1 ? " --max-messages=" + maxMessages : "")
         + (kameletsPath && kameletsPath.trim().length > 0 ? " --local-kamelet-dir=" + kameletsPath : "");
     const command = prepareCommand(cmd) + (dev === true ? " --dev" : "");
@@ -94,19 +94,57 @@ export function camelJbangRun(filename?: string) {
 }
 
 export function camelJbangExport(directory: string) {
-    const kameletsPath: string | undefined = workspace.getConfiguration().get("Karavan.kameletsPath");
-    const cmd = "export  --directory=" + directory
-        + (kameletsPath && kameletsPath.trim().length >0 ? " --local-kamelet-dir=" + kameletsPath : "");
-    const command = prepareCommand(cmd);
+    const command = createExportCommand(directory);
     const terminalId = "export";
     const existTerminal = TERMINALS.get(terminalId);
     if (existTerminal) existTerminal.dispose();
-    const terminal = window.createTerminal('Camel export');
+    const terminal = window.createTerminal('export');
     TERMINALS.set(terminalId, terminal);
     terminal.show();
     terminal.sendText(command);
 }
 
+export function createExportCommand(directory: string) {
+    const kameletsPath: string | undefined = workspace.getConfiguration().get("Karavan.kameletsPath");
+    const cmd = "export --directory=" + directory
+        + (kameletsPath && kameletsPath.trim().length > 0 ? " --local-kamelet-dir=" + kameletsPath : "");
+    return prepareCommand(cmd);
+}
+
+export function camelDeploy(directory: string) {
+    const command = createExportCommand(directory).concat(" && ").concat(createPackageCommand(directory));
+
+    utils.readFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
+        .then((readData: Uint8Array) => {
+            const namespace = Buffer.from(readData).toString('utf8');
+            utils.readFile("/var/run/secrets/kubernetes.io/serviceaccount/token")
+                .then((readData: Uint8Array) => {
+                    const token = Buffer.from(readData).toString('utf8');
+                    const env = { "TOKEN":token, "NAMESPACE": namespace, "DATE":  Date.now().toString() };
+                    camelRunDeploy(command, env);
+                    
+                }).catch((reason: any) => {
+                    window.showErrorMessage("Token file not found. Set TOKEN environment variable!\n" + reason.message);
+                });
+        }).catch((reason: any) => {
+            window.showErrorMessage("Namespace file not found. Set NAMESPACE environment variable!\n" + reason.message);
+        });
+}
+
+export function camelRunDeploy(command: string, env?: { [key: string]: string | null | undefined }) {
+    const terminalId = "deploy";
+    const existTerminal = TERMINALS.get(terminalId);
+    if (existTerminal) existTerminal.dispose();
+    const terminal = window.createTerminal({ name: terminalId, env: env, iconPath: new ThemeIcon("layers") });
+    TERMINALS.set(terminalId, terminal);
+    terminal.show();
+    terminal.sendText(command);
+}
+
+export function createPackageCommand(directory: string) {
+    return "mvn clean package -f " + directory;
+}
+
 function executeJbangCommand(rootPath: string, command: string, callback: (code: number, stdout: any, stderr: any) => any) {
     console.log("excute command", command)
     const jbang = shell.which('jbang');
diff --git a/karavan-vscode/src/utils.ts b/karavan-vscode/src/utils.ts
index 7949a46..e498e63 100644
--- a/karavan-vscode/src/utils.ts
+++ b/karavan-vscode/src/utils.ts
@@ -221,7 +221,7 @@ export async function createApplicationproperties(runtime: string, gav: string,
         const runtimeDefaults: [] = (runtime === 'quarkus') 
             ? workspace.getConfiguration().get("Karavan.quarkusApplicationProperties") || []
             : [];
-        const text = props.concat(runtimeDefaults).concat(imageBuildProps).concat(targetProps).map(v => {
+        const text = props.concat(runtimeDefaults).concat("\n").concat(imageBuildProps).concat("\n").concat(targetProps).map(v => {
             if (v.includes('$NAME')) return v.replace('$NAME', name)
             else if (v.includes('$GAV')) return v.replace('$GAV', gav)
             else if (v.includes('$RUNTIME_VERSION')) return v.replace('$RUNTIME_VERSION', runtimeVersion) // $RUNTIME_VERSION should be before $RUNTIME