@catladder/cli 1.80.4 → 1.81.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/apps/cli/cli.js +2 -2
  2. package/dist/apps/cli/cli.js.map +1 -1
  3. package/dist/apps/cli/commands/general/index.js +11 -11
  4. package/dist/apps/cli/commands/general/index.js.map +1 -1
  5. package/dist/apps/cli/commands/general/portForward.js +3 -3
  6. package/dist/apps/cli/commands/general/portForward.js.map +1 -1
  7. package/dist/apps/cli/commands/mongodb/projectMongoPortForward.js +2 -2
  8. package/dist/apps/cli/commands/mongodb/projectMongoPortForward.js.map +1 -1
  9. package/dist/apps/cli/commands/project/commandOpenCostDashboard.js +2 -2
  10. package/dist/apps/cli/commands/project/commandOpenCostDashboard.js.map +1 -1
  11. package/dist/apps/cli/commands/project/commandOpenGrafana.js +2 -2
  12. package/dist/apps/cli/commands/project/commandOpenGrafana.js.map +1 -1
  13. package/dist/apps/cli/commands/project/commandOpenGrafanaPod.js +2 -2
  14. package/dist/apps/cli/commands/project/commandOpenGrafanaPod.js.map +1 -1
  15. package/dist/apps/cli/commands/project/commandPortForward.js +97 -36
  16. package/dist/apps/cli/commands/project/commandPortForward.js.map +1 -1
  17. package/dist/bundles/catenv/index.js +1 -1
  18. package/dist/bundles/cli/index.js +2 -2
  19. package/dist/kubernetes/portForward.d.ts +1 -0
  20. package/dist/kubernetes/portForward.js +55 -0
  21. package/dist/kubernetes/portForward.js.map +1 -0
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/dist/utils/portForwards.d.ts +12 -0
  24. package/dist/utils/{portForward.js → portForwards.js} +20 -16
  25. package/dist/utils/portForwards.js.map +1 -0
  26. package/package.json +2 -2
  27. package/src/apps/cli/cli.ts +1 -1
  28. package/src/apps/cli/commands/general/index.ts +10 -7
  29. package/src/apps/cli/commands/general/portForward.ts +3 -3
  30. package/src/apps/cli/commands/mongodb/projectMongoPortForward.ts +2 -2
  31. package/src/apps/cli/commands/project/commandOpenCostDashboard.ts +2 -2
  32. package/src/apps/cli/commands/project/commandOpenGrafana.ts +2 -2
  33. package/src/apps/cli/commands/project/commandOpenGrafanaPod.ts +2 -2
  34. package/src/apps/cli/commands/project/commandPortForward.ts +72 -29
  35. package/src/kubernetes/portForward.ts +15 -0
  36. package/src/utils/{portForward.ts → portForwards.ts} +27 -22
  37. package/dist/utils/portForward.d.ts +0 -4
  38. package/dist/utils/portForward.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import type { ReadStream } from "fs-extra";
3
+ export declare type PortForward = Promise<unknown> & {
4
+ childProcess: {
5
+ stdout: ReadStream;
6
+ kill: () => any;
7
+ };
8
+ };
9
+ export declare const stopPortForward: (name: string) => Promise<void>;
10
+ export declare const getAllRunningPortForwards: () => string[];
11
+ export declare const startPortForwardCommand: (name: string, command: string) => Promise<void>;
12
+ export declare const stopAllPortForwards: () => Promise<void>;
@@ -47,7 +47,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
47
47
  }
48
48
  };
49
49
  exports.__esModule = true;
50
- exports.stopAllPortForwards = exports.startPortForward = exports.getAllRunningPortForwards = exports.stopPortForward = void 0;
50
+ exports.stopAllPortForwards = exports.startPortForwardCommand = exports.getAllRunningPortForwards = exports.stopPortForward = void 0;
51
51
  var child_process_promise_1 = require("child-process-promise");
52
52
  var portForwards = new Map();
53
53
  var stopPortForward = function (name) { return __awaiter(void 0, void 0, void 0, function () {
@@ -80,30 +80,34 @@ var getAllRunningPortForwards = function () {
80
80
  return Array.from(portForwards.keys());
81
81
  };
82
82
  exports.getAllRunningPortForwards = getAllRunningPortForwards;
83
- var startPortForward = function (podname, localPort, remotePort, namespace) { return __awaiter(void 0, void 0, void 0, function () {
84
- var name, promise;
85
- return __generator(this, function (_a) {
86
- switch (_a.label) {
87
- case 0:
88
- name = "".concat(namespace, "/").concat(podname, "/").concat(localPort, ":").concat(remotePort);
83
+ var addPortForward = function (name, portForward) {
84
+ portForwards.set(name, portForward);
85
+ };
86
+ var startPortForwardCommand = function (name, command) { return __awaiter(void 0, void 0, void 0, function () {
87
+ var _a, cmd, args, promise;
88
+ return __generator(this, function (_b) {
89
+ switch (_b.label) {
90
+ case 0:
91
+ // stop if already there
92
+ return [4 /*yield*/, (0, exports.stopPortForward)(name)];
93
+ case 1:
89
94
  // stop if already there
90
- if (portForwards.has(name)) {
91
- (0, exports.stopPortForward)(name);
92
- }
93
- promise = (0, child_process_promise_1.spawn)("kubectl", ["port-forward", podname, "".concat(localPort, ":").concat(remotePort), "-n", namespace], {
95
+ _b.sent();
96
+ _a = command.split(" "), cmd = _a[0], args = _a.slice(1);
97
+ promise = (0, child_process_promise_1.spawn)(cmd, args, {
94
98
  env: __assign(__assign({}, process.env), { DEBUG: "" })
95
99
  });
96
- portForwards.set(name, promise);
100
+ addPortForward(name, promise);
97
101
  // wait a moment so that is surley started, unfortunatly we don't know that
98
102
  return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 1000); })];
99
- case 1:
103
+ case 2:
100
104
  // wait a moment so that is surley started, unfortunatly we don't know that
101
- _a.sent();
105
+ _b.sent();
102
106
  return [2 /*return*/];
103
107
  }
104
108
  });
105
109
  }); };
106
- exports.startPortForward = startPortForward;
110
+ exports.startPortForwardCommand = startPortForwardCommand;
107
111
  var stopAllPortForwards = function () { return __awaiter(void 0, void 0, void 0, function () {
108
112
  return __generator(this, function (_a) {
109
113
  (0, exports.getAllRunningPortForwards)().forEach(function (name) {
@@ -113,4 +117,4 @@ var stopAllPortForwards = function () { return __awaiter(void 0, void 0, void 0,
113
117
  });
114
118
  }); };
115
119
  exports.stopAllPortForwards = stopAllPortForwards;
116
- //# sourceMappingURL=portForward.js.map
120
+ //# sourceMappingURL=portForwards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portForwards.js","sourceRoot":"","sources":["../../src/utils/portForwards.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA8C;AAU9C,IAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;AAE7C,IAAM,eAAe,GAAG,UAAO,IAAY;;;;;gBAC1C,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBAE/B,GAAG,EAAH,wBAAG;;;;gBAEH,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACxB,qBAAM,GAAG,EAAA;;gBAAT,SAAS,CAAC;;;;;;gBAIZ,YAAY,CAAC,QAAM,CAAA,CAAC,IAAI,CAAC,CAAC;;;;;KAE7B,CAAC;AAZW,QAAA,eAAe,mBAY1B;AAEK,IAAM,yBAAyB,GAAG;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC;AAFW,QAAA,yBAAyB,6BAEpC;AAEF,IAAM,cAAc,GAAG,UAAC,IAAY,EAAE,WAAwB;IAC5D,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC,CAAC;AAEK,IAAM,uBAAuB,GAAG,UACrC,IAAY,EACZ,OAAe;;;;;YAEf,wBAAwB;YACxB,qBAAM,IAAA,uBAAe,EAAC,IAAI,CAAC,EAAA;;gBAD3B,wBAAwB;gBACxB,SAA2B,CAAC;gBACtB,KAAiB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAlC,GAAG,QAAA,EAAK,IAAI,cAAA,CAAuB;gBAEpC,OAAO,GAAG,IAAA,6BAAK,EAAC,GAAG,EAAE,IAAI,EAAE;oBAC/B,GAAG,wBACE,OAAO,CAAC,GAAG,KACd,KAAK,EAAE,EAAE,GACV;iBACF,CAAgB,CAAC;gBAClB,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9B,2EAA2E;gBAC3E,qBAAM,IAAI,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAnB,CAAmB,CAAC,EAAA;;gBAD7C,2EAA2E;gBAC3E,SAA6C,CAAC;;;;KAC/C,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC;AACK,IAAM,mBAAmB,GAAG;;QACjC,IAAA,iCAAyB,GAAE,CAAC,OAAO,CAAC,UAAC,IAAI;YACvC,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;;;KACJ,CAAC;AAJW,QAAA,mBAAmB,uBAI9B"}
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "node": ">=12.0.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@catladder/pipeline": "1.80.4",
27
+ "@catladder/pipeline": "1.81.1",
28
28
  "@kubernetes/client-node": "^0.16.2",
29
29
  "@tsconfig/node14": "^1.0.1",
30
30
  "@types/common-tags": "^1.8.0",
@@ -57,5 +57,5 @@
57
57
  "typescript": "^4.5.4",
58
58
  "vorpal": "^1.12.0"
59
59
  },
60
- "version": "1.80.4"
60
+ "version": "1.81.1"
61
61
  }
@@ -1,7 +1,7 @@
1
1
  import Vorpal from "vorpal";
2
2
  // tslint:disable-next-line:no-var-requires
3
3
  import packageInfos from "../../packageInfos";
4
- import { stopAllPortForwards } from "../../utils/portForward";
4
+ import { stopAllPortForwards } from "../../utils/portForwards";
5
5
  import general from "./commands/general";
6
6
  import mongodb from "./commands/mongodb";
7
7
  import cloudSQL from "./commands/cloudSQL";
@@ -7,7 +7,7 @@ import { syncBitwarden } from "../../../../utils/passwordstore";
7
7
  import {
8
8
  getAllRunningPortForwards,
9
9
  stopPortForward,
10
- } from "../../../../utils/portForward";
10
+ } from "../../../../utils/portForwards";
11
11
  import { getShell } from "../../../../utils/shell";
12
12
  import { namespaceAutoCompletion } from "./namespaceAutoCompletion";
13
13
  import portForward from "./portForward";
@@ -26,19 +26,19 @@ export const getAllNamespacesNames = async () => {
26
26
  return namespaces.map((n) => n.metadata.name);
27
27
  };
28
28
  export default async (vorpal: Vorpal) => {
29
- vorpal.command("current-context").action(async function () {
29
+ vorpal.command("kube-current-context").action(async function () {
30
30
  this.log(await getCurrentContext());
31
31
  });
32
32
 
33
33
  vorpal
34
- .command("list-namespaces", "list all namespaces")
34
+ .command("kube-list-namespaces", "list all namespaces")
35
35
  .action(async function () {
36
36
  const namespaces = await getAllNamespacesNames();
37
37
  this.log(namespaces.join("\n"));
38
38
  });
39
39
 
40
40
  vorpal
41
- .command("list-secrets <namespace>", "show secrets")
41
+ .command("kube-list-secrets <namespace>", "show secrets")
42
42
  .autocomplete(namespaceAutoCompletion)
43
43
  .action(async function ({ namespace }) {
44
44
  const k8sApi = getk8sApi();
@@ -53,7 +53,7 @@ export default async (vorpal: Vorpal) => {
53
53
  });
54
54
 
55
55
  vorpal
56
- .command("list-pods <namespace>", "list all pods of namespace")
56
+ .command("kube-list-pods <namespace>", "list all pods of namespace")
57
57
  .autocomplete(namespaceAutoCompletion)
58
58
  .action(async function ({ namespace }) {
59
59
  const k8sApi = getk8sApi();
@@ -62,14 +62,17 @@ export default async (vorpal: Vorpal) => {
62
62
  });
63
63
 
64
64
  vorpal
65
- .command("stop-portforward <name>", "stop a running port forward")
65
+ .command("kube-stop-portforward <name>", "stop a running port forward")
66
66
  .autocomplete({ data: async () => getAllRunningPortForwards() })
67
67
  .action(async function ({ name }) {
68
68
  stopPortForward(name.trim());
69
69
  });
70
70
 
71
71
  vorpal
72
- .command("get-shell <namespace>", "get a shell to a pod in the environment")
72
+ .command(
73
+ "kube-get-shell <namespace>",
74
+ "get a shell to a pod in the environment"
75
+ )
73
76
  .autocomplete(namespaceAutoCompletion)
74
77
  .action(async function ({ namespace }) {
75
78
  const k8sApi = getk8sApi();
@@ -1,14 +1,14 @@
1
1
  import type Vorpal from "vorpal";
2
2
  import { logError } from "../../../../utils/log";
3
3
 
4
- import { startPortForward } from "../../../../utils/portForward";
4
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
5
5
 
6
6
  import { getk8sApi } from "../../../../k8sApi";
7
7
  import { namespaceAutoCompletion } from "./namespaceAutoCompletion";
8
8
 
9
9
  export default async (vorpal: Vorpal) =>
10
10
  vorpal
11
- .command("port-forward <namespace>", "start port-forwarding")
11
+ .command("kube-port-forward <namespace>", "start port-forwarding")
12
12
  .autocomplete(namespaceAutoCompletion)
13
13
  .action(async function ({ namespace }) {
14
14
  const k8sApi = getk8sApi();
@@ -44,5 +44,5 @@ export default async (vorpal: Vorpal) =>
44
44
  message: "Remote port: ",
45
45
  });
46
46
 
47
- return startPortForward(podName, localPort, remotePort, namespace);
47
+ return startKubePortForward(podName, localPort, remotePort, namespace);
48
48
  });
@@ -1,7 +1,7 @@
1
1
  import type Vorpal from "vorpal";
2
2
  import { getEnvVars, parseChoice } from "../../../../config/getProjectConfig";
3
3
  import { logError } from "../../../../utils/log";
4
- import { startPortForward } from "../../../../utils/portForward";
4
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
5
5
  import { getProjectNamespace } from "../../../../utils/projects";
6
6
  import { envAndComponents } from "../project/utils/autocompletions";
7
7
  import ensureCluster from "../project/utils/ensureCluster";
@@ -58,5 +58,5 @@ export default async (vorpal: Vorpal) =>
58
58
  this.log("👆 connection string has been copied to your clipboard!");
59
59
  this.log("");
60
60
 
61
- return startPortForward(podName, localPort, 27017, namespace);
61
+ return startKubePortForward(podName, localPort, 27017, namespace);
62
62
  });
@@ -5,7 +5,7 @@ import {
5
5
  GRAFANA_PROXY_TARGET_PORT,
6
6
  } from "../../../../config/constants";
7
7
 
8
- import { startPortForward } from "../../../../utils/portForward";
8
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
9
9
 
10
10
  import { getProjectNamespace } from "../../../../utils/projects";
11
11
 
@@ -22,7 +22,7 @@ export default async (vorpal: Vorpal) =>
22
22
  await ensureCluster.call(this, envComponent);
23
23
  const namespace = await getProjectNamespace(envComponent);
24
24
  const url = `http://localhost:${GRAFANA_PROXY_LOCAL_PORT}/namespace.html?name=${namespace}`;
25
- await startPortForward(
25
+ await startKubePortForward(
26
26
  "deployment/kubecost-cost-analyzer",
27
27
  GRAFANA_PROXY_LOCAL_PORT,
28
28
  GRAFANA_PROXY_TARGET_PORT,
@@ -1,5 +1,5 @@
1
1
  import open from "open";
2
- import { startPortForward } from "../../../../utils/portForward";
2
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
3
3
  import type Vorpal from "vorpal";
4
4
  import {
5
5
  GRAFANA_PROXY_LOCAL_PORT,
@@ -21,7 +21,7 @@ export default async (vorpal: Vorpal) =>
21
21
  await ensureCluster.call(this, envComponent);
22
22
  const namespace = await getProjectNamespace(envComponent);
23
23
  const url = `http://localhost:${GRAFANA_PROXY_LOCAL_PORT}/grafana/d/at-cost-analysis-namespace2/namespace-utilization-metrics?var-namespace=${namespace}`;
24
- await startPortForward(
24
+ await startKubePortForward(
25
25
  "deployment/kubecost-cost-analyzer",
26
26
  GRAFANA_PROXY_LOCAL_PORT,
27
27
  GRAFANA_PROXY_TARGET_PORT,
@@ -6,7 +6,7 @@ import {
6
6
  } from "../../../../config/constants";
7
7
  import { getProjectPodNames } from "../../../../kubernetes";
8
8
  import { logError } from "../../../../utils/log";
9
- import { startPortForward } from "../../../../utils/portForward";
9
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
10
10
  import { getProjectNamespace } from "../../../../utils/projects";
11
11
  import { envAndComponents } from "./utils/autocompletions";
12
12
  import ensureCluster from "./utils/ensureCluster";
@@ -33,7 +33,7 @@ export default async (vorpal: Vorpal) =>
33
33
  });
34
34
  const namespace = await getProjectNamespace(envComponent);
35
35
  const url = `http://localhost:${GRAFANA_PROXY_LOCAL_PORT}/grafana/d/at-cost-analysis-pod/pod-cost-and-utilization-metrics?var-namespace=${namespace}&var-pod=${podName}`;
36
- await startPortForward(
36
+ await startKubePortForward(
37
37
  "deployment/kubecost-cost-analyzer",
38
38
  GRAFANA_PROXY_LOCAL_PORT,
39
39
  GRAFANA_PROXY_TARGET_PORT,
@@ -1,43 +1,86 @@
1
1
  import type Vorpal from "vorpal";
2
2
  import { getProjectPodNames } from "../../../../kubernetes";
3
3
  import { logError } from "../../../../utils/log";
4
- import { startPortForward } from "../../../../utils/portForward";
4
+ import { startKubePortForward } from "../../../../kubernetes/portForward";
5
5
  import { getProjectNamespace } from "../../../../utils/projects";
6
6
  import { envAndComponents } from "./utils/autocompletions";
7
7
  import ensureCluster from "./utils/ensureCluster";
8
+ import type { CommandInstance } from "vorpal";
9
+ import { parseChoice } from "../../../../config/parseChoice";
10
+ import { getPipelineContextByChoice } from "../../../../config/getProjectConfig";
11
+ import type { Context } from "@catladder/pipeline";
12
+ import { isOfDeployType } from "@catladder/pipeline";
13
+ import { startPortForwardCommand } from "../../../../utils/portForwards";
14
+ import open from "open";
15
+ const kubePortForward = async (cmd: CommandInstance, envComponent: string) => {
16
+ await ensureCluster.call(cmd, envComponent);
17
+ const namespace = await getProjectNamespace(envComponent);
18
+ const podNames = await getProjectPodNames(envComponent);
19
+ if (podNames.length === 0) {
20
+ logError(cmd, "sorry, no pods found");
21
+ return;
22
+ }
23
+ const { podName } = await cmd.prompt({
24
+ type: "list",
25
+ name: "podName",
26
+ choices: podNames,
27
+ message: "Which pod? 🤔",
28
+ });
8
29
 
30
+ const { localPort } = await cmd.prompt({
31
+ type: "number",
32
+ name: "localPort",
33
+
34
+ message: "Local port: ",
35
+ });
36
+
37
+ const { remotePort } = await cmd.prompt({
38
+ type: "number",
39
+ name: "remotePort",
40
+
41
+ message: "Remote port: ",
42
+ });
43
+
44
+ return startKubePortForward(podName, localPort, remotePort, namespace);
45
+ };
46
+
47
+ const cloudRunPortForward = async (cmd: CommandInstance, context: Context) => {
48
+ if (!isOfDeployType(context.componentConfig.deploy, "google-cloudrun")) {
49
+ throw new Error("not cloud run");
50
+ }
51
+
52
+ const { fullName } = context.environment;
53
+ let serviceName = fullName;
54
+ if (context.environment.envType === "review") {
55
+ const { mr } = await cmd.prompt({
56
+ type: "number",
57
+ name: "mr",
58
+
59
+ message: "Which mr 🤔 ",
60
+ });
61
+ // poor mans solution
62
+ serviceName = serviceName.replace("-review-", "-review-mr" + mr + "-");
63
+ }
64
+
65
+ const { projectId, region } = context.componentConfig.deploy;
66
+
67
+ const command = `gcloud beta run services proxy ${serviceName} --project ${projectId} --region ${region}`;
68
+
69
+ await startPortForwardCommand(`cloudRun/${serviceName}`, command);
70
+ open("http://localhost:8080");
71
+ };
9
72
  export default async (vorpal: Vorpal) =>
10
73
  vorpal
11
74
  .command("project-port-forward <envComponent>", "start port-forwarding")
12
75
  .autocomplete(await envAndComponents())
13
76
  .action(async function ({ envComponent }) {
14
- await ensureCluster.call(this, envComponent);
15
- const namespace = await getProjectNamespace(envComponent);
16
- const podNames = await getProjectPodNames(envComponent);
17
- if (podNames.length === 0) {
18
- logError(this, "sorry, no pods found");
19
- return;
20
- }
21
- const { podName } = await this.prompt({
22
- type: "list",
23
- name: "podName",
24
- choices: podNames,
25
- message: "Which pod? 🤔",
26
- });
27
-
28
- const { localPort } = await this.prompt({
29
- type: "number",
30
- name: "localPort",
31
-
32
- message: "Local port: ",
33
- });
77
+ const { env, componentName } = parseChoice(envComponent);
78
+ const context = await getPipelineContextByChoice(env, componentName);
34
79
 
35
- const { remotePort } = await this.prompt({
36
- type: "number",
37
- name: "remotePort",
38
-
39
- message: "Remote port: ",
40
- });
41
-
42
- return startPortForward(podName, localPort, remotePort, namespace);
80
+ if (isOfDeployType(context.componentConfig.deploy, "kubernetes")) {
81
+ await kubePortForward(this, envComponent);
82
+ }
83
+ if (isOfDeployType(context.componentConfig.deploy, "google-cloudrun")) {
84
+ await cloudRunPortForward(this, context);
85
+ }
43
86
  });
@@ -0,0 +1,15 @@
1
+ import { startPortForwardCommand } from "../utils/portForwards";
2
+
3
+ export const startKubePortForward = async (
4
+ podname: string,
5
+ localPort: number,
6
+ remotePort: number,
7
+ namespace: string
8
+ ) => {
9
+ const name = `kube/${namespace}/${podname}/${localPort}:${remotePort}`;
10
+
11
+ await startPortForwardCommand(
12
+ name,
13
+ `kubectl port-forward ${podname} ${localPort}:${remotePort} -n ${namespace}`
14
+ );
15
+ };
@@ -1,6 +1,14 @@
1
1
  import { spawn } from "child-process-promise";
2
+ import type { ReadStream } from "fs-extra";
3
+ import open from "open";
2
4
 
3
- const portForwards = new Map();
5
+ export type PortForward = Promise<unknown> & {
6
+ childProcess: {
7
+ stdout: ReadStream;
8
+ kill: () => any;
9
+ };
10
+ };
11
+ const portForwards = new Map<string, PortForward>();
4
12
 
5
13
  export const stopPortForward = async (name: string) => {
6
14
  const old = portForwards.get(name);
@@ -19,32 +27,29 @@ export const stopPortForward = async (name: string) => {
19
27
  export const getAllRunningPortForwards = () => {
20
28
  return Array.from(portForwards.keys());
21
29
  };
22
- export const startPortForward = async (
23
- podname: string,
24
- localPort: number,
25
- remotePort: number,
26
- namespace: string
30
+
31
+ const addPortForward = (name: string, portForward: PortForward) => {
32
+ portForwards.set(name, portForward);
33
+ };
34
+
35
+ export const startPortForwardCommand = async (
36
+ name: string,
37
+ command: string
27
38
  ) => {
28
- const name = `${namespace}/${podname}/${localPort}:${remotePort}`;
29
39
  // stop if already there
30
- if (portForwards.has(name)) {
31
- stopPortForward(name);
32
- }
33
- const promise = spawn(
34
- "kubectl",
35
- ["port-forward", podname, `${localPort}:${remotePort}`, "-n", namespace],
36
- {
37
- env: {
38
- ...process.env,
39
- DEBUG: "",
40
- },
41
- }
42
- );
43
- portForwards.set(name, promise);
40
+ await stopPortForward(name);
41
+ const [cmd, ...args] = command.split(" ");
42
+
43
+ const promise = spawn(cmd, args, {
44
+ env: {
45
+ ...process.env,
46
+ DEBUG: "",
47
+ },
48
+ }) as PortForward;
49
+ addPortForward(name, promise);
44
50
  // wait a moment so that is surley started, unfortunatly we don't know that
45
51
  await new Promise((r) => setTimeout(r, 1000));
46
52
  };
47
-
48
53
  export const stopAllPortForwards = async () => {
49
54
  getAllRunningPortForwards().forEach((name) => {
50
55
  stopPortForward(name);
@@ -1,4 +0,0 @@
1
- export declare const stopPortForward: (name: string) => Promise<void>;
2
- export declare const getAllRunningPortForwards: () => any[];
3
- export declare const startPortForward: (podname: string, localPort: number, remotePort: number, namespace: string) => Promise<void>;
4
- export declare const stopAllPortForwards: () => Promise<void>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"portForward.js","sourceRoot":"","sources":["../../src/utils/portForward.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA8C;AAE9C,IAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;AAExB,IAAM,eAAe,GAAG,UAAO,IAAY;;;;;gBAC1C,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBAE/B,GAAG,EAAH,wBAAG;;;;gBAEH,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACxB,qBAAM,GAAG,EAAA;;gBAAT,SAAS,CAAC;;;;;;gBAIZ,YAAY,CAAC,QAAM,CAAA,CAAC,IAAI,CAAC,CAAC;;;;;KAE7B,CAAC;AAZW,QAAA,eAAe,mBAY1B;AAEK,IAAM,yBAAyB,GAAG;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC;AAFW,QAAA,yBAAyB,6BAEpC;AACK,IAAM,gBAAgB,GAAG,UAC9B,OAAe,EACf,SAAiB,EACjB,UAAkB,EAClB,SAAiB;;;;;gBAEX,IAAI,GAAG,UAAG,SAAS,cAAI,OAAO,cAAI,SAAS,cAAI,UAAU,CAAE,CAAC;gBAClE,wBAAwB;gBACxB,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC1B,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC;iBACvB;gBACK,OAAO,GAAG,IAAA,6BAAK,EACnB,SAAS,EACT,CAAC,cAAc,EAAE,OAAO,EAAE,UAAG,SAAS,cAAI,UAAU,CAAE,EAAE,IAAI,EAAE,SAAS,CAAC,EACxE;oBACE,GAAG,wBACE,OAAO,CAAC,GAAG,KACd,KAAK,EAAE,EAAE,GACV;iBACF,CACF,CAAC;gBACF,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAChC,2EAA2E;gBAC3E,qBAAM,IAAI,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAnB,CAAmB,CAAC,EAAA;;gBAD7C,2EAA2E;gBAC3E,SAA6C,CAAC;;;;KAC/C,CAAC;AAxBW,QAAA,gBAAgB,oBAwB3B;AAEK,IAAM,mBAAmB,GAAG;;QACjC,IAAA,iCAAyB,GAAE,CAAC,OAAO,CAAC,UAAC,IAAI;YACvC,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;;;KACJ,CAAC;AAJW,QAAA,mBAAmB,uBAI9B"}