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.
Files changed (86) hide show
  1. package/.github/workflows/ci.yml +61 -0
  2. package/README.md +45 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +28 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/list.d.ts +4 -0
  8. package/dist/commands/list.d.ts.map +1 -0
  9. package/dist/commands/list.js +35 -0
  10. package/dist/commands/list.js.map +1 -0
  11. package/dist/commands/run.d.ts +9 -0
  12. package/dist/commands/run.d.ts.map +1 -0
  13. package/dist/commands/run.js +76 -0
  14. package/dist/commands/run.js.map +1 -0
  15. package/dist/services/kubernetes.service.d.ts +20 -0
  16. package/dist/services/kubernetes.service.d.ts.map +1 -0
  17. package/dist/services/kubernetes.service.js +278 -0
  18. package/dist/services/kubernetes.service.js.map +1 -0
  19. package/dist/services/script.service.d.ts +8 -0
  20. package/dist/services/script.service.d.ts.map +1 -0
  21. package/dist/services/script.service.js +82 -0
  22. package/dist/services/script.service.js.map +1 -0
  23. package/dist/types/config.types.d.ts +26 -0
  24. package/dist/types/config.types.d.ts.map +1 -0
  25. package/dist/types/config.types.js +3 -0
  26. package/dist/types/config.types.js.map +1 -0
  27. package/dist/types/kubernetes.types.d.ts +9 -0
  28. package/dist/types/kubernetes.types.d.ts.map +1 -0
  29. package/dist/types/kubernetes.types.js +3 -0
  30. package/dist/types/kubernetes.types.js.map +1 -0
  31. package/dist/types/script.types.d.ts +11 -0
  32. package/dist/types/script.types.d.ts.map +1 -0
  33. package/dist/types/script.types.js +3 -0
  34. package/dist/types/script.types.js.map +1 -0
  35. package/dist/types/testRunManifest.types.d.ts +43 -0
  36. package/dist/types/testRunManifest.types.d.ts.map +1 -0
  37. package/dist/types/testRunManifest.types.js +3 -0
  38. package/dist/types/testRunManifest.types.js.map +1 -0
  39. package/dist/utils/configLoader.d.ts +30 -0
  40. package/dist/utils/configLoader.d.ts.map +1 -0
  41. package/dist/utils/configLoader.js +63 -0
  42. package/dist/utils/configLoader.js.map +1 -0
  43. package/dist/utils/env.d.ts +17 -0
  44. package/dist/utils/env.d.ts.map +1 -0
  45. package/dist/utils/env.js +111 -0
  46. package/dist/utils/env.js.map +1 -0
  47. package/dist/utils/logger.d.ts +4 -0
  48. package/dist/utils/logger.d.ts.map +1 -0
  49. package/dist/utils/logger.js +16 -0
  50. package/dist/utils/logger.js.map +1 -0
  51. package/dist/utils/table.util.d.ts +10 -0
  52. package/dist/utils/table.util.d.ts.map +1 -0
  53. package/dist/utils/table.util.js +24 -0
  54. package/dist/utils/table.util.js.map +1 -0
  55. package/dist/utils/testRunManifestBuilder.d.ts +5 -0
  56. package/dist/utils/testRunManifestBuilder.d.ts.map +1 -0
  57. package/dist/utils/testRunManifestBuilder.js +89 -0
  58. package/dist/utils/testRunManifestBuilder.js.map +1 -0
  59. package/package.json +44 -0
  60. package/src/cli.ts +31 -0
  61. package/src/commands/list.ts +29 -0
  62. package/src/commands/run.ts +52 -0
  63. package/src/services/kubernetes.service.ts +238 -0
  64. package/src/services/script.service.ts +79 -0
  65. package/src/types/config.types.ts +25 -0
  66. package/src/types/kubernetes.types.ts +9 -0
  67. package/src/types/script.types.ts +8 -0
  68. package/src/types/testRunManifest.types.ts +42 -0
  69. package/src/utils/configLoader.ts +63 -0
  70. package/src/utils/env.ts +90 -0
  71. package/src/utils/logger.ts +17 -0
  72. package/src/utils/table.util.ts +23 -0
  73. package/src/utils/testRunManifestBuilder.ts +102 -0
  74. package/test/integration/env.test.ts +33 -0
  75. package/test/integration/kubernetes.service.test.ts +70 -0
  76. package/test/integration/script.service.test.ts +64 -0
  77. package/test/jest.config.integration.js +20 -0
  78. package/test/jest.config.unit.js +14 -0
  79. package/test/samples/data_sample_1.csv +4 -0
  80. package/test/samples/k6_script_sample_1.js +9 -0
  81. package/test/samples/k6_script_sample_2.js +18 -0
  82. package/test/unit/configLoader.test.ts +53 -0
  83. package/test/unit/env.test.ts +1029 -0
  84. package/test/unit/kubernetes.service.test.ts +197 -0
  85. package/test/unit/script.service.test.ts +112 -0
  86. 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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,4 @@
1
+ export declare function list(type: string, options: {
2
+ namespace?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -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,9 @@
1
+ interface RunOptions {
2
+ config: string;
3
+ namespace?: string;
4
+ parallelism?: number;
5
+ verbose?: boolean;
6
+ }
7
+ export declare function runTest(scriptPath: string, options: RunOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=run.d.ts.map
@@ -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":"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"}
@@ -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"}