@hiiretail/gcp-infra-generators 1.0.0 → 1.0.2

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 (74) 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/templates/alerts/generic-infra.yaml +37 -2
  24. package/dist/generators/common-resources/monitoring/validate.js +58 -0
  25. package/dist/generators/common-resources/pubsub/append.js +130 -0
  26. package/dist/generators/common-resources/pubsub/get-gcp-projects.js +34 -0
  27. package/dist/generators/common-resources/pubsub/handle-subscribers.js +68 -0
  28. package/dist/generators/common-resources/pubsub/index.js +194 -536
  29. package/dist/generators/common-resources/pubsub/validate.js +53 -0
  30. package/dist/generators/common-resources/scheduler/append.js +85 -0
  31. package/dist/generators/common-resources/scheduler/index.js +62 -249
  32. package/dist/generators/common-resources/spanner/append.js +31 -0
  33. package/dist/generators/common-resources/spanner/index.js +102 -269
  34. package/dist/generators/common-resources/spanner/validate.js +38 -0
  35. package/dist/generators/docs/rca/index.js +25 -135
  36. package/dist/generators/docs/runbook/index.js +16 -126
  37. package/dist/generators/docs/srb/index.js +33 -147
  38. package/dist/generators/docs/srb/run-docker.js +2 -0
  39. package/dist/generators/init/clan-infra/gcp-projects.js +47 -0
  40. package/dist/generators/init/clan-infra/index.js +95 -290
  41. package/dist/generators/init/clan-infra/tribe-clan-repo.js +38 -0
  42. package/dist/generators/init/clan-infra/validate.js +8 -0
  43. package/dist/generators/maintenance/manage-states/index.js +142 -219
  44. package/dist/generators/maintenance/update-modules/index.js +56 -155
  45. package/dist/generators/organization/clan-project/googlecloud.js +124 -0
  46. package/dist/generators/organization/clan-project/index.js +81 -303
  47. package/dist/node_modules/.package-lock.json +88 -31
  48. package/dist/node_modules/@google-cloud/storage/build/cjs/src/bucket.js +5 -5
  49. package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.d.ts +1 -0
  50. package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.js +10 -1
  51. package/dist/node_modules/@google-cloud/storage/build/cjs/src/storage.js +1 -1
  52. package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.d.ts +4 -4
  53. package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.js +4 -4
  54. package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.d.ts +1 -1
  55. package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.js +2 -2
  56. package/dist/node_modules/@google-cloud/storage/build/esm/src/bucket.js +5 -5
  57. package/dist/node_modules/@google-cloud/storage/build/esm/src/file.d.ts +1 -0
  58. package/dist/node_modules/@google-cloud/storage/build/esm/src/file.js +10 -1
  59. package/dist/node_modules/@google-cloud/storage/build/esm/src/storage.js +1 -1
  60. package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.d.ts +4 -4
  61. package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.js +4 -4
  62. package/dist/node_modules/@google-cloud/storage/build/esm/src/util.d.ts +1 -1
  63. package/dist/node_modules/@google-cloud/storage/build/esm/src/util.js +2 -2
  64. package/dist/node_modules/@google-cloud/storage/package.json +5 -5
  65. package/dist/package.json +45 -0
  66. package/dist/src/BaseGenerator.js +84 -0
  67. package/dist/src/SecretsGenerator.js +137 -0
  68. package/dist/src/cli.js +54 -255
  69. package/dist/src/dependency-check.js +48 -0
  70. package/dist/src/update-check.js +38 -0
  71. package/dist/src/validators.js +33 -0
  72. package/dist/src/yeoman.js +80 -0
  73. package/package.json +2 -3
  74. package/dist/node_modules/@google-cloud/storage/CHANGELOG.md +0 -1769
@@ -1,171 +1,61 @@
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/common-resources/kms/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: "keyRing",
126
- message: "Please provide the name of the key ring",
127
- validate: required
10
+ type: 'input',
11
+ name: 'keyRing',
12
+ message: 'Please provide the name of the key ring',
13
+ validate: required,
128
14
  },
129
15
  {
130
- type: "input",
131
- name: "location",
132
- message: "Please provide the location for the key ring",
133
- default: "europe-west1",
134
- validate: required
16
+ type: 'input',
17
+ name: 'location',
18
+ message: 'Please provide the location for the key ring',
19
+ default: 'europe-west1',
20
+ validate: required,
135
21
  },
136
22
  {
137
- type: "input",
138
- name: "keys",
139
- message: "Please provide the first key in the key ring",
140
- validate: required
141
- }
23
+ type: 'input',
24
+ name: 'keys',
25
+ message: 'Please provide the first key in the key ring',
26
+ validate: required,
27
+ },
142
28
  ];
29
+
143
30
  return this.prompt(prompts).then((props) => {
144
31
  this.answers = props;
145
32
  });
146
33
  }
34
+
147
35
  writing() {
148
36
  const { keyRing, location, keys } = this.answers;
149
- ["prod", "staging"].forEach((env) => {
150
- this.copyDir("kms", path.join("infra", env, "kms"), {
37
+
38
+ ['prod', 'staging'].forEach((env) => {
39
+ this.copyDir('kms', path.join('infra', env, 'kms'), {
151
40
  ...this.answers,
152
41
  env,
153
42
  keyRing,
154
43
  location,
155
- keys
44
+ keys,
156
45
  });
157
46
  });
158
47
  }
48
+
159
49
  end() {
160
- const specStageFile = path.join("infra", "staging", "kms");
161
- const specProdFile = path.join("infra", "prod", "kms");
50
+ const specStageFile = path.join('infra', 'staging', 'kms');
51
+ const specProdFile = path.join('infra', 'prod', 'kms');
162
52
  this.log(`
163
53
  ${chalk.green(`Your KMS resources have now been created. To finalize your configuration, please continue
164
54
  with manual editing of the generated files.`)}
165
- ${chalk.green("1.")} Review KMS configurations:
166
- \u2192 ${chalk.cyan(path.join(specStageFile, "spec.hcl"))}
167
- \u2192 ${chalk.cyan(path.join(specProdFile, "spec.hcl"))}
168
- ${chalk.green("2.")} Push this change in a feature branch and open a pull request.
55
+ ${chalk.green('1.')} Review KMS configurations:
56
+ \u2192 ${chalk.cyan(path.join(specStageFile, 'spec.hcl'))}
57
+ \u2192 ${chalk.cyan(path.join(specProdFile, 'spec.hcl'))}
58
+ ${chalk.green('2.')} Push this change in a feature branch and open a pull request.
169
59
  `);
170
60
  }
171
61
  };
@@ -1,361 +1,75 @@
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
- });
114
-
115
- // src/SecretsGenerator.js
116
- var require_SecretsGenerator = __commonJS({
117
- "src/SecretsGenerator.js"(exports2, module2) {
118
- var path2 = require("path");
119
- var fs = require("fs");
120
- var printf = require("sprintf-js").sprintf;
121
- var chalk = require("chalk");
122
- var BaseGenerator = require_BaseGenerator();
123
- function getMaxStrLength(strings) {
124
- let maxLength = 0;
125
- Object.values(strings).forEach((string) => {
126
- if (string.length > maxLength) {
127
- maxLength = string.length;
128
- }
129
- });
130
- return maxLength;
131
- }
132
- __name(getMaxStrLength, "getMaxStrLength");
133
- module2.exports = class extends BaseGenerator {
134
- writeSecrets(resource, instanceResource, instanceType, resourceName) {
135
- ["prod", "staging"].forEach((env) => {
136
- this.init(env, resource, instanceResource, instanceType, resourceName);
137
- if (fs.existsSync(path2.resolve(this.secretsDir, "terragrunt.hcl"))) {
138
- fs.unlinkSync(path2.join(this.secretsDir, "terragrunt.hcl"));
139
- } else {
140
- fs.mkdirSync(this.secretsDir, { recursive: true });
141
- }
142
- this.createTemplate();
143
- });
144
- }
145
- init(env, resource, instanceResource, instanceType, resourceName) {
146
- this.resourceName = resourceName;
147
- this.instanceType = instanceType;
148
- this.resource = resource;
149
- this.outputs = JSON.parse(
150
- fs.readFileSync(
151
- path2.join(
152
- this.baseDir,
153
- "generators",
154
- this.generatorId,
155
- "templates",
156
- this.instanceType,
157
- "outputs.json"
158
- ),
159
- "utf8"
160
- )
161
- );
162
- this.secretsDir = path2.join(
163
- "infra",
164
- env,
165
- resource,
166
- instanceType,
167
- instanceResource,
168
- "secrets"
169
- );
170
- if (fs.existsSync(path2.join(this.secretsDir, "state.json"))) {
171
- this.stateNames = JSON.parse(
172
- fs.readFileSync(path2.join(this.secretsDir, "state.json"), "utf8")
173
- );
174
- this.checkUniqueState();
175
- this.stateNames.secrets.push(this.resourceName);
176
- } else {
177
- this.stateNames = { secrets: [this.resourceName] };
178
- }
179
- this.outputLen = getMaxStrLength(this.outputs);
180
- this.stateLen = getMaxStrLength(this.stateNames.secrets);
181
- }
182
- checkUniqueState() {
183
- this.stateNames.secrets.forEach((state) => {
184
- if (state === this.resourceName) {
185
- process.stderr.write(
186
- `${chalk.red("ERROR!")} resource already exists
187
- `
188
- );
189
- process.exit(1);
190
- }
191
- });
192
- }
193
- buildDependencies() {
194
- const dependencies = [];
195
- this.stateNames.secrets.forEach((secret) => {
196
- let fp = `dependency "${secret}" {
197
- config_path = "../${secret}"
198
- mock_outputs = {
199
- `;
200
- Object.values(this.outputs).forEach((value) => {
201
- fp += printf(
202
- `%-4s%-${this.outputLen}s %s`,
203
- "",
204
- `${value}`,
205
- `= "dummy-${value}"
206
- `
207
- );
208
- });
209
- fp += " }\n}\n";
210
- dependencies.push(fp);
211
- });
212
- return dependencies;
213
- }
214
- buildSecrets() {
215
- const secrets = [];
216
- const resourceType = this.instanceType === "" ? this.resource : this.instanceType;
217
- const padding = resourceType.length + this.outputLen + this.stateLen + 2;
218
- this.stateNames.secrets.forEach((secret) => {
219
- const secretsSet = [];
220
- Object.values(this.outputs).forEach((value) => {
221
- secretsSet.push(
222
- printf(
223
- `
224
- %-6s%-${padding}s %s`,
225
- "",
226
- `${resourceType}_${secret}_${value}`,
227
- `= dependency.${secret}.outputs.${value}`
228
- )
229
- );
230
- });
231
- secrets.push(secretsSet.join(""));
232
- });
233
- return secrets.join("");
234
- }
235
- updateState() {
236
- fs.writeFileSync(
237
- path2.join(this.secretsDir, "state.json"),
238
- JSON.stringify(this.stateNames, null, 2)
239
- );
240
- }
241
- createTemplate() {
242
- const dependencies = this.buildDependencies().join("");
243
- const secrets = this.buildSecrets();
244
- this.updateState();
245
- this.copyDir(path2.join(this.instanceType, "secrets"), this.secretsDir, {
246
- ...this.answers,
247
- dependencies,
248
- secrets
249
- });
250
- }
251
- };
252
- }
253
- });
1
+ const path = require('path');
2
+ const SecretsGenerator = require('../../../src/SecretsGenerator');
3
+ const getTribeAndClanName = require('../../init/clan-infra/tribe-clan-repo');
254
4
 
255
- // generators/init/clan-infra/tribe-clan-repo.js
256
- var require_tribe_clan_repo = __commonJS({
257
- "generators/init/clan-infra/tribe-clan-repo.js"(exports2, module2) {
258
- var path2 = require("path");
259
- var fs = require("fs");
260
- var getKeyValue = /* @__PURE__ */ __name((content, key) => {
261
- let value = "";
262
- content.split(/\r?\n/).forEach((line) => {
263
- if (line.includes(key)) {
264
- value = line.split("=")[1].replace('"', "").replace('"', "").trim();
265
- }
266
- });
267
- return value;
268
- }, "getKeyValue");
269
- var getTribeAndClanName2 = /* @__PURE__ */ __name(() => {
270
- const repoName = path2.basename(path2.resolve());
271
- const isClanInfraRepo = /^(?:\w+-){2}common(?:$|\W)$/.test(repoName);
272
- let tribe = "";
273
- let clan = "";
274
- if (isClanInfraRepo) {
275
- [tribe, clan] = repoName.split("-");
276
- } else {
277
- const commonHCL = path2.join("infra", "common.hcl");
278
- if (fs.existsSync(commonHCL)) {
279
- const commonHCLContent = fs.readFileSync(commonHCL, "utf8");
280
- tribe = getKeyValue(commonHCLContent, "tribe_name");
281
- clan = getKeyValue(commonHCLContent, "clan_name");
282
- }
283
- }
284
- return {
285
- tribe,
286
- clan
287
- };
288
- }, "getTribeAndClanName");
289
- module2.exports = getTribeAndClanName2;
290
- }
291
- });
292
-
293
- // generators/common-resources/memorystore/index.js
294
- var path = require("path");
295
- var SecretsGenerator = require_SecretsGenerator();
296
- var getTribeAndClanName = require_tribe_clan_repo();
297
5
  module.exports = class extends SecretsGenerator {
298
6
  prompting() {
299
7
  const choices = [
300
8
  {
301
- name: "BASIC - standalone instance",
302
- value: "BASIC"
9
+ name: 'BASIC - standalone instance',
10
+ value: 'BASIC',
303
11
  },
304
12
  {
305
- name: "STANDARD_HA - highly available primary/replica instances",
306
- value: "STANDARD_HA"
307
- }
13
+ name: 'STANDARD_HA - highly available primary/replica instances',
14
+ value: 'STANDARD_HA',
15
+ },
308
16
  ];
17
+
309
18
  const prompts = [
310
19
  {
311
- type: "input",
312
- name: "name",
20
+ type: 'input',
21
+ name: 'name',
313
22
  default: getTribeAndClanName().clan,
314
- message: "Enter your service name or leave blank for common instance"
23
+ message: 'Enter your service name or leave blank for common instance',
315
24
  },
316
25
  {
317
- type: "list",
318
- name: "stagingTier",
319
- default: "BASIC",
320
- message: "Select the service tier for the staging environment",
321
- choices
26
+ type: 'list',
27
+ name: 'stagingTier',
28
+ default: 'BASIC',
29
+ message: 'Select the service tier for the staging environment',
30
+ choices,
322
31
  },
323
32
  {
324
- type: "list",
325
- name: "prodTier",
326
- default: "STANDARD_HA",
327
- message: "Select the service tier for the production environment",
328
- choices
329
- }
33
+ type: 'list',
34
+ name: 'prodTier',
35
+ default: 'STANDARD_HA',
36
+ message: 'Select the service tier for the production environment',
37
+ choices,
38
+ },
330
39
  ];
40
+
331
41
  return this.prompt(prompts).then((props) => {
332
42
  this.answers = props;
333
43
  });
334
44
  }
45
+
335
46
  writing() {
336
47
  const { name, stagingTier, prodTier } = this.answers;
337
- const selectTier = /* @__PURE__ */ __name((env, tier) => {
48
+
49
+ const selectTier = (env, tier) => {
338
50
  this.copyDir(
339
- "redis-instance",
51
+ 'redis-instance',
340
52
  path.join(
341
- "infra",
53
+ 'infra',
342
54
  env,
343
- "memorystore",
344
- name === "" ? "redis-instance" : name
55
+ 'memorystore',
56
+ name === '' ? 'redis-instance' : name,
345
57
  ),
346
58
  {
347
59
  env,
348
- tier
349
- }
60
+ tier,
61
+ },
350
62
  );
351
- }, "selectTier");
352
- selectTier("prod", prodTier);
353
- selectTier("staging", stagingTier);
63
+ };
64
+
65
+ selectTier('prod', prodTier);
66
+ selectTier('staging', stagingTier);
67
+
354
68
  this.writeSecrets(
355
- "memorystore",
356
- "",
357
- "",
358
- name === "" ? "redis-instance" : name
69
+ 'memorystore',
70
+ '',
71
+ '',
72
+ name === '' ? 'redis-instance' : name,
359
73
  );
360
74
  }
361
75
  };
@@ -0,0 +1,49 @@
1
+ const ejs = require('ejs');
2
+
3
+ function cleanAlerts(alerts) {
4
+ const copy = [...alerts];
5
+ return copy.map((obj) => {
6
+ if ('enabled' in obj && obj.enabled === true) {
7
+ delete obj.enabled;
8
+ }
9
+ return obj;
10
+ });
11
+ }
12
+
13
+ const handleAlert = (templates, answers) => {
14
+ const alerts = [];
15
+
16
+ Object.entries(templates).forEach(([, template]) => {
17
+ const newAlert = JSON.parse(ejs.render(JSON.stringify(template), answers));
18
+ alerts.push(newAlert);
19
+ });
20
+
21
+ const cleanedAlerts = cleanAlerts(alerts);
22
+
23
+ return Array.isArray(cleanedAlerts) ? cleanedAlerts : [cleanedAlerts];
24
+ };
25
+
26
+ const handleAlerts = (alerts, templates, answers) => {
27
+ const newAlertsList = [];
28
+
29
+ const newAlerts = handleAlert(templates, answers);
30
+
31
+ newAlertsList.push(...newAlerts);
32
+ return newAlertsList;
33
+ };
34
+
35
+ const handleUptimeChecks = (slos, templates, answers) => {
36
+ const newUptimeCheck = JSON.parse(
37
+ ejs.render(JSON.stringify(templates), answers),
38
+ );
39
+
40
+ slos.push(newUptimeCheck);
41
+ return slos;
42
+ };
43
+
44
+ module.exports = {
45
+ handleAlert,
46
+ handleAlerts,
47
+ handleUptimeChecks,
48
+ cleanAlerts,
49
+ };