k6ctl 1.0.0
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/.github/workflows/ci.yml +61 -0
- package/README.md +45 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +35 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/run.d.ts +9 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +76 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/services/kubernetes.service.d.ts +20 -0
- package/dist/services/kubernetes.service.d.ts.map +1 -0
- package/dist/services/kubernetes.service.js +278 -0
- package/dist/services/kubernetes.service.js.map +1 -0
- package/dist/services/script.service.d.ts +8 -0
- package/dist/services/script.service.d.ts.map +1 -0
- package/dist/services/script.service.js +82 -0
- package/dist/services/script.service.js.map +1 -0
- package/dist/types/config.types.d.ts +26 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +3 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/kubernetes.types.d.ts +9 -0
- package/dist/types/kubernetes.types.d.ts.map +1 -0
- package/dist/types/kubernetes.types.js +3 -0
- package/dist/types/kubernetes.types.js.map +1 -0
- package/dist/types/script.types.d.ts +11 -0
- package/dist/types/script.types.d.ts.map +1 -0
- package/dist/types/script.types.js +3 -0
- package/dist/types/script.types.js.map +1 -0
- package/dist/types/testRunManifest.types.d.ts +43 -0
- package/dist/types/testRunManifest.types.d.ts.map +1 -0
- package/dist/types/testRunManifest.types.js +3 -0
- package/dist/types/testRunManifest.types.js.map +1 -0
- package/dist/utils/configLoader.d.ts +30 -0
- package/dist/utils/configLoader.d.ts.map +1 -0
- package/dist/utils/configLoader.js +63 -0
- package/dist/utils/configLoader.js.map +1 -0
- package/dist/utils/env.d.ts +17 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +111 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/table.util.d.ts +10 -0
- package/dist/utils/table.util.d.ts.map +1 -0
- package/dist/utils/table.util.js +24 -0
- package/dist/utils/table.util.js.map +1 -0
- package/dist/utils/testRunManifestBuilder.d.ts +5 -0
- package/dist/utils/testRunManifestBuilder.d.ts.map +1 -0
- package/dist/utils/testRunManifestBuilder.js +89 -0
- package/dist/utils/testRunManifestBuilder.js.map +1 -0
- package/package.json +44 -0
- package/src/cli.ts +31 -0
- package/src/commands/list.ts +29 -0
- package/src/commands/run.ts +52 -0
- package/src/services/kubernetes.service.ts +238 -0
- package/src/services/script.service.ts +79 -0
- package/src/types/config.types.ts +25 -0
- package/src/types/kubernetes.types.ts +9 -0
- package/src/types/script.types.ts +8 -0
- package/src/types/testRunManifest.types.ts +42 -0
- package/src/utils/configLoader.ts +63 -0
- package/src/utils/env.ts +90 -0
- package/src/utils/logger.ts +17 -0
- package/src/utils/table.util.ts +23 -0
- package/src/utils/testRunManifestBuilder.ts +102 -0
- package/test/integration/env.test.ts +33 -0
- package/test/integration/kubernetes.service.test.ts +70 -0
- package/test/integration/script.service.test.ts +64 -0
- package/test/jest.config.integration.js +20 -0
- package/test/jest.config.unit.js +14 -0
- package/test/samples/data_sample_1.csv +4 -0
- package/test/samples/k6_script_sample_1.js +9 -0
- package/test/samples/k6_script_sample_2.js +18 -0
- package/test/unit/configLoader.test.ts +53 -0
- package/test/unit/env.test.ts +1029 -0
- package/test/unit/kubernetes.service.test.ts +197 -0
- package/test/unit/script.service.test.ts +112 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*.*.*'
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
unit-tests:
|
|
15
|
+
name: Unit tests
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
if: github.event_name == 'pull_request'
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout code
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Setup Node.js
|
|
23
|
+
uses: actions/setup-node@v4
|
|
24
|
+
with:
|
|
25
|
+
node-version: '18'
|
|
26
|
+
cache: 'npm'
|
|
27
|
+
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: npm ci
|
|
30
|
+
|
|
31
|
+
- name: Run unit tests
|
|
32
|
+
run: npm run test:unit
|
|
33
|
+
|
|
34
|
+
publish:
|
|
35
|
+
name: Publish to npm
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
if: startsWith(github.ref, 'refs/tags/v') && github.event.base_ref == 'refs/heads/main'
|
|
38
|
+
steps:
|
|
39
|
+
- name: Checkout code
|
|
40
|
+
uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- name: Setup Node.js
|
|
43
|
+
uses: actions/setup-node@v4
|
|
44
|
+
with:
|
|
45
|
+
node-version: '18'
|
|
46
|
+
registry-url: 'https://registry.npmjs.org'
|
|
47
|
+
cache: 'npm'
|
|
48
|
+
|
|
49
|
+
- name: Install dependencies
|
|
50
|
+
run: npm ci
|
|
51
|
+
|
|
52
|
+
- name: Run unit tests
|
|
53
|
+
run: npm run test:unit
|
|
54
|
+
|
|
55
|
+
- name: Build
|
|
56
|
+
run: npm run build
|
|
57
|
+
|
|
58
|
+
- name: Publish to npm
|
|
59
|
+
run: npm publish --access public
|
|
60
|
+
env:
|
|
61
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# k6ctl
|
|
2
|
+
|
|
3
|
+
A CLI tool to simplify running k6 tests on Kubernetes using the k6-operator.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`k6ctl` eliminates the need to manually run `kubectl` commands to create ConfigMaps, apply TestRun manifests, and manage k6 tests in Kubernetes. Instead, you configure your test settings once and run tests with a simple command.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g k6ctl
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or use it directly with npx:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx k6ctl run path/to/test.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Configuration
|
|
22
|
+
|
|
23
|
+
Create a `k6ctl.config.js` file in the root of your k6 scripts project:
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
Run a k6 test:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
k6ctl run large-test-1.js
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Options
|
|
34
|
+
|
|
35
|
+
### Additional Commands
|
|
36
|
+
|
|
37
|
+
## Requirements
|
|
38
|
+
|
|
39
|
+
- Node.js >= 18.0.0
|
|
40
|
+
- kubectl configured with access to your Kubernetes cluster
|
|
41
|
+
- k6-operator installed in your cluster
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const run_1 = require("./commands/run");
|
|
6
|
+
const list_1 = require("./commands/list");
|
|
7
|
+
const package_json_1 = require("../package.json");
|
|
8
|
+
const program = new commander_1.Command();
|
|
9
|
+
program
|
|
10
|
+
.name('k6ctl')
|
|
11
|
+
.description('CLI tool to run k6 tests on Kubernetes using k6-operator')
|
|
12
|
+
.version(package_json_1.version);
|
|
13
|
+
program
|
|
14
|
+
.command('run <script>')
|
|
15
|
+
.description('Run a k6 test script')
|
|
16
|
+
.option('-c, --config <path>', 'Path to config file', 'k6ctl.config.js')
|
|
17
|
+
.option('-n, --namespace <namespace>', 'Kubernetes namespace')
|
|
18
|
+
.option('-p, --parallelism <number>', 'Number of parallel test pods')
|
|
19
|
+
.option('-v, --verbose', 'enable debug logging')
|
|
20
|
+
.action(run_1.runTest);
|
|
21
|
+
program
|
|
22
|
+
.command('list')
|
|
23
|
+
.description('List all resources')
|
|
24
|
+
.addArgument(new commander_1.Argument('[type]', 'Resource type').choices(['pods', 'testruns', 'configmaps']).default('all'))
|
|
25
|
+
.option('-n, --namespace <namespace>', 'Kubernetes namespace', 'default')
|
|
26
|
+
.action(list_1.list);
|
|
27
|
+
program.parse();
|
|
28
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAA8C;AAC9C,wCAAyC;AACzC,0CAAuC;AACvC,kDAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,sBAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,iBAAiB,CAAC;KACvE,MAAM,CAAC,6BAA6B,EAAE,sBAAsB,CAAC;KAC7D,MAAM,CAAC,4BAA4B,EAAE,8BAA8B,CAAC;KACpE,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,aAAO,CAAC,CAAC;AAEnB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oBAAoB,CAAC;KACjC,WAAW,CAAC,IAAI,oBAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC/G,MAAM,CAAC,6BAA6B,EAAE,sBAAsB,EAAE,SAAS,CAAC;KACxE,MAAM,CAAC,WAAI,CAAC,CAAC;AAEhB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,iBAyBvE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.list = list;
|
|
7
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
8
|
+
const kubernetes_service_1 = require("../services/kubernetes.service");
|
|
9
|
+
async function list(type, options) {
|
|
10
|
+
const kubernetesService = (0, kubernetes_service_1.createDefaultKubernetesService)();
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'all':
|
|
13
|
+
logger_1.default.debug(`Listing all resources in namespace: ${options.namespace}`);
|
|
14
|
+
await kubernetesService.listTestRuns(options.namespace);
|
|
15
|
+
await kubernetesService.listPods(options.namespace);
|
|
16
|
+
await kubernetesService.listConfigMaps(options.namespace);
|
|
17
|
+
break;
|
|
18
|
+
case 'pods':
|
|
19
|
+
logger_1.default.debug(`Listing Pods in namespace: ${options.namespace}`);
|
|
20
|
+
await kubernetesService.listPods(options.namespace);
|
|
21
|
+
break;
|
|
22
|
+
case 'testruns':
|
|
23
|
+
logger_1.default.debug(`Listing TestRuns in namespace: ${options.namespace}`);
|
|
24
|
+
await kubernetesService.listTestRuns(options.namespace);
|
|
25
|
+
break;
|
|
26
|
+
case 'configmaps':
|
|
27
|
+
logger_1.default.debug(`Listing ConfigMaps in namespace: ${options.namespace}`);
|
|
28
|
+
await kubernetesService.listConfigMaps(options.namespace);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
logger_1.default.debug(`Listing ${type} in namespace: ${options.namespace}`);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;AAGA,oBAyBC;AA5BD,6DAAsD;AACtD,uEAAgF;AAEzE,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,OAA+B;IACtE,MAAM,iBAAiB,GAAG,IAAA,mDAA8B,GAAE,CAAC;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACR,gBAAM,CAAC,KAAK,CAAC,uCAAuC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACzE,MAAM,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM;QACR,KAAK,MAAM;YACT,gBAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAChE,MAAM,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM;QACR,KAAK,UAAU;YACb,gBAAM,CAAC,KAAK,CAAC,kCAAkC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACpE,MAAM,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM;QACR,KAAK,YAAY;YACf,gBAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACtE,MAAM,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM;QACR;YACE,gBAAM,CAAC,KAAK,CAAC,WAAW,IAAI,kBAAkB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,MAAM;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAqCpE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runTest = runTest;
|
|
37
|
+
const kubernetes_service_1 = require("../services/kubernetes.service");
|
|
38
|
+
const script_service_1 = require("../services/script.service");
|
|
39
|
+
const configLoader_1 = require("../utils/configLoader");
|
|
40
|
+
const env_1 = require("../utils/env");
|
|
41
|
+
const logger_1 = __importStar(require("../utils/logger"));
|
|
42
|
+
const testRunManifestBuilder_1 = require("../utils/testRunManifestBuilder");
|
|
43
|
+
async function runTest(scriptPath, options) {
|
|
44
|
+
if (options.verbose)
|
|
45
|
+
(0, logger_1.setLogLevel)('debug');
|
|
46
|
+
logger_1.default.debug(`Running k6 test: ${scriptPath}`);
|
|
47
|
+
logger_1.default.debug(`Using config: ${JSON.stringify(options.config, null, 2)}`);
|
|
48
|
+
try {
|
|
49
|
+
// Initialize services
|
|
50
|
+
const scriptService = new script_service_1.ScriptService();
|
|
51
|
+
const kubernetesService = (0, kubernetes_service_1.createDefaultKubernetesService)();
|
|
52
|
+
// Load test script
|
|
53
|
+
const archive = await scriptService.archiveTest(scriptPath);
|
|
54
|
+
// Load config
|
|
55
|
+
const config = (0, configLoader_1.loadK6Config)(options.config);
|
|
56
|
+
// Load environment variables
|
|
57
|
+
let envVars;
|
|
58
|
+
try {
|
|
59
|
+
envVars = (0, env_1.loadAndValidateEnv)();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger_1.default.warn("Warning: no environment variables loaded, continuing anyway.");
|
|
63
|
+
logger_1.default.debug(`Error loading environment variables: ${error instanceof Error ? error.message : String(error)}`);
|
|
64
|
+
}
|
|
65
|
+
// Create configmap for test script
|
|
66
|
+
const configMap = await kubernetesService.createConfigMap(archive, config.namespace);
|
|
67
|
+
// Build testrun
|
|
68
|
+
const testRunManifest = (0, testRunManifestBuilder_1.buildTestRunManifest)(configMap, archive, config, envVars);
|
|
69
|
+
// Create testrun resource
|
|
70
|
+
const testRunResult = await kubernetesService.createTestRun(testRunManifest);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger_1.default.error(`Error running test: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,0BAqCC;AAnDD,uEAAgF;AAChF,+DAA2D;AAC3D,wDAAqD;AACrD,sCAAkD;AAClD,0DAAsD;AACtD,4EAAuE;AAShE,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,OAAmB;IACnE,IAAI,OAAO,CAAC,OAAO;QAAE,IAAA,oBAAW,EAAC,OAAO,CAAC,CAAC;IAC1C,gBAAM,CAAC,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;IAC/C,gBAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzE,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,8BAAa,EAAE,CAAC;QAC1C,MAAM,iBAAiB,GAAG,IAAA,mDAA8B,GAAE,CAAC;QAE3D,mBAAmB;QACnB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAE5D,cAAc;QACd,MAAM,MAAM,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,6BAA6B;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,wBAAkB,GAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC5E,gBAAM,CAAC,KAAK,CAAC,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAErF,gBAAgB;QAChB,MAAM,eAAe,GAAG,IAAA,6CAAoB,EAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAElF,0BAA0B;QAC1B,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAE/E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAM,CAAC,KAAK,CAAC,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as k8s from '@kubernetes/client-node';
|
|
2
|
+
import type { ArchivedFile, ConfigMapResult } from '../types/kubernetes.types';
|
|
3
|
+
import { TestRunManifest } from '../types/testRunManifest.types';
|
|
4
|
+
export declare class KubernetesService {
|
|
5
|
+
private readonly k8sApi;
|
|
6
|
+
private readonly k8sCustomApi;
|
|
7
|
+
constructor(k8sApi: k8s.CoreV1Api, k8sCustomApi: k8s.CustomObjectsApi);
|
|
8
|
+
createConfigMap(archiveFile: ArchivedFile, namespace: string): Promise<ConfigMapResult>;
|
|
9
|
+
deleteConfigMap(configMapName: string, namespace: string): Promise<void>;
|
|
10
|
+
createTestRun(testRunManifest: TestRunManifest): Promise<any>;
|
|
11
|
+
deleteTestRun(testRunManifest: TestRunManifest): Promise<void>;
|
|
12
|
+
listTestRuns(namespace?: string): Promise<any>;
|
|
13
|
+
listPods(namespace?: string): Promise<any>;
|
|
14
|
+
listConfigMaps(namespace?: string): Promise<any>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createDefaultKubernetesService(context?: string): KubernetesService;
|
|
17
|
+
export declare function printPodsTable(data: k8s.V1PodList): void;
|
|
18
|
+
export declare function printConfigMapsTable(data: k8s.V1ConfigMapList): void;
|
|
19
|
+
export declare function printTestRunsTable(testRuns: TestRunManifest[]): void;
|
|
20
|
+
//# sourceMappingURL=kubernetes.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.service.d.ts","sourceRoot":"","sources":["../../src/services/kubernetes.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAiB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAApD,MAAM,EAAE,GAAG,CAAC,SAAS,EAAmB,YAAY,EAAE,GAAG,CAAC,gBAAgB;IAEjG,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAgCvF,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxE,aAAa,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAkB7D,aAAa,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D,YAAY,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;IAiBzD,QAAQ,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;IAYrD,cAAc,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;CAWlE;AA2BD,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAOlF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAmCxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,eAAe,GAAG,IAAI,CAgBpE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI,CAkBpE"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.KubernetesService = void 0;
|
|
40
|
+
exports.createDefaultKubernetesService = createDefaultKubernetesService;
|
|
41
|
+
exports.printPodsTable = printPodsTable;
|
|
42
|
+
exports.printConfigMapsTable = printConfigMapsTable;
|
|
43
|
+
exports.printTestRunsTable = printTestRunsTable;
|
|
44
|
+
const fs_1 = require("fs");
|
|
45
|
+
const node_path_1 = require("node:path");
|
|
46
|
+
const k8s = __importStar(require("@kubernetes/client-node"));
|
|
47
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
48
|
+
const table_util_1 = require("../utils/table.util");
|
|
49
|
+
class KubernetesService {
|
|
50
|
+
k8sApi;
|
|
51
|
+
k8sCustomApi;
|
|
52
|
+
constructor(k8sApi, k8sCustomApi) {
|
|
53
|
+
this.k8sApi = k8sApi;
|
|
54
|
+
this.k8sCustomApi = k8sCustomApi;
|
|
55
|
+
}
|
|
56
|
+
async createConfigMap(archiveFile, namespace) {
|
|
57
|
+
// Check if the archive file exists
|
|
58
|
+
if (!(0, fs_1.existsSync)(archiveFile.archivePath)) {
|
|
59
|
+
throw new Error(`Archive file not found at path: ${archiveFile.archivePath}`);
|
|
60
|
+
}
|
|
61
|
+
// Check archive file size (should be less than 1MB for k8s configmap)
|
|
62
|
+
const stats = await fs_1.promises.stat(archiveFile.archivePath);
|
|
63
|
+
if (stats.size > 1024 * 1024) {
|
|
64
|
+
throw new Error(`Archive file is too large to be stored in a configmap (size: ${stats.size} bytes)`);
|
|
65
|
+
}
|
|
66
|
+
const configMapName = (0, node_path_1.parse)(archiveFile.archiveFilename).name;
|
|
67
|
+
const fileContent = await fs_1.promises.readFile(archiveFile.archivePath, 'base64');
|
|
68
|
+
const configMap = {
|
|
69
|
+
apiVersion: 'v1',
|
|
70
|
+
kind: 'ConfigMap',
|
|
71
|
+
metadata: {
|
|
72
|
+
name: configMapName,
|
|
73
|
+
namespace: namespace,
|
|
74
|
+
},
|
|
75
|
+
binaryData: {
|
|
76
|
+
[archiveFile.archiveFilename]: fileContent,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
await this.k8sApi.createNamespacedConfigMap({ namespace, body: configMap });
|
|
80
|
+
logger_1.default.info(`ConfigMap ${configMapName} created in namespace ${namespace}`);
|
|
81
|
+
return { namespace, configMapName };
|
|
82
|
+
}
|
|
83
|
+
async deleteConfigMap(configMapName, namespace) {
|
|
84
|
+
try {
|
|
85
|
+
await this.k8sApi.deleteNamespacedConfigMap({ name: configMapName, namespace });
|
|
86
|
+
logger_1.default.info(`ConfigMap ${configMapName} deleted from namespace ${namespace}`);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
90
|
+
throw new Error(`Failed to delete ConfigMap ${configMapName} from namespace ${namespace}: ${errorMessage}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async createTestRun(testRunManifest) {
|
|
94
|
+
try {
|
|
95
|
+
const response = await this.k8sCustomApi.createNamespacedCustomObject({
|
|
96
|
+
group: testRunManifest.apiVersion.split('/')[0],
|
|
97
|
+
version: testRunManifest.apiVersion.split('/')[1],
|
|
98
|
+
namespace: testRunManifest.metadata.namespace,
|
|
99
|
+
plural: "testruns",
|
|
100
|
+
body: testRunManifest,
|
|
101
|
+
});
|
|
102
|
+
logger_1.default.info(`TestRun ${testRunManifest.metadata.name} created in namespace ${testRunManifest.metadata.namespace}`);
|
|
103
|
+
logger_1.default.debug(`Create response: ${JSON.stringify(response)}`);
|
|
104
|
+
return response;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
108
|
+
throw new Error(`Failed to create TestRun ${testRunManifest.metadata.name} in namespace ${testRunManifest.metadata.namespace}: ${errorMessage}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async deleteTestRun(testRunManifest) {
|
|
112
|
+
try {
|
|
113
|
+
const response = await this.k8sCustomApi.deleteNamespacedCustomObject({
|
|
114
|
+
group: testRunManifest.apiVersion.split('/')[0],
|
|
115
|
+
version: testRunManifest.apiVersion.split('/')[1],
|
|
116
|
+
namespace: testRunManifest.metadata.namespace,
|
|
117
|
+
plural: "testruns",
|
|
118
|
+
name: testRunManifest.metadata.name,
|
|
119
|
+
});
|
|
120
|
+
logger_1.default.info(`TestRun ${testRunManifest.metadata.name} deleted from namespace ${testRunManifest.metadata.namespace}`);
|
|
121
|
+
logger_1.default.debug(`Delete response: ${JSON.stringify(response)}`);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
125
|
+
throw new Error(`Failed to delete TestRun ${testRunManifest.metadata.name} from namespace ${testRunManifest.metadata.namespace}: ${errorMessage}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async listTestRuns(namespace = "default") {
|
|
129
|
+
try {
|
|
130
|
+
const response = await this.k8sCustomApi.listNamespacedCustomObject({
|
|
131
|
+
group: "k6.io",
|
|
132
|
+
version: "v1alpha1",
|
|
133
|
+
namespace: namespace,
|
|
134
|
+
plural: "testruns",
|
|
135
|
+
});
|
|
136
|
+
// logger.debug(`List response: ${JSON.stringify(response)}`);
|
|
137
|
+
printTestRunsTable(response.items ?? []);
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
142
|
+
throw new Error(`Failed to list TestRuns in namespace ${namespace}: ${errorMessage}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async listPods(namespace = "default") {
|
|
146
|
+
try {
|
|
147
|
+
const response = await this.k8sApi.listNamespacedPod({ namespace });
|
|
148
|
+
printPodsTable(response);
|
|
149
|
+
// logger.debug(`List Pods: ${JSON.stringify(response)}`);
|
|
150
|
+
return response;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
154
|
+
throw new Error(`Failed to list Pods in namespace ${namespace}: ${errorMessage}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async listConfigMaps(namespace = "default") {
|
|
158
|
+
try {
|
|
159
|
+
const response = await this.k8sApi.listNamespacedConfigMap({ namespace });
|
|
160
|
+
printConfigMapsTable(response);
|
|
161
|
+
// logger.debug(`List ConfigMaps: ${JSON.stringify(response)}`);
|
|
162
|
+
return response;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const errorMessage = error.message ?? 'Unknown error';
|
|
166
|
+
throw new Error(`Failed to list ConfigMaps in namespace ${namespace}: ${errorMessage}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.KubernetesService = KubernetesService;
|
|
171
|
+
function fmt(v) {
|
|
172
|
+
return v ?? "N/A";
|
|
173
|
+
}
|
|
174
|
+
function getNamespace(obj) {
|
|
175
|
+
return obj?.metadata?.namespace ?? "default";
|
|
176
|
+
}
|
|
177
|
+
function getName(obj) {
|
|
178
|
+
return obj?.metadata?.name ?? "unknown";
|
|
179
|
+
}
|
|
180
|
+
function ageSince(isoDate) {
|
|
181
|
+
if (!isoDate)
|
|
182
|
+
return "N/A";
|
|
183
|
+
const created = new Date(isoDate).getTime();
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
let s = Math.max(0, Math.floor((now - created) / 1000));
|
|
186
|
+
const days = Math.floor(s / 86400);
|
|
187
|
+
s %= 86400;
|
|
188
|
+
const hrs = Math.floor(s / 3600);
|
|
189
|
+
s %= 3600;
|
|
190
|
+
const mins = Math.floor(s / 60);
|
|
191
|
+
if (days > 0)
|
|
192
|
+
return `${days}d${hrs}h`;
|
|
193
|
+
if (hrs > 0)
|
|
194
|
+
return `${hrs}h${mins}m`;
|
|
195
|
+
return `${mins}m`;
|
|
196
|
+
}
|
|
197
|
+
function createDefaultKubernetesService(context) {
|
|
198
|
+
const kc = new k8s.KubeConfig();
|
|
199
|
+
kc.loadFromDefault();
|
|
200
|
+
if (context)
|
|
201
|
+
kc.setCurrentContext(context);
|
|
202
|
+
const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
|
|
203
|
+
const k8sCustomApi = kc.makeApiClient(k8s.CustomObjectsApi);
|
|
204
|
+
return new KubernetesService(k8sApi, k8sCustomApi);
|
|
205
|
+
}
|
|
206
|
+
function printPodsTable(data) {
|
|
207
|
+
const pods = data.items ?? [];
|
|
208
|
+
const ns = pods[0]?.metadata?.namespace ?? "unknown";
|
|
209
|
+
(0, table_util_1.printTableGeneric)({
|
|
210
|
+
title: "Pods",
|
|
211
|
+
headers: ["Pod", "Namespace", "Container", "Node Name", "Req CPU", "Req Mem", "Lim CPU", "Lim Mem", "Status"],
|
|
212
|
+
items: pods,
|
|
213
|
+
toRows: (pod) => {
|
|
214
|
+
const podName = getName(pod);
|
|
215
|
+
const namespace = getNamespace(pod);
|
|
216
|
+
const status = pod.status?.phase ?? "unknown";
|
|
217
|
+
const node = pod.spec?.nodeName ?? "unknown";
|
|
218
|
+
const containers = pod.spec?.containers ?? [];
|
|
219
|
+
if (containers.length === 0) {
|
|
220
|
+
return [[podName, namespace, "-", "-", "-", "-", "-", status, node]];
|
|
221
|
+
}
|
|
222
|
+
return containers.map((c) => {
|
|
223
|
+
const r = c.resources || {};
|
|
224
|
+
const req = r.requests || {};
|
|
225
|
+
const lim = r.limits || {};
|
|
226
|
+
const statusEmoji = status === 'Succeeded' ? '🟢' : status === 'Failed' ? '🔴' : '🟡';
|
|
227
|
+
return [
|
|
228
|
+
podName,
|
|
229
|
+
namespace,
|
|
230
|
+
c.name,
|
|
231
|
+
node,
|
|
232
|
+
fmt(req.cpu),
|
|
233
|
+
fmt(req.memory),
|
|
234
|
+
fmt(lim.cpu),
|
|
235
|
+
fmt(lim.memory),
|
|
236
|
+
`${status} ${statusEmoji}`,
|
|
237
|
+
];
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function printConfigMapsTable(data) {
|
|
243
|
+
const cms = data.items ?? [];
|
|
244
|
+
const ns = cms[0]?.metadata?.namespace ?? "unknown";
|
|
245
|
+
(0, table_util_1.printTableGeneric)({
|
|
246
|
+
title: "ConfigMaps",
|
|
247
|
+
headers: ["Name", "Namespace", "Data keys", "Binary keys", "Age"],
|
|
248
|
+
items: cms,
|
|
249
|
+
toRows: (cm) => {
|
|
250
|
+
const name = getName(cm);
|
|
251
|
+
const namespace = getNamespace(cm);
|
|
252
|
+
const dataKeys = Object.keys(cm.data ?? {}).length ? Object.keys(cm.data ?? {}).join(", ") : "0";
|
|
253
|
+
const binKeys = Object.keys(cm.binaryData ?? {}).length ? Object.keys(cm.binaryData ?? {}).join(", ") : "0";
|
|
254
|
+
const age = ageSince(cm.metadata?.creationTimestamp);
|
|
255
|
+
return [[name, namespace, dataKeys, binKeys, age]];
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function printTestRunsTable(testRuns) {
|
|
260
|
+
const ns = testRuns[0]?.metadata?.namespace ?? "unknown";
|
|
261
|
+
(0, table_util_1.printTableGeneric)({
|
|
262
|
+
title: "TestRuns",
|
|
263
|
+
headers: ["Name", "Namespace", "Parallelism", "Cleanup", "Separate", "Quiet", "Age"],
|
|
264
|
+
items: testRuns,
|
|
265
|
+
toRows: (tr) => {
|
|
266
|
+
const name = tr.metadata?.name ?? "unknown";
|
|
267
|
+
const namespace = tr.metadata?.namespace ?? "unknown";
|
|
268
|
+
const parallelism = tr.spec?.parallelism ?? "N/A";
|
|
269
|
+
const cleanup = tr.spec?.cleanup ?? "N/A";
|
|
270
|
+
const separate = tr.spec?.separate ?? "N/A";
|
|
271
|
+
const quiet = tr.spec?.quiet ?? "N/A";
|
|
272
|
+
const age = tr?.metadata?.creationTimestamp ?? "N/A";
|
|
273
|
+
// const age = ageSince((tr as any)?.metadata?.creationTimestamp) || "N/A";
|
|
274
|
+
return [[name, namespace, parallelism, cleanup, separate, quiet, age]];
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=kubernetes.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.service.js","sourceRoot":"","sources":["../../src/services/kubernetes.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2JA,wEAOC;AAED,wCAmCC;AAED,oDAgBC;AAED,gDAkBC;AA7OD,2BAAyD;AACzD,yCAAkC;AAClC,6DAA+C;AAC/C,6DAAqC;AAGrC,oDAAwD;AAExD,MAAa,iBAAiB;IACC;IAAwC;IAArE,YAA6B,MAAqB,EAAmB,YAAkC;QAA1E,WAAM,GAAN,MAAM,CAAe;QAAmB,iBAAY,GAAZ,YAAY,CAAsB;IAAI,CAAC;IAE5G,KAAK,CAAC,eAAe,CAAC,WAAyB,EAAE,SAAiB;QAChE,mCAAmC;QACnC,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,mCAAmC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,sEAAsE;QACtE,MAAM,KAAK,GAAG,MAAM,aAAW,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,iBAAK,EAAC,WAAW,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,aAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAElF,MAAM,SAAS,GAAoB;YACjC,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;gBACR,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,SAAS;aACrB;YACD,UAAU,EAAE;gBACV,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW;aAC3C;SACF,CAAC;QAEF,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,gBAAM,CAAC,IAAI,CAAC,aAAa,aAAa,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB,EAAE,SAAiB;QAC5D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;YAChF,gBAAM,CAAC,IAAI,CAAC,aAAa,aAAa,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,8BAA8B,aAAa,mBAAmB,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,eAAgC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC;gBACpE,KAAK,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjD,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe;aACtB,CAAC,CAAC;YACH,gBAAM,CAAC,IAAI,CAAC,WAAW,eAAe,CAAC,QAAQ,CAAC,IAAI,yBAAyB,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACnH,gBAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,4BAA4B,eAAe,CAAC,QAAQ,CAAC,IAAI,iBAAiB,eAAe,CAAC,QAAQ,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QACnJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,eAAgC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC;gBACpE,KAAK,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjD,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI;aACpC,CAAC,CAAC;YACH,gBAAM,CAAC,IAAI,CAAC,WAAW,eAAe,CAAC,QAAQ,CAAC,IAAI,2BAA2B,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACrH,gBAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,4BAA4B,eAAe,CAAC,QAAQ,CAAC,IAAI,mBAAmB,eAAe,CAAC,QAAQ,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QACrJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAoB,SAAS;QAC9C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC;gBAClE,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YACH,8DAA8D;YAC9D,kBAAkB,CAAE,QAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,YAAoB,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACpE,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzB,0DAA0D;YAC1D,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,YAAoB,SAAS;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1E,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC/B,gEAAgE;YAChE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;CACF;AAxHD,8CAwHC;AAED,SAAS,GAAG,CAAC,CAAM;IACjB,OAAO,CAAC,IAAI,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,YAAY,CAAC,GAAQ;IAC5B,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;AAC/C,CAAC;AAED,SAAS,OAAO,CAAC,GAAQ;IACvB,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,OAAY;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAAC,CAAC,IAAI,KAAK,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAAC,CAAC,IAAI,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;IACtC,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED,SAAgB,8BAA8B,CAAC,OAAgB;IAC7D,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;IAChC,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,IAAI,OAAO;QAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5D,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,SAAgB,cAAc,CAAC,IAAmB;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;IACrD,IAAA,8BAAiB,EAAC;QAChB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC7G,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,SAAS,CAAC;YAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC;YAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtF,OAAO;oBACL,OAAO;oBACP,SAAS;oBACT,CAAC,CAAC,IAAI;oBACN,IAAI;oBACJ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;oBACZ,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACf,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;oBACZ,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACf,GAAG,MAAM,IAAI,WAAW,EAAE;iBAC3B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAyB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;IACpD,IAAA,8BAAiB,EAAC;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC;QACjE,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YACzB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5G,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAA2B;IAC5D,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;IACzD,IAAA,8BAAiB,EAAC;QAChB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC;QACpF,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC;YAC5C,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;YACtD,MAAM,WAAW,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;YAClD,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;YAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC;YAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC;YACtC,MAAM,GAAG,GAAI,EAAU,EAAE,QAAQ,EAAE,iBAAiB,IAAI,KAAK,CAAC;YAC9D,2EAA2E;YAC3E,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACzE,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ArchiveResult, ExecFn } from '../types/script.types';
|
|
2
|
+
export declare class ScriptService {
|
|
3
|
+
private readonly execCmd;
|
|
4
|
+
constructor(execCmd?: ExecFn);
|
|
5
|
+
archiveTest(scriptPath: string, outputDirectory?: string): Promise<ArchiveResult>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createDefaultScriptService(): ScriptService;
|
|
8
|
+
//# sourceMappingURL=script.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.service.d.ts","sourceRoot":"","sources":["../../src/services/script.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAInE,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,MAAyB;IAEzD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA8CxF;AAED,wBAAgB,0BAA0B,IAAI,aAAa,CAE1D"}
|