@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.
- 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/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 +81 -23
- 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 +1 -2
|
@@ -1,327 +1,80 @@
|
|
|
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
|
-
});
|
|
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 chalk2 = 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
|
-
`${chalk2.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 chalk = require('chalk');
|
|
3
|
+
const { required } = require('../../../src/validators');
|
|
4
|
+
const SecretsGenerator = require('../../../src/SecretsGenerator');
|
|
254
5
|
|
|
255
|
-
// generators/common-resources/cloudsql-database/index.js
|
|
256
|
-
var path = require("path");
|
|
257
|
-
var chalk = require("chalk");
|
|
258
|
-
var { required } = require_validators();
|
|
259
|
-
var SecretsGenerator = require_SecretsGenerator();
|
|
260
6
|
module.exports = class extends SecretsGenerator {
|
|
261
7
|
prompting() {
|
|
262
8
|
const prompts = [
|
|
263
9
|
{
|
|
264
|
-
type:
|
|
265
|
-
name:
|
|
266
|
-
message:
|
|
267
|
-
default:
|
|
268
|
-
choices: [
|
|
10
|
+
type: 'list',
|
|
11
|
+
name: 'instanceType',
|
|
12
|
+
message: 'Select Cloud SQL database instance type',
|
|
13
|
+
default: 'postgres',
|
|
14
|
+
choices: ['postgres', 'mysql'],
|
|
269
15
|
},
|
|
270
16
|
{
|
|
271
|
-
type:
|
|
272
|
-
name:
|
|
17
|
+
type: 'input',
|
|
18
|
+
name: 'dbName',
|
|
273
19
|
validate: required,
|
|
274
|
-
message:
|
|
275
|
-
}
|
|
20
|
+
message: 'Enter the name of the service of the database be created for',
|
|
21
|
+
},
|
|
276
22
|
];
|
|
23
|
+
|
|
277
24
|
return this.prompt(prompts).then((props) => {
|
|
278
25
|
this.answers = props;
|
|
279
26
|
});
|
|
280
27
|
}
|
|
28
|
+
|
|
281
29
|
writing() {
|
|
282
30
|
const { instanceType, dbName } = this.answers;
|
|
283
|
-
|
|
31
|
+
|
|
32
|
+
// CloudSQL Database
|
|
33
|
+
['prod', 'staging'].forEach((env) => {
|
|
284
34
|
const randomPort = Math.floor(Math.random() * (65535 - 49152)) + 49152;
|
|
285
35
|
this.copyDir(
|
|
286
|
-
path.join(instanceType,
|
|
287
|
-
path.join(
|
|
36
|
+
path.join(instanceType, 'database'),
|
|
37
|
+
path.join('infra', env, 'cloud-sql', instanceType, 'databases', dbName),
|
|
288
38
|
{
|
|
289
39
|
...this.answers,
|
|
290
40
|
env,
|
|
291
|
-
randomPort
|
|
292
|
-
}
|
|
41
|
+
randomPort,
|
|
42
|
+
},
|
|
293
43
|
);
|
|
294
44
|
});
|
|
295
|
-
|
|
45
|
+
|
|
46
|
+
this.writeSecrets('cloud-sql', 'databases', instanceType, dbName);
|
|
296
47
|
}
|
|
48
|
+
|
|
297
49
|
end() {
|
|
298
50
|
const { instanceType, dbName } = this.answers;
|
|
51
|
+
|
|
299
52
|
const specStageFile = path.join(
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
53
|
+
'infra',
|
|
54
|
+
'staging',
|
|
55
|
+
'cloud-sql',
|
|
303
56
|
instanceType,
|
|
304
|
-
|
|
57
|
+
'databases',
|
|
305
58
|
dbName,
|
|
306
|
-
|
|
59
|
+
'spec.hcl',
|
|
307
60
|
);
|
|
308
61
|
const specProdFile = path.join(
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
62
|
+
'infra',
|
|
63
|
+
'prod',
|
|
64
|
+
'cloud-sql',
|
|
312
65
|
instanceType,
|
|
313
|
-
|
|
66
|
+
'databases',
|
|
314
67
|
dbName,
|
|
315
|
-
|
|
68
|
+
'spec.hcl',
|
|
316
69
|
);
|
|
70
|
+
|
|
317
71
|
this.log(`
|
|
318
|
-
${chalk.green(`Your CloudSQL ${instanceType} database ${chalk.cyan(dbName)} have now been created. To finalize your
|
|
319
|
-
iguration, please continue
|
|
72
|
+
${chalk.green(`Your CloudSQL ${instanceType} database ${chalk.cyan(dbName)} have now been created. To finalize your configuration, please continue
|
|
320
73
|
with manual editing of the generated files.`)}
|
|
321
|
-
${chalk.green(
|
|
74
|
+
${chalk.green('1.')} Review and change specs if needed.
|
|
322
75
|
\u2192 ${chalk.cyan(specStageFile)}
|
|
323
76
|
\u2192 ${chalk.cyan(specProdFile)}
|
|
324
|
-
${chalk.green(
|
|
77
|
+
${chalk.green('2.')} Push this change in a feature branch and open a pull request.
|
|
325
78
|
`);
|
|
326
79
|
}
|
|
327
80
|
};
|
|
@@ -1,156 +1,47 @@
|
|
|
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/confluent-cluster/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
|
-
|
|
128
|
-
|
|
10
|
+
type: 'input',
|
|
11
|
+
name: 'clusterName',
|
|
12
|
+
message:
|
|
13
|
+
'Please provide the cluster name (clan_name and env will be added after the provided name)',
|
|
14
|
+
validate: required,
|
|
15
|
+
},
|
|
129
16
|
];
|
|
17
|
+
|
|
130
18
|
return this.prompt(prompts).then((props) => {
|
|
131
19
|
this.answers = props;
|
|
132
20
|
});
|
|
133
21
|
}
|
|
22
|
+
|
|
134
23
|
writing() {
|
|
135
24
|
const { clusterName } = this.answers;
|
|
136
|
-
|
|
137
|
-
|
|
25
|
+
|
|
26
|
+
['prod', 'staging'].forEach((env) => {
|
|
27
|
+
this.copyDir('confluent', path.join('infra', env, 'confluent'), {
|
|
138
28
|
...this.answers,
|
|
139
29
|
env,
|
|
140
|
-
clusterName
|
|
30
|
+
clusterName,
|
|
141
31
|
});
|
|
142
32
|
});
|
|
143
33
|
}
|
|
34
|
+
|
|
144
35
|
end() {
|
|
145
|
-
const specStageFile = path.join(
|
|
146
|
-
const specProdFile = path.join(
|
|
36
|
+
const specStageFile = path.join('infra', 'staging', 'confluent');
|
|
37
|
+
const specProdFile = path.join('infra', 'prod', 'confluent');
|
|
147
38
|
this.log(`
|
|
148
39
|
${chalk.green(`Your Confluent clusters have now been created. To finalize your configuration, please continue
|
|
149
40
|
with manual editing of the generated files.`)}
|
|
150
|
-
${chalk.green(
|
|
151
|
-
\u2192 ${chalk.cyan(path.join(specStageFile,
|
|
152
|
-
\u2192 ${chalk.cyan(path.join(specProdFile,
|
|
153
|
-
${chalk.green(
|
|
41
|
+
${chalk.green('1.')} Review Confluent configuration
|
|
42
|
+
\u2192 ${chalk.cyan(path.join(specStageFile, 'spec.hcl'))}
|
|
43
|
+
\u2192 ${chalk.cyan(path.join(specProdFile, 'spec.hcl'))}
|
|
44
|
+
${chalk.green('2.')} Push this change in a feature branch and open a pull request.
|
|
154
45
|
`);
|
|
155
46
|
}
|
|
156
47
|
};
|