@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,306 +1,207 @@
|
|
|
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
|
-
});
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const { required } = require('../../../src/validators');
|
|
4
|
+
const BaseGenerator = require('../../../src/BaseGenerator');
|
|
42
5
|
|
|
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/common-resources/bigquery/index.js
|
|
116
|
-
var path = require("path");
|
|
117
|
-
var chalk = require("chalk");
|
|
118
|
-
var { required } = require_validators();
|
|
119
|
-
var BaseGenerator = require_BaseGenerator();
|
|
120
6
|
module.exports = class extends BaseGenerator {
|
|
121
7
|
prompting() {
|
|
122
8
|
const prompts = [
|
|
123
9
|
{
|
|
124
|
-
type:
|
|
125
|
-
name:
|
|
126
|
-
message:
|
|
127
|
-
default:
|
|
128
|
-
choices: [
|
|
10
|
+
type: 'list',
|
|
11
|
+
name: 'resourceType',
|
|
12
|
+
message: 'Select type of resource you want to create',
|
|
13
|
+
default: 'datasets',
|
|
14
|
+
choices: ['scheduledQueries', 'datasets'],
|
|
129
15
|
},
|
|
130
16
|
{
|
|
131
|
-
when:
|
|
132
|
-
type:
|
|
133
|
-
name:
|
|
134
|
-
message:
|
|
135
|
-
validate: required
|
|
17
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
18
|
+
type: 'input',
|
|
19
|
+
name: 'queryName',
|
|
20
|
+
message: 'Please provide the name for the transfer config',
|
|
21
|
+
validate: required,
|
|
136
22
|
},
|
|
137
23
|
{
|
|
138
|
-
when:
|
|
139
|
-
type:
|
|
140
|
-
name:
|
|
141
|
-
message:
|
|
142
|
-
|
|
24
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
25
|
+
type: 'input',
|
|
26
|
+
name: 'dataSourceId',
|
|
27
|
+
message:
|
|
28
|
+
'Please provide the data source id. Cannot be changed once the transfer config is created.',
|
|
29
|
+
validate: required,
|
|
143
30
|
},
|
|
144
31
|
{
|
|
145
|
-
when:
|
|
146
|
-
type:
|
|
147
|
-
name:
|
|
148
|
-
message:
|
|
32
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
33
|
+
type: 'input',
|
|
34
|
+
name: 'destinationDatasetId',
|
|
35
|
+
message:
|
|
36
|
+
'Please provide the BigQuery target dataset id. Leave empty to specify later',
|
|
149
37
|
},
|
|
150
38
|
{
|
|
151
|
-
when:
|
|
152
|
-
type:
|
|
153
|
-
name:
|
|
154
|
-
message:
|
|
155
|
-
|
|
156
|
-
validate: required
|
|
39
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
40
|
+
type: 'input',
|
|
41
|
+
name: 'schedule',
|
|
42
|
+
message:
|
|
43
|
+
'Please provide the data transfer schedule. Format here: https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format',
|
|
44
|
+
validate: required,
|
|
157
45
|
},
|
|
158
46
|
{
|
|
159
|
-
when:
|
|
160
|
-
type:
|
|
161
|
-
name:
|
|
162
|
-
message:
|
|
163
|
-
|
|
47
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
48
|
+
type: 'input',
|
|
49
|
+
name: 'notificationPubsubTopic',
|
|
50
|
+
message:
|
|
51
|
+
'Please provide Pub/Sub topic full name where notifications will be sent after transfer finish. Leave empty to specify later',
|
|
164
52
|
},
|
|
165
53
|
{
|
|
166
|
-
when:
|
|
167
|
-
type:
|
|
168
|
-
name:
|
|
169
|
-
message:
|
|
170
|
-
|
|
54
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
55
|
+
type: 'input',
|
|
56
|
+
name: 'dataRefreshWindow',
|
|
57
|
+
message:
|
|
58
|
+
'Please provide the number of days to look back to automatically refresh the data. Leave empty to specify later',
|
|
171
59
|
},
|
|
172
60
|
{
|
|
173
|
-
when:
|
|
174
|
-
type:
|
|
175
|
-
name:
|
|
176
|
-
message:
|
|
177
|
-
|
|
178
|
-
default:
|
|
179
|
-
choices: [
|
|
61
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
62
|
+
type: 'list',
|
|
63
|
+
name: 'enableFailureEmail',
|
|
64
|
+
message:
|
|
65
|
+
'Select if you want to enable notifications to be sent to the email address of the user who owns this transfer config if the run fails',
|
|
66
|
+
default: 'false',
|
|
67
|
+
choices: ['false', 'true'],
|
|
180
68
|
},
|
|
181
69
|
{
|
|
182
|
-
when:
|
|
183
|
-
type:
|
|
184
|
-
name:
|
|
185
|
-
message:
|
|
186
|
-
|
|
70
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
71
|
+
type: 'input',
|
|
72
|
+
name: 'dataPathTemplate',
|
|
73
|
+
message:
|
|
74
|
+
'Please provide the Cloud Storage URI that contains your files to be transferred',
|
|
75
|
+
validate: required,
|
|
187
76
|
},
|
|
188
77
|
{
|
|
189
|
-
when:
|
|
190
|
-
type:
|
|
191
|
-
name:
|
|
192
|
-
message:
|
|
193
|
-
validate: required
|
|
78
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
79
|
+
type: 'input',
|
|
80
|
+
name: 'destinationTableTemplate',
|
|
81
|
+
message: 'Please provide the name of your destination table',
|
|
82
|
+
validate: required,
|
|
194
83
|
},
|
|
195
84
|
{
|
|
196
|
-
when:
|
|
197
|
-
type:
|
|
198
|
-
name:
|
|
199
|
-
message:
|
|
200
|
-
|
|
201
|
-
validate: required
|
|
85
|
+
when: (response) => response.resourceType === 'scheduledQueries',
|
|
86
|
+
type: 'input',
|
|
87
|
+
name: 'fileFormat',
|
|
88
|
+
message:
|
|
89
|
+
'Please provide the type of files you want to transfe. Supported values CSV, JSON, AVRO, PARQUET, or ORC',
|
|
90
|
+
validate: required,
|
|
202
91
|
},
|
|
203
92
|
{
|
|
204
|
-
when:
|
|
205
|
-
type:
|
|
206
|
-
name:
|
|
207
|
-
message:
|
|
208
|
-
|
|
93
|
+
when: (response) => response.resourceType === 'datasets',
|
|
94
|
+
type: 'input',
|
|
95
|
+
name: 'datasetId',
|
|
96
|
+
message:
|
|
97
|
+
'Please provide the dataset ID (must be alphanumeric, plus underscores)',
|
|
98
|
+
validate: required,
|
|
209
99
|
},
|
|
210
100
|
{
|
|
211
|
-
when:
|
|
212
|
-
type:
|
|
213
|
-
name:
|
|
214
|
-
message:
|
|
215
|
-
validate: required
|
|
101
|
+
when: (response) => response.resourceType === 'datasets',
|
|
102
|
+
type: 'input',
|
|
103
|
+
name: 'datasetName',
|
|
104
|
+
message: 'Please provide the user-frienldy name for the dataset',
|
|
105
|
+
validate: required,
|
|
216
106
|
},
|
|
217
107
|
{
|
|
218
|
-
when:
|
|
219
|
-
type:
|
|
220
|
-
name:
|
|
221
|
-
message:
|
|
222
|
-
validate: required
|
|
108
|
+
when: (response) => response.resourceType === 'datasets',
|
|
109
|
+
type: 'input',
|
|
110
|
+
name: 'description',
|
|
111
|
+
message: 'Please provide the description for the dataset',
|
|
112
|
+
validate: required,
|
|
223
113
|
},
|
|
224
114
|
{
|
|
225
|
-
when:
|
|
226
|
-
type:
|
|
227
|
-
name:
|
|
228
|
-
message:
|
|
229
|
-
default:
|
|
230
|
-
choices: [
|
|
115
|
+
when: (response) => response.resourceType === 'datasets',
|
|
116
|
+
type: 'list',
|
|
117
|
+
name: 'createTable',
|
|
118
|
+
message: 'Do you want to create a table?',
|
|
119
|
+
default: 'no',
|
|
120
|
+
choices: ['yes', 'no'],
|
|
231
121
|
},
|
|
232
122
|
{
|
|
233
|
-
when:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
123
|
+
when: (response) =>
|
|
124
|
+
response.createTable === 'yes' &&
|
|
125
|
+
response.resourceType === 'datasets',
|
|
126
|
+
type: 'input',
|
|
127
|
+
name: 'tableId',
|
|
128
|
+
message: 'Please provide the ID for the table',
|
|
129
|
+
validate: required,
|
|
239
130
|
},
|
|
240
131
|
{
|
|
241
|
-
when:
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
132
|
+
when: (response) =>
|
|
133
|
+
response.createTable === 'yes' &&
|
|
134
|
+
response.resourceType === 'datasets',
|
|
135
|
+
type: 'input',
|
|
136
|
+
name: 'expirationTime',
|
|
137
|
+
message:
|
|
138
|
+
'Please provide the time when the table expires (in milliseconds since the epoch). If set to `null`, the table will persist indefinitely.',
|
|
139
|
+
validate: required,
|
|
248
140
|
},
|
|
249
141
|
{
|
|
250
|
-
when:
|
|
251
|
-
type:
|
|
252
|
-
name:
|
|
253
|
-
message:
|
|
254
|
-
default:
|
|
255
|
-
choices: [
|
|
142
|
+
when: (response) => response.resourceType === 'datasets',
|
|
143
|
+
type: 'list',
|
|
144
|
+
name: 'createRoutine',
|
|
145
|
+
message: 'Do you want to create a routine?',
|
|
146
|
+
default: 'no',
|
|
147
|
+
choices: ['yes', 'no'],
|
|
256
148
|
},
|
|
257
149
|
{
|
|
258
|
-
when:
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
150
|
+
when: (response) =>
|
|
151
|
+
response.createRoutine === 'yes' &&
|
|
152
|
+
response.resourceType === 'datasets',
|
|
153
|
+
type: 'input',
|
|
154
|
+
name: 'routineId',
|
|
155
|
+
message:
|
|
156
|
+
'Please provide the ID of the routine. The ID must contain only letters, numbers, or underscores',
|
|
157
|
+
validate: required,
|
|
264
158
|
},
|
|
265
159
|
{
|
|
266
|
-
when:
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
160
|
+
when: (response) =>
|
|
161
|
+
response.createRoutine === 'yes' &&
|
|
162
|
+
response.resourceType === 'datasets',
|
|
163
|
+
type: 'input',
|
|
164
|
+
name: 'routineDescription',
|
|
165
|
+
message: 'Please provide the description of the routine',
|
|
166
|
+
validate: required,
|
|
272
167
|
},
|
|
273
168
|
{
|
|
274
|
-
when:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
169
|
+
when: (response) =>
|
|
170
|
+
response.createRoutine === 'yes' &&
|
|
171
|
+
response.resourceType === 'datasets',
|
|
172
|
+
type: 'list',
|
|
173
|
+
name: 'routineType',
|
|
174
|
+
message: 'Please select a routine type',
|
|
175
|
+
default: 'PROCEDURE',
|
|
176
|
+
choices: ['SCALAR_FUNCTION', 'PROCEDURE'],
|
|
281
177
|
},
|
|
282
178
|
{
|
|
283
|
-
when:
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
179
|
+
when: (response) =>
|
|
180
|
+
response.createRoutine === 'yes' &&
|
|
181
|
+
response.resourceType === 'datasets',
|
|
182
|
+
type: 'list',
|
|
183
|
+
name: 'language',
|
|
184
|
+
message: 'Please select a language of the routine',
|
|
185
|
+
default: 'SQL',
|
|
186
|
+
choices: ['SQL', 'JAVASCRIPT'],
|
|
290
187
|
},
|
|
291
188
|
{
|
|
292
|
-
when:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
189
|
+
when: (response) =>
|
|
190
|
+
response.createRoutine === 'yes' &&
|
|
191
|
+
response.resourceType === 'datasets',
|
|
192
|
+
type: 'input',
|
|
193
|
+
name: 'definitionBody',
|
|
194
|
+
message:
|
|
195
|
+
'Please provide the body of the routine, specify null if not needed',
|
|
196
|
+
validate: required,
|
|
197
|
+
},
|
|
299
198
|
];
|
|
199
|
+
|
|
300
200
|
return this.prompt(prompts).then((props) => {
|
|
301
201
|
this.answers = props;
|
|
302
202
|
});
|
|
303
203
|
}
|
|
204
|
+
|
|
304
205
|
writing() {
|
|
305
206
|
const {
|
|
306
207
|
datasetId,
|
|
@@ -325,13 +226,14 @@ ts", "when"),
|
|
|
325
226
|
enableFailureEmail,
|
|
326
227
|
dataPathTemplate,
|
|
327
228
|
destinationTableTemplate,
|
|
328
|
-
fileFormat
|
|
229
|
+
fileFormat,
|
|
329
230
|
} = this.answers;
|
|
330
|
-
|
|
331
|
-
|
|
231
|
+
|
|
232
|
+
['prod', 'staging'].forEach((env) => {
|
|
233
|
+
if (createTable === 'no' && resourceType === 'datasets') {
|
|
332
234
|
this.copyDir(
|
|
333
|
-
|
|
334
|
-
path.join(
|
|
235
|
+
'bigquery',
|
|
236
|
+
path.join('infra', env, 'bigquery', datasetId),
|
|
335
237
|
{
|
|
336
238
|
...this.answers,
|
|
337
239
|
env,
|
|
@@ -344,13 +246,14 @@ ts", "when"),
|
|
|
344
246
|
routineType,
|
|
345
247
|
language,
|
|
346
248
|
definitionBody,
|
|
347
|
-
routineDescription
|
|
348
|
-
}
|
|
249
|
+
routineDescription,
|
|
250
|
+
},
|
|
349
251
|
);
|
|
350
252
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
253
|
+
|
|
254
|
+
if (createTable === 'yes' && resourceType === 'datasets') {
|
|
255
|
+
['schema', 'bigquery'].forEach((folder) => {
|
|
256
|
+
this.copyDir(folder, path.join('infra', env, 'bigquery', datasetId), {
|
|
354
257
|
...this.answers,
|
|
355
258
|
env,
|
|
356
259
|
datasetId,
|
|
@@ -364,14 +267,15 @@ ts", "when"),
|
|
|
364
267
|
routineType,
|
|
365
268
|
language,
|
|
366
269
|
definitionBody,
|
|
367
|
-
routineDescription
|
|
270
|
+
routineDescription,
|
|
368
271
|
});
|
|
369
272
|
});
|
|
370
273
|
}
|
|
371
|
-
|
|
274
|
+
|
|
275
|
+
if (resourceType === 'scheduledQueries') {
|
|
372
276
|
this.copyDir(
|
|
373
|
-
|
|
374
|
-
path.join(
|
|
277
|
+
'scheduled-queries',
|
|
278
|
+
path.join('infra', env, 'scheduled-queries'),
|
|
375
279
|
{
|
|
376
280
|
...this.answers,
|
|
377
281
|
env,
|
|
@@ -384,18 +288,19 @@ ts", "when"),
|
|
|
384
288
|
enableFailureEmail,
|
|
385
289
|
dataPathTemplate,
|
|
386
290
|
destinationTableTemplate,
|
|
387
|
-
fileFormat
|
|
388
|
-
}
|
|
291
|
+
fileFormat,
|
|
292
|
+
},
|
|
389
293
|
);
|
|
390
294
|
}
|
|
391
295
|
});
|
|
392
296
|
}
|
|
297
|
+
|
|
393
298
|
end() {
|
|
394
299
|
this.log(`
|
|
395
300
|
${chalk.green(`Your BigQuery resources have now been created. To finalize your configuration, please continue
|
|
396
301
|
with manual editing of the generated files.`)}
|
|
397
|
-
${chalk.green(
|
|
398
|
-
${chalk.green(
|
|
302
|
+
${chalk.green('1.')} Review and add modify schema.json file, change null values to needed ones.
|
|
303
|
+
${chalk.green('2.')} Push this change in a feature branch and open a pull request.
|
|
399
304
|
`);
|
|
400
305
|
}
|
|
401
306
|
};
|