summaryrefslogtreecommitdiff
path: root/ironic_python_agent/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ironic_python_agent/tests')
-rw-r--r--ironic_python_agent/tests/unit/extensions/test_standby.py82
1 files changed, 70 insertions, 12 deletions
diff --git a/ironic_python_agent/tests/unit/extensions/test_standby.py b/ironic_python_agent/tests/unit/extensions/test_standby.py
index d4030f09..b0cc081b 100644
--- a/ironic_python_agent/tests/unit/extensions/test_standby.py
+++ b/ironic_python_agent/tests/unit/extensions/test_standby.py
@@ -18,6 +18,7 @@ from unittest import mock
from ironic_lib import exception
from oslo_concurrency import processutils
+import requests
from ironic_python_agent import errors
from ironic_python_agent.extensions import standby
@@ -369,7 +370,8 @@ class TestStandbyExtension(base.IronicAgentTest):
standby._download_image(image_info)
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies={})
+ stream=True, proxies={},
+ timeout=60)
write = file_mock.write
write.assert_any_call('some')
write.assert_any_call('content')
@@ -400,7 +402,8 @@ class TestStandbyExtension(base.IronicAgentTest):
self.assertEqual(no_proxy, os.environ['no_proxy'])
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies=proxies)
+ stream=True, proxies=proxies,
+ timeout=60)
write = file_mock.write
write.assert_any_call('some')
write.assert_any_call('content')
@@ -1111,7 +1114,8 @@ class TestStandbyExtension(base.IronicAgentTest):
'/dev/foo')
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies={})
+ stream=True, proxies={},
+ timeout=60)
expected_calls = [mock.call('some'), mock.call('content')]
file_mock.write.assert_has_calls(expected_calls)
fix_gpt_mock.assert_called_once_with('/dev/foo', node_uuid=None)
@@ -1136,7 +1140,8 @@ class TestStandbyExtension(base.IronicAgentTest):
image_info, '/dev/foo')
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies={})
+ stream=True, proxies={},
+ timeout=60)
# Assert write was only called once and failed!
file_mock.write.assert_called_once_with('some')
@@ -1254,11 +1259,13 @@ class TestImageDownload(base.IronicAgentTest):
self.assertEqual(content, list(image_download))
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies={})
+ stream=True, proxies={},
+ timeout=60)
self.assertEqual(image_info['checksum'],
image_download._hash_algo.hexdigest())
- def test_download_image_fail(self, requests_mock, time_mock):
+ @mock.patch('time.sleep', autospec=True)
+ def test_download_image_fail(self, sleep_mock, requests_mock, time_mock):
response = requests_mock.return_value
response.status_code = 401
response.text = 'Unauthorized'
@@ -1272,7 +1279,56 @@ class TestImageDownload(base.IronicAgentTest):
standby.ImageDownload, image_info)
requests_mock.assert_called_once_with(image_info['urls'][0],
cert=None, verify=True,
- stream=True, proxies={})
+ stream=True, proxies={},
+ timeout=60)
+ self.assertFalse(sleep_mock.called)
+
+ @mock.patch('time.sleep', autospec=True)
+ def test_download_image_retries(self, sleep_mock, requests_mock,
+ time_mock):
+ response = requests_mock.return_value
+ response.status_code = 500
+ response.text = 'Oops'
+ time_mock.return_value = 0.0
+ image_info = _build_fake_image_info()
+ msg = ('Error downloading image: Download of image fake_id failed: '
+ 'URL: http://example.org; time: .* seconds. Error: '
+ 'Received status code 500 from http://example.org, expected '
+ '200. Response body: Oops')
+ self.assertRaisesRegex(errors.ImageDownloadError, msg,
+ standby.ImageDownload, image_info)
+ requests_mock.assert_called_with(image_info['urls'][0],
+ cert=None, verify=True,
+ stream=True, proxies={},
+ timeout=60)
+ self.assertEqual(3, requests_mock.call_count)
+ sleep_mock.assert_called_with(5)
+ self.assertEqual(2, sleep_mock.call_count)
+
+ @mock.patch('time.sleep', autospec=True)
+ def test_download_image_retries_success(self, sleep_mock, requests_mock,
+ md5_mock):
+ content = ['SpongeBob', 'SquarePants']
+ fail_response = mock.Mock()
+ fail_response.status_code = 500
+ fail_response.text = " "
+ response = mock.Mock()
+ response.status_code = 200
+ response.iter_content.return_value = content
+ requests_mock.side_effect = [requests.Timeout, fail_response, response]
+
+ image_info = _build_fake_image_info()
+ md5_mock.return_value.hexdigest.return_value = image_info['checksum']
+ image_download = standby.ImageDownload(image_info)
+
+ self.assertEqual(content, list(image_download))
+ requests_mock.assert_called_with(image_info['urls'][0],
+ cert=None, verify=True,
+ stream=True, proxies={},
+ timeout=60)
+ self.assertEqual(3, requests_mock.call_count)
+ sleep_mock.assert_called_with(5)
+ self.assertEqual(2, sleep_mock.call_count)
def test_download_image_and_checksum(self, requests_mock, md5_mock):
content = ['SpongeBob', 'SquarePants']
@@ -1293,9 +1349,9 @@ class TestImageDownload(base.IronicAgentTest):
self.assertEqual(content, list(image_download))
requests_mock.assert_has_calls([
mock.call('http://example.com/checksum', cert=None, verify=True,
- stream=True, proxies={}),
+ stream=True, proxies={}, timeout=60),
mock.call(image_info['urls'][0], cert=None, verify=True,
- stream=True, proxies={}),
+ stream=True, proxies={}, timeout=60),
])
self.assertEqual(fake_cs, image_download._hash_algo.hexdigest())
@@ -1323,9 +1379,9 @@ foobar irrelevant file.img
self.assertEqual(content, list(image_download))
requests_mock.assert_has_calls([
mock.call('http://example.com/checksum', cert=None, verify=True,
- stream=True, proxies={}),
+ stream=True, proxies={}, timeout=60),
mock.call(image_info['urls'][0], cert=None, verify=True,
- stream=True, proxies={}),
+ stream=True, proxies={}, timeout=60),
])
self.assertEqual(fake_cs, image_download._hash_algo.hexdigest())
@@ -1378,7 +1434,9 @@ foobar irrelevant file.img
response = mock.Mock()
response.status_code = 200
response.iter_content.return_value = content
- requests_mock.side_effect = [cs_response, response]
+ # 3 retries on status code
+ requests_mock.side_effect = [cs_response, cs_response, cs_response,
+ response]
image_info = _build_fake_image_info(
'http://example.com/path/image.img')