@hiiretail/gcp-infra-cli 0.103.1 → 1.0.0
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/README.md +9 -46
- package/bin/gcp-infra +5 -2
- package/package.json +7 -30
- package/src/gcp-infra.js +87 -0
- package/LICENSE +0 -21
- package/generators/clan-resources/clan-project/generator.json +0 -4
- package/generators/clan-resources/clan-project/index.js +0 -135
- package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat/terragrunt.hcl +0 -52
- package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat-static-ip/spec.hcl +0 -7
- package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat-static-ip/terragrunt.hcl +0 -25
- package/generators/clan-resources/clan-project/templates/clan-resources/cloud-router/terragrunt.hcl +0 -34
- package/generators/clan-resources/clan-project/templates/clan-resources/gke/gke-resources/terragrunt.hcl +0 -40
- package/generators/clan-resources/clan-project/templates/clan-resources/gke/spec.hcl +0 -18
- package/generators/clan-resources/clan-project/templates/clan-resources/gke/terragrunt.hcl +0 -52
- package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/config/main.tf +0 -41
- package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/config/vars.tf +0 -9
- package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/terragrunt.hcl +0 -32
- package/generators/clan-resources/clan-project/templates/clan-resources/network/spec.hcl +0 -54
- package/generators/clan-resources/clan-project/templates/clan-resources/network/terragrunt.hcl +0 -29
- package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/config/main.tf +0 -18
- package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/config/vars.tf +0 -27
- package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/terragrunt.hcl +0 -35
- package/generators/clan-resources/clan-project/templates/clan-resources/serverless-vpc-connector/terragrunt.hcl +0 -40
- package/generators/clan-resources/clan-project/templates/clan-resources/terragrunt.hcl +0 -3
- package/generators/clan-resources/command.json +0 -7
- package/generators/common-resources/bigquery/generator.json +0 -4
- package/generators/common-resources/bigquery/index.js +0 -284
- package/generators/common-resources/bigquery/templates/bigquery/spec.hcl +0 -8
- package/generators/common-resources/bigquery/templates/bigquery/terragrunt.hcl +0 -53
- package/generators/common-resources/bigquery/templates/scheduled-queries/terragrunt.hcl +0 -56
- package/generators/common-resources/bigquery/templates/schema/schema.json +0 -14
- package/generators/common-resources/budget/generator.json +0 -4
- package/generators/common-resources/budget/index.js +0 -89
- package/generators/common-resources/budget/templates/budget/terragrunt.hcl +0 -45
- package/generators/common-resources/cloud-armor/generator.json +0 -4
- package/generators/common-resources/cloud-armor/index.js +0 -45
- package/generators/common-resources/cloud-armor/templates/policies.yaml +0 -53
- package/generators/common-resources/cloud-armor/templates/terragrunt.hcl +0 -30
- package/generators/common-resources/cloud-storage/generator.json +0 -4
- package/generators/common-resources/cloud-storage/index.js +0 -156
- package/generators/common-resources/cloud-storage/templates/cloud-storage/storage.yaml +0 -26
- package/generators/common-resources/cloud-storage/templates/cloud-storage/terragrunt.hcl +0 -32
- package/generators/common-resources/cloudsql/generator.json +0 -4
- package/generators/common-resources/cloudsql/index.js +0 -106
- package/generators/common-resources/cloudsql/templates/mssql/instance/spec.hcl +0 -76
- package/generators/common-resources/cloudsql/templates/mssql/instance/terragrunt.hcl +0 -38
- package/generators/common-resources/cloudsql/templates/mssql/instance-secrets/terragrunt.hcl +0 -37
- package/generators/common-resources/cloudsql/templates/mysql/instance/spec.hcl +0 -73
- package/generators/common-resources/cloudsql/templates/mysql/instance/terragrunt.hcl +0 -40
- package/generators/common-resources/cloudsql/templates/mysql/instance-secrets/terragrunt.hcl +0 -38
- package/generators/common-resources/cloudsql/templates/postgres-clan/instance/spec.hcl +0 -102
- package/generators/common-resources/cloudsql/templates/postgres-clan/instance/terragrunt.hcl +0 -36
- package/generators/common-resources/cloudsql/templates/postgres-clan/instance-secrets/terragrunt.hcl +0 -44
- package/generators/common-resources/cloudsql-database/generator.json +0 -4
- package/generators/common-resources/cloudsql-database/index.js +0 -70
- package/generators/common-resources/cloudsql-database/templates/mysql/database/proxy_port.hcl +0 -4
- package/generators/common-resources/cloudsql-database/templates/mysql/database/terragrunt.hcl +0 -69
- package/generators/common-resources/cloudsql-database/templates/mysql/outputs.json +0 -5
- package/generators/common-resources/cloudsql-database/templates/mysql/secrets/terragrunt.hcl +0 -30
- package/generators/common-resources/cloudsql-database/templates/postgres/database/proxy_port.hcl +0 -4
- package/generators/common-resources/cloudsql-database/templates/postgres/database/spec.hcl +0 -17
- package/generators/common-resources/cloudsql-database/templates/postgres/database/terragrunt.hcl +0 -74
- package/generators/common-resources/cloudsql-database/templates/postgres/outputs.json +0 -5
- package/generators/common-resources/cloudsql-database/templates/postgres/secrets/terragrunt.hcl +0 -30
- package/generators/common-resources/command.json +0 -8
- package/generators/common-resources/confluent-cluster/generator.json +0 -4
- package/generators/common-resources/confluent-cluster/index.js +0 -52
- package/generators/common-resources/confluent-cluster/templates/confluent/spec.hcl +0 -5
- package/generators/common-resources/confluent-cluster/templates/confluent/terragrunt.hcl +0 -25
- package/generators/common-resources/datastore/generator.json +0 -4
- package/generators/common-resources/datastore/index.js +0 -91
- package/generators/common-resources/datastore/templates/datastore/indexes.yaml +0 -6
- package/generators/common-resources/datastore/templates/datastore/terragrunt.hcl +0 -23
- package/generators/common-resources/elastic-cloud/generator.json +0 -4
- package/generators/common-resources/elastic-cloud/index.js +0 -52
- package/generators/common-resources/elastic-cloud/templates/elastic/spec.hcl +0 -27
- package/generators/common-resources/elastic-cloud/templates/elastic/terragrunt.hcl +0 -27
- package/generators/common-resources/elastic-index-policy/generator.json +0 -4
- package/generators/common-resources/elastic-index-policy/handle-yaml.js +0 -76
- package/generators/common-resources/elastic-index-policy/index.js +0 -210
- package/generators/common-resources/elastic-index-policy/templates/policy/policy.yaml +0 -28
- package/generators/common-resources/elastic-index-policy/templates/policy/terragrunt.hcl +0 -25
- package/generators/common-resources/elastic-template/generator.json +0 -4
- package/generators/common-resources/elastic-template/index.js +0 -84
- package/generators/common-resources/elastic-template/templates/elastic-template/mappings.json +0 -1
- package/generators/common-resources/elastic-template/templates/elastic-template/terragrunt.hcl +0 -35
- package/generators/common-resources/firestore/generator.json +0 -4
- package/generators/common-resources/firestore/index.js +0 -81
- package/generators/common-resources/firestore/templates/firestore/indexes.yaml +0 -10
- package/generators/common-resources/firestore/templates/firestore/terragrunt.hcl +0 -25
- package/generators/common-resources/iam/generator.json +0 -4
- package/generators/common-resources/iam/index.js +0 -62
- package/generators/common-resources/iam/templates/github/workflows/iam.yml +0 -18
- package/generators/common-resources/iam/templates/iam.yaml +0 -8
- package/generators/common-resources/iam/valid-prefix.js +0 -8
- package/generators/common-resources/kafka-connect/generator.json +0 -4
- package/generators/common-resources/kafka-connect/index.js +0 -75
- package/generators/common-resources/kafka-connect/templates/elastic/terragrunt.hcl +0 -92
- package/generators/common-resources/kafka-connect/templates/pubsub/terragrunt.hcl +0 -75
- package/generators/common-resources/kafka-topics/generator.json +0 -4
- package/generators/common-resources/kafka-topics/index.js +0 -54
- package/generators/common-resources/kafka-topics/templates/kafka/kafka.yaml +0 -20
- package/generators/common-resources/kafka-topics/templates/kafka/terragrunt.hcl +0 -21
- package/generators/common-resources/kms/generator.json +0 -4
- package/generators/common-resources/kms/index.js +0 -69
- package/generators/common-resources/kms/templates/kms/spec.hcl +0 -5
- package/generators/common-resources/kms/templates/kms/terragrunt.hcl +0 -33
- package/generators/common-resources/memorystore/generator.json +0 -4
- package/generators/common-resources/memorystore/index.js +0 -69
- package/generators/common-resources/memorystore/templates/outputs.json +0 -3
- package/generators/common-resources/memorystore/templates/redis-instance/spec.hcl +0 -16
- package/generators/common-resources/memorystore/templates/redis-instance/terragrunt.hcl +0 -35
- package/generators/common-resources/memorystore/templates/secrets/terragrunt.hcl +0 -31
- package/generators/common-resources/monitoring/generator.json +0 -4
- package/generators/common-resources/monitoring/handle-yaml.js +0 -48
- package/generators/common-resources/monitoring/index.js +0 -192
- package/generators/common-resources/monitoring/templates/alerts/generic-infra.yaml +0 -633
- package/generators/common-resources/monitoring/templates/alerts/terragrunt.hcl +0 -37
- package/generators/common-resources/monitoring/templates/service/service.yaml +0 -16
- package/generators/common-resources/monitoring/templates/service/terragrunt.hcl +0 -37
- package/generators/common-resources/monitoring/templates/uptime-checks/terragrunt.hcl +0 -36
- package/generators/common-resources/monitoring/templates/uptime-checks/uptime-checks.yaml +0 -3
- package/generators/common-resources/monitoring/validate.js +0 -58
- package/generators/common-resources/pubsub/append.js +0 -120
- package/generators/common-resources/pubsub/generator.json +0 -4
- package/generators/common-resources/pubsub/get-gcp-projects.js +0 -34
- package/generators/common-resources/pubsub/handle-subscribers.js +0 -63
- package/generators/common-resources/pubsub/index.js +0 -316
- package/generators/common-resources/pubsub/templates/pubsub/spec.hcl +0 -7
- package/generators/common-resources/pubsub/templates/pubsub/subscribers.yaml +0 -16
- package/generators/common-resources/pubsub/templates/pubsub/terragrunt.hcl +0 -34
- package/generators/common-resources/pubsub/templates/pubsub-dlq/terragrunt.hcl +0 -42
- package/generators/common-resources/pubsub/templates/pubsub-external/spec.hcl +0 -10
- package/generators/common-resources/pubsub/templates/pubsub-external/subscribers.yaml +0 -16
- package/generators/common-resources/pubsub/templates/pubsub-external/terragrunt.hcl +0 -31
- package/generators/common-resources/pubsub/validate.js +0 -44
- package/generators/common-resources/scheduler/append.js +0 -83
- package/generators/common-resources/scheduler/generator.json +0 -4
- package/generators/common-resources/scheduler/index.js +0 -103
- package/generators/common-resources/scheduler/templates/scheduler/terragrunt.hcl +0 -44
- package/generators/common-resources/spanner/append.js +0 -27
- package/generators/common-resources/spanner/generator.json +0 -4
- package/generators/common-resources/spanner/index.js +0 -169
- package/generators/common-resources/spanner/templates/spanner/databases.yaml +0 -5
- package/generators/common-resources/spanner/templates/spanner/spec.hcl +0 -22
- package/generators/common-resources/spanner/templates/spanner/terragrunt.hcl +0 -33
- package/generators/common-resources/spanner/validate.js +0 -38
- package/generators/docs/command.json +0 -7
- package/generators/docs/rca/generator.json +0 -4
- package/generators/docs/rca/index.js +0 -50
- package/generators/docs/rca/templates/docs/rca_external.md +0 -43
- package/generators/docs/rca/templates/docs/rca_internal.md +0 -88
- package/generators/docs/runbook/generator.json +0 -4
- package/generators/docs/runbook/index.js +0 -42
- package/generators/docs/runbook/templates/docs/runbook.md +0 -106
- package/generators/docs/srb/generator.json +0 -4
- package/generators/docs/srb/index.js +0 -62
- package/generators/docs/srb/templates/docs/README.md +0 -42
- package/generators/docs/srb/templates/docs/adr.cmd +0 -3
- package/generators/docs/srb/templates/docs/adr.sh +0 -4
- package/generators/docs/srb/templates/docs/architecture.md +0 -68
- package/generators/docs/srb/templates/docs/cost-estimates.md +0 -39
- package/generators/docs/srb/templates/docs/dsl2png.cmd +0 -3
- package/generators/docs/srb/templates/docs/dsl2png.sh +0 -4
- package/generators/docs/srb/templates/docs/sre.md +0 -43
- package/generators/docs/srb/templates/sample.dsl +0 -36
- package/generators/init/clan-infra/gcp-projects.js +0 -36
- package/generators/init/clan-infra/generator.json +0 -4
- package/generators/init/clan-infra/index.js +0 -170
- package/generators/init/clan-infra/templates/.yamllint +0 -17
- package/generators/init/clan-infra/templates/env/project.hcl +0 -15
- package/generators/init/clan-infra/templates/env/secrets/secrets.yaml +0 -4
- package/generators/init/clan-infra/templates/env/secrets/terragrunt.hcl +0 -31
- package/generators/init/clan-infra/templates/github/CODEOWNERS +0 -1
- package/generators/init/clan-infra/templates/github/workflows/infra-verify.yml +0 -16
- package/generators/init/clan-infra/templates/github/workflows/infra.yml +0 -17
- package/generators/init/clan-infra/templates/github/workflows/release-notes.yml +0 -33
- package/generators/init/clan-infra/templates/github/workflows/sync-docs.yml +0 -29
- package/generators/init/clan-infra/templates/infra/.terraform-version +0 -1
- package/generators/init/clan-infra/templates/infra/.terragrunt-version +0 -1
- package/generators/init/clan-infra/templates/infra/README.md +0 -5
- package/generators/init/clan-infra/templates/infra/common.hcl +0 -24
- package/generators/init/clan-infra/templates/infra/terragrunt_root.hcl +0 -44
- package/generators/init/clan-infra/templates/notification-channels/notification-channels.yaml +0 -7
- package/generators/init/clan-infra/templates/notification-channels/terragrunt.hcl +0 -29
- package/generators/init/clan-infra/templates/release-notes/example-service.yaml +0 -23
- package/generators/init/clan-infra/templates/release-notes-schema/release-notes.schema.json +0 -63
- package/generators/init/clan-infra/tribe-clan-repo.js +0 -38
- package/generators/init/clan-infra/validate.js +0 -8
- package/generators/init/command.json +0 -7
- package/generators/maintenance/command.json +0 -7
- package/generators/maintenance/manage-states/generator.json +0 -4
- package/generators/maintenance/manage-states/index.js +0 -188
- package/generators/maintenance/update-modules/generator.json +0 -4
- package/generators/maintenance/update-modules/index.js +0 -102
- package/generators/organization/clan-project/__tests__/__snapshots__/googlecloud.test.js.snap +0 -27
- package/generators/organization/clan-project/generator.json +0 -4
- package/generators/organization/clan-project/googlecloud.js +0 -119
- package/generators/organization/clan-project/index.js +0 -139
- package/generators/organization/clan-project/templates/clan/clan.yaml +0 -22
- package/generators/organization/clan-project/templates/clan/terragrunt.hcl +0 -39
- package/generators/organization/clan-project/templates/clan-project/project.yaml +0 -14
- package/generators/organization/clan-project/templates/clan-project/terragrunt.hcl +0 -51
- package/generators/organization/clan-project/templates/clans-folder/terragrunt.hcl +0 -3
- package/generators/organization/clan-project/templates/department/terragrunt.hcl +0 -32
- package/generators/organization/clan-project/templates/tribe/terragrunt.hcl +0 -67
- package/generators/organization/clan-project/templates/tribe/tribe.yaml +0 -19
- package/generators/organization/command.json +0 -8
- package/src/BaseGenerator.js +0 -73
- package/src/SecretsGenerator.js +0 -105
- package/src/cli.js +0 -73
- package/src/dependency-check.js +0 -48
- package/src/update-check.js +0 -30
- package/src/validators.js +0 -32
- package/src/yeoman.js +0 -71
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const chalk = require('chalk');
|
|
3
|
-
const BaseGenerator = require('../../../src/BaseGenerator');
|
|
4
|
-
const {
|
|
5
|
-
chain,
|
|
6
|
-
required,
|
|
7
|
-
filename,
|
|
8
|
-
maxLength,
|
|
9
|
-
} = require('../../../src/validators');
|
|
10
|
-
const googleapis = require('./googlecloud');
|
|
11
|
-
|
|
12
|
-
const resolveAnswer = (answers, name) => answers[`new-${name}`] || answers[name];
|
|
13
|
-
|
|
14
|
-
module.exports = class extends BaseGenerator {
|
|
15
|
-
constructor(args, opts) {
|
|
16
|
-
super(args, opts);
|
|
17
|
-
|
|
18
|
-
// Output directory relative to the tf-infra-gcp directory.
|
|
19
|
-
this.destinationRoot('organization');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
prompting() {
|
|
23
|
-
const prompts = [
|
|
24
|
-
{
|
|
25
|
-
type: 'list',
|
|
26
|
-
name: 'domain',
|
|
27
|
-
default: 'extendaretail-com',
|
|
28
|
-
message: 'Choose GCP Organization',
|
|
29
|
-
store: true,
|
|
30
|
-
choices: this.listSubDirectories(this.destinationPath()),
|
|
31
|
-
validate: required,
|
|
32
|
-
},
|
|
33
|
-
...this.chooseOrCreatePrompts(
|
|
34
|
-
'department',
|
|
35
|
-
(answers) => path.join(this.destinationPath(), answers.domain, 'departments'),
|
|
36
|
-
),
|
|
37
|
-
...this.chooseOrCreatePrompts(
|
|
38
|
-
'tribe',
|
|
39
|
-
(answers) => path.join(
|
|
40
|
-
this.destinationPath(), answers.domain, 'departments', resolveAnswer(answers, 'department'),
|
|
41
|
-
),
|
|
42
|
-
),
|
|
43
|
-
{
|
|
44
|
-
type: 'input',
|
|
45
|
-
name: 'clan',
|
|
46
|
-
message: 'Clan name',
|
|
47
|
-
store: false,
|
|
48
|
-
// Max project name length is 30. But we must account for -staging-RAND suffix
|
|
49
|
-
validate: (input) => chain(input, required, filename, (s) => maxLength(s, 17)),
|
|
50
|
-
filter: this.kebabCase,
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
type: 'input',
|
|
54
|
-
name: 'commonInfraRepo',
|
|
55
|
-
message: 'Name of GitHub repository for clan common infrastructure',
|
|
56
|
-
default: (answers) => `${answers.tribe}-${answers.clan}-common`,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
type: 'input',
|
|
60
|
-
name: 'costCenter',
|
|
61
|
-
message: 'Please provide the Cost Center of the Clan',
|
|
62
|
-
validate: required,
|
|
63
|
-
},
|
|
64
|
-
];
|
|
65
|
-
|
|
66
|
-
return this.prompt(prompts).then((props) => {
|
|
67
|
-
this.answers = {
|
|
68
|
-
...props,
|
|
69
|
-
department: resolveAnswer(props, 'department'),
|
|
70
|
-
tribe: resolveAnswer(props, 'tribe'),
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
writing() {
|
|
76
|
-
const {
|
|
77
|
-
domain,
|
|
78
|
-
department,
|
|
79
|
-
tribe,
|
|
80
|
-
clan,
|
|
81
|
-
} = this.answers;
|
|
82
|
-
|
|
83
|
-
// Department
|
|
84
|
-
this.copyDir(
|
|
85
|
-
'department',
|
|
86
|
-
path.join(domain, 'departments', department),
|
|
87
|
-
this.answers,
|
|
88
|
-
true,
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Tribe
|
|
92
|
-
this.copyDir(
|
|
93
|
-
'tribe',
|
|
94
|
-
path.join(domain, 'departments', department, tribe),
|
|
95
|
-
this.answers,
|
|
96
|
-
true,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
// Clan
|
|
100
|
-
this.copyDir(
|
|
101
|
-
'clans-folder',
|
|
102
|
-
path.join(domain, 'departments', department, tribe, 'clans'),
|
|
103
|
-
this.answers,
|
|
104
|
-
true,
|
|
105
|
-
);
|
|
106
|
-
const clanDir = path.join(domain, 'departments', department, tribe, 'clans', clan);
|
|
107
|
-
this.copyDir('clan', clanDir, this.answers, true);
|
|
108
|
-
|
|
109
|
-
// Clan GCP projects
|
|
110
|
-
['staging', 'prod'].forEach((env) => {
|
|
111
|
-
this.copyDir('clan-project', path.join(clanDir, env), {
|
|
112
|
-
...this.answers,
|
|
113
|
-
activate_apis: googleapis.apisYaml([]),
|
|
114
|
-
env,
|
|
115
|
-
clan,
|
|
116
|
-
tribe,
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
end() {
|
|
122
|
-
const {
|
|
123
|
-
domain,
|
|
124
|
-
department,
|
|
125
|
-
tribe,
|
|
126
|
-
clan,
|
|
127
|
-
} = this.answers;
|
|
128
|
-
const clanDir = path.join(domain, 'departments', department, tribe, 'clans', clan);
|
|
129
|
-
this.log(`
|
|
130
|
-
${chalk.green('Your clan projects have now been created. To finalize your configuration, please continue with manual editing of the generated files.')}
|
|
131
|
-
${chalk.green('1.')} Add clan members and groups
|
|
132
|
-
\u2192 ${chalk.cyan(path.join(clanDir, 'clan.yaml'))}
|
|
133
|
-
${chalk.green('2.')} Configure APIs, service accounts and repositories
|
|
134
|
-
\u2192 ${chalk.cyan(path.join(clanDir, 'prod', 'project.yaml'))}
|
|
135
|
-
\u2192 ${chalk.cyan(path.join(clanDir, 'staging', 'project.yaml'))}
|
|
136
|
-
${chalk.green('3.')} Push this change in a feature branch and open a pull request.
|
|
137
|
-
`);
|
|
138
|
-
}
|
|
139
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Please add corporate email addresses for each user member of your Clan.
|
|
2
|
-
# If no groups or users are specified you must leave the brackets [] in place
|
|
3
|
-
# to indicate an empty list
|
|
4
|
-
# You MUST include at least 1 Group or User member
|
|
5
|
-
|
|
6
|
-
### example
|
|
7
|
-
#
|
|
8
|
-
# members:
|
|
9
|
-
# groups: []
|
|
10
|
-
# users:
|
|
11
|
-
# - name: Alice Test
|
|
12
|
-
# email: alice@extendaretail.com
|
|
13
|
-
# - name: Bob Test
|
|
14
|
-
# email: bob@extendaretail.com
|
|
15
|
-
###
|
|
16
|
-
---
|
|
17
|
-
common-infra-repo: "<%-commonInfraRepo%>"
|
|
18
|
-
members:
|
|
19
|
-
groups: []
|
|
20
|
-
users: []
|
|
21
|
-
|
|
22
|
-
costcenter: "<%-costCenter%>"
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Here we specifify the Terraform Module which we will execute. We pin to a specific version.
|
|
2
|
-
terraform {
|
|
3
|
-
source = "git::https://github.com/extenda/tf-module-gcp-organization//?ref=v1.0.1"
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
# This dependency block is used to fetch outputs from the parent folder
|
|
7
|
-
# We use mock_ouputs to support the "first time" deployment scenario where
|
|
8
|
-
# these outputs do not yet exist.
|
|
9
|
-
dependency "tribe_folder" {
|
|
10
|
-
config_path = "../../"
|
|
11
|
-
mock_outputs = {
|
|
12
|
-
folder_id = "folder-dummy-id"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
include {
|
|
17
|
-
path = find_in_parent_folders("terragrunt_root.hcl")
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
# We fetch common variables from the yaml files which MUST exist in these paths
|
|
21
|
-
locals {
|
|
22
|
-
tribe_name = basename(dirname(dirname(get_terragrunt_dir())))
|
|
23
|
-
clan_name = basename(get_terragrunt_dir())
|
|
24
|
-
clan_vars = yamldecode(file("${get_terragrunt_dir()}/clan.yaml"))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
# These are the inputs that we pass to the Terraform module specified in the Terraform block above
|
|
28
|
-
inputs = {
|
|
29
|
-
folder_name = "${local.clan_name}"
|
|
30
|
-
|
|
31
|
-
# We fetch our tribe folder ID from the dependency block
|
|
32
|
-
folder_parent_id = dependency.tribe_folder.outputs.folder_id
|
|
33
|
-
|
|
34
|
-
# Default Group membership for each Folder is based on the Tribe and Clan name. We expect that there will be a GSuite for every
|
|
35
|
-
# Clan which follows the convention of <tribe_name>@extendaretail.com
|
|
36
|
-
gsuite_group_name = "tribe-${local.tribe_name}-${local.clan_name}"
|
|
37
|
-
|
|
38
|
-
gsuite_group_members = "${local.clan_vars.members}"
|
|
39
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Uncomment APIs you want to activate. This list includes common APIs.
|
|
2
|
-
activate_apis:
|
|
3
|
-
<%- activate_apis %>
|
|
4
|
-
|
|
5
|
-
# Uncomment and add service(s) that defines the service accounts that will be used by
|
|
6
|
-
# Cloud Run services. The granted roles determines what resources the service can access.
|
|
7
|
-
# services:
|
|
8
|
-
# - name: my-service-name
|
|
9
|
-
# iam_roles:
|
|
10
|
-
# - roles/my-service-role
|
|
11
|
-
#
|
|
12
|
-
# Uncomment and add repository(s) that defines the GitHub repositories that should be given
|
|
13
|
-
# secrets to allow them to deploy resources to the GCP project.
|
|
14
|
-
# repositories: my-service-github-repository
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
terraform {
|
|
2
|
-
source = "git::https://github.com/extenda/tf-module-gcp-project//?ref=v2.0.0-autopilot"
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
dependency "parent_folder" {
|
|
6
|
-
config_path = "../"
|
|
7
|
-
mock_outputs = {
|
|
8
|
-
folder_id = "folder-dummy-id"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
locals {
|
|
13
|
-
tribe_name = basename(dirname(dirname(dirname(get_terragrunt_dir()))))
|
|
14
|
-
clan_name = basename(dirname(get_terragrunt_dir()))
|
|
15
|
-
env_name = basename(get_terragrunt_dir())
|
|
16
|
-
name = "${local.clan_name}-${local.env_name}"
|
|
17
|
-
bucket_name = "tf-state-${local.tribe_name}-${local.name}"
|
|
18
|
-
|
|
19
|
-
service_group_name = "gcp-${local.tribe_name}-${local.name}"
|
|
20
|
-
clan_gsuite_group = "tribe-${local.tribe_name}-${local.clan_name}"
|
|
21
|
-
tribe_yaml = yamldecode(file(find_in_parent_folders("tribe.yaml")))
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
include {
|
|
25
|
-
path = find_in_parent_folders("terragrunt_root.hcl")
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
inputs = merge(
|
|
29
|
-
|
|
30
|
-
yamldecode(
|
|
31
|
-
file("${get_terragrunt_dir()}/project.yaml")),
|
|
32
|
-
{
|
|
33
|
-
labels = {
|
|
34
|
-
cc = local.tribe_yaml.costcenter
|
|
35
|
-
tribe = local.tribe_name
|
|
36
|
-
clan = local.clan_name
|
|
37
|
-
environment = local.env_name
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
name = local.name
|
|
41
|
-
bucket_name = local.bucket_name
|
|
42
|
-
folder_id = dependency.parent_folder.outputs.folder_id
|
|
43
|
-
|
|
44
|
-
service_group_name = local.service_group_name
|
|
45
|
-
clan_gsuite_group = local.clan_gsuite_group
|
|
46
|
-
env_name = local.env_name
|
|
47
|
-
bucket_labels = {
|
|
48
|
-
cc = local.tribe_yaml.costcenter
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
)
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Here we specifify the Terraform Module which we will execute. We pin to a specific version.
|
|
2
|
-
terraform {
|
|
3
|
-
source = "git::https://github.com/extenda/tf-module-gcp-organization//?ref=v1.0.1"
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
# This dependency block is used to fetch outputs from the parent folder
|
|
7
|
-
# We use mock_ouputs to support the "first time" deployment scenario where
|
|
8
|
-
# these outputs do not yet exist.
|
|
9
|
-
dependency "parent_folder" {
|
|
10
|
-
config_path = "../"
|
|
11
|
-
mock_outputs = {
|
|
12
|
-
folder_id = "folder-dummy-id"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
include {
|
|
17
|
-
path = find_in_parent_folders("terragrunt_root.hcl")
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
# We fetch common variables from the yaml files which MUST exist in these paths
|
|
21
|
-
locals {
|
|
22
|
-
# fetch the name of the current directory
|
|
23
|
-
department_name = basename(get_terragrunt_dir())
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
# These are the inputs that we pass to the Terraform module specified in the Terraform block above
|
|
27
|
-
inputs = {
|
|
28
|
-
folder_name = "${local.department_name}"
|
|
29
|
-
|
|
30
|
-
# We fetch our parent folder ID from the dependency block
|
|
31
|
-
folder_parent_id = dependency.parent_folder.outputs.folder_id
|
|
32
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# Here we specifify the Terraform Module which we will execute. We pin to a specific version.
|
|
2
|
-
terraform {
|
|
3
|
-
source = "git::https://github.com/extenda/tf-module-gcp-organization//?ref=v1.0.1"
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
# This dependency block is used to fetch outputs from the parent folder
|
|
7
|
-
# We use mock_ouputs to support the "first time" deployment scenario where
|
|
8
|
-
# these outputs do not yet exist.
|
|
9
|
-
dependency "parent_folder" {
|
|
10
|
-
config_path = "../"
|
|
11
|
-
mock_outputs = {
|
|
12
|
-
folder_id = "folder-dummy-id"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
include {
|
|
17
|
-
path = find_in_parent_folders("terragrunt_root.hcl")
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
# We fetch common variables from the yaml files which MUST exist in these paths
|
|
21
|
-
locals {
|
|
22
|
-
# fetch the name of the current directory
|
|
23
|
-
tribe_name = basename(get_terragrunt_dir())
|
|
24
|
-
tribe_vars = yamldecode(file("${get_terragrunt_dir()}/tribe.yaml"))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
# These are the inputs that we pass to the Terraform module specified in the Terraform block above
|
|
28
|
-
inputs = {
|
|
29
|
-
folder_name = "${local.tribe_name}"
|
|
30
|
-
|
|
31
|
-
# We fetch our parent folder ID from the dependency block
|
|
32
|
-
folder_parent_id = dependency.parent_folder.outputs.folder_id
|
|
33
|
-
|
|
34
|
-
# Default Group membership for each Folder is based on the Tribe and Clan name. We expect that there will be a GSuite for every
|
|
35
|
-
# Clan which follows the convention of tribe-<tribe_name>@extendaretail.com
|
|
36
|
-
gsuite_group_name = "tribe-${local.tribe_name}"
|
|
37
|
-
|
|
38
|
-
gsuite_group_members = "${local.tribe_vars.members}"
|
|
39
|
-
|
|
40
|
-
folder_iam_roles = [
|
|
41
|
-
"roles/container.viewer",
|
|
42
|
-
"roles/compute.viewer",
|
|
43
|
-
"roles/errorreporting.user",
|
|
44
|
-
"roles/logging.viewer",
|
|
45
|
-
"roles/logging.configWriter",
|
|
46
|
-
"roles/cloudtrace.user",
|
|
47
|
-
"roles/pubsub.viewer",
|
|
48
|
-
"roles/run.viewer",
|
|
49
|
-
"roles/viewer",
|
|
50
|
-
"roles/monitoring.viewer",
|
|
51
|
-
"roles/monitoring.uptimeCheckConfigViewer",
|
|
52
|
-
"roles/monitoring.servicesViewer",
|
|
53
|
-
"roles/monitoring.notificationChannelViewer",
|
|
54
|
-
"roles/monitoring.metricsScopesViewer",
|
|
55
|
-
"roles/monitoring.dashboardEditor",
|
|
56
|
-
"roles/monitoring.alertPolicyViewer"
|
|
57
|
-
]
|
|
58
|
-
|
|
59
|
-
roles_map = [
|
|
60
|
-
{
|
|
61
|
-
project = "extenda"
|
|
62
|
-
iam_roles = [
|
|
63
|
-
"roles/storage.objectViewer"
|
|
64
|
-
]
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Please add corporate email addresses for each user member of your Tribe.
|
|
2
|
-
# If no groups or users are specified you must leave the brackets [] in place
|
|
3
|
-
# to indicate an empty list
|
|
4
|
-
# You MUST include at least 1 Group or User member
|
|
5
|
-
|
|
6
|
-
### example
|
|
7
|
-
#
|
|
8
|
-
# members:
|
|
9
|
-
# groups: []
|
|
10
|
-
# users:
|
|
11
|
-
# - alice@extendaretail.com
|
|
12
|
-
# - bob@extendaretail.com
|
|
13
|
-
###
|
|
14
|
-
---
|
|
15
|
-
members:
|
|
16
|
-
groups: []
|
|
17
|
-
users: []
|
|
18
|
-
|
|
19
|
-
costcenter: "<%- costCenter %>"
|
package/src/BaseGenerator.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
const Generator = require('yeoman-generator');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const inquirer = require('inquirer');
|
|
5
|
-
const {
|
|
6
|
-
chain,
|
|
7
|
-
required,
|
|
8
|
-
filename,
|
|
9
|
-
} = require('./validators');
|
|
10
|
-
|
|
11
|
-
module.exports = class extends Generator {
|
|
12
|
-
constructor(args, opts) {
|
|
13
|
-
super(args, opts);
|
|
14
|
-
|
|
15
|
-
this.baseDir = path.resolve(path.join(__dirname, '..'));
|
|
16
|
-
this.destinationRoot(process.cwd());
|
|
17
|
-
|
|
18
|
-
const [command, generator] = opts.namespace.split(':').slice(-2);
|
|
19
|
-
this.generatorId = path.join(command, generator);
|
|
20
|
-
this.sourceRoot(path.join(this.baseDir, 'generators', this.generatorId, 'templates'));
|
|
21
|
-
|
|
22
|
-
this.copyDir = (templateDir, targetDir, answers = this.answers, skipIfExists = false) => {
|
|
23
|
-
if (skipIfExists && fs.existsSync(targetDir)) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
this.fs.copyTpl(
|
|
27
|
-
this.templatePath(`${templateDir}/**/*`),
|
|
28
|
-
this.destinationPath(targetDir),
|
|
29
|
-
answers,
|
|
30
|
-
);
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
this.listSubDirectories = (parent) => fs.readdirSync(parent)
|
|
34
|
-
.filter((f) => !f.startsWith('.'))
|
|
35
|
-
.filter((f) => fs.lstatSync(path.join(parent, f)).isDirectory())
|
|
36
|
-
.sort();
|
|
37
|
-
|
|
38
|
-
this.kebabCase = (input) => input.replace(/\s|_/g, '-');
|
|
39
|
-
|
|
40
|
-
this.chooseOrCreatePrompts = (name, getChoicesDirectory) => [{
|
|
41
|
-
when: (answers) => fs.existsSync(getChoicesDirectory(answers)),
|
|
42
|
-
type: 'list',
|
|
43
|
-
name,
|
|
44
|
-
message: `Choose ${name}`,
|
|
45
|
-
store: true,
|
|
46
|
-
choices: (answers) => [
|
|
47
|
-
...this.listSubDirectories(getChoicesDirectory(answers)),
|
|
48
|
-
new inquirer.Separator(),
|
|
49
|
-
`Create new ${name}`,
|
|
50
|
-
],
|
|
51
|
-
validate: required,
|
|
52
|
-
filter: this.kebabCase,
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
when: (answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === `Create-new-${name}`,
|
|
56
|
-
type: 'input',
|
|
57
|
-
name: `new-${name}`,
|
|
58
|
-
message: `New ${name} name`,
|
|
59
|
-
store: false,
|
|
60
|
-
validate: (input) => chain(input, required, filename),
|
|
61
|
-
filter: this.kebabCase,
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
when: (answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === 'Create-new-tribe',
|
|
65
|
-
type: 'input',
|
|
66
|
-
name: 'costCenter',
|
|
67
|
-
message: 'Please provide the Cost Center of the Tribe',
|
|
68
|
-
store: false,
|
|
69
|
-
validate: (input) => chain(input, required, filename),
|
|
70
|
-
filter: this.kebabCase,
|
|
71
|
-
}];
|
|
72
|
-
}
|
|
73
|
-
};
|
package/src/SecretsGenerator.js
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const printf = require('sprintf-js').sprintf;
|
|
4
|
-
const chalk = require('chalk');
|
|
5
|
-
const BaseGenerator = require('./BaseGenerator');
|
|
6
|
-
|
|
7
|
-
function getMaxStrLength(strings) {
|
|
8
|
-
let maxLength = 0;
|
|
9
|
-
Object.values(strings).forEach((string) => {
|
|
10
|
-
if (string.length > maxLength) {
|
|
11
|
-
maxLength = string.length;
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
return maxLength;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
module.exports = class extends BaseGenerator {
|
|
18
|
-
writeSecrets(resource, instanceResource, instanceType, resourceName) {
|
|
19
|
-
['prod', 'staging'].forEach((env) => {
|
|
20
|
-
this.init(env, resource, instanceResource, instanceType, resourceName);
|
|
21
|
-
|
|
22
|
-
if (fs.existsSync(path.resolve(this.secretsDir, 'terragrunt.hcl'))) {
|
|
23
|
-
fs.unlinkSync(path.join(this.secretsDir, 'terragrunt.hcl'));
|
|
24
|
-
} else {
|
|
25
|
-
fs.mkdirSync(this.secretsDir, { recursive: true });
|
|
26
|
-
}
|
|
27
|
-
this.createTemplate();
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
init(env, resource, instanceResource, instanceType, resourceName) {
|
|
32
|
-
this.resourceName = resourceName;
|
|
33
|
-
this.instanceType = instanceType;
|
|
34
|
-
this.resource = resource;
|
|
35
|
-
this.outputs = JSON.parse(fs.readFileSync(path.join(this.baseDir, 'generators', this.generatorId, 'templates', this.instanceType, 'outputs.json'), 'utf8'));
|
|
36
|
-
this.secretsDir = path.join('infra', env, resource, instanceType, instanceResource, 'secrets');
|
|
37
|
-
if (fs.existsSync(path.join(this.secretsDir, 'state.json'))) {
|
|
38
|
-
this.stateNames = JSON.parse(fs.readFileSync(path.join(this.secretsDir, 'state.json'), 'utf8'));
|
|
39
|
-
this.checkUniqueState();
|
|
40
|
-
this.stateNames.secrets.push(this.resourceName);
|
|
41
|
-
} else {
|
|
42
|
-
this.stateNames = { secrets: [this.resourceName] };
|
|
43
|
-
}
|
|
44
|
-
this.outputLen = getMaxStrLength(this.outputs);
|
|
45
|
-
this.stateLen = getMaxStrLength(this.stateNames.secrets);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
checkUniqueState() {
|
|
49
|
-
this.stateNames.secrets.forEach((state) => {
|
|
50
|
-
if (state === this.resourceName) {
|
|
51
|
-
process.stderr.write(`${chalk.red('ERROR!')} resource already exists\n`);
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
buildDependencies() {
|
|
58
|
-
const dependencies = [];
|
|
59
|
-
this.stateNames.secrets.forEach((secret) => {
|
|
60
|
-
let fp = `dependency "${secret}" {\n config_path = "../${secret}"\n mock_outputs = {\n`;
|
|
61
|
-
Object.values(this.outputs).forEach((value) => {
|
|
62
|
-
fp += printf(`%-4s%-${this.outputLen}s %s`, '', `${value}`, `= "dummy-${value}"\n`);
|
|
63
|
-
});
|
|
64
|
-
fp += ' }\n}\n';
|
|
65
|
-
dependencies.push(fp);
|
|
66
|
-
});
|
|
67
|
-
return dependencies;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
buildSecrets() {
|
|
71
|
-
const secrets = [];
|
|
72
|
-
const resourceType = this.instanceType === '' ? this.resource : this.instanceType;
|
|
73
|
-
const padding = resourceType.length + this.outputLen + this.stateLen + 2;
|
|
74
|
-
this.stateNames.secrets.forEach((secret) => {
|
|
75
|
-
const secretsSet = [];
|
|
76
|
-
Object.values(this.outputs).forEach((value) => {
|
|
77
|
-
secretsSet.push(printf(`\n%-6s%-${padding}s %s`, '', `${resourceType}_${secret}_${value}`, `= dependency.${secret}.outputs.${value}`));
|
|
78
|
-
});
|
|
79
|
-
secrets.push(secretsSet.join(''));
|
|
80
|
-
});
|
|
81
|
-
return secrets.join('');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
updateState() {
|
|
85
|
-
fs.writeFileSync(
|
|
86
|
-
path.join(this.secretsDir, 'state.json'),
|
|
87
|
-
JSON.stringify(this.stateNames, null, 2),
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
createTemplate() {
|
|
92
|
-
const dependencies = this.buildDependencies().join('');
|
|
93
|
-
const secrets = this.buildSecrets();
|
|
94
|
-
this.updateState();
|
|
95
|
-
this.copyDir(
|
|
96
|
-
path.join(this.instanceType, 'secrets'),
|
|
97
|
-
this.secretsDir,
|
|
98
|
-
{
|
|
99
|
-
...this.answers,
|
|
100
|
-
dependencies,
|
|
101
|
-
secrets,
|
|
102
|
-
},
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
};
|
package/src/cli.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const glob = require('glob');
|
|
4
|
-
const { Command } = require('commander');
|
|
5
|
-
const packageJson = require('../package.json');
|
|
6
|
-
const { runYeoman } = require('./yeoman');
|
|
7
|
-
const dependencyCheck = require('./dependency-check');
|
|
8
|
-
const { isUpdateRequired, printUpdateMessage } = require('./update-check');
|
|
9
|
-
|
|
10
|
-
const addGenerators = (commandDir, command, require) => {
|
|
11
|
-
glob.sync(`${commandDir}/*/generator.json`).forEach((file) => {
|
|
12
|
-
const dir = path.dirname(file);
|
|
13
|
-
const info = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
14
|
-
const name = path.basename(dir);
|
|
15
|
-
command.command(name)
|
|
16
|
-
.description(info.description)
|
|
17
|
-
.action(() => {
|
|
18
|
-
dependencyCheck.requireCheck(require);
|
|
19
|
-
return runYeoman(commandDir, name);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const createCommands = (program) => {
|
|
25
|
-
const opts = {
|
|
26
|
-
cwd: path.resolve(__dirname, '..'),
|
|
27
|
-
absolute: true,
|
|
28
|
-
};
|
|
29
|
-
glob.sync('generators/*/command.json', opts).forEach((file) => {
|
|
30
|
-
const dir = path.dirname(file);
|
|
31
|
-
const name = path.basename(dir);
|
|
32
|
-
const {
|
|
33
|
-
query = 'Choose a generator',
|
|
34
|
-
description = '',
|
|
35
|
-
require = [],
|
|
36
|
-
} = JSON.parse(fs.readFileSync(path.join(file), 'utf8'));
|
|
37
|
-
const command = program.command(name)
|
|
38
|
-
.description(description)
|
|
39
|
-
.action(() => {
|
|
40
|
-
dependencyCheck.requireCheck(require);
|
|
41
|
-
return runYeoman(dir, '', query);
|
|
42
|
-
});
|
|
43
|
-
addGenerators(dir, command, require);
|
|
44
|
-
});
|
|
45
|
-
return program;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const cli = async (argv, exitOverride) => {
|
|
49
|
-
const needsUpdate = await isUpdateRequired();
|
|
50
|
-
if (needsUpdate) {
|
|
51
|
-
await printUpdateMessage();
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const command = new Command();
|
|
56
|
-
if (exitOverride) {
|
|
57
|
-
command.exitOverride(exitOverride);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return createCommands(command)
|
|
61
|
-
.version(packageJson.version)
|
|
62
|
-
.description(packageJson.description)
|
|
63
|
-
.addHelpCommand(false)
|
|
64
|
-
.parseAsync(argv);
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
if (require.main === module) {
|
|
68
|
-
cli().then(() => {
|
|
69
|
-
process.exit(0);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
module.exports = cli;
|