@@ -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
3352resource "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