From d34e644a8f5551336f4b7ce88b6b05b66f711214 Mon Sep 17 00:00:00 2001 From: Thiago Paiva Date: Tue, 5 Jan 2016 18:00:14 -0300 Subject: [PATCH] Change polling give up policy for OneView client On previous versions of the OneView client, the polling of changes on OneView was done until a certain amount of tries then stopped even for tasks that are ongoing. This patch changes that behavior to keep checking tasks until completion and use the max_polling_attempts parameter only for exceptional cases such as request errors/timeouts. Change-Id: I392e0b17e160fbc37d19183f5890038818e6c4f4 Closes-Bug: #1531918 --- oneview_client/client.py | 5 ++- oneview_client/tests/test_oneview_client.py | 39 ++++++++++++++++----- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/oneview_client/client.py b/oneview_client/client.py index 1bb1454..bb601dd 100644 --- a/oneview_client/client.py +++ b/oneview_client/client.py @@ -28,7 +28,7 @@ from oneview_client import states SUPPORTED_ONEVIEW_VERSION = 200 -WAIT_DO_REQUEST_IN_MILLISECONDS = 100 +WAIT_DO_REQUEST_IN_MILLISECONDS = 1000 WAIT_TASK_IN_MILLISECONDS = 1000 GET_REQUEST_TYPE = 'GET' @@ -484,7 +484,6 @@ class Client(object): def _wait_for_task_to_complete(self, task): @retrying.retry( - stop_max_attempt_number=self.max_polling_attempts, retry_on_result=lambda task: task.get('percentComplete') < 100, wait_fixed=WAIT_TASK_IN_MILLISECONDS, retry_on_exception=lambda task: False @@ -517,7 +516,7 @@ def _check_request_status(response): raise exceptions.OneViewNotAuthorizedException() elif status == 404: raise exceptions.OneViewResourceNotFoundError() - elif status in (409,): + elif status in (408, 409,): time.sleep(10) repeat = True elif status == 500: diff --git a/oneview_client/tests/test_oneview_client.py b/oneview_client/tests/test_oneview_client.py index ff7c8a3..8d44d87 100644 --- a/oneview_client/tests/test_oneview_client.py +++ b/oneview_client/tests/test_oneview_client.py @@ -480,7 +480,26 @@ class OneViewClientTestCase(unittest.TestCase): @mock.patch.object(client.Client, '_prepare_and_do_request', autospec=True) def test__wait_for_task_to_complete(self, mock__prepare_do_request, mock__authenticate): - task = { + + task0 = { + "uri": "/any_uri", + "taskState": "Something", + "percentComplete": 0 + } + + task1 = { + "uri": "/any_uri", + "taskState": "Something", + "percentComplete": 10 + } + + task2 = { + "uri": "/any_uri", + "taskState": "Something", + "percentComplete": 50 + } + + task3 = { "uri": "/any_uri", "taskState": "Something", "percentComplete": 100 @@ -491,29 +510,31 @@ class OneViewClientTestCase(unittest.TestCase): self.password, max_polling_attempts=1) - mock__prepare_do_request.return_value = task - oneview_client._wait_for_task_to_complete(task) + mock__prepare_do_request.side_effect = [task1, task2, task3] + oneview_client._wait_for_task_to_complete(task0) - @mock.patch.object(client.Client, '_prepare_and_do_request', autospec=True) - def test__wait_for_task_to_complete_timeout(self, mock__prepare_do_request, + @mock.patch.object(requests, 'get') + def test__wait_for_task_to_complete_timeout(self, mock_get, mock__authenticate): task = { "uri": "/any_uri", "taskState": "Something", - "percentComplete": 30 + "percentComplete": 0 } - oneview_client = client.Client(self.manager_url, self.username, self.password, - max_polling_attempts=1) + max_polling_attempts=3) - mock__prepare_do_request.return_value = task + response = mock_get.return_value + response.status_code = http_client.REQUEST_TIMEOUT + mock_get.return_value = response self.assertRaises( retrying.RetryError, oneview_client._wait_for_task_to_complete, task, ) + self.assertEqual(mock_get.call_count, 3) @mock.patch.object(client.Client, 'get_server_hardware', autospec=True) def test_validate_node_server_hardware_inconsistent_memorymb_value(