diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py index a8b403e88e1..f5630840668 100755 --- a/cloudinit/sources/DataSourceAzure.py +++ b/cloudinit/sources/DataSourceAzure.py @@ -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 @@ -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( diff --git a/tests/unittests/sources/test_azure.py b/tests/unittests/sources/test_azure.py index 8b0762b77e3..44c0a545170 100644 --- a/tests/unittests/sources/test_azure.py +++ b/tests/unittests/sources/test_azure.py @@ -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 @@ -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):