0a07cd
From daed9fe5c87c679fe2576be47fc195d44629b142 Mon Sep 17 00:00:00 2001
0a07cd
From: Eduardo Otubo <otubo@redhat.com>
0a07cd
Date: Wed, 29 May 2019 13:41:48 +0200
0a07cd
Subject: [PATCH 4/5] DataSourceAzure: Adjust timeout for polling IMDS
0a07cd
0a07cd
RH-Author: Eduardo Otubo <otubo@redhat.com>
0a07cd
Message-id: <20190529134149.842-5-otubo@redhat.com>
0a07cd
Patchwork-id: 88267
0a07cd
O-Subject: [RHEL-8.0.1/RHEL-8.1.0 cloud-init PATCHv2 4/5] DataSourceAzure: Adjust timeout for polling IMDS
0a07cd
Bugzilla: 1648375
0a07cd
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
0a07cd
RH-Acked-by: Cathy Avery <cavery@redhat.com>
0a07cd
0a07cd
From: Anh Vo <anhvo@microsoft.com>
0a07cd
commit ab6621d849b24bb652243e88c79f6f3b446048d7
0a07cd
Author: Anh Vo <anhvo@microsoft.com>
0a07cd
Date:   Wed May 8 14:54:03 2019 +0000
0a07cd
0a07cd
    DataSourceAzure: Adjust timeout for polling IMDS
0a07cd
0a07cd
    If the IMDS primary server is not available, falling back to the
0a07cd
    secondary server takes about 1s. The net result is that the
0a07cd
    expected E2E time is slightly more than 1s. This change increases
0a07cd
    the timeout to 2s to prevent the infinite loop of timeouts.
0a07cd
0a07cd
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
0a07cd
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a07cd
---
0a07cd
 cloudinit/sources/DataSourceAzure.py          | 15 ++++++++++-----
0a07cd
 tests/unittests/test_datasource/test_azure.py | 10 +++++++---
0a07cd
 2 files changed, 17 insertions(+), 8 deletions(-)
0a07cd
0a07cd
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
0a07cd
index c827816..5baf8da 100755
0a07cd
--- a/cloudinit/sources/DataSourceAzure.py
0a07cd
+++ b/cloudinit/sources/DataSourceAzure.py
0a07cd
@@ -57,7 +57,12 @@ AZURE_CHASSIS_ASSET_TAG = '7783-7084-3265-9085-8269-3286-77'
0a07cd
 REPROVISION_MARKER_FILE = "/var/lib/cloud/data/poll_imds"
0a07cd
 REPORTED_READY_MARKER_FILE = "/var/lib/cloud/data/reported_ready"
0a07cd
 AGENT_SEED_DIR = '/var/lib/waagent'
0a07cd
+
0a07cd
+# In the event where the IMDS primary server is not
0a07cd
+# available, it takes 1s to fallback to the secondary one
0a07cd
+IMDS_TIMEOUT_IN_SECONDS = 2
0a07cd
 IMDS_URL = "http://169.254.169.254/metadata/"
0a07cd
+
0a07cd
 PLATFORM_ENTROPY_SOURCE = "/sys/firmware/acpi/tables/OEM0"
0a07cd
 
0a07cd
 # List of static scripts and network config artifacts created by
0a07cd
@@ -582,9 +587,9 @@ class DataSourceAzure(sources.DataSource):
0a07cd
                         return
0a07cd
                     self._ephemeral_dhcp_ctx.clean_network()
0a07cd
                 else:
0a07cd
-                    return readurl(url, timeout=1, headers=headers,
0a07cd
-                                   exception_cb=exc_cb, infinite=True,
0a07cd
-                                   log_req_resp=False).contents
0a07cd
+                    return readurl(url, timeout=IMDS_TIMEOUT_IN_SECONDS,
0a07cd
+                                   headers=headers, exception_cb=exc_cb,
0a07cd
+                                   infinite=True, log_req_resp=False).contents
0a07cd
             except UrlError:
0a07cd
                 # Teardown our EphemeralDHCPv4 context on failure as we retry
0a07cd
                 self._ephemeral_dhcp_ctx.clean_network()
0a07cd
@@ -1291,8 +1296,8 @@ def _get_metadata_from_imds(retries):
0a07cd
     headers = {"Metadata": "true"}
0a07cd
     try:
0a07cd
         response = readurl(
0a07cd
-            url, timeout=1, headers=headers, retries=retries,
0a07cd
-            exception_cb=retry_on_url_exc)
0a07cd
+            url, timeout=IMDS_TIMEOUT_IN_SECONDS, headers=headers,
0a07cd
+            retries=retries, exception_cb=retry_on_url_exc)
0a07cd
     except Exception as e:
0a07cd
         LOG.debug('Ignoring IMDS instance metadata: %s', e)
0a07cd
         return {}
0a07cd
diff --git a/tests/unittests/test_datasource/test_azure.py b/tests/unittests/test_datasource/test_azure.py
0a07cd
index eacf225..bc8b42c 100644
0a07cd
--- a/tests/unittests/test_datasource/test_azure.py
0a07cd
+++ b/tests/unittests/test_datasource/test_azure.py
0a07cd
@@ -163,7 +163,8 @@ class TestGetMetadataFromIMDS(HttprettyTestCase):
0a07cd
 
0a07cd
         m_readurl.assert_called_with(
0a07cd
             self.network_md_url, exception_cb=mock.ANY,
0a07cd
-            headers={'Metadata': 'true'}, retries=2, timeout=1)
0a07cd
+            headers={'Metadata': 'true'}, retries=2,
0a07cd
+            timeout=dsaz.IMDS_TIMEOUT_IN_SECONDS)
0a07cd
 
0a07cd
     @mock.patch('cloudinit.url_helper.time.sleep')
0a07cd
     @mock.patch(MOCKPATH + 'net.is_up')
0a07cd
@@ -1789,7 +1790,8 @@ class TestAzureDataSourcePreprovisioning(CiTestCase):
0a07cd
                                     headers={'Metadata': 'true',
0a07cd
                                              'User-Agent':
0a07cd
                                              'Cloud-Init/%s' % vs()
0a07cd
-                                             }, method='GET', timeout=1,
0a07cd
+                                             }, method='GET',
0a07cd
+                                    timeout=dsaz.IMDS_TIMEOUT_IN_SECONDS,
0a07cd
                                     url=full_url)])
0a07cd
         self.assertEqual(m_dhcp.call_count, 2)
0a07cd
         m_net.assert_any_call(
0a07cd
@@ -1826,7 +1828,9 @@ class TestAzureDataSourcePreprovisioning(CiTestCase):
0a07cd
                                     headers={'Metadata': 'true',
0a07cd
                                              'User-Agent':
0a07cd
                                              'Cloud-Init/%s' % vs()},
0a07cd
-                                    method='GET', timeout=1, url=full_url)])
0a07cd
+                                    method='GET',
0a07cd
+                                    timeout=dsaz.IMDS_TIMEOUT_IN_SECONDS,
0a07cd
+                                    url=full_url)])
0a07cd
         self.assertEqual(m_dhcp.call_count, 2)
0a07cd
         m_net.assert_any_call(
0a07cd
             broadcast='192.168.2.255', interface='eth9', ip='192.168.2.9',
0a07cd
-- 
0a07cd
1.8.3.1
0a07cd