Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 17 additions & 25 deletions cloudinit/sources/DataSourceAzure.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,13 +297,10 @@ def __init__(self, sys_cfg, distro, paths):
self.dhclient_lease_file = self.ds_cfg.get("dhclient_lease_file")
self._network_config = None
self._ephemeral_dhcp_ctx = None
self.failed_desired_api_version = False
self.iso_dev = None

def _unpickle(self, ci_pkl_version: int) -> None:
super()._unpickle(ci_pkl_version)
if not hasattr(self, "failed_desired_api_version"):
self.failed_desired_api_version = False
if not hasattr(self, "iso_dev"):
self.iso_dev = None

Expand Down Expand Up @@ -647,29 +644,24 @@ def get_imds_data_with_api_fallback(
this fault tolerant and fall back to a good known minimum api
version.
"""

if not self.failed_desired_api_version:
for _ in range(retries):
try:
LOG.info("Attempting IMDS api-version: %s", IMDS_VER_WANT)
return get_metadata_from_imds(
fallback_nic=fallback_nic,
retries=0,
md_type=md_type,
api_version=IMDS_VER_WANT,
exc_cb=exc_cb,
)
except UrlError as err:
LOG.info(
"UrlError with IMDS api-version: %s", IMDS_VER_WANT
for _ in range(retries):
try:
LOG.info("Attempting IMDS api-version: %s", IMDS_VER_WANT)
return get_metadata_from_imds(
fallback_nic=fallback_nic,
retries=0,
md_type=md_type,
api_version=IMDS_VER_WANT,
exc_cb=exc_cb,
)
except UrlError as err:
LOG.info("UrlError with IMDS api-version: %s", IMDS_VER_WANT)
if err.code == 400:
log_msg = "Fall back to IMDS api-version: {}".format(
IMDS_VER_MIN
)
if err.code == 400:
log_msg = "Fall back to IMDS api-version: {}".format(
IMDS_VER_MIN
)
report_diagnostic_event(log_msg, logger_func=LOG.info)
self.failed_desired_api_version = True
break
report_diagnostic_event(log_msg, logger_func=LOG.info)
break

LOG.info("Using IMDS api-version: %s", IMDS_VER_MIN)
return get_metadata_from_imds(
Expand Down
30 changes: 28 additions & 2 deletions tests/unittests/sources/test_azure.py
Original file line number Diff line number Diff line change
Expand Up @@ -2149,7 +2149,24 @@ def get_metadata_from_imds_side_eff(*args, **kwargs):
dsrc = self._get_ds(data)
dsrc.get_data()
self.assertIsNotNone(dsrc.metadata)
self.assertTrue(dsrc.failed_desired_api_version)

assert m_get_metadata_from_imds.mock_calls == [
mock.call(
fallback_nic="eth9",
retries=0,
md_type=dsaz.metadata_type.all,
api_version="2021-08-01",
exc_cb=mock.ANY,
),
mock.call(
fallback_nic="eth9",
retries=10,
md_type=dsaz.metadata_type.all,
api_version="2019-06-01",
exc_cb=mock.ANY,
infinite=False,
),
]

@mock.patch(
MOCKPATH + "get_metadata_from_imds", return_value=NETWORK_METADATA
Expand All @@ -2164,7 +2181,16 @@ def test_imds_api_version_wanted_exists(self, m_get_metadata_from_imds):
dsrc = self._get_ds(data)
dsrc.get_data()
self.assertIsNotNone(dsrc.metadata)
self.assertFalse(dsrc.failed_desired_api_version)

assert m_get_metadata_from_imds.mock_calls == [
mock.call(
fallback_nic="eth9",
retries=0,
md_type=dsaz.metadata_type.all,
api_version="2021-08-01",
exc_cb=mock.ANY,
)
]

@mock.patch(MOCKPATH + "get_metadata_from_imds")
def test_hostname_from_imds(self, m_get_metadata_from_imds):
Expand Down