diff options
Diffstat (limited to 'cloudinit/sources/azure/errors.py')
-rw-r--r-- | cloudinit/sources/azure/errors.py | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/cloudinit/sources/azure/errors.py b/cloudinit/sources/azure/errors.py index ca902a03..966725b0 100644 --- a/cloudinit/sources/azure/errors.py +++ b/cloudinit/sources/azure/errors.py @@ -10,8 +10,11 @@ from datetime import datetime from io import StringIO from typing import Any, Dict, List, Optional +import requests + from cloudinit import version from cloudinit.sources.azure import identity +from cloudinit.url_helper import UrlError LOG = logging.getLogger(__name__) @@ -81,7 +84,12 @@ class ReportableError(Exception): ) def __repr__(self) -> str: - return self.as_encoded_report() + return ( + f"{self.__class__.__name__}(" + f"reason={self.reason}, " + f"timestamp={self.timestamp}, " + f"supporting_data={self.supporting_data})" + ) class ReportableErrorDhcpInterfaceNotFound(ReportableError): @@ -99,6 +107,37 @@ class ReportableErrorDhcpLease(ReportableError): self.supporting_data["interface"] = interface +class ReportableErrorImdsUrlError(ReportableError): + def __init__(self, *, exception: UrlError, duration: float) -> None: + # ConnectTimeout sub-classes ConnectError so order is important. + if isinstance(exception.cause, requests.ConnectTimeout): + reason = "connection timeout querying IMDS" + elif isinstance(exception.cause, requests.ConnectionError): + reason = "connection error querying IMDS" + elif isinstance(exception.cause, requests.ReadTimeout): + reason = "read timeout querying IMDS" + elif exception.code: + reason = "http error querying IMDS" + else: + reason = "unexpected error querying IMDS" + + super().__init__(reason) + + if exception.code: + self.supporting_data["http_code"] = exception.code + + self.supporting_data["duration"] = duration + self.supporting_data["exception"] = repr(exception) + self.supporting_data["url"] = exception.url + + +class ReportableErrorImdsMetadataParsingException(ReportableError): + def __init__(self, *, exception: ValueError) -> None: + super().__init__("error parsing IMDS metadata") + + self.supporting_data["exception"] = repr(exception) + + class ReportableErrorUnhandledException(ReportableError): def __init__(self, exception: Exception) -> None: super().__init__("unhandled exception") |