Skip to content

Commit 4e4c09c

Browse files
committed
Member roles can now be changed and members removed.
1 parent 5b2566e commit 4e4c09c

4 files changed

Lines changed: 69 additions & 25 deletions

File tree

code/examples/create_and_populate_groups/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ The path to a valid YAML or JSON group configuration file needs to be supplied a
1919
description: "<optional group description>"
2020
members:
2121
- id: "<globus user uuid>"
22-
role: "<admin | member>"
22+
role: "<admin | manager | member>"
2323
user: "<informational field only - user email?>"
2424
...
2525
policies:
@@ -43,7 +43,7 @@ The path to a valid YAML or JSON group configuration file needs to be supplied a
4343
{
4444
"user": "<informational field only - user email?>",
4545
"id": "<globus user uuid>",
46-
"role": "<admin | member>"
46+
"role": "<admin | manager | member>"
4747
},
4848
...
4949
],

code/examples/create_and_populate_groups/create_and_populate_groups.py

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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"\tUser {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"\tChanging 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"\tAdding 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"\tDeleting 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

225267
if __name__ == '__main__':
226268
main()

code/examples/create_and_populate_groups/managed_groups.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
{
1111
"user": "steele.cooke@aarnet.edu.au",
1212
"id": "547541ca-d5dd-42e5-aa08-6174a61928b7",
13-
"role": "member"
13+
"role": "manager"
1414
},
1515
{
1616
"user": "greg.darcy@aarnet.edu.au",
1717
"id": "17111e0b-8777-47a4-92f6-f563e64ba171",
1818
"role": "member"
1919
}
2020
],
21+
"parent_id": "c4d1a384-679a-11ea-b75d-0a53601d30b5",
2122
"policies": {
2223
"is_high_assurance": false,
2324
"authentication_assurance_timeout": 1800,

code/examples/create_and_populate_groups/managed_groups.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ Auto-created test group:
66
role: admin
77
user: alex.ip@aarnet.edu.au
88
- id: 547541ca-d5dd-42e5-aa08-6174a61928b7
9-
role: member
9+
role: manager
1010
user: steele.cooke@aarnet.edu.au
1111
- id: 17111e0b-8777-47a4-92f6-f563e64ba171
1212
role: member
1313
user: greg.darcy@aarnet.edu.au
14+
parent_id: "c4d1a384-679a-11ea-b75d-0a53601d30b5",
1415
policies:
1516
authentication_assurance_timeout: 1800
1617
group_members_visibility: members

0 commit comments

Comments
 (0)