@hiiretail/gcp-infra-cli 0.104.0 → 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.
Files changed (217) hide show
  1. package/README.md +9 -46
  2. package/bin/gcp-infra +5 -2
  3. package/package.json +7 -30
  4. package/src/gcp-infra.js +87 -0
  5. package/LICENSE +0 -21
  6. package/generators/clan-resources/clan-project/generator.json +0 -4
  7. package/generators/clan-resources/clan-project/index.js +0 -135
  8. package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat/terragrunt.hcl +0 -52
  9. package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat-static-ip/spec.hcl +0 -7
  10. package/generators/clan-resources/clan-project/templates/clan-resources/cloud-nat-static-ip/terragrunt.hcl +0 -25
  11. package/generators/clan-resources/clan-project/templates/clan-resources/cloud-router/terragrunt.hcl +0 -34
  12. package/generators/clan-resources/clan-project/templates/clan-resources/gke/gke-resources/terragrunt.hcl +0 -40
  13. package/generators/clan-resources/clan-project/templates/clan-resources/gke/spec.hcl +0 -18
  14. package/generators/clan-resources/clan-project/templates/clan-resources/gke/terragrunt.hcl +0 -52
  15. package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/config/main.tf +0 -41
  16. package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/config/vars.tf +0 -9
  17. package/generators/clan-resources/clan-project/templates/clan-resources/network/firewall-rules/terragrunt.hcl +0 -32
  18. package/generators/clan-resources/clan-project/templates/clan-resources/network/spec.hcl +0 -54
  19. package/generators/clan-resources/clan-project/templates/clan-resources/network/terragrunt.hcl +0 -29
  20. package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/config/main.tf +0 -18
  21. package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/config/vars.tf +0 -27
  22. package/generators/clan-resources/clan-project/templates/clan-resources/private-vpc-connection/terragrunt.hcl +0 -35
  23. package/generators/clan-resources/clan-project/templates/clan-resources/serverless-vpc-connector/terragrunt.hcl +0 -40
  24. package/generators/clan-resources/clan-project/templates/clan-resources/terragrunt.hcl +0 -3
  25. package/generators/clan-resources/command.json +0 -7
  26. package/generators/common-resources/bigquery/generator.json +0 -4
  27. package/generators/common-resources/bigquery/index.js +0 -284
  28. package/generators/common-resources/bigquery/templates/bigquery/spec.hcl +0 -8
  29. package/generators/common-resources/bigquery/templates/bigquery/terragrunt.hcl +0 -53
  30. package/generators/common-resources/bigquery/templates/scheduled-queries/terragrunt.hcl +0 -56
  31. package/generators/common-resources/bigquery/templates/schema/schema.json +0 -14
  32. package/generators/common-resources/budget/generator.json +0 -4
  33. package/generators/common-resources/budget/index.js +0 -89
  34. package/generators/common-resources/budget/templates/budget/terragrunt.hcl +0 -45
  35. package/generators/common-resources/cloud-armor/generator.json +0 -4
  36. package/generators/common-resources/cloud-armor/index.js +0 -45
  37. package/generators/common-resources/cloud-armor/templates/policies.yaml +0 -53
  38. package/generators/common-resources/cloud-armor/templates/terragrunt.hcl +0 -30
  39. package/generators/common-resources/cloud-storage/generator.json +0 -4
  40. package/generators/common-resources/cloud-storage/index.js +0 -156
  41. package/generators/common-resources/cloud-storage/templates/cloud-storage/storage.yaml +0 -26
  42. package/generators/common-resources/cloud-storage/templates/cloud-storage/terragrunt.hcl +0 -32
  43. package/generators/common-resources/cloudsql/generator.json +0 -4
  44. package/generators/common-resources/cloudsql/index.js +0 -106
  45. package/generators/common-resources/cloudsql/templates/mssql/instance/spec.hcl +0 -76
  46. package/generators/common-resources/cloudsql/templates/mssql/instance/terragrunt.hcl +0 -38
  47. package/generators/common-resources/cloudsql/templates/mssql/instance-secrets/terragrunt.hcl +0 -37
  48. package/generators/common-resources/cloudsql/templates/mysql/instance/spec.hcl +0 -73
  49. package/generators/common-resources/cloudsql/templates/mysql/instance/terragrunt.hcl +0 -40
  50. package/generators/common-resources/cloudsql/templates/mysql/instance-secrets/terragrunt.hcl +0 -38
  51. package/generators/common-resources/cloudsql/templates/postgres-clan/instance/spec.hcl +0 -102
  52. package/generators/common-resources/cloudsql/templates/postgres-clan/instance/terragrunt.hcl +0 -36
  53. package/generators/common-resources/cloudsql/templates/postgres-clan/instance-secrets/terragrunt.hcl +0 -44
  54. package/generators/common-resources/cloudsql-database/generator.json +0 -4
  55. package/generators/common-resources/cloudsql-database/index.js +0 -70
  56. package/generators/common-resources/cloudsql-database/templates/mysql/database/proxy_port.hcl +0 -4
  57. package/generators/common-resources/cloudsql-database/templates/mysql/database/terragrunt.hcl +0 -69
  58. package/generators/common-resources/cloudsql-database/templates/mysql/outputs.json +0 -5
  59. package/generators/common-resources/cloudsql-database/templates/mysql/secrets/terragrunt.hcl +0 -30
  60. package/generators/common-resources/cloudsql-database/templates/postgres/database/proxy_port.hcl +0 -4
  61. package/generators/common-resources/cloudsql-database/templates/postgres/database/spec.hcl +0 -17
  62. package/generators/common-resources/cloudsql-database/templates/postgres/database/terragrunt.hcl +0 -74
  63. package/generators/common-resources/cloudsql-database/templates/postgres/outputs.json +0 -5
  64. package/generators/common-resources/cloudsql-database/templates/postgres/secrets/terragrunt.hcl +0 -30
  65. package/generators/common-resources/command.json +0 -8
  66. package/generators/common-resources/confluent-cluster/generator.json +0 -4
  67. package/generators/common-resources/confluent-cluster/index.js +0 -52
  68. package/generators/common-resources/confluent-cluster/templates/confluent/spec.hcl +0 -5
  69. package/generators/common-resources/confluent-cluster/templates/confluent/terragrunt.hcl +0 -25
  70. package/generators/common-resources/datastore/generator.json +0 -4
  71. package/generators/common-resources/datastore/index.js +0 -91
  72. package/generators/common-resources/datastore/templates/datastore/indexes.yaml +0 -6
  73. package/generators/common-resources/datastore/templates/datastore/terragrunt.hcl +0 -23
  74. package/generators/common-resources/elastic-cloud/generator.json +0 -4
  75. package/generators/common-resources/elastic-cloud/index.js +0 -52
  76. package/generators/common-resources/elastic-cloud/templates/elastic/spec.hcl +0 -27
  77. package/generators/common-resources/elastic-cloud/templates/elastic/terragrunt.hcl +0 -27
  78. package/generators/common-resources/elastic-index-policy/generator.json +0 -4
  79. package/generators/common-resources/elastic-index-policy/handle-yaml.js +0 -76
  80. package/generators/common-resources/elastic-index-policy/index.js +0 -210
  81. package/generators/common-resources/elastic-index-policy/templates/policy/policy.yaml +0 -28
  82. package/generators/common-resources/elastic-index-policy/templates/policy/terragrunt.hcl +0 -25
  83. package/generators/common-resources/elastic-template/generator.json +0 -4
  84. package/generators/common-resources/elastic-template/index.js +0 -84
  85. package/generators/common-resources/elastic-template/templates/elastic-template/mappings.json +0 -1
  86. package/generators/common-resources/elastic-template/templates/elastic-template/terragrunt.hcl +0 -35
  87. package/generators/common-resources/firestore/generator.json +0 -4
  88. package/generators/common-resources/firestore/index.js +0 -141
  89. package/generators/common-resources/firestore/templates/firestore/indexes/indexes.yaml +0 -12
  90. package/generators/common-resources/firestore/templates/firestore/indexes/terragrunt.hcl +0 -27
  91. package/generators/common-resources/firestore/templates/firestore/spec.hcl +0 -31
  92. package/generators/common-resources/firestore/templates/firestore/terragrunt.hcl +0 -25
  93. package/generators/common-resources/iam/generator.json +0 -4
  94. package/generators/common-resources/iam/index.js +0 -62
  95. package/generators/common-resources/iam/templates/github/workflows/iam.yml +0 -18
  96. package/generators/common-resources/iam/templates/iam.yaml +0 -8
  97. package/generators/common-resources/iam/valid-prefix.js +0 -8
  98. package/generators/common-resources/kafka-connect/generator.json +0 -4
  99. package/generators/common-resources/kafka-connect/index.js +0 -75
  100. package/generators/common-resources/kafka-connect/templates/elastic/terragrunt.hcl +0 -92
  101. package/generators/common-resources/kafka-connect/templates/pubsub/terragrunt.hcl +0 -75
  102. package/generators/common-resources/kafka-topics/generator.json +0 -4
  103. package/generators/common-resources/kafka-topics/index.js +0 -54
  104. package/generators/common-resources/kafka-topics/templates/kafka/kafka.yaml +0 -20
  105. package/generators/common-resources/kafka-topics/templates/kafka/terragrunt.hcl +0 -21
  106. package/generators/common-resources/kms/generator.json +0 -4
  107. package/generators/common-resources/kms/index.js +0 -69
  108. package/generators/common-resources/kms/templates/kms/spec.hcl +0 -5
  109. package/generators/common-resources/kms/templates/kms/terragrunt.hcl +0 -33
  110. package/generators/common-resources/memorystore/generator.json +0 -4
  111. package/generators/common-resources/memorystore/index.js +0 -69
  112. package/generators/common-resources/memorystore/templates/outputs.json +0 -3
  113. package/generators/common-resources/memorystore/templates/redis-instance/spec.hcl +0 -16
  114. package/generators/common-resources/memorystore/templates/redis-instance/terragrunt.hcl +0 -35
  115. package/generators/common-resources/memorystore/templates/secrets/terragrunt.hcl +0 -31
  116. package/generators/common-resources/monitoring/generator.json +0 -4
  117. package/generators/common-resources/monitoring/handle-yaml.js +0 -48
  118. package/generators/common-resources/monitoring/index.js +0 -192
  119. package/generators/common-resources/monitoring/templates/alerts/generic-infra.yaml +0 -633
  120. package/generators/common-resources/monitoring/templates/alerts/terragrunt.hcl +0 -37
  121. package/generators/common-resources/monitoring/templates/service/service.yaml +0 -16
  122. package/generators/common-resources/monitoring/templates/service/terragrunt.hcl +0 -37
  123. package/generators/common-resources/monitoring/templates/uptime-checks/terragrunt.hcl +0 -36
  124. package/generators/common-resources/monitoring/templates/uptime-checks/uptime-checks.yaml +0 -3
  125. package/generators/common-resources/monitoring/validate.js +0 -58
  126. package/generators/common-resources/pubsub/append.js +0 -120
  127. package/generators/common-resources/pubsub/generator.json +0 -4
  128. package/generators/common-resources/pubsub/get-gcp-projects.js +0 -34
  129. package/generators/common-resources/pubsub/handle-subscribers.js +0 -63
  130. package/generators/common-resources/pubsub/index.js +0 -316
  131. package/generators/common-resources/pubsub/templates/pubsub/spec.hcl +0 -7
  132. package/generators/common-resources/pubsub/templates/pubsub/subscribers.yaml +0 -16
  133. package/generators/common-resources/pubsub/templates/pubsub/terragrunt.hcl +0 -34
  134. package/generators/common-resources/pubsub/templates/pubsub-dlq/terragrunt.hcl +0 -42
  135. package/generators/common-resources/pubsub/templates/pubsub-external/spec.hcl +0 -10
  136. package/generators/common-resources/pubsub/templates/pubsub-external/subscribers.yaml +0 -16
  137. package/generators/common-resources/pubsub/templates/pubsub-external/terragrunt.hcl +0 -31
  138. package/generators/common-resources/pubsub/validate.js +0 -44
  139. package/generators/common-resources/scheduler/append.js +0 -83
  140. package/generators/common-resources/scheduler/generator.json +0 -4
  141. package/generators/common-resources/scheduler/index.js +0 -103
  142. package/generators/common-resources/scheduler/templates/scheduler/terragrunt.hcl +0 -44
  143. package/generators/common-resources/spanner/append.js +0 -27
  144. package/generators/common-resources/spanner/generator.json +0 -4
  145. package/generators/common-resources/spanner/index.js +0 -169
  146. package/generators/common-resources/spanner/templates/spanner/databases.yaml +0 -5
  147. package/generators/common-resources/spanner/templates/spanner/spec.hcl +0 -22
  148. package/generators/common-resources/spanner/templates/spanner/terragrunt.hcl +0 -33
  149. package/generators/common-resources/spanner/validate.js +0 -38
  150. package/generators/docs/command.json +0 -7
  151. package/generators/docs/rca/generator.json +0 -4
  152. package/generators/docs/rca/index.js +0 -50
  153. package/generators/docs/rca/templates/docs/rca_external.md +0 -43
  154. package/generators/docs/rca/templates/docs/rca_internal.md +0 -88
  155. package/generators/docs/runbook/generator.json +0 -4
  156. package/generators/docs/runbook/index.js +0 -42
  157. package/generators/docs/runbook/templates/docs/runbook.md +0 -106
  158. package/generators/docs/srb/generator.json +0 -4
  159. package/generators/docs/srb/index.js +0 -62
  160. package/generators/docs/srb/templates/docs/README.md +0 -42
  161. package/generators/docs/srb/templates/docs/adr.cmd +0 -3
  162. package/generators/docs/srb/templates/docs/adr.sh +0 -4
  163. package/generators/docs/srb/templates/docs/architecture.md +0 -68
  164. package/generators/docs/srb/templates/docs/cost-estimates.md +0 -39
  165. package/generators/docs/srb/templates/docs/dsl2png.cmd +0 -3
  166. package/generators/docs/srb/templates/docs/dsl2png.sh +0 -4
  167. package/generators/docs/srb/templates/docs/sre.md +0 -43
  168. package/generators/docs/srb/templates/sample.dsl +0 -36
  169. package/generators/init/clan-infra/gcp-projects.js +0 -36
  170. package/generators/init/clan-infra/generator.json +0 -4
  171. package/generators/init/clan-infra/index.js +0 -170
  172. package/generators/init/clan-infra/templates/.yamllint +0 -17
  173. package/generators/init/clan-infra/templates/env/project.hcl +0 -15
  174. package/generators/init/clan-infra/templates/env/secrets/secrets.yaml +0 -4
  175. package/generators/init/clan-infra/templates/env/secrets/terragrunt.hcl +0 -31
  176. package/generators/init/clan-infra/templates/github/CODEOWNERS +0 -1
  177. package/generators/init/clan-infra/templates/github/workflows/infra-verify.yml +0 -16
  178. package/generators/init/clan-infra/templates/github/workflows/infra.yml +0 -17
  179. package/generators/init/clan-infra/templates/github/workflows/release-notes.yml +0 -33
  180. package/generators/init/clan-infra/templates/github/workflows/sync-docs.yml +0 -29
  181. package/generators/init/clan-infra/templates/infra/.terraform-version +0 -1
  182. package/generators/init/clan-infra/templates/infra/.terragrunt-version +0 -1
  183. package/generators/init/clan-infra/templates/infra/README.md +0 -5
  184. package/generators/init/clan-infra/templates/infra/common.hcl +0 -24
  185. package/generators/init/clan-infra/templates/infra/terragrunt_root.hcl +0 -44
  186. package/generators/init/clan-infra/templates/notification-channels/notification-channels.yaml +0 -7
  187. package/generators/init/clan-infra/templates/notification-channels/terragrunt.hcl +0 -29
  188. package/generators/init/clan-infra/templates/release-notes/example-service.yaml +0 -23
  189. package/generators/init/clan-infra/templates/release-notes-schema/release-notes.schema.json +0 -63
  190. package/generators/init/clan-infra/tribe-clan-repo.js +0 -38
  191. package/generators/init/clan-infra/validate.js +0 -8
  192. package/generators/init/command.json +0 -7
  193. package/generators/maintenance/command.json +0 -7
  194. package/generators/maintenance/manage-states/generator.json +0 -4
  195. package/generators/maintenance/manage-states/index.js +0 -188
  196. package/generators/maintenance/update-modules/generator.json +0 -4
  197. package/generators/maintenance/update-modules/index.js +0 -102
  198. package/generators/organization/clan-project/__tests__/__snapshots__/googlecloud.test.js.snap +0 -27
  199. package/generators/organization/clan-project/generator.json +0 -4
  200. package/generators/organization/clan-project/googlecloud.js +0 -119
  201. package/generators/organization/clan-project/index.js +0 -139
  202. package/generators/organization/clan-project/templates/clan/clan.yaml +0 -22
  203. package/generators/organization/clan-project/templates/clan/terragrunt.hcl +0 -39
  204. package/generators/organization/clan-project/templates/clan-project/project.yaml +0 -14
  205. package/generators/organization/clan-project/templates/clan-project/terragrunt.hcl +0 -51
  206. package/generators/organization/clan-project/templates/clans-folder/terragrunt.hcl +0 -3
  207. package/generators/organization/clan-project/templates/department/terragrunt.hcl +0 -32
  208. package/generators/organization/clan-project/templates/tribe/terragrunt.hcl +0 -67
  209. package/generators/organization/clan-project/templates/tribe/tribe.yaml +0 -19
  210. package/generators/organization/command.json +0 -8
  211. package/src/BaseGenerator.js +0 -73
  212. package/src/SecretsGenerator.js +0 -105
  213. package/src/cli.js +0 -73
  214. package/src/dependency-check.js +0 -48
  215. package/src/update-check.js +0 -30
  216. package/src/validators.js +0 -32
  217. 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,3 +0,0 @@
1
- include {
2
- path = find_in_parent_folders("terragrunt_root.hcl")
3
- }
@@ -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 %>"
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Create a GCP organization structure.",
3
- "query": "What organization resource do you want to create?",
4
- "require": [
5
- "git-repo",
6
- "org"
7
- ]
8
- }
@@ -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
- };
@@ -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;