Skip to content

Commit a6d7e2b

Browse files
authored
Fix Platform Details API Pydantic validation failure (#45)
* Fix Platform Details API Pydantic validation failure (#44) The ArkPCloudPlatformsService.platform() method was failing with Pydantic validation errors because it tried to validate the Platform Details API response against the wrong model structure. Root cause: - Platform Details API (/platforms/{id}) returns: {"PlatformID": "X", "Active": true, "Details": {...}} - List Platforms API (/platforms) returns structured data that fits ArkPCloudPlatform model with nested sections Changes: - Add new ArkPCloudPlatformDetails model matching actual API response format - Update platform() method to return ArkPCloudPlatformDetails instead of ArkPCloudPlatform - Update import_platform() method return type for consistency - Add model exports to __init__.py This preserves the existing List Platforms functionality while correctly handling the Platform Details API response structure. Fixes #44 * Bump version to 2.0.15 for platform details API fix * Fix import_platform return type to match API response The Import Platform API only returns {"PlatformID": "{PlatformID}"}, so the method should return the platform ID string rather than trying to fetch platform details. This removes the type mismatch and correctly reflects what the API actually provides. Users can call platform() separately if they need platform details. * Fix Platform Details API validation with Union approach Use Union[ArkPCloudPlatform, ArkPCloudPlatformDetails] return type with try/fallback logic to maintain backward compatibility while fixing Pydantic validation failures for Details API endpoint. Addresses reviewer feedback on PR #45. * Prioritize ArkPCloudPlatform validation for backward compatibility
1 parent f723b85 commit a6d7e2b

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

ark_sdk_python/models/services/pcloud/platforms/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
ArkPCloudPrivilegedAccessWorkflows,
2020
ArkPCloudSessionManagement,
2121
)
22+
from ark_sdk_python.models.services.pcloud.platforms.ark_pcloud_platform_details import ArkPCloudPlatformDetails
2223
from ark_sdk_python.models.services.pcloud.platforms.ark_pcloud_platforms_filter import ArkPCloudPlatformsFilter
2324
from ark_sdk_python.models.services.pcloud.platforms.ark_pcloud_platforms_stats import ArkPCloudPlatformsStats
2425
from ark_sdk_python.models.services.pcloud.platforms.ark_pcloud_target_platform import (
@@ -42,6 +43,7 @@
4243
'ArkPCloudImportTargetPlatform',
4344
'ArkPCloudCredentialsManagement',
4445
'ArkPCloudPlatform',
46+
'ArkPCloudPlatformDetails',
4547
'ArkPCloudPlatformGeneralDetails',
4648
'ArkPCloudPlatformProperties',
4749
'ArkPCloudPlatformProperty',
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Dict, Any
2+
3+
from pydantic import Field
4+
5+
from ark_sdk_python.models.ark_model import ArkCamelizedModel
6+
7+
8+
class ArkPCloudPlatformDetails(ArkCamelizedModel):
9+
"""
10+
Model for Platform Details API response.
11+
This API endpoint returns a different structure than the List Platforms API.
12+
"""
13+
platform_id: str = Field(description='Platform ID', alias='PlatformID')
14+
active: bool = Field(description='Whether platform is active', alias='Active')
15+
details: Dict[str, Any] = Field(description='Platform configuration details', alias='Details')

ark_sdk_python/services/pcloud/platforms/ark_pcloud_platforms_service.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from fnmatch import fnmatch
33
from http import HTTPStatus
44
from pathlib import Path
5-
from typing import Final, List, Optional, Set
5+
from typing import Final, List, Optional, Set, Union
66

77
from overrides import overrides
88
from pydantic import TypeAdapter, ValidationError
@@ -24,6 +24,7 @@
2424
ArkPCloudImportPlatform,
2525
ArkPCloudImportTargetPlatform,
2626
ArkPCloudPlatform,
27+
ArkPCloudPlatformDetails,
2728
ArkPCloudPlatformsFilter,
2829
ArkPCloudPlatformsStats,
2930
ArkPCloudPlatformType,
@@ -99,7 +100,7 @@ def list_platforms_by(self, platforms_filter: ArkPCloudPlatformsFilter) -> List[
99100
active=platforms_filter.active, platform_type=platforms_filter.platform_type, platform_name=platforms_filter.platform_name
100101
)
101102

102-
def platform(self, get_platform: ArkPCloudGetPlatform) -> ArkPCloudPlatform:
103+
def platform(self, get_platform: ArkPCloudGetPlatform) -> Union[ArkPCloudPlatform, ArkPCloudPlatformDetails]:
103104
"""
104105
Retrieves a platform by id
105106
https://docs.cyberark.com/Product-Doc/OnlineHelp/PAS/Latest/en/Content/WebServices/GetPlatformDetails.htm
@@ -111,16 +112,21 @@ def platform(self, get_platform: ArkPCloudGetPlatform) -> ArkPCloudPlatform:
111112
ArkServiceException: _description_
112113
113114
Returns:
114-
ArkPCloudPlatform: _description_
115+
Union[ArkPCloudPlatform, ArkPCloudPlatformDetails]: Platform details in appropriate format
115116
"""
116117
self._logger.info(f'Retrieving platform [{get_platform.platform_id}]')
117118
resp: Response = self._client.get(PLATFORM_URL.format(platform_id=get_platform.platform_id))
118119
if resp.status_code == HTTPStatus.OK:
119120
try:
121+
# Try the old model first for backward compatibility
120122
return ArkPCloudPlatform.model_validate(resp.json())
121-
except (ValidationError, JSONDecodeError) as ex:
122-
self._logger.exception(f'Failed to parse platform response [{str(ex)}] - [{resp.text}]')
123-
raise ArkServiceException(f'Failed to parse platform response [{str(ex)}]') from ex
123+
except ValidationError:
124+
try:
125+
# Fallback to new Details API model
126+
return ArkPCloudPlatformDetails.model_validate(resp.json())
127+
except (ValidationError, JSONDecodeError) as ex:
128+
self._logger.exception(f'Failed to parse platform response [{str(ex)}] - [{resp.text}]')
129+
raise ArkServiceException(f'Failed to parse platform response [{str(ex)}]') from ex
124130
raise ArkServiceException(f'Failed to retrieve platform [{resp.text}] - [{resp.status_code}]')
125131

126132
def import_platform(self, import_platform: ArkPCloudImportPlatform) -> ArkPCloudPlatform:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "ark-sdk-python"
3-
version = "2.0.14"
3+
version = "2.0.15"
44
description='Official Ark SDK / CLI for CyberArk Identity Security Platform'
55
authors = ["CyberArk <[email protected]>", "Ofir Iluz <[email protected]"]
66
readme = "README.md"

0 commit comments

Comments
 (0)