@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,147 +1,37 @@
|
|
|
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/docs/runbook/index.js
|
|
116
|
-
var path = require("path");
|
|
117
|
-
var chalk = require("chalk");
|
|
118
|
-
var BaseGenerator = require_BaseGenerator();
|
|
119
|
-
var { required } = require_validators();
|
|
120
6
|
module.exports = class extends BaseGenerator {
|
|
121
7
|
prompting() {
|
|
122
8
|
const prompts = [
|
|
123
9
|
{
|
|
124
|
-
type:
|
|
125
|
-
name:
|
|
126
|
-
message:
|
|
127
|
-
validate: required
|
|
128
|
-
}
|
|
10
|
+
type: 'input',
|
|
11
|
+
name: 'system',
|
|
12
|
+
message: 'Name of the software system',
|
|
13
|
+
validate: required,
|
|
14
|
+
},
|
|
129
15
|
];
|
|
16
|
+
|
|
130
17
|
return this.prompt(prompts).then((props) => {
|
|
131
18
|
this.answers = props;
|
|
132
19
|
});
|
|
133
20
|
}
|
|
21
|
+
|
|
134
22
|
writing() {
|
|
135
23
|
const { system } = this.answers;
|
|
136
24
|
const filename = this.kebabCase(system.toLowerCase());
|
|
137
|
-
|
|
25
|
+
|
|
26
|
+
this.copyDir('docs', this.destinationPath(path.join('docs', filename)), {
|
|
138
27
|
...this.answers,
|
|
139
|
-
c4System: system.replace(/\s/g,
|
|
28
|
+
c4System: system.replace(/\s/g, ''),
|
|
140
29
|
});
|
|
141
30
|
}
|
|
31
|
+
|
|
142
32
|
end() {
|
|
143
33
|
this.log(`
|
|
144
|
-
${chalk.green(
|
|
34
|
+
${chalk.green('Your Runbook documentation template have now been created.')}
|
|
145
35
|
Next, push this change in a feature branch and open a pull request.
|
|
146
36
|
`);
|
|
147
37
|
}
|
|
@@ -1,182 +1,68 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
// src/validators.js
|
|
9
|
-
var require_validators = __commonJS({
|
|
10
|
-
"src/validators.js"(exports2, module2) {
|
|
11
|
-
var path2 = require("path");
|
|
12
|
-
module2.exports = {
|
|
13
|
-
chain: /* @__PURE__ */ __name((input, ...validators) => {
|
|
14
|
-
let msg = "";
|
|
15
|
-
validators.every((validator) => {
|
|
16
|
-
msg = validator(input);
|
|
17
|
-
return msg === true;
|
|
18
|
-
});
|
|
19
|
-
return msg === true ? true : msg;
|
|
20
|
-
}, "chain"),
|
|
21
|
-
filename: /* @__PURE__ */ __name((input) => {
|
|
22
|
-
if (!input) {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
return path2.basename(input) === input ? true : "Invalid filename";
|
|
26
|
-
}, "filename"),
|
|
27
|
-
maxLength: /* @__PURE__ */ __name((input, maxLength) => !input || input.length <= maxLength ? true : `Exceeds max \
|
|
28
|
-
length: ${maxLength}`, "maxLength"),
|
|
29
|
-
required: /* @__PURE__ */ __name((input) => {
|
|
30
|
-
const msg = "Required";
|
|
31
|
-
if (Array.isArray(input)) {
|
|
32
|
-
return input.length > 0 ? true : msg;
|
|
33
|
-
}
|
|
34
|
-
if (input) {
|
|
35
|
-
return input.trim().length > 0 ? true : msg;
|
|
36
|
-
}
|
|
37
|
-
return msg;
|
|
38
|
-
}, "required")
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// src/BaseGenerator.js
|
|
44
|
-
var require_BaseGenerator = __commonJS({
|
|
45
|
-
"src/BaseGenerator.js"(exports2, module2) {
|
|
46
|
-
var Generator = require("yeoman-generator");
|
|
47
|
-
var path2 = require("path");
|
|
48
|
-
var fs = require("fs");
|
|
49
|
-
var inquirer = require("inquirer");
|
|
50
|
-
var { chain, required: required2, filename } = require_validators();
|
|
51
|
-
module2.exports = class extends Generator {
|
|
52
|
-
constructor(args, opts) {
|
|
53
|
-
super(args, opts);
|
|
54
|
-
this.baseDir = path2.resolve(path2.join(__dirname, ".."));
|
|
55
|
-
this.destinationRoot(process.cwd());
|
|
56
|
-
const [command, generator] = opts.namespace.split(":").slice(-2);
|
|
57
|
-
this.generatorId = path2.join(command, generator);
|
|
58
|
-
this.sourceRoot(
|
|
59
|
-
path2.join(this.baseDir, "generators", this.generatorId, "templates")
|
|
60
|
-
);
|
|
61
|
-
this.copyDir = (templateDir, targetDir, answers = this.answers, skipIfExists = false) => {
|
|
62
|
-
if (skipIfExists && fs.existsSync(targetDir)) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this.fs.copyTpl(
|
|
66
|
-
this.templatePath(`${templateDir}/**/*`),
|
|
67
|
-
this.destinationPath(targetDir),
|
|
68
|
-
answers
|
|
69
|
-
);
|
|
70
|
-
};
|
|
71
|
-
this.listSubDirectories = (parent) => fs.readdirSync(parent).filter((f) => !f.startsWith(".")).filter((f) => fs.
|
|
72
|
-
lstatSync(path2.join(parent, f)).isDirectory()).sort((a, b) => a.localeCompare(b));
|
|
73
|
-
this.kebabCase = (input) => input.replace(/\s|_/g, "-");
|
|
74
|
-
this.chooseOrCreatePrompts = (name, getChoicesDirectory) => [
|
|
75
|
-
{
|
|
76
|
-
when: /* @__PURE__ */ __name((answers) => fs.existsSync(getChoicesDirectory(answers)), "when"),
|
|
77
|
-
type: "list",
|
|
78
|
-
name,
|
|
79
|
-
message: `Choose ${name}`,
|
|
80
|
-
store: true,
|
|
81
|
-
choices: /* @__PURE__ */ __name((answers) => [
|
|
82
|
-
...this.listSubDirectories(getChoicesDirectory(answers)),
|
|
83
|
-
new inquirer.Separator(),
|
|
84
|
-
`Create new ${name}`
|
|
85
|
-
], "choices"),
|
|
86
|
-
validate: required2,
|
|
87
|
-
filter: this.kebabCase
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === `\
|
|
91
|
-
Create-new-${name}`, "when"),
|
|
92
|
-
type: "input",
|
|
93
|
-
name: `new-${name}`,
|
|
94
|
-
message: `New ${name} name`,
|
|
95
|
-
store: false,
|
|
96
|
-
validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
|
|
97
|
-
filter: this.kebabCase
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === "\
|
|
101
|
-
Create-new-tribe", "when"),
|
|
102
|
-
type: "input",
|
|
103
|
-
name: "costCenter",
|
|
104
|
-
message: "Please provide the Cost Center of the Tribe",
|
|
105
|
-
store: false,
|
|
106
|
-
validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
|
|
107
|
-
filter: this.kebabCase
|
|
108
|
-
}
|
|
109
|
-
];
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// generators/docs/srb/run-docker.js
|
|
116
|
-
var require_run_docker = __commonJS({
|
|
117
|
-
"generators/docs/srb/run-docker.js"(exports2, module2) {
|
|
118
|
-
module2.exports = (spawnCommandSync, args) => spawnCommandSync("docker", args, { encoding: "utf8" });
|
|
119
|
-
}
|
|
120
|
-
});
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const BaseGenerator = require('../../../src/BaseGenerator');
|
|
4
|
+
const { required } = require('../../../src/validators');
|
|
5
|
+
const runDocker = require('./run-docker');
|
|
121
6
|
|
|
122
|
-
// generators/docs/srb/index.js
|
|
123
|
-
var path = require("path");
|
|
124
|
-
var chalk = require("chalk");
|
|
125
|
-
var BaseGenerator = require_BaseGenerator();
|
|
126
|
-
var { required } = require_validators();
|
|
127
|
-
var runDocker = require_run_docker();
|
|
128
7
|
module.exports = class extends BaseGenerator {
|
|
129
8
|
prompting() {
|
|
130
9
|
const prompts = [
|
|
131
10
|
{
|
|
132
|
-
type:
|
|
133
|
-
name:
|
|
134
|
-
message:
|
|
135
|
-
validate: required
|
|
136
|
-
}
|
|
11
|
+
type: 'input',
|
|
12
|
+
name: 'system',
|
|
13
|
+
message: 'Name of the software system',
|
|
14
|
+
validate: required,
|
|
15
|
+
},
|
|
137
16
|
];
|
|
17
|
+
|
|
138
18
|
return this.prompt(prompts).then((props) => {
|
|
139
19
|
this.answers = props;
|
|
140
20
|
});
|
|
141
21
|
}
|
|
22
|
+
|
|
142
23
|
writing() {
|
|
143
24
|
const { system } = this.answers;
|
|
144
25
|
const filename = this.kebabCase(system.toLowerCase());
|
|
145
|
-
|
|
26
|
+
|
|
27
|
+
this.copyDir('docs', this.destinationPath(path.join('docs', filename)), {
|
|
146
28
|
...this.answers,
|
|
147
|
-
c4System: system.replace(/\s/g,
|
|
29
|
+
c4System: system.replace(/\s/g, ''),
|
|
148
30
|
});
|
|
31
|
+
|
|
149
32
|
this.fs.copyTpl(
|
|
150
|
-
this.templatePath(
|
|
151
|
-
this.destinationPath(
|
|
152
|
-
this.answers
|
|
33
|
+
this.templatePath('sample.dsl'),
|
|
34
|
+
this.destinationPath('docs', filename, `${filename}.dsl`),
|
|
35
|
+
this.answers,
|
|
153
36
|
);
|
|
154
37
|
}
|
|
38
|
+
|
|
155
39
|
install() {
|
|
156
40
|
const { system } = this.answers;
|
|
157
41
|
const filename = this.kebabCase(system.toLowerCase());
|
|
158
42
|
const baseArgs = [
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
`${this.destinationPath(
|
|
43
|
+
'run',
|
|
44
|
+
'--pull=always',
|
|
45
|
+
'--rm',
|
|
46
|
+
'-t',
|
|
47
|
+
'-v',
|
|
48
|
+
`${this.destinationPath('docs', filename)}:/docs`,
|
|
165
49
|
];
|
|
166
50
|
runDocker(this.spawnCommandSync, [
|
|
167
51
|
...baseArgs,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
52
|
+
'extenda/adr-tools',
|
|
53
|
+
'init',
|
|
54
|
+
'adr',
|
|
171
55
|
]);
|
|
56
|
+
|
|
172
57
|
runDocker(this.spawnCommandSync, [
|
|
173
58
|
...baseArgs,
|
|
174
|
-
|
|
59
|
+
'extenda/structurizr-to-png',
|
|
175
60
|
]);
|
|
176
61
|
}
|
|
62
|
+
|
|
177
63
|
end() {
|
|
178
64
|
this.log(`
|
|
179
|
-
${chalk.green(
|
|
65
|
+
${chalk.green('Your system documentation stubs have now been created.')}
|
|
180
66
|
Next, push this change in a feature branch and open a pull request.
|
|
181
67
|
`);
|
|
182
68
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const gcpProjects = {};
|
|
2
|
+
|
|
3
|
+
const getGcpProjects = ({ spawnCommandSync }, name) => {
|
|
4
|
+
let projects = gcpProjects[name];
|
|
5
|
+
|
|
6
|
+
if (!projects) {
|
|
7
|
+
const result = spawnCommandSync(
|
|
8
|
+
'gcloud',
|
|
9
|
+
[
|
|
10
|
+
'projects',
|
|
11
|
+
'list',
|
|
12
|
+
`--filter=NAME~${name}`,
|
|
13
|
+
'--format=value(PROJECT_ID)',
|
|
14
|
+
],
|
|
15
|
+
{ encoding: 'utf8', stdio: 'pipe' },
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
if (result.status !== 0) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
"gcloud error. Please run 'gcloud auth application-defaults login' and try again.",
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
projects = result.stdout
|
|
24
|
+
.split(/\s+/)
|
|
25
|
+
.filter((line) => line.trim().length > 0)
|
|
26
|
+
.sort();
|
|
27
|
+
gcpProjects[name] = projects;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return projects;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const validateGcpProjects = ({ spawnCommandSync }, name) => {
|
|
34
|
+
try {
|
|
35
|
+
const projects = getGcpProjects({ spawnCommandSync }, name);
|
|
36
|
+
return projects.length > 0
|
|
37
|
+
? true
|
|
38
|
+
: 'Invalid input. No matching GCP project(s) found.';
|
|
39
|
+
} catch (err) {
|
|
40
|
+
return err.message;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
module.exports = {
|
|
45
|
+
getGcpProjects,
|
|
46
|
+
validateGcpProjects,
|
|
47
|
+
};
|