From 589aaf99cd8c0f70967b3249cb40e3961ddfeb7e Mon Sep 17 00:00:00 2001 From: Ashwini Kumar Date: Wed, 23 Sep 2026 14:36:25 +0530 Subject: [PATCH] fix(ms-azure): handle missing "details" field in inner-error objects Per the Azure error schema (https://schema.mp.microsoft.com/schema/error/2022-07-01) , "details" is optional. Treat its absence as no further nesting rather than raising InvalidSchema. Assisted-by: Claude Sonnet 4.6 --- cloudpub/ms_azure/utils.py | 7 +++++-- tests/ms_azure/test_utils.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/cloudpub/ms_azure/utils.py b/cloudpub/ms_azure/utils.py index a95cac3..0a6000d 100644 --- a/cloudpub/ms_azure/utils.py +++ b/cloudpub/ms_azure/utils.py @@ -556,9 +556,12 @@ def _contains_certification_error(item: Any) -> bool: message: str = item.get("message", "") if code == "invalidState" and "certification" in message.lower(): return True - if not isinstance(item.get('details'), list): + details = item.get('details') + if details is None: + return False + if not isinstance(details, list): raise InvalidSchema(f"Invalid schema for 'details' inside error object: {item}") - for detail in item.get("details") or []: + for detail in details: if _contains_certification_error(detail): return True return False diff --git a/tests/ms_azure/test_utils.py b/tests/ms_azure/test_utils.py index 8f1498b..9f7186b 100644 --- a/tests/ms_azure/test_utils.py +++ b/tests/ms_azure/test_utils.py @@ -522,8 +522,24 @@ def test_is_certification_error(cert_error_failure: list[Dict[str, Any]]) -> Non ], } ] + # Inner-errors (in "details") may omit their own "details" field. This must not raise + # InvalidSchema — it just means no further nesting, so it's not a certification error. + no_details_non_certification_error: list[Dict[str, Any]] = [ + { + "resourceId": "virtual-machine-plan-technical-configuration/test", + "code": "conflict", + "message": "PackageSet failed CreateUpdate with response code: BadRequest", + "details": [ + { + "code": "invalidState", + "message": "PackageSet failed CreateUpdate with response code: BadRequest", + } + ], + } + ] assert is_certification_error(cert_error_failure) is True assert is_certification_error(valid_non_certification_errors) is False + assert is_certification_error(no_details_non_certification_error) is False assert is_certification_error([]) is False