@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.
- package/dist/apps/cli/cli.js +2 -2
- package/dist/apps/cli/cli.js.map +1 -1
- package/dist/apps/cli/commands/general/index.js +11 -11
- package/dist/apps/cli/commands/general/index.js.map +1 -1
- package/dist/apps/cli/commands/general/portForward.js +3 -3
- package/dist/apps/cli/commands/general/portForward.js.map +1 -1
- package/dist/apps/cli/commands/mongodb/projectMongoPortForward.js +2 -2
- package/dist/apps/cli/commands/mongodb/projectMongoPortForward.js.map +1 -1
- package/dist/apps/cli/commands/project/commandOpenCostDashboard.js +2 -2
- package/dist/apps/cli/commands/project/commandOpenCostDashboard.js.map +1 -1
- package/dist/apps/cli/commands/project/commandOpenGrafana.js +2 -2
- package/dist/apps/cli/commands/project/commandOpenGrafana.js.map +1 -1
- package/dist/apps/cli/commands/project/commandOpenGrafanaPod.js +2 -2
- package/dist/apps/cli/commands/project/commandOpenGrafanaPod.js.map +1 -1
- package/dist/apps/cli/commands/project/commandPortForward.js +97 -36
- package/dist/apps/cli/commands/project/commandPortForward.js.map +1 -1
- package/dist/bundles/catenv/index.js +1 -1
- package/dist/bundles/cli/index.js +2 -2
- package/dist/kubernetes/portForward.d.ts +1 -0
- package/dist/kubernetes/portForward.js +55 -0
- package/dist/kubernetes/portForward.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/portForwards.d.ts +12 -0
- package/dist/utils/{portForward.js → portForwards.js} +20 -16
- package/dist/utils/portForwards.js.map +1 -0
- package/package.json +2 -2
- package/src/apps/cli/cli.ts +1 -1
- package/src/apps/cli/commands/general/index.ts +10 -7
- package/src/apps/cli/commands/general/portForward.ts +3 -3
- package/src/apps/cli/commands/mongodb/projectMongoPortForward.ts +2 -2
- package/src/apps/cli/commands/project/commandOpenCostDashboard.ts +2 -2
- package/src/apps/cli/commands/project/commandOpenGrafana.ts +2 -2
- package/src/apps/cli/commands/project/commandOpenGrafanaPod.ts +2 -2
- package/src/apps/cli/commands/project/commandPortForward.ts +72 -29
- package/src/kubernetes/portForward.ts +15 -0
- package/src/utils/{portForward.ts → portForwards.ts} +27 -22
- package/dist/utils/portForward.d.ts +0 -4
- 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.
|
|
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
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
|
103
|
+
case 2:
|
|
100
104
|
// wait a moment so that is surley started, unfortunatly we don't know that
|
|
101
|
-
|
|
105
|
+
_b.sent();
|
|
102
106
|
return [2 /*return*/];
|
|
103
107
|
}
|
|
104
108
|
});
|
|
105
109
|
}); };
|
|
106
|
-
exports.
|
|
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=
|
|
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.
|
|
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.
|
|
60
|
+
"version": "1.81.1"
|
|
61
61
|
}
|
package/src/apps/cli/cli.ts
CHANGED
|
@@ -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/
|
|
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/
|
|
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(
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
-
|
|
15
|
-
const
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const promise = spawn(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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"}
|