20a859
From c98408a2cf874435c7423a1574a9ffc81053707a Mon Sep 17 00:00:00 2001
20a859
From: Lars Kellogg-Stedman <lars@redhat.com>
20a859
Date: Tue, 17 Jan 2017 08:53:22 -0500
20a859
Subject: [PATCH] OpenStack: Use timeout and retries from config in get_data.
20a859
20a859
This modifies get_data in DataSourceOpenStack.py to get the timeout
20a859
and retries values from the data source configuration, rather than
20a859
from keyword arguments.  This permits get_data to use the same timeout
20a859
as other methods, and allows an operator to increase the timeout in
20a859
environments where the metadata service takes longer than five seconds
20a859
to respond.
20a859
20a859
LP: #1657130
20a859
Resolves: rhbz#1408589
20a859
(cherry picked from commit 4cf53f1544f8f5629330eab3efef1a18255c277a)
20a859
---
20a859
 cloudinit/sources/DataSourceOpenStack.py          | 15 ++++++++++++---
20a859
 tests/unittests/test_datasource/test_openstack.py |  8 ++++----
20a859
 2 files changed, 16 insertions(+), 7 deletions(-)
20a859
20a859
diff --git a/cloudinit/sources/DataSourceOpenStack.py b/cloudinit/sources/DataSourceOpenStack.py
20a859
index 2a58f1c..e1ea21f 100644
20a859
--- a/cloudinit/sources/DataSourceOpenStack.py
20a859
+++ b/cloudinit/sources/DataSourceOpenStack.py
20a859
@@ -45,6 +45,7 @@ class DataSourceOpenStack(openstack.SourceMixin, sources.DataSource):
20a859
         # max_wait < 0 indicates do not wait
20a859
         max_wait = -1
20a859
         timeout = 10
20a859
+        retries = 5
20a859
 
20a859
         try:
20a859
             max_wait = int(self.ds_cfg.get("max_wait", max_wait))
20a859
@@ -55,7 +56,13 @@ class DataSourceOpenStack(openstack.SourceMixin, sources.DataSource):
20a859
             timeout = max(0, int(self.ds_cfg.get("timeout", timeout)))
20a859
         except Exception:
20a859
             util.logexc(LOG, "Failed to get timeout, using %s", timeout)
20a859
-        return (max_wait, timeout)
20a859
+
20a859
+        try:
20a859
+            retries = int(self.ds_cfg.get("retries", retries))
20a859
+        except Exception:
20a859
+            util.logexc(LOG, "Failed to get max wait. using %s", retries)
20a859
+
20a859
+        return (max_wait, timeout, retries)
20a859
 
20a859
     def wait_for_metadata_service(self):
20a859
         urls = self.ds_cfg.get("metadata_urls", [DEF_MD_URL])
20a859
@@ -76,7 +83,7 @@ class DataSourceOpenStack(openstack.SourceMixin, sources.DataSource):
20a859
             md_urls.append(md_url)
20a859
             url2base[md_url] = url
20a859
 
20a859
-        (max_wait, timeout) = self._get_url_settings()
20a859
+        (max_wait, timeout, retries) = self._get_url_settings()
20a859
         start_time = time.time()
20a859
         avail_url = url_helper.wait_for_url(urls=md_urls, max_wait=max_wait,
20a859
                                             timeout=timeout)
20a859
@@ -89,13 +96,15 @@ class DataSourceOpenStack(openstack.SourceMixin, sources.DataSource):
20a859
         self.metadata_address = url2base.get(avail_url)
20a859
         return bool(avail_url)
20a859
 
20a859
-    def get_data(self, retries=5, timeout=5):
20a859
+    def get_data(self):
20a859
         try:
20a859
             if not self.wait_for_metadata_service():
20a859
                 return False
20a859
         except IOError:
20a859
             return False
20a859
 
20a859
+        (max_wait, timeout, retries) = self._get_url_settings()
20a859
+
20a859
         try:
20a859
             results = util.log_time(LOG.debug,
20a859
                                     'Crawl of openstack metadata service',
20a859
diff --git a/tests/unittests/test_datasource/test_openstack.py b/tests/unittests/test_datasource/test_openstack.py
20a859
index e5b6fcc..28e1833 100644
20a859
--- a/tests/unittests/test_datasource/test_openstack.py
20a859
+++ b/tests/unittests/test_datasource/test_openstack.py
20a859
@@ -232,7 +232,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
20a859
                                        None,
20a859
                                        helpers.Paths({}))
20a859
         self.assertIsNone(ds_os.version)
20a859
-        found = ds_os.get_data(timeout=0.1, retries=0)
20a859
+        found = ds_os.get_data()
20a859
         self.assertTrue(found)
20a859
         self.assertEqual(2, ds_os.version)
20a859
         md = dict(ds_os.metadata)
20a859
@@ -256,7 +256,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
20a859
                                        None,
20a859
                                        helpers.Paths({}))
20a859
         self.assertIsNone(ds_os.version)
20a859
-        found = ds_os.get_data(timeout=0.1, retries=0)
20a859
+        found = ds_os.get_data()
20a859
         self.assertFalse(found)
20a859
         self.assertIsNone(ds_os.version)
20a859
 
20a859
@@ -275,7 +275,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
20a859
             'timeout': 0,
20a859
         }
20a859
         self.assertIsNone(ds_os.version)
20a859
-        found = ds_os.get_data(timeout=0.1, retries=0)
20a859
+        found = ds_os.get_data()
20a859
         self.assertFalse(found)
20a859
         self.assertIsNone(ds_os.version)
20a859
 
20a859
@@ -298,7 +298,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
20a859
             'timeout': 0,
20a859
         }
20a859
         self.assertIsNone(ds_os.version)
20a859
-        found = ds_os.get_data(timeout=0.1, retries=0)
20a859
+        found = ds_os.get_data()
20a859
         self.assertFalse(found)
20a859
         self.assertIsNone(ds_os.version)
20a859