@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.
Files changed (215) 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 -81
  89. package/generators/common-resources/firestore/templates/firestore/indexes.yaml +0 -10
  90. package/generators/common-resources/firestore/templates/firestore/terragrunt.hcl +0 -25
  91. package/generators/common-resources/iam/generator.json +0 -4
  92. package/generators/common-resources/iam/index.js +0 -62
  93. package/generators/common-resources/iam/templates/github/workflows/iam.yml +0 -18
  94. package/generators/common-resources/iam/templates/iam.yaml +0 -8
  95. package/generators/common-resources/iam/valid-prefix.js +0 -8
  96. package/generators/common-resources/kafka-connect/generator.json +0 -4
  97. package/generators/common-resources/kafka-connect/index.js +0 -75
  98. package/generators/common-resources/kafka-connect/templates/elastic/terragrunt.hcl +0 -92
  99. package/generators/common-resources/kafka-connect/templates/pubsub/terragrunt.hcl +0 -75
  100. package/generators/common-resources/kafka-topics/generator.json +0 -4
  101. package/generators/common-resources/kafka-topics/index.js +0 -54
  102. package/generators/common-resources/kafka-topics/templates/kafka/kafka.yaml +0 -20
  103. package/generators/common-resources/kafka-topics/templates/kafka/terragrunt.hcl +0 -21
  104. package/generators/common-resources/kms/generator.json +0 -4
  105. package/generators/common-resources/kms/index.js +0 -69
  106. package/generators/common-resources/kms/templates/kms/spec.hcl +0 -5
  107. package/generators/common-resources/kms/templates/kms/terragrunt.hcl +0 -33
  108. package/generators/common-resources/memorystore/generator.json +0 -4
  109. package/generators/common-resources/memorystore/index.js +0 -69
  110. package/generators/common-resources/memorystore/templates/outputs.json +0 -3
  111. package/generators/common-resources/memorystore/templates/redis-instance/spec.hcl +0 -16
  112. package/generators/common-resources/memorystore/templates/redis-instance/terragrunt.hcl +0 -35
  113. package/generators/common-resources/memorystore/templates/secrets/terragrunt.hcl +0 -31
  114. package/generators/common-resources/monitoring/generator.json +0 -4
  115. package/generators/common-resources/monitoring/handle-yaml.js +0 -48
  116. package/generators/common-resources/monitoring/index.js +0 -192
  117. package/generators/common-resources/monitoring/templates/alerts/generic-infra.yaml +0 -633
  118. package/generators/common-resources/monitoring/templates/alerts/terragrunt.hcl +0 -37
  119. package/generators/common-resources/monitoring/templates/service/service.yaml +0 -16
  120. package/generators/common-resources/monitoring/templates/service/terragrunt.hcl +0 -37
  121. package/generators/common-resources/monitoring/templates/uptime-checks/terragrunt.hcl +0 -36
  122. package/generators/common-resources/monitoring/templates/uptime-checks/uptime-checks.yaml +0 -3
  123. package/generators/common-resources/monitoring/validate.js +0 -58
  124. package/generators/common-resources/pubsub/append.js +0 -120
  125. package/generators/common-resources/pubsub/generator.json +0 -4
  126. package/generators/common-resources/pubsub/get-gcp-projects.js +0 -34
  127. package/generators/common-resources/pubsub/handle-subscribers.js +0 -63
  128. package/generators/common-resources/pubsub/index.js +0 -316
  129. package/generators/common-resources/pubsub/templates/pubsub/spec.hcl +0 -7
  130. package/generators/common-resources/pubsub/templates/pubsub/subscribers.yaml +0 -16
  131. package/generators/common-resources/pubsub/templates/pubsub/terragrunt.hcl +0 -34
  132. package/generators/common-resources/pubsub/templates/pubsub-dlq/terragrunt.hcl +0 -42
  133. package/generators/common-resources/pubsub/templates/pubsub-external/spec.hcl +0 -10
  134. package/generators/common-resources/pubsub/templates/pubsub-external/subscribers.yaml +0 -16
  135. package/generators/common-resources/pubsub/templates/pubsub-external/terragrunt.hcl +0 -31
  136. package/generators/common-resources/pubsub/validate.js +0 -44
  137. package/generators/common-resources/scheduler/append.js +0 -83
  138. package/generators/common-resources/scheduler/generator.json +0 -4
  139. package/generators/common-resources/scheduler/index.js +0 -103
  140. package/generators/common-resources/scheduler/templates/scheduler/terragrunt.hcl +0 -44
  141. package/generators/common-resources/spanner/append.js +0 -27
  142. package/generators/common-resources/spanner/generator.json +0 -4
  143. package/generators/common-resources/spanner/index.js +0 -169
  144. package/generators/common-resources/spanner/templates/spanner/databases.yaml +0 -5
  145. package/generators/common-resources/spanner/templates/spanner/spec.hcl +0 -22
  146. package/generators/common-resources/spanner/templates/spanner/terragrunt.hcl +0 -33
  147. package/generators/common-resources/spanner/validate.js +0 -38
  148. package/generators/docs/command.json +0 -7
  149. package/generators/docs/rca/generator.json +0 -4
  150. package/generators/docs/rca/index.js +0 -50
  151. package/generators/docs/rca/templates/docs/rca_external.md +0 -43
  152. package/generators/docs/rca/templates/docs/rca_internal.md +0 -88
  153. package/generators/docs/runbook/generator.json +0 -4
  154. package/generators/docs/runbook/index.js +0 -42
  155. package/generators/docs/runbook/templates/docs/runbook.md +0 -106
  156. package/generators/docs/srb/generator.json +0 -4
  157. package/generators/docs/srb/index.js +0 -62
  158. package/generators/docs/srb/templates/docs/README.md +0 -42
  159. package/generators/docs/srb/templates/docs/adr.cmd +0 -3
  160. package/generators/docs/srb/templates/docs/adr.sh +0 -4
  161. package/generators/docs/srb/templates/docs/architecture.md +0 -68
  162. package/generators/docs/srb/templates/docs/cost-estimates.md +0 -39
  163. package/generators/docs/srb/templates/docs/dsl2png.cmd +0 -3
  164. package/generators/docs/srb/templates/docs/dsl2png.sh +0 -4
  165. package/generators/docs/srb/templates/docs/sre.md +0 -43
  166. package/generators/docs/srb/templates/sample.dsl +0 -36
  167. package/generators/init/clan-infra/gcp-projects.js +0 -36
  168. package/generators/init/clan-infra/generator.json +0 -4
  169. package/generators/init/clan-infra/index.js +0 -170
  170. package/generators/init/clan-infra/templates/.yamllint +0 -17
  171. package/generators/init/clan-infra/templates/env/project.hcl +0 -15
  172. package/generators/init/clan-infra/templates/env/secrets/secrets.yaml +0 -4
  173. package/generators/init/clan-infra/templates/env/secrets/terragrunt.hcl +0 -31
  174. package/generators/init/clan-infra/templates/github/CODEOWNERS +0 -1
  175. package/generators/init/clan-infra/templates/github/workflows/infra-verify.yml +0 -16
  176. package/generators/init/clan-infra/templates/github/workflows/infra.yml +0 -17
  177. package/generators/init/clan-infra/templates/github/workflows/release-notes.yml +0 -33
  178. package/generators/init/clan-infra/templates/github/workflows/sync-docs.yml +0 -29
  179. package/generators/init/clan-infra/templates/infra/.terraform-version +0 -1
  180. package/generators/init/clan-infra/templates/infra/.terragrunt-version +0 -1
  181. package/generators/init/clan-infra/templates/infra/README.md +0 -5
  182. package/generators/init/clan-infra/templates/infra/common.hcl +0 -24
  183. package/generators/init/clan-infra/templates/infra/terragrunt_root.hcl +0 -44
  184. package/generators/init/clan-infra/templates/notification-channels/notification-channels.yaml +0 -7
  185. package/generators/init/clan-infra/templates/notification-channels/terragrunt.hcl +0 -29
  186. package/generators/init/clan-infra/templates/release-notes/example-service.yaml +0 -23
  187. package/generators/init/clan-infra/templates/release-notes-schema/release-notes.schema.json +0 -63
  188. package/generators/init/clan-infra/tribe-clan-repo.js +0 -38
  189. package/generators/init/clan-infra/validate.js +0 -8
  190. package/generators/init/command.json +0 -7
  191. package/generators/maintenance/command.json +0 -7
  192. package/generators/maintenance/manage-states/generator.json +0 -4
  193. package/generators/maintenance/manage-states/index.js +0 -188
  194. package/generators/maintenance/update-modules/generator.json +0 -4
  195. package/generators/maintenance/update-modules/index.js +0 -102
  196. package/generators/organization/clan-project/__tests__/__snapshots__/googlecloud.test.js.snap +0 -27
  197. package/generators/organization/clan-project/generator.json +0 -4
  198. package/generators/organization/clan-project/googlecloud.js +0 -119
  199. package/generators/organization/clan-project/index.js +0 -139
  200. package/generators/organization/clan-project/templates/clan/clan.yaml +0 -22
  201. package/generators/organization/clan-project/templates/clan/terragrunt.hcl +0 -39
  202. package/generators/organization/clan-project/templates/clan-project/project.yaml +0 -14
  203. package/generators/organization/clan-project/templates/clan-project/terragrunt.hcl +0 -51
  204. package/generators/organization/clan-project/templates/clans-folder/terragrunt.hcl +0 -3
  205. package/generators/organization/clan-project/templates/department/terragrunt.hcl +0 -32
  206. package/generators/organization/clan-project/templates/tribe/terragrunt.hcl +0 -67
  207. package/generators/organization/clan-project/templates/tribe/tribe.yaml +0 -19
  208. package/generators/organization/command.json +0 -8
  209. package/src/BaseGenerator.js +0 -73
  210. package/src/SecretsGenerator.js +0 -105
  211. package/src/cli.js +0 -73
  212. package/src/dependency-check.js +0 -48
  213. package/src/update-check.js +0 -30
  214. package/src/validators.js +0 -32
  215. 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;