Skip to content

Commit eb09369

Browse files
authored
Merge branch 'master' into add_skip_provisioners_variable_to_skip_local-exec
2 parents 55ce9e3 + 9983d8d commit eb09369

File tree

24 files changed

+104
-19
lines changed

24 files changed

+104
-19
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Extending the adopted spec, each change should have a link to its corresponding
1515
### Added
1616

1717
* Added [private](https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/tree/master/modules/private-cluster-update-variant) and [beta private](https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/tree/master/modules/beta-private-cluster-update-variant) variants which allow node pools to be created before being destroyed. [#256]
18+
* Add a parameter `registry_project_id` to allow connecting to registries in other projects. [#273]
1819

1920
## [v5.0.0] - 2019-09-25
2021
v5.0.0 is a backwards-incompatible release. Please see the [upgrading guide](./docs/upgrading_to_v5.0.md).
@@ -204,6 +205,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o
204205
[v0.3.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.2.0...v0.3.0
205206
[v0.2.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.1.0...v0.2.0
206207

208+
[#273]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/273
207209
[#247]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/247
208210
[#256]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/256
209211
[#248]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/248

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o
167167
| project\_id | The project ID to host the cluster in (required) | string | n/a | yes |
168168
| region | The region to host the cluster in (optional if zonal cluster / required if regional) | string | `"null"` | no |
169169
| regional | Whether is a regional cluster (zonal cluster if set false. WARNING: changing this after cluster creation is destructive!) | bool | `"true"` | no |
170+
| registry\_project\_id | Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project. | string | `""` | no |
170171
| remove\_default\_node\_pool | Remove default node pool while setting up the cluster | bool | `"false"` | no |
171172
| service\_account | The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created. | string | `""` | no |
172173
| skip\_provisioners | Flag to skip all local-exec provisioners. It breaks down `stub_domains` and `upstream_nameservers` variables functionality. | bool | `"false"` | no |
@@ -229,6 +230,9 @@ following project roles:
229230
- roles/iam.serviceAccountUser
230231
- roles/resourcemanager.projectIamAdmin (only required if `service_account` is set to `create`)
231232

233+
Additionally, if `service_account` is set to `create` and `grant_registry_access` is requested, the service account requires the following role on the `registry_project_id` project:
234+
- roles/resourcemanager.projectIamAdmin
235+
232236
### Enable APIs
233237
In order to operate with the Service Account you must activate the following APIs on the project where the Service Account was created:
234238

autogen/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,9 @@ following project roles:
269269
- roles/iam.serviceAccountUser
270270
- roles/resourcemanager.projectIamAdmin (only required if `service_account` is set to `create`)
271271

272+
Additionally, if `service_account` is set to `create` and `grant_registry_access` is requested, the service account requires the following role on the `registry_project_id` project:
273+
- roles/resourcemanager.projectIamAdmin
274+
272275
### Enable APIs
273276
In order to operate with the Service Account you must activate the following APIs on the project where the Service Account was created:
274277

autogen/sa.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ resource "google_project_iam_member" "cluster_service_account-monitoring_viewer"
6464

6565
resource "google_project_iam_member" "cluster_service_account-gcr" {
6666
count = var.create_service_account && var.grant_registry_access ? 1 : 0
67-
project = var.project_id
67+
project = var.registry_project_id == "" ? var.project_id : var.registry_project_id
6868
role = "roles/storage.objectViewer"
6969
member = "serviceAccount:${google_service_account.cluster_service_account[0].email}"
7070
}

autogen/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ variable "grant_registry_access" {
270270
default = false
271271
}
272272

273+
variable "registry_project_id" {
274+
type = string
275+
description = "Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project."
276+
default = ""
277+
}
278+
273279
variable "service_account" {
274280
type = string
275281
description = "The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created."

examples/workload_metadata_config/main.tf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ module "gke" {
4040
subnetwork = var.subnetwork
4141
ip_range_pods = var.ip_range_pods
4242
ip_range_services = var.ip_range_services
43-
create_service_account = false
44-
service_account = var.compute_engine_service_account
43+
create_service_account = true
44+
grant_registry_access = true
45+
registry_project_id = var.registry_project_id
4546
enable_private_endpoint = true
4647
enable_private_nodes = true
4748
master_ipv4_cidr_block = "172.16.0.0/28"

examples/workload_metadata_config/variables.tf

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ variable "ip_range_services" {
4848
description = "The secondary ip range to use for pods"
4949
}
5050

51-
variable "compute_engine_service_account" {
52-
description = "Service account to associate to the nodes in the cluster"
51+
variable "registry_project_id" {
52+
description = "Project name for the GCR registry"
5353
}
54-

modules/beta-private-cluster/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o
190190
| project\_id | The project ID to host the cluster in (required) | string | n/a | yes |
191191
| region | The region to host the cluster in (optional if zonal cluster / required if regional) | string | `"null"` | no |
192192
| regional | Whether is a regional cluster (zonal cluster if set false. WARNING: changing this after cluster creation is destructive!) | bool | `"true"` | no |
193+
| registry\_project\_id | Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project. | string | `""` | no |
193194
| remove\_default\_node\_pool | Remove default node pool while setting up the cluster | bool | `"false"` | no |
194195
| resource\_usage\_export\_dataset\_id | The dataset id for which network egress metering for this cluster will be enabled. If enabled, a daemonset will be created in the cluster to meter network egress traffic. | string | `""` | no |
195196
| sandbox\_enabled | (Beta) Enable GKE Sandbox (Do not forget to set `image_type` = `COS_CONTAINERD` and `node_version` = `1.12.7-gke.17` or later to use it). | bool | `"false"` | no |
@@ -259,6 +260,9 @@ following project roles:
259260
- roles/iam.serviceAccountUser
260261
- roles/resourcemanager.projectIamAdmin (only required if `service_account` is set to `create`)
261262

263+
Additionally, if `service_account` is set to `create` and `grant_registry_access` is requested, the service account requires the following role on the `registry_project_id` project:
264+
- roles/resourcemanager.projectIamAdmin
265+
262266
### Enable APIs
263267
In order to operate with the Service Account you must activate the following APIs on the project where the Service Account was created:
264268

modules/beta-private-cluster/sa.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ resource "google_project_iam_member" "cluster_service_account-monitoring_viewer"
6464

6565
resource "google_project_iam_member" "cluster_service_account-gcr" {
6666
count = var.create_service_account && var.grant_registry_access ? 1 : 0
67-
project = var.project_id
67+
project = var.registry_project_id == "" ? var.project_id : var.registry_project_id
6868
role = "roles/storage.objectViewer"
6969
member = "serviceAccount:${google_service_account.cluster_service_account[0].email}"
7070
}

modules/beta-private-cluster/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,12 @@ variable "grant_registry_access" {
268268
default = false
269269
}
270270

271+
variable "registry_project_id" {
272+
type = string
273+
description = "Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project."
274+
default = ""
275+
}
276+
271277
variable "service_account" {
272278
type = string
273279
description = "The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created."

modules/beta-public-cluster/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o
181181
| project\_id | The project ID to host the cluster in (required) | string | n/a | yes |
182182
| region | The region to host the cluster in (optional if zonal cluster / required if regional) | string | `"null"` | no |
183183
| regional | Whether is a regional cluster (zonal cluster if set false. WARNING: changing this after cluster creation is destructive!) | bool | `"true"` | no |
184+
| registry\_project\_id | Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project. | string | `""` | no |
184185
| remove\_default\_node\_pool | Remove default node pool while setting up the cluster | bool | `"false"` | no |
185186
| resource\_usage\_export\_dataset\_id | The dataset id for which network egress metering for this cluster will be enabled. If enabled, a daemonset will be created in the cluster to meter network egress traffic. | string | `""` | no |
186187
| sandbox\_enabled | (Beta) Enable GKE Sandbox (Do not forget to set `image_type` = `COS_CONTAINERD` and `node_version` = `1.12.7-gke.17` or later to use it). | bool | `"false"` | no |
@@ -250,6 +251,9 @@ following project roles:
250251
- roles/iam.serviceAccountUser
251252
- roles/resourcemanager.projectIamAdmin (only required if `service_account` is set to `create`)
252253

254+
Additionally, if `service_account` is set to `create` and `grant_registry_access` is requested, the service account requires the following role on the `registry_project_id` project:
255+
- roles/resourcemanager.projectIamAdmin
256+
253257
### Enable APIs
254258
In order to operate with the Service Account you must activate the following APIs on the project where the Service Account was created:
255259

modules/beta-public-cluster/sa.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ resource "google_project_iam_member" "cluster_service_account-monitoring_viewer"
6464

6565
resource "google_project_iam_member" "cluster_service_account-gcr" {
6666
count = var.create_service_account && var.grant_registry_access ? 1 : 0
67-
project = var.project_id
67+
project = var.registry_project_id == "" ? var.project_id : var.registry_project_id
6868
role = "roles/storage.objectViewer"
6969
member = "serviceAccount:${google_service_account.cluster_service_account[0].email}"
7070
}

modules/beta-public-cluster/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,12 @@ variable "grant_registry_access" {
268268
default = false
269269
}
270270

271+
variable "registry_project_id" {
272+
type = string
273+
description = "Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project."
274+
default = ""
275+
}
276+
271277
variable "service_account" {
272278
type = string
273279
description = "The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created."

modules/private-cluster/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o
176176
| project\_id | The project ID to host the cluster in (required) | string | n/a | yes |
177177
| region | The region to host the cluster in (optional if zonal cluster / required if regional) | string | `"null"` | no |
178178
| regional | Whether is a regional cluster (zonal cluster if set false. WARNING: changing this after cluster creation is destructive!) | bool | `"true"` | no |
179+
| registry\_project\_id | Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project. | string | `""` | no |
179180
| remove\_default\_node\_pool | Remove default node pool while setting up the cluster | bool | `"false"` | no |
180181
| service\_account | The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created. | string | `""` | no |
181182
| skip\_provisioners | Flag to skip all local-exec provisioners. It breaks down `stub_domains` and `upstream_nameservers` variables functionality. | bool | `"false"` | no |
@@ -238,6 +239,9 @@ following project roles:
238239
- roles/iam.serviceAccountUser
239240
- roles/resourcemanager.projectIamAdmin (only required if `service_account` is set to `create`)
240241

242+
Additionally, if `service_account` is set to `create` and `grant_registry_access` is requested, the service account requires the following role on the `registry_project_id` project:
243+
- roles/resourcemanager.projectIamAdmin
244+
241245
### Enable APIs
242246
In order to operate with the Service Account you must activate the following APIs on the project where the Service Account was created:
243247

modules/private-cluster/sa.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ resource "google_project_iam_member" "cluster_service_account-monitoring_viewer"
6464

6565
resource "google_project_iam_member" "cluster_service_account-gcr" {
6666
count = var.create_service_account && var.grant_registry_access ? 1 : 0
67-
project = var.project_id
67+
project = var.registry_project_id == "" ? var.project_id : var.registry_project_id
6868
role = "roles/storage.objectViewer"
6969
member = "serviceAccount:${google_service_account.cluster_service_account[0].email}"
7070
}

modules/private-cluster/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,12 @@ variable "grant_registry_access" {
258258
default = false
259259
}
260260

261+
variable "registry_project_id" {
262+
type = string
263+
description = "Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project."
264+
default = ""
265+
}
266+
261267
variable "service_account" {
262268
type = string
263269
description = "The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created."

sa.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ resource "google_project_iam_member" "cluster_service_account-monitoring_viewer"
6464

6565
resource "google_project_iam_member" "cluster_service_account-gcr" {
6666
count = var.create_service_account && var.grant_registry_access ? 1 : 0
67-
project = var.project_id
67+
project = var.registry_project_id == "" ? var.project_id : var.registry_project_id
6868
role = "roles/storage.objectViewer"
6969
member = "serviceAccount:${google_service_account.cluster_service_account[0].email}"
7070
}

test/fixtures/shared/outputs.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,6 @@ output "service_account" {
7979
value = module.example.service_account
8080
}
8181

82+
output "registry_project_id" {
83+
value = var.registry_project_id
84+
}

test/fixtures/shared/variables.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,7 @@ variable "compute_engine_service_account" {
3333
description = "The email address of the service account to associate with the GKE cluster"
3434
}
3535

36+
variable "registry_project_id" {
37+
description = "Project to use for granting access to the GCR registry, if requested"
38+
}
39+

test/fixtures/workload_metadata_config/example.tf

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
module "example" {
1818
source = "../../../examples/workload_metadata_config"
1919

20-
project_id = var.project_id
21-
cluster_name_suffix = "-${random_string.suffix.result}"
22-
region = var.region
23-
zones = slice(var.zones, 0, 1)
24-
network = google_compute_network.main.name
25-
subnetwork = google_compute_subnetwork.main.name
26-
ip_range_pods = google_compute_subnetwork.main.secondary_ip_range[0].range_name
27-
ip_range_services = google_compute_subnetwork.main.secondary_ip_range[1].range_name
28-
compute_engine_service_account = var.compute_engine_service_account
20+
project_id = var.project_id
21+
cluster_name_suffix = "-${random_string.suffix.result}"
22+
region = var.region
23+
zones = slice(var.zones, 0, 1)
24+
network = google_compute_network.main.name
25+
subnetwork = google_compute_subnetwork.main.name
26+
ip_range_pods = google_compute_subnetwork.main.secondary_ip_range[0].range_name
27+
ip_range_services = google_compute_subnetwork.main.secondary_ip_range[1].range_name
28+
registry_project_id = var.registry_project_id
2929
}

test/integration/workload_metadata_config/controls/gcloud.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
# limitations under the License.
1414

1515
project_id = attribute('project_id')
16+
registry_project_id = attribute('registry_project_id')
1617
location = attribute('location')
1718
cluster_name = attribute('cluster_name')
19+
service_account = attribute('service_account')
1820

1921
control "gcloud" do
2022
title "Google Compute Engine GKE configuration"
@@ -55,4 +57,20 @@
5557
end
5658
end
5759
end
60+
61+
describe command("gcloud projects get-iam-policy #{registry_project_id} --format=json") do
62+
its(:exit_status) { should eq 0 }
63+
its(:stderr) { should eq '' }
64+
65+
let!(:iam) do
66+
if subject.exit_status == 0
67+
JSON.parse(subject.stdout)
68+
else
69+
{}
70+
end
71+
end
72+
it "has expected registry roles" do
73+
expect(iam['bindings']).to include("members" => ["serviceAccount:#{service_account}"], "role" => "roles/storage.objectViewer")
74+
end
75+
end
5876
end

test/integration/workload_metadata_config/inspec.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,9 @@ attributes:
99
- name: project_id
1010
required: true
1111
type: string
12+
- name: service_account
13+
required: true
14+
type: string
15+
- name: registry_project_id
16+
required: false
17+
type: string

test/setup/make_source.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ echo "#!/usr/bin/env bash" > ../source.sh
1919
project_id=$(terraform output project_id)
2020
echo "export TF_VAR_project_id='$project_id'" >> ../source.sh
2121

22+
# We use the same project for registry project in the tests.
23+
echo "export TF_VAR_registry_project_id='$project_id'" >> ../source.sh
24+
2225
sa_json=$(terraform output sa_key)
2326
# shellcheck disable=SC2086
2427
echo "export SERVICE_ACCOUNT_JSON='$(echo $sa_json | base64 --decode)'" >> ../source.sh

variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,12 @@ variable "grant_registry_access" {
258258
default = false
259259
}
260260

261+
variable "registry_project_id" {
262+
type = string
263+
description = "Project holding the Google Container Registry. If empty, we use the cluster project. If grant_registry_access is true, storage.objectViewer role is assigned on this project."
264+
default = ""
265+
}
266+
261267
variable "service_account" {
262268
type = string
263269
description = "The service account to run nodes as if not overridden in `node_pools`. The create_service_account variable default value (true) will cause a cluster-specific service account to be created."

0 commit comments

Comments
 (0)