@hiiretail/gcp-infra-generators 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/generators/clan-resources/clan-project/index.js +89 -189
  2. package/dist/generators/common-resources/bigquery/index.js +172 -267
  3. package/dist/generators/common-resources/budget/index.js +67 -153
  4. package/dist/generators/common-resources/cloud-armor/index.js +17 -167
  5. package/dist/generators/common-resources/cloud-storage/index.js +96 -205
  6. package/dist/generators/common-resources/cloudsql/index.js +71 -177
  7. package/dist/generators/common-resources/cloudsql-database/index.js +40 -287
  8. package/dist/generators/common-resources/confluent-cluster/index.js +23 -132
  9. package/dist/generators/common-resources/datastore/index.js +48 -194
  10. package/dist/generators/common-resources/elastic-cloud/index.js +22 -132
  11. package/dist/generators/common-resources/elastic-index-policy/handle-yaml.js +76 -0
  12. package/dist/generators/common-resources/elastic-index-policy/index.js +131 -286
  13. package/dist/generators/common-resources/elastic-template/index.js +52 -162
  14. package/dist/generators/common-resources/firestore/index.js +93 -233
  15. package/dist/generators/common-resources/iam/index.js +35 -157
  16. package/dist/generators/common-resources/iam/valid-prefix.js +8 -0
  17. package/dist/generators/common-resources/kafka-connect/index.js +35 -144
  18. package/dist/generators/common-resources/kafka-topics/index.js +20 -129
  19. package/dist/generators/common-resources/kms/index.js +31 -141
  20. package/dist/generators/common-resources/memorystore/index.js +42 -328
  21. package/dist/generators/common-resources/monitoring/handle-yaml.js +49 -0
  22. package/dist/generators/common-resources/monitoring/index.js +144 -322
  23. package/dist/generators/common-resources/monitoring/validate.js +58 -0
  24. package/dist/generators/common-resources/pubsub/append.js +130 -0
  25. package/dist/generators/common-resources/pubsub/get-gcp-projects.js +34 -0
  26. package/dist/generators/common-resources/pubsub/handle-subscribers.js +68 -0
  27. package/dist/generators/common-resources/pubsub/index.js +194 -536
  28. package/dist/generators/common-resources/pubsub/validate.js +53 -0
  29. package/dist/generators/common-resources/scheduler/append.js +85 -0
  30. package/dist/generators/common-resources/scheduler/index.js +62 -249
  31. package/dist/generators/common-resources/spanner/append.js +31 -0
  32. package/dist/generators/common-resources/spanner/index.js +102 -269
  33. package/dist/generators/common-resources/spanner/validate.js +38 -0
  34. package/dist/generators/docs/rca/index.js +25 -135
  35. package/dist/generators/docs/runbook/index.js +16 -126
  36. package/dist/generators/docs/srb/index.js +33 -147
  37. package/dist/generators/docs/srb/run-docker.js +2 -0
  38. package/dist/generators/init/clan-infra/gcp-projects.js +47 -0
  39. package/dist/generators/init/clan-infra/index.js +95 -290
  40. package/dist/generators/init/clan-infra/tribe-clan-repo.js +38 -0
  41. package/dist/generators/init/clan-infra/validate.js +8 -0
  42. package/dist/generators/maintenance/manage-states/index.js +142 -219
  43. package/dist/generators/maintenance/update-modules/index.js +56 -155
  44. package/dist/generators/organization/clan-project/googlecloud.js +124 -0
  45. package/dist/generators/organization/clan-project/index.js +81 -303
  46. package/dist/node_modules/.package-lock.json +81 -23
  47. package/dist/package.json +45 -0
  48. package/dist/src/BaseGenerator.js +84 -0
  49. package/dist/src/SecretsGenerator.js +137 -0
  50. package/dist/src/cli.js +54 -255
  51. package/dist/src/dependency-check.js +48 -0
  52. package/dist/src/update-check.js +38 -0
  53. package/dist/src/validators.js +33 -0
  54. package/dist/src/yeoman.js +80 -0
  55. package/package.json +1 -2
@@ -1,147 +1,37 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
- var __commonJS = (cb, mod) => function __require() {
5
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
6
- };
7
-
8
- // src/validators.js
9
- var require_validators = __commonJS({
10
- "src/validators.js"(exports2, module2) {
11
- var path2 = require("path");
12
- module2.exports = {
13
- chain: /* @__PURE__ */ __name((input, ...validators) => {
14
- let msg = "";
15
- validators.every((validator) => {
16
- msg = validator(input);
17
- return msg === true;
18
- });
19
- return msg === true ? true : msg;
20
- }, "chain"),
21
- filename: /* @__PURE__ */ __name((input) => {
22
- if (!input) {
23
- return true;
24
- }
25
- return path2.basename(input) === input ? true : "Invalid filename";
26
- }, "filename"),
27
- maxLength: /* @__PURE__ */ __name((input, maxLength) => !input || input.length <= maxLength ? true : `Exceeds max \
28
- length: ${maxLength}`, "maxLength"),
29
- required: /* @__PURE__ */ __name((input) => {
30
- const msg = "Required";
31
- if (Array.isArray(input)) {
32
- return input.length > 0 ? true : msg;
33
- }
34
- if (input) {
35
- return input.trim().length > 0 ? true : msg;
36
- }
37
- return msg;
38
- }, "required")
39
- };
40
- }
41
- });
42
-
43
- // src/BaseGenerator.js
44
- var require_BaseGenerator = __commonJS({
45
- "src/BaseGenerator.js"(exports2, module2) {
46
- var Generator = require("yeoman-generator");
47
- var path2 = require("path");
48
- var fs = require("fs");
49
- var inquirer = require("inquirer");
50
- var { chain, required: required2, filename } = require_validators();
51
- module2.exports = class extends Generator {
52
- constructor(args, opts) {
53
- super(args, opts);
54
- this.baseDir = path2.resolve(path2.join(__dirname, ".."));
55
- this.destinationRoot(process.cwd());
56
- const [command, generator] = opts.namespace.split(":").slice(-2);
57
- this.generatorId = path2.join(command, generator);
58
- this.sourceRoot(
59
- path2.join(this.baseDir, "generators", this.generatorId, "templates")
60
- );
61
- this.copyDir = (templateDir, targetDir, answers = this.answers, skipIfExists = false) => {
62
- if (skipIfExists && fs.existsSync(targetDir)) {
63
- return;
64
- }
65
- this.fs.copyTpl(
66
- this.templatePath(`${templateDir}/**/*`),
67
- this.destinationPath(targetDir),
68
- answers
69
- );
70
- };
71
- this.listSubDirectories = (parent) => fs.readdirSync(parent).filter((f) => !f.startsWith(".")).filter((f) => fs.
72
- lstatSync(path2.join(parent, f)).isDirectory()).sort((a, b) => a.localeCompare(b));
73
- this.kebabCase = (input) => input.replace(/\s|_/g, "-");
74
- this.chooseOrCreatePrompts = (name, getChoicesDirectory) => [
75
- {
76
- when: /* @__PURE__ */ __name((answers) => fs.existsSync(getChoicesDirectory(answers)), "when"),
77
- type: "list",
78
- name,
79
- message: `Choose ${name}`,
80
- store: true,
81
- choices: /* @__PURE__ */ __name((answers) => [
82
- ...this.listSubDirectories(getChoicesDirectory(answers)),
83
- new inquirer.Separator(),
84
- `Create new ${name}`
85
- ], "choices"),
86
- validate: required2,
87
- filter: this.kebabCase
88
- },
89
- {
90
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === `\
91
- Create-new-${name}`, "when"),
92
- type: "input",
93
- name: `new-${name}`,
94
- message: `New ${name} name`,
95
- store: false,
96
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
97
- filter: this.kebabCase
98
- },
99
- {
100
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === "\
101
- Create-new-tribe", "when"),
102
- type: "input",
103
- name: "costCenter",
104
- message: "Please provide the Cost Center of the Tribe",
105
- store: false,
106
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
107
- filter: this.kebabCase
108
- }
109
- ];
110
- }
111
- };
112
- }
113
- });
1
+ const path = require('path');
2
+ const chalk = require('chalk');
3
+ const BaseGenerator = require('../../../src/BaseGenerator');
4
+ const { required } = require('../../../src/validators');
114
5
 
115
- // generators/docs/runbook/index.js
116
- var path = require("path");
117
- var chalk = require("chalk");
118
- var BaseGenerator = require_BaseGenerator();
119
- var { required } = require_validators();
120
6
  module.exports = class extends BaseGenerator {
121
7
  prompting() {
122
8
  const prompts = [
123
9
  {
124
- type: "input",
125
- name: "system",
126
- message: "Name of the software system",
127
- validate: required
128
- }
10
+ type: 'input',
11
+ name: 'system',
12
+ message: 'Name of the software system',
13
+ validate: required,
14
+ },
129
15
  ];
16
+
130
17
  return this.prompt(prompts).then((props) => {
131
18
  this.answers = props;
132
19
  });
133
20
  }
21
+
134
22
  writing() {
135
23
  const { system } = this.answers;
136
24
  const filename = this.kebabCase(system.toLowerCase());
137
- this.copyDir("docs", this.destinationPath(path.join("docs", filename)), {
25
+
26
+ this.copyDir('docs', this.destinationPath(path.join('docs', filename)), {
138
27
  ...this.answers,
139
- c4System: system.replace(/\s/g, "")
28
+ c4System: system.replace(/\s/g, ''),
140
29
  });
141
30
  }
31
+
142
32
  end() {
143
33
  this.log(`
144
- ${chalk.green("Your Runbook documentation template have now been created.")}
34
+ ${chalk.green('Your Runbook documentation template have now been created.')}
145
35
  Next, push this change in a feature branch and open a pull request.
146
36
  `);
147
37
  }
@@ -1,182 +1,68 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
- var __commonJS = (cb, mod) => function __require() {
5
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
6
- };
7
-
8
- // src/validators.js
9
- var require_validators = __commonJS({
10
- "src/validators.js"(exports2, module2) {
11
- var path2 = require("path");
12
- module2.exports = {
13
- chain: /* @__PURE__ */ __name((input, ...validators) => {
14
- let msg = "";
15
- validators.every((validator) => {
16
- msg = validator(input);
17
- return msg === true;
18
- });
19
- return msg === true ? true : msg;
20
- }, "chain"),
21
- filename: /* @__PURE__ */ __name((input) => {
22
- if (!input) {
23
- return true;
24
- }
25
- return path2.basename(input) === input ? true : "Invalid filename";
26
- }, "filename"),
27
- maxLength: /* @__PURE__ */ __name((input, maxLength) => !input || input.length <= maxLength ? true : `Exceeds max \
28
- length: ${maxLength}`, "maxLength"),
29
- required: /* @__PURE__ */ __name((input) => {
30
- const msg = "Required";
31
- if (Array.isArray(input)) {
32
- return input.length > 0 ? true : msg;
33
- }
34
- if (input) {
35
- return input.trim().length > 0 ? true : msg;
36
- }
37
- return msg;
38
- }, "required")
39
- };
40
- }
41
- });
42
-
43
- // src/BaseGenerator.js
44
- var require_BaseGenerator = __commonJS({
45
- "src/BaseGenerator.js"(exports2, module2) {
46
- var Generator = require("yeoman-generator");
47
- var path2 = require("path");
48
- var fs = require("fs");
49
- var inquirer = require("inquirer");
50
- var { chain, required: required2, filename } = require_validators();
51
- module2.exports = class extends Generator {
52
- constructor(args, opts) {
53
- super(args, opts);
54
- this.baseDir = path2.resolve(path2.join(__dirname, ".."));
55
- this.destinationRoot(process.cwd());
56
- const [command, generator] = opts.namespace.split(":").slice(-2);
57
- this.generatorId = path2.join(command, generator);
58
- this.sourceRoot(
59
- path2.join(this.baseDir, "generators", this.generatorId, "templates")
60
- );
61
- this.copyDir = (templateDir, targetDir, answers = this.answers, skipIfExists = false) => {
62
- if (skipIfExists && fs.existsSync(targetDir)) {
63
- return;
64
- }
65
- this.fs.copyTpl(
66
- this.templatePath(`${templateDir}/**/*`),
67
- this.destinationPath(targetDir),
68
- answers
69
- );
70
- };
71
- this.listSubDirectories = (parent) => fs.readdirSync(parent).filter((f) => !f.startsWith(".")).filter((f) => fs.
72
- lstatSync(path2.join(parent, f)).isDirectory()).sort((a, b) => a.localeCompare(b));
73
- this.kebabCase = (input) => input.replace(/\s|_/g, "-");
74
- this.chooseOrCreatePrompts = (name, getChoicesDirectory) => [
75
- {
76
- when: /* @__PURE__ */ __name((answers) => fs.existsSync(getChoicesDirectory(answers)), "when"),
77
- type: "list",
78
- name,
79
- message: `Choose ${name}`,
80
- store: true,
81
- choices: /* @__PURE__ */ __name((answers) => [
82
- ...this.listSubDirectories(getChoicesDirectory(answers)),
83
- new inquirer.Separator(),
84
- `Create new ${name}`
85
- ], "choices"),
86
- validate: required2,
87
- filter: this.kebabCase
88
- },
89
- {
90
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === `\
91
- Create-new-${name}`, "when"),
92
- type: "input",
93
- name: `new-${name}`,
94
- message: `New ${name} name`,
95
- store: false,
96
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
97
- filter: this.kebabCase
98
- },
99
- {
100
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === "\
101
- Create-new-tribe", "when"),
102
- type: "input",
103
- name: "costCenter",
104
- message: "Please provide the Cost Center of the Tribe",
105
- store: false,
106
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
107
- filter: this.kebabCase
108
- }
109
- ];
110
- }
111
- };
112
- }
113
- });
114
-
115
- // generators/docs/srb/run-docker.js
116
- var require_run_docker = __commonJS({
117
- "generators/docs/srb/run-docker.js"(exports2, module2) {
118
- module2.exports = (spawnCommandSync, args) => spawnCommandSync("docker", args, { encoding: "utf8" });
119
- }
120
- });
1
+ const path = require('path');
2
+ const chalk = require('chalk');
3
+ const BaseGenerator = require('../../../src/BaseGenerator');
4
+ const { required } = require('../../../src/validators');
5
+ const runDocker = require('./run-docker');
121
6
 
122
- // generators/docs/srb/index.js
123
- var path = require("path");
124
- var chalk = require("chalk");
125
- var BaseGenerator = require_BaseGenerator();
126
- var { required } = require_validators();
127
- var runDocker = require_run_docker();
128
7
  module.exports = class extends BaseGenerator {
129
8
  prompting() {
130
9
  const prompts = [
131
10
  {
132
- type: "input",
133
- name: "system",
134
- message: "Name of the software system",
135
- validate: required
136
- }
11
+ type: 'input',
12
+ name: 'system',
13
+ message: 'Name of the software system',
14
+ validate: required,
15
+ },
137
16
  ];
17
+
138
18
  return this.prompt(prompts).then((props) => {
139
19
  this.answers = props;
140
20
  });
141
21
  }
22
+
142
23
  writing() {
143
24
  const { system } = this.answers;
144
25
  const filename = this.kebabCase(system.toLowerCase());
145
- this.copyDir("docs", this.destinationPath(path.join("docs", filename)), {
26
+
27
+ this.copyDir('docs', this.destinationPath(path.join('docs', filename)), {
146
28
  ...this.answers,
147
- c4System: system.replace(/\s/g, "")
29
+ c4System: system.replace(/\s/g, ''),
148
30
  });
31
+
149
32
  this.fs.copyTpl(
150
- this.templatePath("sample.dsl"),
151
- this.destinationPath("docs", filename, `${filename}.dsl`),
152
- this.answers
33
+ this.templatePath('sample.dsl'),
34
+ this.destinationPath('docs', filename, `${filename}.dsl`),
35
+ this.answers,
153
36
  );
154
37
  }
38
+
155
39
  install() {
156
40
  const { system } = this.answers;
157
41
  const filename = this.kebabCase(system.toLowerCase());
158
42
  const baseArgs = [
159
- "run",
160
- "--pull=always",
161
- "--rm",
162
- "-t",
163
- "-v",
164
- `${this.destinationPath("docs", filename)}:/docs`
43
+ 'run',
44
+ '--pull=always',
45
+ '--rm',
46
+ '-t',
47
+ '-v',
48
+ `${this.destinationPath('docs', filename)}:/docs`,
165
49
  ];
166
50
  runDocker(this.spawnCommandSync, [
167
51
  ...baseArgs,
168
- "extenda/adr-tools",
169
- "init",
170
- "adr"
52
+ 'extenda/adr-tools',
53
+ 'init',
54
+ 'adr',
171
55
  ]);
56
+
172
57
  runDocker(this.spawnCommandSync, [
173
58
  ...baseArgs,
174
- "extenda/structurizr-to-png"
59
+ 'extenda/structurizr-to-png',
175
60
  ]);
176
61
  }
62
+
177
63
  end() {
178
64
  this.log(`
179
- ${chalk.green("Your system documentation stubs have now been created.")}
65
+ ${chalk.green('Your system documentation stubs have now been created.')}
180
66
  Next, push this change in a feature branch and open a pull request.
181
67
  `);
182
68
  }
@@ -0,0 +1,2 @@
1
+ module.exports = (spawnCommandSync, args) =>
2
+ spawnCommandSync('docker', args, { encoding: 'utf8' });
@@ -0,0 +1,47 @@
1
+ const gcpProjects = {};
2
+
3
+ const getGcpProjects = ({ spawnCommandSync }, name) => {
4
+ let projects = gcpProjects[name];
5
+
6
+ if (!projects) {
7
+ const result = spawnCommandSync(
8
+ 'gcloud',
9
+ [
10
+ 'projects',
11
+ 'list',
12
+ `--filter=NAME~${name}`,
13
+ '--format=value(PROJECT_ID)',
14
+ ],
15
+ { encoding: 'utf8', stdio: 'pipe' },
16
+ );
17
+
18
+ if (result.status !== 0) {
19
+ throw new Error(
20
+ "gcloud error. Please run 'gcloud auth application-defaults login' and try again.",
21
+ );
22
+ }
23
+ projects = result.stdout
24
+ .split(/\s+/)
25
+ .filter((line) => line.trim().length > 0)
26
+ .sort();
27
+ gcpProjects[name] = projects;
28
+ }
29
+
30
+ return projects;
31
+ };
32
+
33
+ const validateGcpProjects = ({ spawnCommandSync }, name) => {
34
+ try {
35
+ const projects = getGcpProjects({ spawnCommandSync }, name);
36
+ return projects.length > 0
37
+ ? true
38
+ : 'Invalid input. No matching GCP project(s) found.';
39
+ } catch (err) {
40
+ return err.message;
41
+ }
42
+ };
43
+
44
+ module.exports = {
45
+ getGcpProjects,
46
+ validateGcpProjects,
47
+ };