From dd495b880d0333b8a8a8fa21be807d456375d5c9 Mon Sep 17 00:00:00 2001 From: poojajadhav Date: Wed, 25 Jan 2017 21:07:42 +0530 Subject: [PATCH] Extracted HTTP response codes to constants There are several places in the source code where HTTP response codes are used as numeric values. Status codes 101, 200, 201, 202, 400, 401, 403, 404, 409, 413, 422, 424 and 500 under tests/unit/volume/drivers are replaced with symbolic constants from six.moves.http_client thus improves code readability. More patches will be submitted to address other status codes. Partial-Bug: #1520159 Change-Id: I491bd9a6e09d39626e3f0c8fa9a151fe1927ee3b --- .../drivers/netapp/eseries/test_client.py | 17 +++-- .../drivers/nexenta/test_nexenta5_jsonrpc.py | 31 +++++--- .../drivers/synology/test_synology_common.py | 31 ++++---- .../unit/volume/drivers/test_blockbridge.py | 26 +++---- .../unit/volume/drivers/test_infinidat.py | 9 ++- .../tests/unit/volume/drivers/test_nimble.py | 5 +- cinder/tests/unit/volume/drivers/test_pure.py | 76 ++++++++++--------- cinder/tests/unit/volume/drivers/test_xio.py | 75 +++++++++--------- 8 files changed, 148 insertions(+), 122 deletions(-) diff --git a/cinder/tests/unit/volume/drivers/netapp/eseries/test_client.py b/cinder/tests/unit/volume/drivers/netapp/eseries/test_client.py index fe23e495601..0cbcfcae2d6 100644 --- a/cinder/tests/unit/volume/drivers/netapp/eseries/test_client.py +++ b/cinder/tests/unit/volume/drivers/netapp/eseries/test_client.py @@ -21,6 +21,7 @@ import ddt import json import mock from simplejson import scanner +from six.moves import http_client from cinder import exception from cinder import test @@ -48,11 +49,13 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): self.my_client._endpoint = eseries_fake.FAKE_ENDPOINT_HTTP fake_response = mock.Mock() - fake_response.status_code = 200 + fake_response.status_code = http_client.OK self.my_client.invoke_service = mock.Mock(return_value=fake_response) self.my_client.api_version = '01.52.9000.1' - @ddt.data(200, 201, 203, 204) + @ddt.data(http_client.OK, http_client.CREATED, + http_client.NON_AUTHORITATIVE_INFORMATION, + http_client.NO_CONTENT) def test_eval_response_success(self, status_code): fake_resp = mock.Mock() fake_resp.status_code = status_code @@ -76,7 +79,7 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): ('unknown', None)) @ddt.unpack def test_eval_response_422(self, ret_code, exc_regex): - status_code = 422 + status_code = http_client.UNPROCESSABLE_ENTITY fake_resp = mock.Mock() fake_resp.text = "fakeError" fake_resp.json = mock.Mock(return_value={'retcode': ret_code}) @@ -89,7 +92,7 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): self.assertEqual(status_code, exc.status_code) def test_eval_response_424(self): - status_code = 424 + status_code = http_client.FAILED_DEPENDENCY fake_resp = mock.Mock() fake_resp.status_code = status_code fake_resp.text = "Fake Error Message" @@ -567,7 +570,7 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): self.assertEqual(fake_volume, volume) def test_list_volume_v2_not_found(self): - status_code = 404 + status_code = http_client.NOT_FOUND url = client.RestClient.RESOURCE_PATHS['ssc_volume'] self.my_client.features = mock.Mock() self.my_client.features.SSC_API_V2 = na_utils.FeatureState( @@ -586,7 +589,7 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): mock.ANY}) def test_list_volume_v2_failure(self): - status_code = 422 + status_code = http_client.UNPROCESSABLE_ENTITY url = client.RestClient.RESOURCE_PATHS['ssc_volume'] self.my_client.features = mock.Mock() self.my_client.features.SSC_API_V2 = na_utils.FeatureState( @@ -1145,7 +1148,7 @@ class NetAppEseriesClientDriverTestCase(test.TestCase): fake_response = mock.Mock() fake_response.json = mock.Mock(side_effect=scanner.JSONDecodeError( '', '{}', 1)) - fake_response.status_code = 424 + fake_response.status_code = http_client.FAILED_DEPENDENCY fake_response.text = "Fake Response" self.mock_object(self.my_client, 'invoke_service', return_value=fake_response) diff --git a/cinder/tests/unit/volume/drivers/nexenta/test_nexenta5_jsonrpc.py b/cinder/tests/unit/volume/drivers/nexenta/test_nexenta5_jsonrpc.py index 0946297ccca..82fbfc69ca8 100644 --- a/cinder/tests/unit/volume/drivers/nexenta/test_nexenta5_jsonrpc.py +++ b/cinder/tests/unit/volume/drivers/nexenta/test_nexenta5_jsonrpc.py @@ -23,6 +23,7 @@ from mock import patch from oslo_serialization import jsonutils import requests from requests import adapters +from six.moves import http_client from cinder import exception from cinder import test @@ -33,7 +34,7 @@ USERNAME = 'user' PASSWORD = 'pass' -def gen_response(code=200, json=None): +def gen_response(code=http_client.OK, json=None): r = requests.Response() r.headers['Content-Type'] = 'application/json' r.encoding = 'utf8' @@ -80,7 +81,7 @@ class TestNexentaJSONProxyAuth(test.TestCase): # an url is being requested for the second time if self.counter == 1: # make the fake backend respond 401 - r = gen_response(401) + r = gen_response(http_client.UNAUTHORIZED) r._content = '' r.connection = mock.Mock() r_ = gen_response(json={'data': []}) @@ -147,31 +148,36 @@ class TestNexentaJSONProxy(test.TestCase): def test_post(self): random_dict = {'data': uuid.uuid4().hex} rnd_url = 'some/random/url' - self._mount_adapter(rnd_url, self.gen_adapter(201, random_dict)) + self._mount_adapter(rnd_url, self.gen_adapter(http_client.CREATED, + random_dict)) self.assertEqual(random_dict, self.nef.post(rnd_url)) def test_delete(self): random_dict = {'data': uuid.uuid4().hex} rnd_url = 'some/random/url' - self._mount_adapter(rnd_url, self.gen_adapter(201, random_dict)) + self._mount_adapter(rnd_url, self.gen_adapter(http_client.CREATED, + random_dict)) self.assertEqual(random_dict, self.nef.delete(rnd_url)) def test_put(self): random_dict = {'data': uuid.uuid4().hex} rnd_url = 'some/random/url' - self._mount_adapter(rnd_url, self.gen_adapter(201, random_dict)) + self._mount_adapter(rnd_url, self.gen_adapter(http_client.CREATED, + random_dict)) self.assertEqual(random_dict, self.nef.put(rnd_url)) def test_get_200(self): random_dict = {'data': uuid.uuid4().hex} rnd_url = 'some/random/url' - self._mount_adapter(rnd_url, self.gen_adapter(200, random_dict)) + self._mount_adapter(rnd_url, self.gen_adapter(http_client.OK, + random_dict)) self.assertEqual(random_dict, self.nef.get(rnd_url)) def test_get_201(self): random_dict = {'data': uuid.uuid4().hex} rnd_url = 'some/random/url' - self._mount_adapter(rnd_url, self.gen_adapter(201, random_dict)) + self._mount_adapter(rnd_url, self.gen_adapter(http_client.CREATED, + random_dict)) self.assertEqual(random_dict, self.nef.get(rnd_url)) def test_get_500(self): @@ -185,7 +191,7 @@ class TestNexentaJSONProxy(test.TestCase): 'code': 'NEF_ERROR', 'message': 'Some error' } - r = gen_response(500, json) + r = gen_response(http_client.INTERNAL_SERVER_ERROR, json) r.request = request return r @@ -201,7 +207,7 @@ class TestNexentaJSONProxy(test.TestCase): super(TestAdapter, self).__init__() def send(self, request, *args, **kwargs): - r = gen_response(404) + r = gen_response(http_client.NOT_FOUND) r._content = 'Page Not Found' r.request = request return r @@ -219,7 +225,7 @@ class TestNexentaJSONProxy(test.TestCase): super(TestAdapter, self).__init__() def send(self, request, *args, **kwargs): - r = gen_response(404) + r = gen_response(http_client.NOT_FOUND) r.request = request return r @@ -241,11 +247,12 @@ class TestNexentaJSONProxy(test.TestCase): json = { 'links': [{'href': redirect_url}] } - r = gen_response(202, json) + r = gen_response(http_client.ACCEPTED, json) r.request = request return r rnd_url = 'some/random/url' self._mount_adapter(rnd_url, RedirectTestAdapter()) - self._mount_adapter(redirect_url, self.gen_adapter(201)) + self._mount_adapter(redirect_url, self.gen_adapter( + http_client.CREATED)) self.assertIsNone(self.nef.get(rnd_url)) diff --git a/cinder/tests/unit/volume/drivers/synology/test_synology_common.py b/cinder/tests/unit/volume/drivers/synology/test_synology_common.py index 48ff5bca7a2..3a03c6563a2 100644 --- a/cinder/tests/unit/volume/drivers/synology/test_synology_common.py +++ b/cinder/tests/unit/volume/drivers/synology/test_synology_common.py @@ -21,6 +21,7 @@ import math import mock from oslo_utils import units import requests +from six.moves import http_client from six import string_types from cinder import context @@ -148,8 +149,8 @@ class MockResponse(object): class SynoSessionTestCase(test.TestCase): - @mock.patch('requests.post', return_value= - MockResponse({'data': {'sid': 'sid'}, 'success': True}, 200)) + @mock.patch('requests.post', return_value=MockResponse( + {'data': {'sid': 'sid'}, 'success': True}, http_client.OK)) def setUp(self, _mock_post): super(SynoSessionTestCase, self).setUp() @@ -190,12 +191,12 @@ class SynoSessionTestCase(test.TestCase): FAKE_API: out }, 'success': True - }, 200), + }, http_client.OK), MockResponse({ 'data': { FAKE_API: out } - }, 200), + }, http_client.OK), ]) result = self.session.query(FAKE_API) @@ -289,18 +290,21 @@ class SynoAPIRequestTestCase(test.TestCase): self.request._encode_param = mock.Mock(side_effect=lambda x: x) self.request.new_session = mock.Mock() requests.post = mock.Mock(side_effect=[ - MockResponse({'success': True}, 200), - MockResponse({'error': {'code': 101}, 'success': False}, 200), - MockResponse({'error': {'code': 101}}, 200), - MockResponse({}, 500) + MockResponse({'success': True}, http_client.OK), + MockResponse({'error': {'code': http_client.SWITCHING_PROTOCOLS}, + 'success': False}, http_client.OK), + MockResponse({'error': {'code': http_client.SWITCHING_PROTOCOLS}}, + http_client.OK), + MockResponse({}, http_client.INTERNAL_SERVER_ERROR) ]) result = self.request.request(FAKE_API, FAKE_METHOD, version) self.assertDictEqual({'success': True}, result) result = self.request.request(FAKE_API, FAKE_METHOD, version) - self.assertDictEqual({'error': {'code': 101}, 'success': False}, - result) + self.assertDictEqual( + {'error': {'code': http_client.SWITCHING_PROTOCOLS}, + 'success': False}, result) self.assertRaises(exception.MalformedResponse, self.request.request, @@ -309,7 +313,8 @@ class SynoAPIRequestTestCase(test.TestCase): version) result = self.request.request(FAKE_API, FAKE_METHOD, version) - self.assertDictEqual({'http_status': 500}, result) + self.assertDictEqual( + {'http_status': http_client.INTERNAL_SERVER_ERROR}, result) @mock.patch.object(common.LOG, 'debug') def test_request_auth_error(self, _log): @@ -322,7 +327,7 @@ class SynoAPIRequestTestCase(test.TestCase): MockResponse({ 'error': {'code': 105}, 'success': False - }, 200)) + }, http_client.OK)) self.assertRaises(exception.SynoAuthError, self.request.request, @@ -1141,7 +1146,7 @@ class SynoCommonTestCase(test.TestCase): version = 1 resp = {} bad_resp = { - 'http_status': 500 + 'http_status': http_client.INTERNAL_SERVER_ERROR } expected = copy.deepcopy(resp) expected.update(api_info={'api': api, diff --git a/cinder/tests/unit/volume/drivers/test_blockbridge.py b/cinder/tests/unit/volume/drivers/test_blockbridge.py index 6cb32ee7285..09a7b9d8d37 100644 --- a/cinder/tests/unit/volume/drivers/test_blockbridge.py +++ b/cinder/tests/unit/volume/drivers/test_blockbridge.py @@ -76,7 +76,7 @@ def common_mocks(f): inst.mock_response = mock.Mock() inst.mock_response.read.return_value = '{}' - inst.mock_response.status = 200 + inst.mock_response.status = http_client.OK inst.mock_conn.request.return_value = True inst.mock_conn.getresponse.return_value = inst.mock_response @@ -150,28 +150,28 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): @common_mocks def test_http_mock_success(self): self.mock_response.read.return_value = '{}' - self.mock_response.status = 200 + self.mock_response.status = http_client.OK conn = http_client.HTTPSConnection('whatever', None) conn.request('GET', '/blah', '{}', {}) rsp = conn.getresponse() self.assertEqual('{}', rsp.read()) - self.assertEqual(200, rsp.status) + self.assertEqual(http_client.OK, rsp.status) @common_mocks def test_http_mock_failure(self): mock_body = '{"error": "no results matching query", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE conn = http_client.HTTPSConnection('whatever', None) conn.request('GET', '/blah', '{}', {}) rsp = conn.getresponse() self.assertEqual(mock_body, rsp.read()) - self.assertEqual(413, rsp.status) + self.assertEqual(http_client.REQUEST_ENTITY_TOO_LARGE, rsp.status) @common_mocks def test_cfg_api_host(self): @@ -264,7 +264,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): mock_body = '{"message": "no results matching query", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE self.assertRaisesRegex(exception.VolumeBackendAPIException, "no results matching query", @@ -310,7 +310,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): mock_body = '{"message": "over quota", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE self.assertRaisesRegex(exception.VolumeBackendAPIException, "over quota", @@ -363,7 +363,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): mock_body = '{"message": "over quota", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE src_vref = dict( name='cloned_volume_source', @@ -409,7 +409,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): def test_extend_volume_overquota(self): mock_body = '{"message": "over quota", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE self.assertRaisesRegex(exception.VolumeBackendAPIException, "over quota", @@ -459,7 +459,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): def test_create_snapshot_overquota(self): mock_body = '{"message": "over quota", "status": 413}' self.mock_response.read.return_value = mock_body - self.mock_response.status = 413 + self.mock_response.status = http_client.REQUEST_ENTITY_TOO_LARGE self.assertRaisesRegex(exception.VolumeBackendAPIException, "over quota", @@ -501,7 +501,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): mock_generate_password.return_value = 'mock-password-abcdef123456' self.mock_response.read.return_value = FIXTURE_VOL_EXPORT_OK - self.mock_response.status = 200 + self.mock_response.status = http_client.OK props = self.driver.initialize_connection(self.volume, self.connector) @@ -563,7 +563,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): @common_mocks def test_get_volume_stats_forbidden(self): - self.mock_response.status = 403 + self.mock_response.status = http_client.FORBIDDEN self.assertRaisesRegex(exception.NotAuthorized, "Insufficient privileges", self.driver.get_volume_stats, @@ -571,7 +571,7 @@ class BlockbridgeISCSIDriverTestCase(test.TestCase): @common_mocks def test_get_volume_stats_unauthorized(self): - self.mock_response.status = 401 + self.mock_response.status = http_client.UNAUTHORIZED self.assertRaisesRegex(exception.NotAuthorized, "Invalid credentials", self.driver.get_volume_stats, diff --git a/cinder/tests/unit/volume/drivers/test_infinidat.py b/cinder/tests/unit/volume/drivers/test_infinidat.py index b23dbb6fca2..10a38350597 100644 --- a/cinder/tests/unit/volume/drivers/test_infinidat.py +++ b/cinder/tests/unit/volume/drivers/test_infinidat.py @@ -21,6 +21,7 @@ import mock from oslo_utils import units import requests import six +from six.moves import http_client from cinder import exception from cinder import test @@ -129,7 +130,7 @@ class InfiniboxDriverTestCase(test.TestCase): response.status_code = result response.raw = six.BytesIO(six.b(json.dumps(dict()))) else: - response.status_code = 200 + response.status_code = http_client.OK response.raw = six.BytesIO(six.b(json.dumps(dict(result=result)))) return response @@ -225,7 +226,8 @@ class InfiniboxDriverTestCase(test.TestCase): self.driver.delete_volume(test_volume) def test_delete_volume_doesnt_exist_on_delete(self): - self._responses["DELETE"][VOLUME_URL + APPROVAL] = 404 + self._responses["DELETE"][VOLUME_URL + APPROVAL] = ( + http_client.NOT_FOUND) # due to a possible race condition (get+delete is not atomic) the # GET may return the volume but it may still be deleted before # the DELETE request @@ -309,7 +311,8 @@ class InfiniboxDriverTestCase(test.TestCase): self.driver.delete_snapshot(test_snapshot) def test_delete_snapshot_doesnt_exist_on_delete(self): - self._responses["DELETE"][SNAPSHOT_URL + APPROVAL] = 404 + self._responses["DELETE"][SNAPSHOT_URL + APPROVAL] = ( + http_client.NOT_FOUND) # due to a possible race condition (get+delete is not atomic) the # GET may return the snapshot but it may still be deleted before # the DELETE request diff --git a/cinder/tests/unit/volume/drivers/test_nimble.py b/cinder/tests/unit/volume/drivers/test_nimble.py index b056372342f..2ad1eafc985 100644 --- a/cinder/tests/unit/volume/drivers/test_nimble.py +++ b/cinder/tests/unit/volume/drivers/test_nimble.py @@ -15,6 +15,7 @@ import mock +from six.moves import http_client import sys from cinder import context @@ -215,7 +216,7 @@ class NimbleDriverBaseTestCase(test.TestCase): configuration=configuration) mock_login_response = mock_urllib2.post.return_value mock_login_response = mock.MagicMock() - mock_login_response.status_code.return_value = 200 + mock_login_response.status_code.return_value = http_client.OK mock_login_response.json.return_value = ( FAKE_LOGIN_POST_RESPONSE) self.driver.do_setup(context.get_admin_context()) @@ -237,7 +238,7 @@ class NimbleDriverBaseTestCase(test.TestCase): configuration=configuration) mock_login_response = mock_urllib2.post.return_value mock_login_response = mock.MagicMock() - mock_login_response.status_code.return_value = 200 + mock_login_response.status_code.return_value = http_client.OK mock_login_response.json.return_value = ( FAKE_LOGIN_POST_RESPONSE) self.driver.do_setup(context.get_admin_context()) diff --git a/cinder/tests/unit/volume/drivers/test_pure.py b/cinder/tests/unit/volume/drivers/test_pure.py index 4ad0e726ce1..f74319565ac 100644 --- a/cinder/tests/unit/volume/drivers/test_pure.py +++ b/cinder/tests/unit/volume/drivers/test_pure.py @@ -19,6 +19,7 @@ import sys import ddt import mock from oslo_utils import units +from six.moves import http_client from cinder import exception from cinder import test @@ -790,7 +791,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.list_volume_private_connections.return_value = {} self.array.destroy_volume.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Volume does not exist" ) self.driver.delete_volume(VOLUME) @@ -805,8 +806,8 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.assert_has_calls(expected) self.assertFalse(self.array.eradicate_volume.called) self.array.destroy_volume.side_effect = ( - self.purestorage_module.PureHTTPError(code=400, text="does not " - "exist")) + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, + text="does not exist")) self.driver.delete_volume(VOLUME) self.array.destroy_volume.side_effect = None self.assert_error_propagates([self.array.destroy_volume], @@ -864,7 +865,8 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.assert_has_calls(expected) self.assertFalse(self.array.eradicate_volume.called) self.array.destroy_volume.side_effect = ( - self.purestorage_module.PureHTTPError(code=400, text=error_text)) + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, + text=error_text)) self.driver.delete_snapshot(SNAPSHOT) self.array.destroy_volume.side_effect = None self.assert_error_propagates([self.array.destroy_volume], @@ -917,7 +919,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): # Branch where connection is missing and the host is still deleted self.array.reset_mock() self.array.disconnect_host.side_effect = \ - self.purestorage_module.PureHTTPError(code=400, + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, text="is not connected") self.driver.terminate_connection(VOLUME, ISCSI_CONNECTOR) self.array.disconnect_host.assert_called_with(PURE_HOST_NAME, vol_name) @@ -928,7 +930,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.reset_mock() self.array.disconnect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=500, + code=http_client.INTERNAL_SERVER_ERROR, text="Some other error" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -945,7 +947,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.reset_mock() self.array.list_host_connections.return_value = [] self.array.delete_host.side_effect = \ - self.purestorage_module.PureHTTPError(code=400, + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, text=error) self.driver.terminate_connection(VOLUME, ISCSI_CONNECTOR) self.array.disconnect_host.assert_called_with(PURE_HOST_NAME, vol_name) @@ -1145,7 +1147,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Protection group has been destroyed." ) self.driver.delete_consistencygroup(mock_context, @@ -1157,7 +1159,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Protection group does not exist" ) self.driver.delete_consistencygroup(mock_context, @@ -1169,7 +1171,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Some other error" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -1180,7 +1182,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=500, + code=http_client.INTERNAL_SERVER_ERROR, text="Another different error" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -1315,7 +1317,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Protection group snapshot has been destroyed." ) self.driver.delete_cgsnapshot(mock_context, mock_cgsnap, [mock_snap]) @@ -1324,7 +1326,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Protection group snapshot does not exist" ) self.driver.delete_cgsnapshot(mock_context, mock_cgsnap, [mock_snap]) @@ -1333,7 +1335,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Some other error" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -1344,7 +1346,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.destroy_pgroup.side_effect = \ self.purestorage_module.PureHTTPError( - code=500, + code=http_client.INTERNAL_SERVER_ERROR, text="Another different error" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -1411,7 +1413,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.get_volume.side_effect = \ self.purestorage_module.PureHTTPError( text="Volume does not exist.", - code=400 + code=http_client.BAD_REQUEST ) self.assertRaises(exception.ManageExistingInvalidReference, self.driver.manage_existing, @@ -1479,7 +1481,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.rename_volume.side_effect = \ self.purestorage_module.PureHTTPError( text="Volume does not exist.", - code=400 + code=http_client.BAD_REQUEST ) self.driver.unmanage(VOLUME) @@ -1537,7 +1539,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.get_volume.side_effect = \ self.purestorage_module.PureHTTPError( text="Volume does not exist.", - code=400 + code=http_client.BAD_REQUEST ) self.assertRaises(exception.ManageExistingInvalidReference, self.driver.manage_existing_snapshot, @@ -1596,7 +1598,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.get_volume.side_effect = \ self.purestorage_module.PureHTTPError( text="Volume does not exist.", - code=400 + code=http_client.BAD_REQUEST ) self.assertRaises(exception.ManageExistingInvalidReference, self.driver.manage_existing_snapshot_get_size, @@ -1624,7 +1626,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self.array.rename_volume.side_effect = \ self.purestorage_module.PureHTTPError( text="Snapshot does not exist.", - code=400 + code=http_client.BAD_REQUEST ) self.driver.unmanage_snapshot(SNAPSHOT) @@ -1853,7 +1855,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): def test_does_pgroup_exist_not_exists(self): self.array.get_pgroup.side_effect = ( - self.purestorage_module.PureHTTPError(code=400, + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, text="does not exist")) exists = self.driver._does_pgroup_exist(self.array, "some_pgroup") self.assertFalse(exists) @@ -2045,7 +2047,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): self, mock_get_volume_type): mock_get_volume_type.return_value = REPLICATED_VOL_TYPE self.array.set_pgroup.side_effect = FakePureStorageHTTPError( - code=400, text='already belongs to') + code=http_client.BAD_REQUEST, text='already belongs to') self.driver._enable_replication_if_needed(self.array, VOLUME) self.array.set_pgroup.assert_called_with( self.driver._replication_pg_name, @@ -2148,7 +2150,7 @@ class PureBaseVolumeDriverTestCase(PureBaseSharedDriverTestCase): def test_disable_replication_already_disabled(self): self.array.set_pgroup.side_effect = FakePureStorageHTTPError( - code=400, text='could not be found') + code=http_client.BAD_REQUEST, text='could not be found') self.driver._disable_replication(VOLUME) self.array.set_pgroup.assert_called_with( self.driver._replication_pg_name, @@ -2375,7 +2377,7 @@ class PureISCSIDriverTestCase(PureDriverTestCase): [expected, {"host": "extra", "lun": 2}] self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) actual = self.driver._connect(VOLUME, ISCSI_CONNECTOR) @@ -2389,7 +2391,7 @@ class PureISCSIDriverTestCase(PureDriverTestCase): self.array.list_volume_private_connections.return_value = {} self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) self.assertRaises(exception.PureDriverException, self.driver._connect, @@ -2401,10 +2403,11 @@ class PureISCSIDriverTestCase(PureDriverTestCase): def test_connect_already_connected_list_hosts_exception(self, mock_host): mock_host.return_value = PURE_HOST self.array.list_volume_private_connections.side_effect = \ - self.purestorage_module.PureHTTPError(code=400, text="") + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, + text="") self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -2422,7 +2425,7 @@ class PureISCSIDriverTestCase(PureDriverTestCase): self.array.set_host.side_effect = ( self.purestorage_module.PureHTTPError( - code=400, text='Host does not exist.')) + code=http_client.BAD_REQUEST, text='Host does not exist.')) # Because we mocked out retry make sure we are raising the right # exception to allow for retries to happen. @@ -2436,7 +2439,8 @@ class PureISCSIDriverTestCase(PureDriverTestCase): self.array.create_host.side_effect = ( self.purestorage_module.PureHTTPError( - code=400, text='The specified IQN is already in use.')) + code=http_client.BAD_REQUEST, + text='The specified IQN is already in use.')) # Because we mocked out retry make sure we are raising the right # exception to allow for retries to happen. @@ -2450,7 +2454,7 @@ class PureISCSIDriverTestCase(PureDriverTestCase): self.array.create_host.side_effect = ( self.purestorage_module.PureHTTPError( - code=400, text='Host already exists.')) + code=http_client.BAD_REQUEST, text='Host already exists.')) # Because we mocked out retry make sure we are raising the right # exception to allow for retries to happen. @@ -2578,7 +2582,7 @@ class PureFCDriverTestCase(PureDriverTestCase): [expected, {"host": "extra", "lun": 2}] self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) actual = self.driver._connect(VOLUME, FC_CONNECTOR) @@ -2592,7 +2596,7 @@ class PureFCDriverTestCase(PureDriverTestCase): self.array.list_volume_private_connections.return_value = {} self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) self.assertRaises(exception.PureDriverException, self.driver._connect, @@ -2604,10 +2608,11 @@ class PureFCDriverTestCase(PureDriverTestCase): def test_connect_already_connected_list_hosts_exception(self, mock_host): mock_host.return_value = PURE_HOST self.array.list_volume_private_connections.side_effect = \ - self.purestorage_module.PureHTTPError(code=400, text="") + self.purestorage_module.PureHTTPError(code=http_client.BAD_REQUEST, + text="") self.array.connect_host.side_effect = \ self.purestorage_module.PureHTTPError( - code=400, + code=http_client.BAD_REQUEST, text="Connection already exists" ) self.assertRaises(self.purestorage_module.PureHTTPError, @@ -2621,7 +2626,8 @@ class PureFCDriverTestCase(PureDriverTestCase): self.array.create_host.side_effect = ( self.purestorage_module.PureHTTPError( - code=400, text='The specified WWN is already in use.')) + code=http_client.BAD_REQUEST, + text='The specified WWN is already in use.')) # Because we mocked out retry make sure we are raising the right # exception to allow for retries to happen. diff --git a/cinder/tests/unit/volume/drivers/test_xio.py b/cinder/tests/unit/volume/drivers/test_xio.py index 1841c9e6d7a..7a7ebb3b9a2 100644 --- a/cinder/tests/unit/volume/drivers/test_xio.py +++ b/cinder/tests/unit/volume/drivers/test_xio.py @@ -14,6 +14,7 @@ # under the License. import mock +from six.moves import http_client from cinder import context from cinder import exception @@ -119,7 +120,7 @@ ISE_GET_QUERY_XML =\ """ % (ISE_IP1, ISE_IP2) ISE_GET_QUERY_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_XML.split())} @@ -139,7 +140,7 @@ ISE_GET_QUERY_NO_CAP_XML =\ """ % (ISE_IP1, ISE_IP2) ISE_GET_QUERY_NO_CAP_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_NO_CAP_XML.split())} @@ -158,7 +159,7 @@ ISE_GET_QUERY_NO_CTRL_XML =\ """ ISE_GET_QUERY_NO_CTRL_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_NO_CTRL_XML.split())} @@ -187,7 +188,7 @@ ISE_GET_QUERY_NO_IP_XML =\ """ ISE_GET_QUERY_NO_IP_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_NO_IP_XML.split())} @@ -213,7 +214,7 @@ ISE_GET_QUERY_NO_GID_XML =\ """ % (ISE_IP1, ISE_IP2) ISE_GET_QUERY_NO_GID_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_NO_GID_XML.split())} @@ -239,7 +240,7 @@ ISE_GET_QUERY_NO_CLONE_XML =\ """ % (ISE_IP1, ISE_IP2) ISE_GET_QUERY_NO_CLONE_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_QUERY_NO_CLONE_XML.split())} @@ -287,7 +288,7 @@ ISE_GET_STORAGE_POOLS_XML =\ """ ISE_GET_STORAGE_POOLS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'Pool location', 'content': " ".join(ISE_GET_STORAGE_POOLS_XML.split())} @@ -295,7 +296,7 @@ ISE_GET_VOL_STATUS_NO_VOL_NODE_XML =\ """""" ISE_GET_VOL_STATUS_NO_VOL_NODE_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_VOLUME1_LOCATION_URL, 'content': " ".join(ISE_GET_VOL_STATUS_NO_VOL_NODE_XML.split())} @@ -306,7 +307,7 @@ ISE_GET_VOL_STATUS_NO_STATUS_XML =\ """ % (ISE_VOLUME1_LOCATION_URL) ISE_GET_VOL_STATUS_NO_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_VOLUME1_LOCATION_URL, 'content': " ".join(ISE_GET_VOL_STATUS_NO_STATUS_XML.split())} @@ -323,7 +324,7 @@ ISE_GET_VOL1_STATUS_XML =\ """ % (ISE_VOLUME1_LOCATION_URL) ISE_GET_VOL1_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_VOLUME1_LOCATION_URL, 'content': " ".join(ISE_GET_VOL1_STATUS_XML.split())} @@ -339,7 +340,7 @@ ISE_GET_VOL2_STATUS_XML =\ """ % (ISE_VOLUME2_LOCATION_URL) ISE_GET_VOL2_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_VOLUME2_LOCATION_URL, 'content': " ".join(ISE_GET_VOL2_STATUS_XML.split())} @@ -355,7 +356,7 @@ ISE_GET_VOL3_STATUS_XML =\ """ % (ISE_VOLUME3_LOCATION_URL) ISE_GET_VOL3_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_VOLUME3_LOCATION_URL, 'content': " ".join(ISE_GET_VOL3_STATUS_XML.split())} @@ -371,7 +372,7 @@ ISE_GET_SNAP1_STATUS_XML =\ """ % (ISE_SNAPSHOT_LOCATION_URL) ISE_GET_SNAP1_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_SNAPSHOT_LOCATION_URL, 'content': " ".join(ISE_GET_SNAP1_STATUS_XML.split())} @@ -387,14 +388,14 @@ ISE_GET_CLONE1_STATUS_XML =\ """ % (ISE_CLONE_LOCATION_URL) ISE_GET_CLONE1_STATUS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': 'u%s' % ISE_CLONE_LOCATION_URL, 'content': " ".join(ISE_GET_CLONE1_STATUS_XML.split())} ISE_CREATE_VOLUME_XML = """""" ISE_CREATE_VOLUME_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': ISE_VOLUME1_LOCATION_URL, 'content': " ".join(ISE_CREATE_VOLUME_XML.split())} @@ -411,7 +412,7 @@ ISE_GET_IONETWORKS_XML =\ """ ISE_GET_IONETWORKS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_IONETWORKS_XML.split())} @@ -428,14 +429,14 @@ ISE_GET_IONETWORKS_CHAP_XML =\ """ ISE_GET_IONETWORKS_CHAP_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_IONETWORKS_CHAP_XML.split())} ISE_DELETE_VOLUME_XML = """""" ISE_DELETE_VOLUME_RESP =\ - {'status': 204, + {'status': http_client.NO_CONTENT, 'location': '', 'content': " ".join(ISE_DELETE_VOLUME_XML.split())} @@ -454,7 +455,7 @@ ISE_GET_ALLOC_WITH_EP_XML =\ (ISE_ALLOCATION_LOCATION_URL, VOLUME1['name'], HOST1) ISE_GET_ALLOC_WITH_EP_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': ISE_ALLOCATION_LOCATION_URL, 'content': " ".join(ISE_GET_ALLOC_WITH_EP_XML.split())} @@ -462,14 +463,14 @@ ISE_GET_ALLOC_WITH_NO_ALLOC_XML =\ """""" % ISE_ALLOCATION_LOCATION_URL ISE_GET_ALLOC_WITH_NO_ALLOC_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': ISE_ALLOCATION_LOCATION_URL, 'content': " ".join(ISE_GET_ALLOC_WITH_NO_ALLOC_XML.split())} ISE_DELETE_ALLOC_XML = """""" ISE_DELETE_ALLOC_RESP =\ - {'status': 204, + {'status': http_client.NO_CONTENT, 'location': '', 'content': " ".join(ISE_DELETE_ALLOC_XML.split())} @@ -477,7 +478,7 @@ ISE_GET_HOSTS_NOHOST_XML =\ """""" ISE_GET_HOSTS_NOHOST_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_HOSTS_NOHOST_XML.split())} @@ -502,7 +503,7 @@ ISE_GET_HOSTS_HOST1_XML =\ """ % HOST1 ISE_GET_HOSTS_HOST1_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_HOSTS_HOST1_XML.split())} @@ -527,7 +528,7 @@ ISE_GET_HOSTS_HOST1_HOST_TYPE_XML =\ """ % HOST1 ISE_GET_HOSTS_HOST1_HOST_TYPE_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_HOSTS_HOST1_HOST_TYPE_XML.split())} @@ -551,7 +552,7 @@ ISE_GET_HOSTS_HOST2_XML =\ """ % HOST2 ISE_GET_HOSTS_HOST2_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_HOSTS_HOST2_XML.split())} @@ -559,7 +560,7 @@ ISE_CREATE_HOST_XML =\ """""" ISE_CREATE_HOST_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': 'http://ip/storage/hosts/host1', 'content': " ".join(ISE_CREATE_HOST_XML.split())} @@ -567,7 +568,7 @@ ISE_CREATE_ALLOC_XML =\ """""" ISE_CREATE_ALLOC_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': ISE_ALLOCATION_LOCATION_URL, 'content': " ".join(ISE_CREATE_ALLOC_XML.split())} @@ -607,7 +608,7 @@ ISE_GET_ENDPOINTS_XML =\ ISE_ALLOCATION_LOCATION_URL) ISE_GET_ENDPOINTS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_ENDPOINTS_XML.split())} @@ -659,35 +660,35 @@ ISE_GET_CONTROLLERS_XML =\ ISE_ISCSI_IP2, ISE_WWN3, ISE_WWN4) ISE_GET_CONTROLLERS_RESP =\ - {'status': 200, + {'status': http_client.OK, 'location': '', 'content': " ".join(ISE_GET_CONTROLLERS_XML.split())} ISE_CREATE_SNAPSHOT_XML = """""" ISE_CREATE_SNAPSHOT_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': ISE_SNAPSHOT_LOCATION_URL, 'content': " ".join(ISE_CREATE_SNAPSHOT_XML.split())} ISE_PREP_SNAPSHOT_XML = """""" ISE_PREP_SNAPSHOT_RESP =\ - {'status': 202, + {'status': http_client.ACCEPTED, 'location': ISE_SNAPSHOT_LOCATION_URL, 'content': " ".join(ISE_PREP_SNAPSHOT_XML.split())} ISE_MODIFY_VOLUME_XML = """""" ISE_MODIFY_VOLUME_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': ISE_VOLUME1_LOCATION_URL, 'content': " ".join(ISE_MODIFY_VOLUME_XML.split())} ISE_MODIFY_HOST_XML = """""" ISE_MODIFY_HOST_RESP =\ - {'status': 201, + {'status': http_client.CREATED, 'location': ISE_HOST_LOCATION_URL, 'content': " ".join(ISE_MODIFY_HOST_XML.split())} @@ -697,7 +698,7 @@ ISE_BAD_CONNECTION_RESP =\ 'content': " "} ISE_400_RESP =\ - {'status': 400, + {'status': http_client.BAD_REQUEST, 'location': '', 'content': ""} @@ -705,7 +706,7 @@ ISE_GET_VOL_STATUS_404_XML = \ """VOLUME not found.""" ISE_GET_VOL_STATUS_404_RESP =\ - {'status': 404, + {'status': http_client.NOT_FOUND, 'location': '', 'content': " ".join(ISE_GET_VOL_STATUS_404_XML.split())} @@ -713,7 +714,7 @@ ISE_400_INVALID_STATE_XML = \ """Not in a valid state.""" ISE_400_INVALID_STATE_RESP =\ - {'status': 400, + {'status': http_client.BAD_REQUEST, 'location': '', 'content': " ".join(ISE_400_INVALID_STATE_XML.split())} @@ -721,7 +722,7 @@ ISE_409_CONFLICT_XML = \ """Conflict""" ISE_409_CONFLICT_RESP =\ - {'status': 409, + {'status': http_client.CONFLICT, 'location': '', 'content': " ".join(ISE_409_CONFLICT_XML.split())}