Skip to content

Commit fa587ae

Browse files
authored
feat: Add support for conditional per_folder_admins and all_folder_adm… (#88)
1 parent e1295d0 commit fa587ae

File tree

1 file changed

+38
-14
lines changed

1 file changed

+38
-14
lines changed

main.tf

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,35 @@ locals {
1818
prefix = var.prefix == "" ? "" : "${var.prefix}-"
1919
folders_list = [for name in var.names : try(google_folder.folders[name], "")]
2020
first_folder = try(local.folders_list[0], {})
21-
folder_admin_roles_map_data = merge([
22-
for name, config in var.per_folder_admins : {
23-
for role in config.roles != null ? config.roles : var.folder_admin_roles : "${name}-${role}" =>
24-
{
21+
22+
# Handle roles for per_folder_admins if provided
23+
folder_admin_roles_map_data = flatten([
24+
for name, config in var.per_folder_admins : [
25+
for role in config.roles != null ? config.roles : var.folder_admin_roles : {
2526
name = name,
2627
role = role,
27-
members = config.members,
28+
members = config.members
2829
}
29-
}
30-
]...)
30+
]
31+
])
32+
33+
# Handle roles for all_folder_admins if provided, applied to all folders only if they are not part of per_folder_admins
34+
folder_admin_roles_all_folders = flatten([
35+
for folder in var.names : [
36+
for role in var.folder_admin_roles : {
37+
name = folder,
38+
role = role,
39+
members = var.all_folder_admins
40+
}
41+
]
42+
# Only add roles for all_folder_admins if they are not already present in per_folder_admins
43+
if length(var.all_folder_admins) > 0 && !contains(keys(var.per_folder_admins), folder)
44+
])
45+
46+
# Merge per_folder_admins and all_folder_admins, avoiding duplication
47+
folder_admin_roles_combined = [
48+
for role_map in concat(local.folder_admin_roles_map_data, local.folder_admin_roles_all_folders) : role_map
49+
]
3150
}
3251

3352
resource "google_folder" "folders" {
@@ -41,13 +60,18 @@ resource "google_folder" "folders" {
4160
# give project creation access to service accounts
4261
# https://cloud.google.com/resource-manager/docs/access-control-folders#granting_folder-specific_roles_to_enable_project_creation
4362

44-
resource "google_folder_iam_binding" "owners" {
45-
for_each = var.set_roles ? local.folder_admin_roles_map_data : {}
46-
folder = google_folder.folders[each.value.name].name
47-
role = each.value.role
63+
locals {
64+
folder_iam_bindings = var.set_roles && length(local.folder_admin_roles_combined) > 0 ? { for i, role in local.folder_admin_roles_combined : "${role.name}-${role.role}" => role } : {}
65+
}
66+
67+
resource "google_folder_iam_binding" "owners_combined" {
68+
for_each = local.folder_iam_bindings
69+
70+
folder = google_folder.folders[each.value.name].name
71+
role = each.value.role
4872

49-
members = concat(
73+
members = distinct(flatten([
5074
each.value.members,
51-
var.all_folder_admins,
52-
)
75+
length(var.all_folder_admins) > 0 && contains(var.names, each.value.name) ? var.all_folder_admins : []
76+
]))
5377
}

0 commit comments

Comments
 (0)