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
This commit is contained in:
Thiago Paiva 2016-01-05 18:00:14 -03:00
parent 09f83c15ba
commit d34e644a8f
2 changed files with 32 additions and 12 deletions

View File

@ -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:

View File

@ -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(