@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.
- package/dist/generators/clan-resources/clan-project/index.js +89 -189
- package/dist/generators/common-resources/bigquery/index.js +172 -267
- package/dist/generators/common-resources/budget/index.js +67 -153
- package/dist/generators/common-resources/cloud-armor/index.js +17 -167
- package/dist/generators/common-resources/cloud-storage/index.js +96 -205
- package/dist/generators/common-resources/cloudsql/index.js +71 -177
- package/dist/generators/common-resources/cloudsql-database/index.js +40 -287
- package/dist/generators/common-resources/confluent-cluster/index.js +23 -132
- package/dist/generators/common-resources/datastore/index.js +48 -194
- package/dist/generators/common-resources/elastic-cloud/index.js +22 -132
- package/dist/generators/common-resources/elastic-index-policy/handle-yaml.js +76 -0
- package/dist/generators/common-resources/elastic-index-policy/index.js +131 -286
- package/dist/generators/common-resources/elastic-template/index.js +52 -162
- package/dist/generators/common-resources/firestore/index.js +93 -233
- package/dist/generators/common-resources/iam/index.js +35 -157
- package/dist/generators/common-resources/iam/valid-prefix.js +8 -0
- package/dist/generators/common-resources/kafka-connect/index.js +35 -144
- package/dist/generators/common-resources/kafka-topics/index.js +20 -129
- package/dist/generators/common-resources/kms/index.js +31 -141
- package/dist/generators/common-resources/memorystore/index.js +42 -328
- package/dist/generators/common-resources/monitoring/handle-yaml.js +49 -0
- package/dist/generators/common-resources/monitoring/index.js +144 -322
- package/dist/generators/common-resources/monitoring/templates/alerts/generic-infra.yaml +37 -2
- package/dist/generators/common-resources/monitoring/validate.js +58 -0
- package/dist/generators/common-resources/pubsub/append.js +130 -0
- package/dist/generators/common-resources/pubsub/get-gcp-projects.js +34 -0
- package/dist/generators/common-resources/pubsub/handle-subscribers.js +68 -0
- package/dist/generators/common-resources/pubsub/index.js +194 -536
- package/dist/generators/common-resources/pubsub/validate.js +53 -0
- package/dist/generators/common-resources/scheduler/append.js +85 -0
- package/dist/generators/common-resources/scheduler/index.js +62 -249
- package/dist/generators/common-resources/spanner/append.js +31 -0
- package/dist/generators/common-resources/spanner/index.js +102 -269
- package/dist/generators/common-resources/spanner/validate.js +38 -0
- package/dist/generators/docs/rca/index.js +25 -135
- package/dist/generators/docs/runbook/index.js +16 -126
- package/dist/generators/docs/srb/index.js +33 -147
- package/dist/generators/docs/srb/run-docker.js +2 -0
- package/dist/generators/init/clan-infra/gcp-projects.js +47 -0
- package/dist/generators/init/clan-infra/index.js +95 -290
- package/dist/generators/init/clan-infra/tribe-clan-repo.js +38 -0
- package/dist/generators/init/clan-infra/validate.js +8 -0
- package/dist/generators/maintenance/manage-states/index.js +142 -219
- package/dist/generators/maintenance/update-modules/index.js +56 -155
- package/dist/generators/organization/clan-project/googlecloud.js +124 -0
- package/dist/generators/organization/clan-project/index.js +81 -303
- package/dist/node_modules/.package-lock.json +88 -31
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/bucket.js +5 -5
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.d.ts +1 -0
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.js +10 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/storage.js +1 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.d.ts +4 -4
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.js +4 -4
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.d.ts +1 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.js +2 -2
- package/dist/node_modules/@google-cloud/storage/build/esm/src/bucket.js +5 -5
- package/dist/node_modules/@google-cloud/storage/build/esm/src/file.d.ts +1 -0
- package/dist/node_modules/@google-cloud/storage/build/esm/src/file.js +10 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/storage.js +1 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.d.ts +4 -4
- package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.js +4 -4
- package/dist/node_modules/@google-cloud/storage/build/esm/src/util.d.ts +1 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/util.js +2 -2
- package/dist/node_modules/@google-cloud/storage/package.json +5 -5
- package/dist/package.json +45 -0
- package/dist/src/BaseGenerator.js +84 -0
- package/dist/src/SecretsGenerator.js +137 -0
- package/dist/src/cli.js +54 -255
- package/dist/src/dependency-check.js +48 -0
- package/dist/src/update-check.js +38 -0
- package/dist/src/validators.js +33 -0
- package/dist/src/yeoman.js +80 -0
- package/package.json +2 -3
- package/dist/node_modules/@google-cloud/storage/CHANGELOG.md +0 -1769
|
@@ -1,171 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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:
|
|
125
|
-
name:
|
|
126
|
-
message:
|
|
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:
|
|
131
|
-
name:
|
|
132
|
-
message:
|
|
133
|
-
default:
|
|
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:
|
|
138
|
-
name:
|
|
139
|
-
message:
|
|
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
|
-
|
|
150
|
-
|
|
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(
|
|
161
|
-
const specProdFile = path.join(
|
|
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(
|
|
166
|
-
\u2192 ${chalk.cyan(path.join(specStageFile,
|
|
167
|
-
\u2192 ${chalk.cyan(path.join(specProdFile,
|
|
168
|
-
${chalk.green(
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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:
|
|
302
|
-
value:
|
|
9
|
+
name: 'BASIC - standalone instance',
|
|
10
|
+
value: 'BASIC',
|
|
303
11
|
},
|
|
304
12
|
{
|
|
305
|
-
name:
|
|
306
|
-
value:
|
|
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:
|
|
312
|
-
name:
|
|
20
|
+
type: 'input',
|
|
21
|
+
name: 'name',
|
|
313
22
|
default: getTribeAndClanName().clan,
|
|
314
|
-
message:
|
|
23
|
+
message: 'Enter your service name or leave blank for common instance',
|
|
315
24
|
},
|
|
316
25
|
{
|
|
317
|
-
type:
|
|
318
|
-
name:
|
|
319
|
-
default:
|
|
320
|
-
message:
|
|
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:
|
|
325
|
-
name:
|
|
326
|
-
default:
|
|
327
|
-
message:
|
|
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
|
-
|
|
48
|
+
|
|
49
|
+
const selectTier = (env, tier) => {
|
|
338
50
|
this.copyDir(
|
|
339
|
-
|
|
51
|
+
'redis-instance',
|
|
340
52
|
path.join(
|
|
341
|
-
|
|
53
|
+
'infra',
|
|
342
54
|
env,
|
|
343
|
-
|
|
344
|
-
name ===
|
|
55
|
+
'memorystore',
|
|
56
|
+
name === '' ? 'redis-instance' : name,
|
|
345
57
|
),
|
|
346
58
|
{
|
|
347
59
|
env,
|
|
348
|
-
tier
|
|
349
|
-
}
|
|
60
|
+
tier,
|
|
61
|
+
},
|
|
350
62
|
);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
selectTier(
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
selectTier('prod', prodTier);
|
|
66
|
+
selectTier('staging', stagingTier);
|
|
67
|
+
|
|
354
68
|
this.writeSecrets(
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
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
|
+
};
|