Skip to content

Commit 13d9b57

Browse files
ludoojuliocc
authored andcommitted
Flexible stage 2s in FAST resource manager (GoogleCloudPlatform#2840)
* wip * WIP * wip * wip * apply untested * tests * support tag expansion for tenant-level installations in IAM conditions * fix stage config output * inventories * remove dev files * tfdoc * enable org policies for stage folders * resman README * tfdoc * stage 3 documentation * inventory * support extra_dirs in testing franework * remove org policy files from stage 1 * Add principal interpolation to iam_by_principals (GoogleCloudPlatform#2847) * Add principal interpolation to iam_by_principals * Fix tests * relax schemas * relax schemas --------- Co-authored-by: Julio Castillo <[email protected]>
1 parent b3d92b1 commit 13d9b57

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1604
-1401
lines changed

fast/stages/1-resman/README.md

+35-39
Large diffs are not rendered by default.

fast/stages/1-resman/billing.tf

+7-25
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,18 @@
1919
locals {
2020
billing_iam = merge(
2121
# stage 2
22-
var.fast_stage_2.networking.enabled != true ? {} : {
23-
sa_net_billing = {
24-
member = module.net-sa-rw[0].iam_email
22+
{
23+
for k, v in local.stage2 : "sa_${v.short_name}_billing" => {
24+
member = module.stage2-sa-rw[k].iam_email
2525
role = "roles/billing.user"
2626
}
2727
},
28-
var.fast_stage_2.security.enabled != true ? {} : {
29-
sa_sec_billing = {
30-
member = module.sec-sa-rw[0].iam_email
31-
role = "roles/billing.user"
28+
{
29+
for k, v in local.stage2 : "sa_${v.short_name}_costs_manager" => {
30+
member = module.stage2-sa-rw[k].iam_email
31+
role = "roles/billing.costsManager"
3232
}
3333
},
34-
var.fast_stage_2.project_factory.enabled != true ? {} : merge(
35-
{
36-
sa_pf_billing = {
37-
member = module.pf-sa-rw[0].iam_email
38-
role = "roles/billing.user"
39-
},
40-
sa_pf_costs_manager = {
41-
member = module.pf-sa-rw[0].iam_email
42-
role = "roles/billing.costsManager"
43-
}
44-
},
45-
var.billing_account.is_org_level != true ? {} : {
46-
sa_pf_ro_viewer = {
47-
member = module.pf-sa-ro[0].iam_email
48-
role = var.custom_roles.billing_viewer
49-
}
50-
}
51-
),
5234
# stage 3
5335
{
5436
for k, v in local.stage3 : k => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Copyright 2025 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
# yaml-language-server: $schema=../../schemas/fast-stage2.schema.json
16+
17+
short_name: net
18+
folder_config:
19+
name: Networking
20+
create_env_folders: true
21+
iam_by_principals:
22+
rw:
23+
- roles/logging.admin
24+
- roles/owner
25+
- roles/resourcemanager.folderAdmin
26+
- roles/resourcemanager.projectCreator
27+
- roles/compute.xpnAdmin
28+
- roles/resourcemanager.tagUser
29+
ro:
30+
- roles/viewer
31+
- roles/resourcemanager.folderViewer
32+
- roles/resourcemanager.tagViewer
33+
project-factory-rw:
34+
- service_project_network_admin
35+
project-factory-ro:
36+
- roles/compute.networkViewer
37+
- project_iam_viewer
38+
gcp-network-admins:
39+
- roles/editor
40+
# project factory delegated IAM grant
41+
iam_bindings:
42+
project_factory:
43+
role: roles/resourcemanager.projectIamAdmin
44+
members:
45+
- project-factory-rw
46+
condition:
47+
title: Project factory delegated IAM grant.
48+
expression: |
49+
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly([
50+
'roles/compute.networkUser', 'roles/composer.sharedVpcAgent',
51+
'roles/container.hostServiceAgentUser', 'roles/vpcaccess.user'
52+
])
53+
# iam_bindings_additive for stage 3 are added here when needed
54+
# refer to each stage 3 documentation for snippets and examples
55+
organization_config:
56+
iam_bindings_additive:
57+
sa_net_rw_fw_policy_admin:
58+
member: rw
59+
role: roles/compute.orgFirewallPolicyAdmin
60+
sa_net_rw_ngfw_enterprise_admin:
61+
member: rw
62+
role: ngfw_enterprise_admin
63+
sa_net_rw_xpn_admin:
64+
member: rw
65+
role: roles/compute.xpnAdmin
66+
sa_net_ro_fw_policy_user:
67+
member: ro
68+
role: roles/compute.orgFirewallPolicyUser
69+
sa_net_ro_ngfw_enterprise_viewer:
70+
member: ro
71+
role: ngfw_enterprise_viewer
72+
# stage_3_config for IAM delegation are added here when needed
73+
# refer to each stage 3 documentation for snippets and examples

fast/stages/1-resman/data/stage-3/project-factory-dev.yaml renamed to fast/stages/1-resman/data/stage-2/project-factory.yaml

+11-7
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
# yaml-language-server: $schema=../../schemas/fast-stage3.schema.json
15+
# yaml-language-server: $schema=../../schemas/fast-stage2.schema.json
1616

1717
short_name: pf
18-
environment: dev
19-
stage2_iam:
20-
networking:
21-
iam_admin_delegated: true
22-
security:
23-
iam_admin_delegated: true
18+
organization_config:
19+
iam_bindings_additive:
20+
sa_pf_conditional_org_policy:
21+
member: rw
22+
role: roles/orgpolicy.policyAdmin
23+
condition:
24+
title: org_policy_tag_pf_scoped
25+
description: Org policy tag scoped grant for project factory.
26+
expression: |
27+
resource.matchTag('${organization.id}/${tag_names.context}', 'project-factory')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Copyright 2025 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
# yaml-language-server: $schema=../../schemas/fast-stage2.schema.json
16+
17+
short_name: sec
18+
folder_config:
19+
name: Security
20+
iam_by_principals:
21+
rw:
22+
- roles/logging.admin
23+
- roles/owner
24+
- roles/resourcemanager.folderAdmin
25+
- roles/resourcemanager.projectCreator
26+
- roles/resourcemanager.tagUser
27+
ro:
28+
- roles/viewer
29+
- roles/resourcemanager.folderViewer
30+
- roles/resourcemanager.tagViewer
31+
project-factory-rw:
32+
- roles/cloudkms.cryptoKeyEncrypterDecrypter
33+
project-factory-ro:
34+
- roles/cloudkms.viewer
35+
- project_iam_viewer
36+
gcp-security-admins:
37+
- roles/editor
38+
39+
# project factory delegated IAM grant
40+
iam_bindings:
41+
project_factory:
42+
role: roles/resourcemanager.projectIamAdmin
43+
members:
44+
- project-factory-rw
45+
condition:
46+
title: Project factory delegated IAM grant.
47+
expression: |
48+
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly([
49+
'roles/cloudkms.cryptoKeyEncrypterDecrypter'
50+
])
51+
organization_config:
52+
iam_bindings_additive:
53+
sa_sec_cloudasset:
54+
member: rw
55+
role: roles/cloudasset.viewer

fast/stages/1-resman/data/stage-3/gcve-dev.yaml

-8
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,3 @@ environment: dev
1919
folder_config:
2020
name: Development
2121
parent_id: gcve
22-
stage2_iam:
23-
networking:
24-
iam_admin_delegated: true
25-
sa_roles:
26-
ro:
27-
- gcve_network_viewer
28-
rw:
29-
- gcve_network_admin

fast/stages/1-resman/data/stage-3/gcve-prod.yaml

-29
This file was deleted.

fast/stages/1-resman/data/stage-3/gke-dev.yaml

-8
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,3 @@ environment: dev
1919
folder_config:
2020
name: Development
2121
parent_id: gke
22-
stage2_iam:
23-
networking:
24-
iam_admin_delegated: true
25-
sa_roles:
26-
ro:
27-
- roles/dns.reader
28-
rw:
29-
- roles/dns.admin

fast/stages/1-resman/data/stage-3/gke-prod.yaml

-28
This file was deleted.

fast/stages/1-resman/data/stage-3/project-factory-prod.yaml

-23
This file was deleted.

fast/stages/1-resman/data/top-level-folders/sandbox.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2024 Google LLC
1+
# Copyright 2025 Google LLC
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -20,8 +20,8 @@ automation:
2020
short_name: sbox
2121
# You can create role bindings referring to the automation service account by
2222
# referring to it using `self` keyword, per the example below
23-
iam:
24-
"roles/owner":
23+
iam:
24+
roles/owner:
2525
- self
2626
factories_config:
2727
org_policies: data/org-policies/sandbox

fast/stages/1-resman/data/top-level-folders/teams.yaml

+13-28
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2024 Google LLC
1+
# Copyright 2025 Google LLC
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -15,33 +15,18 @@
1515
# yaml-language-server: $schema=../../schemas/top-level-folder.schema.json
1616

1717
name: Teams
18-
iam:
19-
"roles/owner":
20-
- project-factory
21-
"roles/resourcemanager.folderAdmin":
22-
- project-factory
23-
"roles/resourcemanager.projectCreator":
24-
- project-factory
25-
"roles/resourcemanager.tagUser":
26-
- project-factory
27-
"service_project_network_admin":
28-
- project-factory
29-
"roles/viewer":
30-
- project-factory-r
31-
"roles/resourcemanager.folderViewer":
32-
- project-factory-r
33-
"roles/resourcemanager.tagViewer":
34-
- project-factory-r
35-
iam_bindings:
36-
pf_viewer:
37-
role: organization_admin_viewer
38-
members:
39-
- project-factory-r
40-
# Modify condition expression to match your own organization tags
41-
# condition:
42-
# title: project-factory-only
43-
#
44-
# expression: "resource.matchTag(\"12345678/context\", \"project-factory\")"
18+
iam_by_principals:
19+
project-factory-rw:
20+
- roles/owner
21+
- roles/resourcemanager.folderAdmin
22+
- roles/resourcemanager.projectCreator
23+
- roles/resourcemanager.tagUser
24+
- service_project_network_admin
25+
project-factory-ro:
26+
- roles/viewer
27+
- roles/resourcemanager.folderViewer
28+
- roles/resourcemanager.tagViewer
29+
4530
# don't create a context tag since this uses the pf tag
4631
is_fast_context: false
4732
tag_bindings:

0 commit comments

Comments
 (0)