@@ -53,6 +53,17 @@ def main() -> None:
5353
5454 assert CLIENT_ID and CLIENT_SECRET , "GCS_CLI_CLIENT_ID and/or GCS_CLI_CLIENT_SECRET undefined"
5555
56+ manage_groups (managed_groups_config , delete_groups = args .delete )
57+
58+
59+ def manage_groups (managed_groups_config : dict [dict [str , Any ]], delete_groups : bool = False ) -> None :
60+ """
61+ Function to manage groups from a configuration dict.
62+ This function could be imported into another Python script and run with a different managed_groups_config.
63+
64+ :param managed_groups_config: Group configuration dict
65+ :type managed_groups_config: dict[dict[str, Any]]
66+ """
5667 client_app = ClientApp (
5768 app_name = "group_test_app" ,
5869 client_id = CLIENT_ID ,
@@ -63,20 +74,18 @@ def main() -> None:
6374
6475 groups_client = GroupsClient (app = client_app , app_scopes = group_scope )
6576
66- groups_manager = GroupsManager (groups_client )
67-
6877 my_groups = get_my_groups (groups_client )
69- pprint (my_groups )
78+ # pprint(my_groups)
7079
71- if args . delete :
80+ if delete_groups :
7281 print ('=' * 25 )
7382 for group in my_groups :
7483 if group ["group_type" ] == 'regular' and group ["name" ] in managed_groups_config .keys ():
7584 print (f"Deleting group { group ['name' ]} " )
7685 groups_client .delete_group (group ["id" ])
7786
7887 my_groups = get_my_groups (groups_client )
79- pprint (my_groups )
88+ # pprint(my_groups)
8089
8190 new_group_names = sorted (list (set (managed_groups_config .keys ()) - set ([group_info ['name' ] for group_info in my_groups ])))
8291 if new_group_names :
@@ -89,11 +98,11 @@ def main() -> None:
8998 groups_client = groups_client ,
9099 group_name = new_group_name ,
91100 group_description = new_group_config .get ("description" ) or f"{ new_group_name } created { datetime .now ()} " ,
92- # parent_id=SUBSCRIPTION_ID, # This doesn't work
101+ parent_id = new_group_config . get ( "parent_id" ),
93102 policies = new_group_config .get ("policies" ),
94103 )
95104
96- pprint (new_group_info )
105+ # pprint(new_group_info)
97106 my_groups .append (new_group_info )
98107
99108 print ('=' * 25 )
@@ -110,10 +119,9 @@ def main() -> None:
110119
111120 group_info ['subscription_admin_verified_id' ] = subscription_id
112121
113- # No way to list members, so we just go ahead and try to add them
114- print (f"Adding members to group \" { group_info ['name' ]} \" " )
115- add_members (
116- groups_manager = groups_manager ,
122+ print (f"Managing group membership for group \" { group_info ['name' ]} \" " )
123+ manage_membership (
124+ groups_client = groups_client ,
117125 group_id = group_info ["id" ],
118126 users = managed_groups_config [group_info ["name" ]]["members" ]
119127 )
@@ -201,26 +209,60 @@ def update_group(
201209 print (f"\t { pformat (result )} " )
202210
203211
204- def add_members (
205- groups_manager : GroupsManager ,
212+ def manage_membership (
213+ groups_client : GroupsClient ,
206214 group_id : str ,
207215 users : list [dict [str , Any ]],
208216 ) -> None :
209- """Function to add members to group
217+ """Function to manage members in a group
210218
211219 Args:
212- groups_manager (GroupsManager ): GroupsManager object
220+ groups_client (GroupsClient ): GroupsClient object
213221 group_id (str): UUID of group
214- users (list[dict[str, Any]]): List of dict {"id": "<user UUID>", "role": "member | admin"}
222+ users (list[dict[str, Any]]): List of dict {"id": "<user UUID>", "role": "member | manager | admin"}
215223 """
224+ groups_manager = GroupsManager (groups_client )
225+
226+ existing_members = groups_client .get_group (group_id , include = "memberships" ).data ["memberships" ]
227+ # pprint(existing_members)
228+
216229 for user in users :
217- result = groups_manager .add_member (
218- group_id ,
219- user ["id" ],
220- role = user .get ("role" ) or 'member'
221- )
230+ try :
231+ existing_member = [member for member in existing_members if member ["identity_id" ] == user ["id" ] and member ["status" ] != "removed" ][0 ]
232+ except IndexError :
233+ existing_member = None
234+
235+ if existing_member and existing_member ["role" ] == user ["role" ]:
236+ # Nothing to do
237+ print (f"\t User { existing_member ['identity_id' ]} already exists with role { existing_member ['role' ]} " )
238+ continue
239+
240+ role = user .get ("role" ) or 'member'
241+
242+ if existing_member : # Need to modify role
243+ print (f"\t Changing existing group member { user ['id' ]} from role \" { existing_member ['role' ]} \" to role \" { role } \" " )
244+ result = groups_manager .change_role (group_id , user ["id" ], role )
245+ else : # Need to add new user
246+ print (f"\t Adding new group member { user ['id' ]} with role \" { role } \" " )
247+ result = groups_manager .add_member (
248+ group_id ,
249+ user ["id" ],
250+ role = role
251+ )
222252 print (f"\t { pformat (result )} " )
223253
254+ member_ids = [user ["id" ] for user in users ] + [CLIENT_ID ]
255+
256+ for existing_member in existing_members :
257+ existing_member_id = existing_member ["identity_id" ]
258+ if existing_member_id not in member_ids and existing_member ['status' ] != 'removed' :
259+ print (f"\t Deleting existing user { existing_member_id } from group { group_id } " )
260+ result = groups_manager .remove_member (
261+ group_id ,
262+ existing_member_id ,
263+ )
264+ print (f"\t { pformat (result )} " )
265+
224266
225267if __name__ == '__main__' :
226268 main ()
0 commit comments