@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,188 +1,102 @@
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, 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: required,
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, required, 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, required, 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');
114
4
 
115
- // generators/common-resources/budget/index.js
116
- var path = require("path");
117
- var chalk = require("chalk");
118
- var BaseGenerator = require_BaseGenerator();
119
5
  module.exports = class extends BaseGenerator {
120
6
  prompting() {
121
7
  const prompts = [
122
8
  {
123
- type: "list",
124
- name: "usingGKE",
125
- message: "Is the clan using GKE?",
126
- default: "false",
127
- choices: ["true", "false"]
9
+ type: 'list',
10
+ name: 'usingGKE',
11
+ message: 'Is the clan using GKE?',
12
+ default: 'false',
13
+ choices: ['true', 'false'],
128
14
  },
129
15
  {
130
- type: "input",
131
- name: "expectedServiceCount",
132
- message: "How many services will eventually be in use simultanously?"
16
+ type: 'input',
17
+ name: 'expectedServiceCount',
18
+ message: 'How many services will eventually be in use simultanously?',
133
19
  },
134
20
  {
135
- type: "list",
136
- name: "usingInternalTraffic",
137
- message: "Is the clan using internal traffic (service to service communication)?",
138
- default: "true",
139
- choices: ["true", "false"]
140
- }
21
+ type: 'list',
22
+ name: 'usingInternalTraffic',
23
+ message:
24
+ 'Is the clan using internal traffic (service to service communication)?',
25
+ default: 'true',
26
+ choices: ['true', 'false'],
27
+ },
141
28
  ];
142
29
  return this.prompt(prompts).then((props) => {
143
30
  this.answers = props;
144
31
  });
145
32
  }
33
+
146
34
  writing() {
147
35
  let overheadPercentage = 0.01;
148
- if (this.answers.usingInternalTraffic === "false" && this.answers.usingGKE === "false" && this.answers.expectedServiceCount <
149
- 8) {
36
+ if (
37
+ this.answers.usingInternalTraffic === 'false' &&
38
+ this.answers.usingGKE === 'false' &&
39
+ this.answers.expectedServiceCount < 8
40
+ ) {
150
41
  overheadPercentage = 0.01;
151
- } else if (this.answers.usingInternalTraffic === "true" && this.answers.usingGKE === "false" && this.answers.expectedServiceCount <
152
- 8) {
42
+ } else if (
43
+ this.answers.usingInternalTraffic === 'true' &&
44
+ this.answers.usingGKE === 'false' &&
45
+ this.answers.expectedServiceCount < 8
46
+ ) {
153
47
  overheadPercentage = 0.03;
154
- } else if (this.answers.usingInternalTraffic === "true" && this.answers.usingGKE === "false" && this.answers.expectedServiceCount >
155
- 8) {
48
+ } else if (
49
+ this.answers.usingInternalTraffic === 'true' &&
50
+ this.answers.usingGKE === 'false' &&
51
+ this.answers.expectedServiceCount > 8
52
+ ) {
156
53
  overheadPercentage = 0.04;
157
- } else if (this.answers.usingInternalTraffic === "true" && this.answers.usingGKE === "true" && this.answers.expectedServiceCount <
158
- 8) {
54
+ } else if (
55
+ this.answers.usingInternalTraffic === 'true' &&
56
+ this.answers.usingGKE === 'true' &&
57
+ this.answers.expectedServiceCount < 8
58
+ ) {
159
59
  overheadPercentage = 0.04;
160
- } else if (this.answers.usingInternalTraffic === "true" && this.answers.usingGKE === "true" && this.answers.expectedServiceCount >
161
- 8) {
60
+ } else if (
61
+ this.answers.usingInternalTraffic === 'true' &&
62
+ this.answers.usingGKE === 'true' &&
63
+ this.answers.expectedServiceCount > 8
64
+ ) {
162
65
  overheadPercentage = 0.05;
163
- } else if (this.answers.usingInternalTraffic === "false" && this.answers.usingGKE === "false" && this.answers.expectedServiceCount >
164
- 8) {
66
+ } else if (
67
+ this.answers.usingInternalTraffic === 'false' &&
68
+ this.answers.usingGKE === 'false' &&
69
+ this.answers.expectedServiceCount > 8
70
+ ) {
165
71
  overheadPercentage = 0.03;
166
- } else if (this.answers.usingInternalTraffic === "false" && this.answers.usingGKE === "true" && this.answers.expectedServiceCount <
167
- 8) {
72
+ } else if (
73
+ this.answers.usingInternalTraffic === 'false' &&
74
+ this.answers.usingGKE === 'true' &&
75
+ this.answers.expectedServiceCount < 8
76
+ ) {
168
77
  overheadPercentage = 0.03;
169
- } else if (this.answers.usingInternalTraffic === "false" && this.answers.usingGKE === "true" && this.answers.expectedServiceCount >
170
- 8) {
78
+ } else if (
79
+ this.answers.usingInternalTraffic === 'false' &&
80
+ this.answers.usingGKE === 'true' &&
81
+ this.answers.expectedServiceCount > 8
82
+ ) {
171
83
  overheadPercentage = 0.04;
172
84
  }
173
- ["prod", "staging"].forEach((env) => {
174
- this.copyDir("budget", path.join("infra", env, "budget"), {
85
+
86
+ ['prod', 'staging'].forEach((env) => {
87
+ this.copyDir('budget', path.join('infra', env, 'budget'), {
175
88
  ...this.answers,
176
89
  env,
177
- overheadPercentage
90
+ overheadPercentage,
178
91
  });
179
92
  });
180
93
  }
94
+
181
95
  end() {
182
96
  this.log(`
183
- ${chalk.green("Your budget has been created.")}
184
- ${chalk.green("1.")} To finalize your configuration, please continue with manual editing of the generated files.
185
- ${chalk.green("2.")} Push the changes in a feature branch and open a pull request.
97
+ ${chalk.green('Your budget has been created.')}
98
+ ${chalk.green('1.')} To finalize your configuration, please continue with manual editing of the generated files.
99
+ ${chalk.green('2.')} Push the changes in a feature branch and open a pull request.
186
100
  `);
187
101
  }
188
102
  };
@@ -1,187 +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, 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: required,
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, required, 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, required, 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 getTribeAndClanName = require('../../init/clan-infra/tribe-clan-repo');
114
5
 
115
- // generators/init/clan-infra/tribe-clan-repo.js
116
- var require_tribe_clan_repo = __commonJS({
117
- "generators/init/clan-infra/tribe-clan-repo.js"(exports2, module2) {
118
- var path2 = require("path");
119
- var fs = require("fs");
120
- var getKeyValue = /* @__PURE__ */ __name((content, key) => {
121
- let value = "";
122
- content.split(/\r?\n/).forEach((line) => {
123
- if (line.includes(key)) {
124
- value = line.split("=")[1].replace('"', "").replace('"', "").trim();
125
- }
126
- });
127
- return value;
128
- }, "getKeyValue");
129
- var getTribeAndClanName2 = /* @__PURE__ */ __name(() => {
130
- const repoName = path2.basename(path2.resolve());
131
- const isClanInfraRepo = /^(?:\w+-){2}common(?:$|\W)$/.test(repoName);
132
- let tribe = "";
133
- let clan = "";
134
- if (isClanInfraRepo) {
135
- [tribe, clan] = repoName.split("-");
136
- } else {
137
- const commonHCL = path2.join("infra", "common.hcl");
138
- if (fs.existsSync(commonHCL)) {
139
- const commonHCLContent = fs.readFileSync(commonHCL, "utf8");
140
- tribe = getKeyValue(commonHCLContent, "tribe_name");
141
- clan = getKeyValue(commonHCLContent, "clan_name");
142
- }
143
- }
144
- return {
145
- tribe,
146
- clan
147
- };
148
- }, "getTribeAndClanName");
149
- module2.exports = getTribeAndClanName2;
150
- }
151
- });
152
-
153
- // generators/common-resources/cloud-armor/index.js
154
- var path = require("path");
155
- var chalk = require("chalk");
156
- var BaseGenerator = require_BaseGenerator();
157
- var getTribeAndClanName = require_tribe_clan_repo();
158
6
  module.exports = class extends BaseGenerator {
159
7
  prompting() {
160
8
  const prompts = [
161
9
  {
162
- type: "input",
163
- name: "name",
10
+ type: 'input',
11
+ name: 'name',
164
12
  default: getTribeAndClanName().clan,
165
- message: "Enter your policy name or leave blank for default"
166
- }
13
+ message: 'Enter your policy name or leave blank for default',
14
+ },
167
15
  ];
168
16
  return this.prompt(prompts).then((props) => {
169
17
  this.answers = props;
170
18
  });
171
19
  }
20
+
172
21
  writing() {
173
22
  const { name } = this.answers;
174
- const run = /* @__PURE__ */ __name((env) => {
175
- this.copyDir(path.join(""), path.join("infra", env, "cloud-armor", name));
176
- }, "run");
177
- run("staging");
178
- run("prod");
23
+
24
+ const run = (env) => {
25
+ this.copyDir(path.join(''), path.join('infra', env, 'cloud-armor', name));
26
+ };
27
+ run('staging');
28
+ run('prod');
179
29
  }
30
+
180
31
  end() {
181
32
  const { name } = this.answers;
182
33
  this.log(`
183
- ${chalk.green(`Your cloud armor policy ${chalk.cyan(name)} has been created. To finalize your configuration, please cont\
184
- inue
34
+ ${chalk.green(`Your cloud armor policy ${chalk.cyan(name)} has been created. To finalize your configuration, please continue
185
35
  with manual editing of the generated files.`)}
186
36
  `);
187
37
  }