@abgov/nx-oc 12.10.0 → 13.0.0-beta.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/generators.json CHANGED
@@ -27,6 +27,11 @@
27
27
  "factory": "./src/generators/sandbox/sandbox",
28
28
  "schema": "./src/generators/sandbox/schema.json",
29
29
  "description": "Generator that creates a sandbox deployment for rapid local iteration (local build, push to OC internal registry)."
30
+ },
31
+ "teardown": {
32
+ "factory": "./src/generators/teardown/teardown",
33
+ "schema": "./src/generators/teardown/schema.json",
34
+ "description": "Adds a teardown target to remove an application's resources from a specific OpenShift environment."
30
35
  }
31
36
  }
32
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abgov/nx-oc",
3
- "version": "12.10.0",
3
+ "version": "13.0.0-beta.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "src/index.js",
6
6
  "description": "Government of Alberta - Nx plugin for OpenShift.",
@@ -10,7 +10,7 @@
10
10
  "directory": "packages/nx-oc"
11
11
  },
12
12
  "peerDependencies": {
13
- "@nx/devkit": "^22.0.0",
13
+ "@nx/devkit": "^23.0.0",
14
14
  "tslib": "^2.0.0"
15
15
  },
16
16
  "dependencies": {
@@ -80,6 +80,13 @@ function addSandboxTarget(host, options) {
80
80
  commands,
81
81
  sequential: true,
82
82
  },
83
+ }, 'sandbox-teardown': {
84
+ executor: 'nx:run-commands',
85
+ options: {
86
+ commands: [
87
+ `oc delete all,configmap -l app=${projectName} -n ${sandboxProject} --ignore-not-found`,
88
+ ],
89
+ },
83
90
  } });
84
91
  (0, devkit_1.updateProjectConfiguration)(host, options.project, config);
85
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/generators/sandbox/sandbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/generators/sandbox/sandbox.ts"],"names":[],"mappings":"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"}
@@ -90,6 +90,22 @@ describe('Sandbox Generator', () => {
90
90
  expect(cmds.some((c) => c.includes('command -v podman'))).toBeTruthy();
91
91
  });
92
92
 
93
+ it('adds sandbox-teardown nx target', async () => {
94
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
95
+ addNodeProject(host);
96
+
97
+ await generator(host, options);
98
+
99
+ const config = readProjectConfiguration(host, 'test');
100
+ expect(config.targets['sandbox-teardown']).toBeTruthy();
101
+ const cmds: string[] = config.targets['sandbox-teardown'].options.commands;
102
+ expect(cmds.some((c) => c.includes('oc delete'))).toBeTruthy();
103
+ expect(cmds.some((c) => c.includes('--ignore-not-found'))).toBeTruthy();
104
+ expect(cmds.some((c) => c.includes('test-sandbox'))).toBeTruthy();
105
+ expect(cmds.some((c) => c.includes('-l app=test'))).toBeTruthy();
106
+ expect(cmds.some((c) => c.includes('all,configmap'))).toBeTruthy();
107
+ });
108
+
93
109
  it('generates shared postgres manifest with secret-backed DATABASE_URL', async () => {
94
110
  const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
95
111
  addNodeProject(host);
@@ -0,0 +1,10 @@
1
+ export interface Schema {
2
+ project: string;
3
+ env: 'dev' | 'test' | 'prod';
4
+ }
5
+
6
+ export interface NormalizedSchema extends Schema {
7
+ projectName: string;
8
+ envProject: string;
9
+ ocInfraProject: string;
10
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "NxOcTeardown",
4
+ "title": "OpenShift Environment Teardown",
5
+ "type": "object",
6
+ "properties": {
7
+ "project": {
8
+ "type": "string",
9
+ "description": "Project to add teardown target for.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "Which project to add teardown for?"
15
+ },
16
+ "env": {
17
+ "type": "string",
18
+ "description": "Environment to target for teardown.",
19
+ "$default": {
20
+ "$source": "argv",
21
+ "index": 1
22
+ },
23
+ "alias": "e",
24
+ "x-prompt": {
25
+ "message": "Which environment to target?",
26
+ "type": "list",
27
+ "items": ["dev", "test", "prod"]
28
+ }
29
+ }
30
+ },
31
+ "required": ["project", "env"],
32
+ "additionalProperties": false
33
+ }
@@ -0,0 +1,3 @@
1
+ import { Tree } from '@nx/devkit';
2
+ import { Schema } from './schema';
3
+ export default function (host: Tree, options: Schema): Promise<void>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const tslib_1 = require("tslib");
5
+ const devkit_1 = require("@nx/devkit");
6
+ const yaml = require("yaml");
7
+ const pipeline_envs_1 = require("../../pipeline-envs");
8
+ const infraManifestFile = '.openshift/environments.yml';
9
+ function normalizeOptions(host, options) {
10
+ var _a, _b, _c, _d;
11
+ const projectName = (0, devkit_1.names)(options.project).fileName;
12
+ const result = host.read(infraManifestFile).toString();
13
+ const { items } = yaml.parse(result);
14
+ const ocInfraProject = ((_b = (_a = items[0]) === null || _a === void 0 ? void 0 : _a.metadata) === null || _b === void 0 ? void 0 : _b.namespace) || '';
15
+ const SA_PREFIX = 'system:serviceaccounts:';
16
+ const ocEnvProjects = (_d = (_c = items[0]) === null || _c === void 0 ? void 0 : _c.subjects) === null || _d === void 0 ? void 0 : _d.filter((s) => s.kind === 'Group' && s.name.startsWith(SA_PREFIX)).map((s) => s.name.replace(SA_PREFIX, ''));
17
+ const envIndex = pipeline_envs_1.pipelineEnvs.map((e) => e.toLowerCase()).indexOf(options.env.toLowerCase());
18
+ const envProject = (ocEnvProjects === null || ocEnvProjects === void 0 ? void 0 : ocEnvProjects[envIndex]) || '';
19
+ return Object.assign(Object.assign({}, options), { projectName,
20
+ ocInfraProject,
21
+ envProject });
22
+ }
23
+ function default_1(host, options) {
24
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
25
+ if (!host.exists(infraManifestFile)) {
26
+ console.log(`Cannot generate teardown; run 'nx g @abgov/nx-oc:pipeline' first.`);
27
+ return;
28
+ }
29
+ const normalizedOptions = normalizeOptions(host, options);
30
+ if (!normalizedOptions.envProject) {
31
+ console.log(`Cannot find project for environment '${options.env}'.`);
32
+ return;
33
+ }
34
+ const config = (0, devkit_1.readProjectConfiguration)(host, options.project);
35
+ const { projectName, envProject } = normalizedOptions;
36
+ config.targets = Object.assign(Object.assign({}, config.targets), { [`teardown-${options.env}`]: {
37
+ executor: 'nx:run-commands',
38
+ options: {
39
+ commands: [
40
+ `oc delete all,configmap -l app=${projectName} -n ${envProject} --ignore-not-found`,
41
+ ],
42
+ },
43
+ } });
44
+ (0, devkit_1.updateProjectConfiguration)(host, options.project, config);
45
+ yield (0, devkit_1.formatFiles)(host);
46
+ });
47
+ }
48
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/generators/teardown/teardown.ts"],"names":[],"mappings":";;AAoCA,4BA6BC;;AAjED,uCAMoB;AACpB,6BAA6B;AAC7B,uDAA2D;AAG3D,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD,SAAS,gBAAgB,CAAC,IAAU,EAAE,OAAe;;IACnD,MAAM,WAAW,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,CAAA,MAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,QAAQ,0CAAE,SAAS,KAAI,EAAE,CAAC;IAE3D,MAAM,SAAS,GAAG,yBAAyB,CAAC;IAC5C,MAAM,aAAa,GAAa,MAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,QAAQ,0CAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,4BAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,QAAQ,CAAC,KAAI,EAAE,CAAC;IAEnD,uCACK,OAAO,KACV,WAAW;QACX,cAAc;QACd,UAAU,IACV;AACJ,CAAC;AAED,mBAA+B,IAAU,EAAE,OAAe;;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,iCAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC;QAEtD,MAAM,CAAC,OAAO,mCACT,MAAM,CAAC,OAAO,KACjB,CAAC,YAAY,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE;gBAC3B,QAAQ,EAAE,iBAAiB;gBAC3B,OAAO,EAAE;oBACP,QAAQ,EAAE;wBACR,kCAAkC,WAAW,OAAO,UAAU,qBAAqB;qBACpF;iBACF;aACF,GACF,CAAC;QAEF,IAAA,mCAA0B,EAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CAAA"}
@@ -0,0 +1,100 @@
1
+ import {
2
+ addProjectConfiguration,
3
+ readProjectConfiguration,
4
+ } from '@nx/devkit';
5
+ import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
6
+ import pipeline from '../pipeline/pipeline';
7
+ import generator from './teardown';
8
+ import { Schema } from './schema';
9
+
10
+ describe('Teardown Generator', () => {
11
+ const options: Schema = {
12
+ project: 'test',
13
+ env: 'dev',
14
+ };
15
+
16
+ async function setup(host, envs = 'test-dev test-test test-prod') {
17
+ await pipeline(host, {
18
+ pipeline: 'test',
19
+ registry: 'ghcr.io/test-org',
20
+ type: 'jenkins',
21
+ infra: 'test-infra',
22
+ envs,
23
+ });
24
+ addProjectConfiguration(host, 'test', {
25
+ root: 'apps/test',
26
+ projectType: 'application',
27
+ targets: {
28
+ build: { executor: '@nx/webpack:webpack', options: { compiler: 'tsc', target: 'node' } },
29
+ },
30
+ });
31
+ }
32
+
33
+ it('adds teardown-dev target for dev environment', async () => {
34
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
35
+ await setup(host);
36
+
37
+ await generator(host, options);
38
+
39
+ const config = readProjectConfiguration(host, 'test');
40
+ expect(config.targets['teardown-dev']).toBeTruthy();
41
+ const cmds: string[] = config.targets['teardown-dev'].options.commands;
42
+ expect(cmds.some((c) => c.includes('oc delete'))).toBeTruthy();
43
+ expect(cmds.some((c) => c.includes('test-dev'))).toBeTruthy();
44
+ expect(cmds.some((c) => c.includes('--ignore-not-found'))).toBeTruthy();
45
+ });
46
+
47
+ it('adds teardown-prod target for prod environment', async () => {
48
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
49
+ await setup(host);
50
+
51
+ await generator(host, { ...options, env: 'prod' });
52
+
53
+ const config = readProjectConfiguration(host, 'test');
54
+ expect(config.targets['teardown-prod']).toBeTruthy();
55
+ const cmds: string[] = config.targets['teardown-prod'].options.commands;
56
+ expect(cmds.some((c) => c.includes('test-prod'))).toBeTruthy();
57
+ });
58
+
59
+ it('teardown targets for multiple environments are additive', async () => {
60
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
61
+ await setup(host);
62
+
63
+ await generator(host, { ...options, env: 'dev' });
64
+ await generator(host, { ...options, env: 'test' });
65
+ await generator(host, { ...options, env: 'prod' });
66
+
67
+ const config = readProjectConfiguration(host, 'test');
68
+ expect(config.targets['teardown-dev']).toBeTruthy();
69
+ expect(config.targets['teardown-test']).toBeTruthy();
70
+ expect(config.targets['teardown-prod']).toBeTruthy();
71
+ });
72
+
73
+ it('skips gracefully when environments.yml does not exist', async () => {
74
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
75
+ addProjectConfiguration(host, 'test', {
76
+ root: 'apps/test',
77
+ projectType: 'application',
78
+ targets: {
79
+ build: { executor: '@nx/webpack:webpack', options: { compiler: 'tsc', target: 'node' } },
80
+ },
81
+ });
82
+
83
+ await generator(host, options);
84
+
85
+ const config = readProjectConfiguration(host, 'test');
86
+ expect(config.targets['teardown-dev']).toBeFalsy();
87
+ });
88
+
89
+ it('uses label selector with project name in delete command', async () => {
90
+ const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
91
+ await setup(host);
92
+
93
+ await generator(host, options);
94
+
95
+ const config = readProjectConfiguration(host, 'test');
96
+ const cmds: string[] = config.targets['teardown-dev'].options.commands;
97
+ expect(cmds.some((c) => c.includes('-l app=test'))).toBeTruthy();
98
+ expect(cmds.some((c) => c.includes('all,configmap'))).toBeTruthy();
99
+ });
100
+ });