Simplify tenacity sleep mocking

This changes the tenacity sleep mocking to not rely on tenacity
internals, and to mock for all tests so that slow tests are not
accidently missed.

Change-Id: I0519e5e1c0edc1f2192a011f9fa524b5380d3518
Related-Bug: #1788802
This commit is contained in:
Steve Baker 2018-08-28 12:00:34 +12:00
parent 6519c0a953
commit eba4912fc4
1 changed files with 27 additions and 53 deletions

View File

@ -13,13 +13,11 @@
# under the License. # under the License.
# #
import inspect
import json import json
import mock import mock
import operator import operator
import requests import requests
import six import six
import tenacity
import urllib3 import urllib3
from oslo_concurrency import processutils from oslo_concurrency import processutils
@ -166,6 +164,10 @@ class TestDockerImageUploader(base.TestCase):
def setUp(self): def setUp(self):
super(TestDockerImageUploader, self).setUp() super(TestDockerImageUploader, self).setUp()
self.uploader = image_uploader.DockerImageUploader() self.uploader = image_uploader.DockerImageUploader()
self.uploader._push.retry.sleep = mock.Mock()
self.uploader._pull.retry.sleep = mock.Mock()
self.uploader._inspect.retry.sleep = mock.Mock()
self.patcher = mock.patch('tripleo_common.image.image_uploader.Client') self.patcher = mock.patch('tripleo_common.image.image_uploader.Client')
self.dockermock = self.patcher.start() self.dockermock = self.patcher.start()
@ -636,8 +638,6 @@ class TestDockerImageUploader(base.TestCase):
]) ])
def test_pull_retry(self): def test_pull_retry(self):
orig_call = tenacity.wait.wait_random_exponential.__call__
orig_argspec = inspect.getargspec(orig_call)
image = 'docker.io/tripleomaster/heat-docker-agents-centos' image = 'docker.io/tripleomaster/heat-docker-agents-centos'
dockerc = self.dockermock.return_value dockerc = self.dockermock.return_value
@ -648,22 +648,16 @@ class TestDockerImageUploader(base.TestCase):
['{"error": "ouch"}'], ['{"error": "ouch"}'],
['{"status": "done"}'] ['{"status": "done"}']
] ]
with mock.patch('tenacity.wait.wait_random_exponential.__call__') as f: self.uploader._pull(dockerc, image)
f.return_value = 0
with mock.patch('inspect.getargspec') as mock_args:
mock_args.return_value = orig_argspec
self.uploader._pull(dockerc, image) self.assertEqual(dockerc.pull.call_count, 5)
dockerc.pull.assert_has_calls([
self.assertEqual(dockerc.pull.call_count, 5) mock.call(image, tag=None, stream=True)
dockerc.pull.assert_has_calls([ ])
mock.call(image, tag=None, stream=True)
])
def test_pull_retry_failure(self): def test_pull_retry_failure(self):
orig_call = tenacity.wait.wait_random_exponential.__call__
orig_argspec = inspect.getargspec(orig_call)
image = 'docker.io/tripleomaster/heat-docker-agents-centos' image = 'docker.io/tripleomaster/heat-docker-agents-centos'
dockerc = self.dockermock.return_value dockerc = self.dockermock.return_value
dockerc.pull.side_effect = [ dockerc.pull.side_effect = [
urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'), urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'),
@ -672,23 +666,15 @@ class TestDockerImageUploader(base.TestCase):
urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'), urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'),
urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'), urllib3.exceptions.ReadTimeoutError('p', '/foo', 'ouch'),
] ]
self.assertRaises(urllib3.exceptions.ReadTimeoutError,
self.uploader._pull, dockerc, image)
with mock.patch('tenacity.wait.wait_random_exponential.__call__') as f: self.assertEqual(dockerc.pull.call_count, 5)
f.return_value = 0 dockerc.pull.assert_has_calls([
with mock.patch('inspect.getargspec') as mock_args: mock.call(image, tag=None, stream=True)
mock_args.return_value = orig_argspec ])
self.assertRaises(urllib3.exceptions.ReadTimeoutError,
self.uploader._pull, dockerc, image)
self.assertEqual(dockerc.pull.call_count, 5)
dockerc.pull.assert_has_calls([
mock.call(image, tag=None, stream=True)
])
def test_push_retry(self): def test_push_retry(self):
orig_call = tenacity.wait.wait_random_exponential.__call__
orig_argspec = inspect.getargspec(orig_call)
image = 'docker.io/tripleoupstream/heat-docker-agents-centos' image = 'docker.io/tripleoupstream/heat-docker-agents-centos'
dockerc = self.dockermock.return_value dockerc = self.dockermock.return_value
@ -699,21 +685,14 @@ class TestDockerImageUploader(base.TestCase):
['{"error": "ouch"}'], ['{"error": "ouch"}'],
['{"status": "done"}'] ['{"status": "done"}']
] ]
with mock.patch('tenacity.wait.wait_random_exponential.__call__') as f: self.uploader._push(dockerc, image)
f.return_value = 0
with mock.patch('inspect.getargspec') as mock_args:
mock_args.return_value = orig_argspec
self.uploader._push(dockerc, image) self.assertEqual(dockerc.push.call_count, 5)
dockerc.push.assert_has_calls([
self.assertEqual(dockerc.push.call_count, 5) mock.call(image, tag=None, stream=True)
dockerc.push.assert_has_calls([ ])
mock.call(image, tag=None, stream=True)
])
def test_push_retry_failure(self): def test_push_retry_failure(self):
orig_call = tenacity.wait.wait_random_exponential.__call__
orig_argspec = inspect.getargspec(orig_call)
image = 'docker.io/tripleoupstream/heat-docker-agents-centos' image = 'docker.io/tripleoupstream/heat-docker-agents-centos'
dockerc = self.dockermock.return_value dockerc = self.dockermock.return_value
@ -724,18 +703,13 @@ class TestDockerImageUploader(base.TestCase):
['{"error": "ouch"}'], ['{"error": "ouch"}'],
['{"error": "ouch"}'], ['{"error": "ouch"}'],
] ]
with mock.patch('tenacity.wait.wait_random_exponential.__call__') as f: self.assertRaises(ImageUploaderException,
f.return_value = 0 self.uploader._push, dockerc, image)
with mock.patch('inspect.getargspec') as mock_args:
mock_args.return_value = orig_argspec
self.assertRaises(ImageUploaderException, self.assertEqual(dockerc.push.call_count, 5)
self.uploader._push, dockerc, image) dockerc.push.assert_has_calls([
mock.call(image, tag=None, stream=True)
self.assertEqual(dockerc.push.call_count, 5) ])
dockerc.push.assert_has_calls([
mock.call(image, tag=None, stream=True)
])
@mock.patch('tripleo_common.image.image_uploader.' @mock.patch('tripleo_common.image.image_uploader.'
'DockerImageUploader._inspect') 'DockerImageUploader._inspect')