From 2fd80c633d09717b4d669848b814848748e91470 Mon Sep 17 00:00:00 2001 From: Chris Patterson Date: Tue, 4 Jan 2022 13:28:59 -0500 Subject: sources/azure: do not persist failed_desired_api_version flag (#1159) If get_imds_data_with_api_fallback() falls back to the minimum required API version, it is effectively pinned to the old API version forever. Remove the failed_desired_api_version property to prevent persistence of the flag between calls and/or reboots. The continued presence of this flag in obj.pkl should be harmless. Signed-off-by: Chris Patterson --- cloudinit/sources/DataSourceAzure.py | 42 ++++++++++++++--------------------- tests/unittests/sources/test_azure.py | 30 +++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py index a8b403e8..f5630840 100755 --- a/cloudinit/sources/DataSourceAzure.py +++ b/cloudinit/sources/DataSourceAzure.py @@ -297,13 +297,10 @@ class DataSourceAzure(sources.DataSource): 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 @@ class DataSourceAzure(sources.DataSource): 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 8b0762b7..44c0a545 100644 --- a/tests/unittests/sources/test_azure.py +++ b/tests/unittests/sources/test_azure.py @@ -2149,7 +2149,24 @@ scbus-1 on xpt0 bus 0 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 @@ scbus-1 on xpt0 bus 0 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): -- cgit v1.2.3