Skip to content

Commit 292cd54

Browse files
author
Nivedithaa Mahendran
committed
Fetch resource id
1 parent c36d4d7 commit 292cd54

2 files changed

Lines changed: 46 additions & 12 deletions

File tree

src/mas/devops/users.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,10 @@ def get_user(self, user_id):
214214
# Get MAXADMIN API key for authentication
215215
maxadmin_manage_api_key = self.create_or_get_manage_api_key_for_user(MASUserUtils.MAXADMIN, temporary=True)
216216

217-
url = f"{self.manage_api_url_internal}/maximo/api/os/masperuser/{user_id}"
217+
url = f"{self.manage_api_url_internal}/maximo/api/os/masperuser"
218218
querystring = {
219-
"lean": 1
219+
"lean": 1,
220+
"oslc.where": f"userid=\"{user_id}\""
220221
}
221222
headers = {
222223
"Accept": "application/json",
@@ -229,6 +230,9 @@ def get_user(self, user_id):
229230
cert=self.manage_internal_client_pem_file_path,
230231
verify=self.manage_internal_ca_pem_file_path
231232
)
233+
self.logger.info(f"GET {url} returned {response.status_code}")
234+
self.logger.debug(f"Response: {response.text}")
235+
self.logger.debug(f"Response json: {response.json}")
232236
else:
233237
# For earlier versions, use the Core API v3/users endpoint
234238
url = f"{self.mas_api_url_internal}/v3/users/{user_id}"
@@ -341,15 +345,15 @@ def get_or_create_user(self, payload):
341345

342346
raise Exception(f"{response.status_code} {response.text}")
343347

344-
def set_user_group_reassignment_auth(self, user_id, groupreassign, manage_api_key):
348+
def set_user_group_reassignment_auth(self, resource_id, groupreassign, manage_api_key):
345349
"""
346350
Set group reassignment authorization for a user via Manage API.
347351
348352
This method updates the grpreassignauth field for a user's maxuser record,
349353
which controls which security groups the user can reassign to other users.
350354
351355
Args:
352-
user_id (str): The unique identifier of the user.
356+
resource_id (str): The resource identifier of the user (extracted from href).
353357
groupreassign (list): List of group objects in format [{"groupname": "GROUP1"}, {"groupname": "GROUP2"}, ...]
354358
manage_api_key (dict): API key record with 'apikey' field for authentication.
355359
@@ -360,13 +364,13 @@ def set_user_group_reassignment_auth(self, user_id, groupreassign, manage_api_ke
360364
Exception: If the update fails.
361365
"""
362366
if not groupreassign or len(groupreassign) == 0:
363-
self.logger.debug(f"No group reassignment authorization to set for user {user_id}")
367+
self.logger.debug(f"No group reassignment authorization to set for resource {resource_id}")
364368
return
365369

366-
self.logger.info(f"Setting group reassignment authorization for user {user_id} with {len(groupreassign)} groups")
370+
self.logger.info(f"Setting group reassignment authorization for resource {resource_id} with {len(groupreassign)} groups")
367371

368372
# Use Manage API to update the user's grpreassignauth
369-
url = f"{self.manage_api_url_internal}/maximo/api/os/masperuser/{user_id}"
373+
url = f"{self.manage_api_url_internal}/maximo/api/os/masperuser/{resource_id}"
370374
querystring = {
371375
"lean": 1,
372376
"ccm": 1
@@ -398,7 +402,7 @@ def set_user_group_reassignment_auth(self, user_id, groupreassign, manage_api_ke
398402
self.logger.info(f"Response text: {response.text}")
399403

400404
if response.status_code == 200:
401-
self.logger.info(f"Successfully set group reassignment authorization for user {user_id}")
405+
self.logger.info(f"Successfully set group reassignment authorization for resource {resource_id}")
402406
return response.json()
403407

404408
raise Exception(f"Failed to set group reassignment authorization: {response.status_code} {response.text}")
@@ -1617,6 +1621,18 @@ def create_initial_user_for_saas(self, user, user_type, groupreassign=None):
16171621
self.logger.info(f"User def - {user_def}")
16181622
user_info = self.get_or_create_user(user_def)
16191623
self.logger.info(f"User info - {user_info}")
1624+
1625+
# Parse resource_id from user_info for version >= 9.1
1626+
resource_id = None
1627+
if Version(self.mas_version) >= Version('9.1') and user_info:
1628+
# Check if user_info has member array with href
1629+
if "member" in user_info and len(user_info["member"]) > 0:
1630+
href = user_info["member"][0].get("href", "")
1631+
# Extract resource_id from href (e.g., "api/os/masperuser/<resource_id>")
1632+
if href and "/" in href:
1633+
resource_id = href.split("/")[-1]
1634+
self.logger.info(f"Extracted resource_id: {resource_id} from user_info")
1635+
16201636
self.link_user_to_local_idp(user_id, email_password=True)
16211637
self.add_user_to_workspace(user_id, is_workspace_admin=is_workspace_admin)
16221638

@@ -1642,7 +1658,10 @@ def create_initial_user_for_saas(self, user, user_type, groupreassign=None):
16421658
for manage_security_group in manage_security_groups:
16431659
self.add_user_to_manage_group(user_id, manage_security_group, maxadmin_manage_api_key)
16441660
if Version(self.mas_version) >= Version('9.1') and user_type == "PRIMARY" and groupreassign is not None:
1645-
self.set_user_group_reassignment_auth(user_id, groupreassign, maxadmin_manage_api_key)
1661+
if resource_id:
1662+
self.set_user_group_reassignment_auth(resource_id, groupreassign, maxadmin_manage_api_key)
1663+
else:
1664+
self.logger.warning(f"Cannot set group reassignment auth: resource_id not found for user {user_id}")
16461665

16471666
# # Grant authorization to reassign users to/from ALL security groups (PRIMARY users only)
16481667
# if user_type == "PRIMARY":

test/src/test_users.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,9 @@ def mock_get_user(requests_mock, user_id, json, status_code, mock_manage_api_key
210210
)
211211

212212
# Mock Manage API endpoint for version >= 9.1
213+
# Uses query parameter oslc.where instead of path parameter
213214
manage_mock = requests_mock.get(
214-
f"{MANAGE_API_URL}/maximo/api/os/masperuser/{user_id}?lean=1",
215+
f"{MANAGE_API_URL}/maximo/api/os/masperuser?lean=1&oslc.where=userid%3D%22{user_id}%22",
215216
request_headers={"apikey": mock_manage_api_key["apikey"]},
216217
json=json,
217218
status_code=status_code,
@@ -1940,7 +1941,18 @@ def test_create_initial_user_for_saas(
19401941
manage_security_groups = manage_security_groups_91
19411942
permissions = None # Not used in 9.1
19421943
entitlement = None # Not used in 9.1
1943-
user_utils.get_or_create_user = MagicMock()
1944+
# Mock get_or_create_user to return appropriate response based on version
1945+
# Note: user_id might be None at this point, it gets set to user_email later
1946+
actual_user_id = user_id if user_id is not None else user_email
1947+
if mas_version == '9.1':
1948+
# For 9.1, return response with member array containing href with resource_id
1949+
resource_id = f"_{actual_user_id.replace('@', '_').replace('.', '_')}_resource_id"
1950+
user_utils.get_or_create_user = MagicMock(return_value={
1951+
"member": [{"href": f"api/os/masperuser/{resource_id}"}],
1952+
"id": actual_user_id
1953+
})
1954+
else:
1955+
user_utils.get_or_create_user = MagicMock(return_value={"id": actual_user_id})
19441956
user_utils.link_user_to_local_idp = MagicMock()
19451957
user_utils.add_user_to_workspace = MagicMock()
19461958
mas_workspace_application_ids = ["manage", "iot", "facilities"]
@@ -2078,7 +2090,10 @@ def test_create_initial_user_for_saas(
20782090
else: # 9.1
20792091
user_utils.add_user_to_manage_group.assert_not_called()
20802092
if user_type == "PRIMARY":
2081-
user_utils.set_user_group_reassignment_auth.assert_called_once_with(user_id, [{"groupname": "USERMANAGEMENT"}], manage_api_key)
2093+
# For 9.1, resource_id is passed instead of user_id
2094+
actual_user_id = user_id if user_id is not None else user_email
2095+
resource_id = f"_{actual_user_id.replace('@', '_').replace('.', '_')}_resource_id"
2096+
user_utils.set_user_group_reassignment_auth.assert_called_once_with(resource_id, [{"groupname": "USERMANAGEMENT"}], manage_api_key)
20822097
else:
20832098
user_utils.set_user_group_reassignment_auth.assert_not_called()
20842099
else:

0 commit comments

Comments
 (0)