From f484310fe6bb62a7fe22bbf1648aee10ea6ba2b7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 May 2015 16:56:46 +0200 Subject: [PATCH] Use six to fix imports on Python 3 Replace Python 2 imports with six.moves import to make code compatible with Python 2 and Python 3. Replaced imports: * BaseHTTPServer * __builtin__ * cookielib * httplib This patch was generated by the six_moves operation of the sixer tool version 0.4: https://pypi.python.org/pypi/sixer Manual changes: * Disable pylint warnings on the HTTPSConnection classes because pylint doesn't support importing from six.moves yet, see: https://bitbucket.org/logilab/pylint/issue/550/ Blueprint cinder-python3 Change-Id: Ide6d4e3480f2c0a7eb4500aa88affe152ecc0401 --- cinder/api/v1/limits.py | 4 +- cinder/api/v2/limits.py | 4 +- cinder/tests/unit/__init__.py | 4 +- cinder/tests/unit/api/v1/test_limits.py | 21 ++-- cinder/tests/unit/api/v2/test_limits.py | 21 ++-- .../unit/backup/drivers/test_backup_nfs.py | 10 +- cinder/tests/unit/backup/fake_swift_client.py | 6 +- .../tests/unit/backup/fake_swift_client2.py | 6 +- cinder/tests/unit/test_api.py | 11 +- cinder/tests/unit/test_netapp.py | 25 ++-- cinder/tests/unit/test_netapp_ssc.py | 15 ++- cinder/tests/unit/test_prophetstor_dpl.py | 38 +++--- cinder/volume/drivers/cloudbyte/cloudbyte.py | 6 +- cinder/volume/drivers/emc/emc_vmax_https.py | 16 +-- cinder/volume/drivers/huawei/rest_common.py | 4 +- .../volume/drivers/prophetstor/dplcommon.py | 119 ++++++++++-------- cinder/volume/drivers/zfssa/restclient.py | 46 +++---- cinder/volume/drivers/zfssa/webdavclient.py | 31 ++--- pylintrc | 6 + 19 files changed, 206 insertions(+), 187 deletions(-) diff --git a/cinder/api/v1/limits.py b/cinder/api/v1/limits.py index d8c6afabf53..16f09a37d8c 100644 --- a/cinder/api/v1/limits.py +++ b/cinder/api/v1/limits.py @@ -19,13 +19,13 @@ Module dedicated functions/classes dealing with rate limiting requests. import collections import copy -import httplib import math import re import time from oslo_serialization import jsonutils from oslo_utils import importutils +from six.moves import http_client import webob.dec import webob.exc @@ -439,7 +439,7 @@ class WsgiLimiterProxy(object): body = jsonutils.dumps({"verb": verb, "path": path}) headers = {"Content-Type": "application/json"} - conn = httplib.HTTPConnection(self.limiter_address) + conn = http_client.HTTPConnection(self.limiter_address) if username: conn.request("POST", "/%s" % (username), body, headers) diff --git a/cinder/api/v2/limits.py b/cinder/api/v2/limits.py index f3df1c4b90b..ea9d80b29ad 100644 --- a/cinder/api/v2/limits.py +++ b/cinder/api/v2/limits.py @@ -19,13 +19,13 @@ Module dedicated functions/classes dealing with rate limiting requests. import collections import copy -import httplib import math import re import time from oslo_serialization import jsonutils from oslo_utils import importutils +from six.moves import http_client import webob.dec import webob.exc @@ -437,7 +437,7 @@ class WsgiLimiterProxy(object): body = jsonutils.dumps({"verb": verb, "path": path}) headers = {"Content-Type": "application/json"} - conn = httplib.HTTPConnection(self.limiter_address) + conn = http_client.HTTPConnection(self.limiter_address) if username: conn.request("POST", "/%s" % (username), body, headers) diff --git a/cinder/tests/unit/__init__.py b/cinder/tests/unit/__init__.py index 125b19eac35..35f2079f615 100644 --- a/cinder/tests/unit/__init__.py +++ b/cinder/tests/unit/__init__.py @@ -29,10 +29,10 @@ """ import eventlet +from six.moves import builtins eventlet.monkey_patch() # See http://code.google.com/p/python-nose/issues/detail?id=373 # The code below enables nosetests to work with i18n _() blocks -import __builtin__ -setattr(__builtin__, '_', lambda x: x) +setattr(builtins, '_', lambda x: x) diff --git a/cinder/tests/unit/api/v1/test_limits.py b/cinder/tests/unit/api/v1/test_limits.py index 0ddc3fdc5d8..9d0f31c334e 100644 --- a/cinder/tests/unit/api/v1/test_limits.py +++ b/cinder/tests/unit/api/v1/test_limits.py @@ -17,12 +17,12 @@ Tests dealing with HTTP rate-limiting. """ -import httplib from xml.dom import minidom from lxml import etree from oslo_serialization import jsonutils import six +from six.moves import http_client import webob from cinder.api.v1 import limits @@ -631,7 +631,7 @@ class WsgiLimiterTest(BaseLimitTestSuite): class FakeHttplibSocket(object): - """Fake `httplib.HTTPResponse` replacement.""" + """Fake `http_client.HTTPResponse` replacement.""" def __init__(self, response_string): """Initialize new `FakeHttplibSocket`.""" @@ -643,7 +643,7 @@ class FakeHttplibSocket(object): class FakeHttplibConnection(object): - """Fake `httplib.HTTPConnection`.""" + """Fake `http_client.HTTPConnection`.""" def __init__(self, app, host): """Initialize `FakeHttplibConnection`.""" @@ -655,7 +655,7 @@ class FakeHttplibConnection(object): Requests made via this connection actually get translated and routed into our WSGI app, we then wait for the response and turn - it back into an `httplib.HTTPResponse`. + it back into an `http_client.HTTPResponse`. """ if not headers: headers = {} @@ -669,7 +669,7 @@ class FakeHttplibConnection(object): resp = str(req.get_response(self.app)) resp = "HTTP/1.0 %s" % resp sock = FakeHttplibSocket(resp) - self.http_response = httplib.HTTPResponse(sock) + self.http_response = http_client.HTTPResponse(sock) self.http_response.begin() def getresponse(self): @@ -683,7 +683,7 @@ def wire_HTTPConnection_to_WSGI(host, app): After calling this method, when any code calls - httplib.HTTPConnection(host) + http_client.HTTPConnection(host) the connection object will be a fake. Its requests will be sent directly to the given WSGI app rather than through a socket. @@ -710,8 +710,9 @@ def wire_HTTPConnection_to_WSGI(host, app): else: return self.wrapped(connection_host, *args, **kwargs) - oldHTTPConnection = httplib.HTTPConnection - httplib.HTTPConnection = HTTPConnectionDecorator(httplib.HTTPConnection) + oldHTTPConnection = http_client.HTTPConnection + new_http_connection = HTTPConnectionDecorator(http_client.HTTPConnection) + http_client.HTTPConnection = new_http_connection return oldHTTPConnection @@ -722,7 +723,7 @@ class WsgiLimiterProxyTest(BaseLimitTestSuite): """setUp for test suite. Do some nifty HTTP/WSGI magic which allows for WSGI to be called - directly by something like the `httplib` library. + directly by something like the `http_client` library. """ super(WsgiLimiterProxyTest, self).setUp() self.app = limits.WsgiLimiter(TEST_LIMITS) @@ -733,7 +734,7 @@ class WsgiLimiterProxyTest(BaseLimitTestSuite): def _restore(self, oldHTTPConnection): # restore original HTTPConnection object - httplib.HTTPConnection = oldHTTPConnection + http_client.HTTPConnection = oldHTTPConnection def test_200(self): """Successful request test.""" diff --git a/cinder/tests/unit/api/v2/test_limits.py b/cinder/tests/unit/api/v2/test_limits.py index 0f1421dea5f..9d529107992 100644 --- a/cinder/tests/unit/api/v2/test_limits.py +++ b/cinder/tests/unit/api/v2/test_limits.py @@ -17,12 +17,12 @@ Tests dealing with HTTP rate-limiting. """ -import httplib from xml.dom import minidom from lxml import etree from oslo_serialization import jsonutils import six +from six.moves import http_client import webob from cinder.api.v2 import limits @@ -634,7 +634,7 @@ class WsgiLimiterTest(BaseLimitTestSuite): class FakeHttplibSocket(object): - """Fake `httplib.HTTPResponse` replacement.""" + """Fake `http_client.HTTPResponse` replacement.""" def __init__(self, response_string): """Initialize new `FakeHttplibSocket`.""" @@ -647,7 +647,7 @@ class FakeHttplibSocket(object): class FakeHttplibConnection(object): - """Fake `httplib.HTTPConnection`.""" + """Fake `http_client.HTTPConnection`.""" def __init__(self, app, host): """Initialize `FakeHttplibConnection`.""" @@ -659,7 +659,7 @@ class FakeHttplibConnection(object): Requests made via this connection actually get translated and routed into our WSGI app, we then wait for the response and turn - it back into an `httplib.HTTPResponse`. + it back into an `http_client.HTTPResponse`. """ if not headers: headers = {} @@ -673,7 +673,7 @@ class FakeHttplibConnection(object): resp = str(req.get_response(self.app)) resp = "HTTP/1.0 %s" % resp sock = FakeHttplibSocket(resp) - self.http_response = httplib.HTTPResponse(sock) + self.http_response = http_client.HTTPResponse(sock) self.http_response.begin() def getresponse(self): @@ -687,7 +687,7 @@ def wire_HTTPConnection_to_WSGI(host, app): After calling this method, when any code calls - httplib.HTTPConnection(host) + http_client.HTTPConnection(host) the connection object will be a fake. Its requests will be sent directly to the given WSGI app rather than through a socket. @@ -714,8 +714,9 @@ def wire_HTTPConnection_to_WSGI(host, app): else: return self.wrapped(connection_host, *args, **kwargs) - oldHTTPConnection = httplib.HTTPConnection - httplib.HTTPConnection = HTTPConnectionDecorator(httplib.HTTPConnection) + oldHTTPConnection = http_client.HTTPConnection + new_http_connection = HTTPConnectionDecorator(http_client.HTTPConnection) + http_client.HTTPConnection = new_http_connection return oldHTTPConnection @@ -727,7 +728,7 @@ class WsgiLimiterProxyTest(BaseLimitTestSuite): """setUp() for WsgiLimiterProxyTest. Do some nifty HTTP/WSGI magic which allows for WSGI to be called - directly by something like the `httplib` library. + directly by something like the `http_client` library. """ super(WsgiLimiterProxyTest, self).setUp() self.app = limits.WsgiLimiter(TEST_LIMITS) @@ -738,7 +739,7 @@ class WsgiLimiterProxyTest(BaseLimitTestSuite): def _restore(self, oldHTTPConnection): # restore original HTTPConnection object - httplib.HTTPConnection = oldHTTPConnection + http_client.HTTPConnection = oldHTTPConnection def test_200(self): """Successful request test.""" diff --git a/cinder/tests/unit/backup/drivers/test_backup_nfs.py b/cinder/tests/unit/backup/drivers/test_backup_nfs.py index b77317728b5..183dd59f9e8 100644 --- a/cinder/tests/unit/backup/drivers/test_backup_nfs.py +++ b/cinder/tests/unit/backup/drivers/test_backup_nfs.py @@ -16,7 +16,6 @@ Tests for Backup NFS driver. """ -import __builtin__ import bz2 import exceptions import filecmp @@ -30,6 +29,7 @@ import mock from os_brick.remotefs import remotefs as remotefs_brick from oslo_config import cfg from oslo_log import log as logging +from six.moves import builtins from cinder.backup.drivers import nfs from cinder import context @@ -214,20 +214,20 @@ class BackupNFSTestCase(test.TestCase): self.assertEqual([], result) def test_get_object_writer(self): - self.mock_object(__builtin__, 'open', mock.mock_open()) + self.mock_object(builtins, 'open', mock.mock_open()) self.mock_object(os, 'chmod') self.driver.get_object_writer(FAKE_CONTAINER, FAKE_OBJECT_NAME) os.chmod.assert_called_once_with(FAKE_OBJECT_PATH, 0o660) - __builtin__.open.assert_called_once_with(FAKE_OBJECT_PATH, 'w') + builtins.open.assert_called_once_with(FAKE_OBJECT_PATH, 'w') def test_get_object_reader(self): - self.mock_object(__builtin__, 'open', mock.mock_open()) + self.mock_object(builtins, 'open', mock.mock_open()) self.driver.get_object_reader(FAKE_CONTAINER, FAKE_OBJECT_NAME) - __builtin__.open.assert_called_once_with(FAKE_OBJECT_PATH, 'r') + builtins.open.assert_called_once_with(FAKE_OBJECT_PATH, 'r') def test_delete_object(self): self.mock_object(os, 'remove') diff --git a/cinder/tests/unit/backup/fake_swift_client.py b/cinder/tests/unit/backup/fake_swift_client.py index 86d2925c981..ce27fbeb8bd 100644 --- a/cinder/tests/unit/backup/fake_swift_client.py +++ b/cinder/tests/unit/backup/fake_swift_client.py @@ -13,13 +13,13 @@ # License for the specific language governing permissions and limitations # under the License. -import httplib import json import os import socket import zlib from oslo_log import log as logging +from six.moves import http_client from swiftclient import client as swift LOG = logging.getLogger(__name__) @@ -45,10 +45,10 @@ class FakeSwiftConnection(object): LOG.debug("fake head_container(%s)" % container) if container == 'missing_container': raise swift.ClientException('fake exception', - http_status=httplib.NOT_FOUND) + http_status=http_client.NOT_FOUND) elif container == 'unauthorized_container': raise swift.ClientException('fake exception', - http_status=httplib.UNAUTHORIZED) + http_status=http_client.UNAUTHORIZED) elif container == 'socket_error_on_head': raise socket.error(111, 'ECONNREFUSED') pass diff --git a/cinder/tests/unit/backup/fake_swift_client2.py b/cinder/tests/unit/backup/fake_swift_client2.py index 2572549fa1c..b30b191a4b2 100644 --- a/cinder/tests/unit/backup/fake_swift_client2.py +++ b/cinder/tests/unit/backup/fake_swift_client2.py @@ -15,12 +15,12 @@ # under the License. import hashlib -import httplib import os import socket import tempfile from oslo_log import log as logging +from six.moves import http_client from swiftclient import client as swift from cinder.openstack.common import fileutils @@ -48,10 +48,10 @@ class FakeSwiftConnection2(object): LOG.debug("fake head_container(%s)", container) if container == 'missing_container': raise swift.ClientException('fake exception', - http_status=httplib.NOT_FOUND) + http_status=http_client.NOT_FOUND) elif container == 'unauthorized_container': raise swift.ClientException('fake exception', - http_status=httplib.UNAUTHORIZED) + http_status=http_client.UNAUTHORIZED) elif container == 'socket_error_on_head': raise socket.error(111, 'ECONNREFUSED') diff --git a/cinder/tests/unit/test_api.py b/cinder/tests/unit/test_api.py index 7076bd5e379..bb96cb2fabd 100644 --- a/cinder/tests/unit/test_api.py +++ b/cinder/tests/unit/test_api.py @@ -17,14 +17,13 @@ """Unit tests for the API endpoint.""" -import httplib - import six +from six.moves import http_client import webob class FakeHttplibSocket(object): - """A fake socket implementation for httplib.HTTPResponse, trivial.""" + """A fake socket implementation for http_client.HTTPResponse, trivial.""" def __init__(self, response_string): self.response_string = response_string self._buffer = six.StringIO(response_string) @@ -35,11 +34,11 @@ class FakeHttplibSocket(object): class FakeHttplibConnection(object): - """A fake httplib.HTTPConnection for boto. + """A fake http_client.HTTPConnection for boto. requests made via this connection actually get translated and routed into our WSGI app, we then wait for the response and turn it back into - the httplib.HTTPResponse that boto expects. + the http_client.HTTPResponse that boto expects. """ def __init__(self, app, host, is_secure=False): self.app = app @@ -58,7 +57,7 @@ class FakeHttplibConnection(object): # guess that's a function the web server usually provides. resp = "HTTP/1.0 %s" % resp self.sock = FakeHttplibSocket(resp) - self.http_response = httplib.HTTPResponse(self.sock) + self.http_response = http_client.HTTPResponse(self.sock) # NOTE(vish): boto is accessing private variables for some reason self._HTTPConnection__response = self.http_response self.http_response.begin() diff --git a/cinder/tests/unit/test_netapp.py b/cinder/tests/unit/test_netapp.py index d21f96ec4bf..0c7472d7635 100644 --- a/cinder/tests/unit/test_netapp.py +++ b/cinder/tests/unit/test_netapp.py @@ -17,13 +17,12 @@ Tests for NetApp volume driver """ -import BaseHTTPServer -import httplib - from lxml import etree import mock from oslo_log import log as logging import six +from six.moves import BaseHTTPServer +from six.moves import http_client from cinder import exception from cinder import test @@ -58,7 +57,7 @@ class FakeHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): class FakeHttplibSocket(object): - """A fake socket implementation for httplib.HTTPResponse.""" + """A fake socket implementation for http_client.HTTPResponse.""" def __init__(self, value): self._rbuffer = six.StringIO(value) self._wbuffer = six.StringIO('') @@ -444,11 +443,11 @@ class FakeDirectCMODEServerHandler(FakeHTTPRequestHandler): class FakeDirectCmodeHTTPConnection(object): - """A fake httplib.HTTPConnection for netapp tests + """A fake http_client.HTTPConnection for netapp tests Requests made via this connection actually get translated and routed into the fake direct handler above, we then turn the response into - the httplib.HTTPResponse that the caller expects. + the http_client.HTTPResponse that the caller expects. """ def __init__(self, host, timeout=None): self.host = host @@ -470,7 +469,7 @@ class FakeDirectCmodeHTTPConnection(object): self.app = FakeDirectCMODEServerHandler(sock, '127.0.0.1:80', None) self.sock = FakeHttplibSocket(sock.result) - self.http_response = httplib.HTTPResponse(self.sock) + self.http_response = http_client.HTTPResponse(self.sock) def set_debuglevel(self, level): pass @@ -553,7 +552,7 @@ class NetAppDirectCmodeISCSIDriverTestCase(test.TestCase): self.mock_object(utils, 'OpenStackInfo') configuration = self._set_config(create_configuration()) driver = common.NetAppDriver(configuration=configuration) - self.stubs.Set(httplib, 'HTTPConnection', + self.stubs.Set(http_client, 'HTTPConnection', FakeDirectCmodeHTTPConnection) driver.do_setup(context='') self.driver = driver @@ -1126,11 +1125,11 @@ class FakeDirect7MODEServerHandler(FakeHTTPRequestHandler): class FakeDirect7modeHTTPConnection(object): - """A fake httplib.HTTPConnection for netapp tests + """A fake http_client.HTTPConnection for netapp tests Requests made via this connection actually get translated and routed into the fake direct handler above, we then turn the response into - the httplib.HTTPResponse that the caller expects. + the http_client.HTTPResponse that the caller expects. """ def __init__(self, host, timeout=None): self.host = host @@ -1152,7 +1151,7 @@ class FakeDirect7modeHTTPConnection(object): self.app = FakeDirect7MODEServerHandler(sock, '127.0.0.1:80', None) self.sock = FakeHttplibSocket(sock.result) - self.http_response = httplib.HTTPResponse(self.sock) + self.http_response = http_client.HTTPResponse(self.sock) def set_debuglevel(self, level): pass @@ -1177,7 +1176,7 @@ class NetAppDirect7modeISCSIDriverTestCase_NV( self.mock_object(utils, 'OpenStackInfo') configuration = self._set_config(create_configuration()) driver = common.NetAppDriver(configuration=configuration) - self.stubs.Set(httplib, 'HTTPConnection', + self.stubs.Set(http_client, 'HTTPConnection', FakeDirect7modeHTTPConnection) driver.do_setup(context='') driver.root_volume_name = 'root' @@ -1233,7 +1232,7 @@ class NetAppDirect7modeISCSIDriverTestCase_WV( self.mock_object(utils, 'OpenStackInfo') configuration = self._set_config(create_configuration()) driver = common.NetAppDriver(configuration=configuration) - self.stubs.Set(httplib, 'HTTPConnection', + self.stubs.Set(http_client, 'HTTPConnection', FakeDirect7modeHTTPConnection) driver.do_setup(context='') self.driver = driver diff --git a/cinder/tests/unit/test_netapp_ssc.py b/cinder/tests/unit/test_netapp_ssc.py index 68f1fa3683e..9226e6b99f0 100644 --- a/cinder/tests/unit/test_netapp_ssc.py +++ b/cinder/tests/unit/test_netapp_ssc.py @@ -14,13 +14,12 @@ # under the License. """Unit tests for the NetApp-specific ssc module.""" -import BaseHTTPServer import copy -import httplib - from lxml import etree from mox3 import mox import six +from six.moves import BaseHTTPServer +from six.moves import http_client from cinder import exception from cinder import test @@ -36,7 +35,7 @@ class FakeHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): class FakeHttplibSocket(object): - """A fake socket implementation for httplib.HTTPResponse.""" + """A fake socket implementation for http_client.HTTPResponse.""" def __init__(self, value): self._rbuffer = six.StringIO(value) self._wbuffer = six.StringIO('') @@ -252,11 +251,11 @@ class FakeDirectCMODEServerHandler(FakeHTTPRequestHandler): class FakeDirectCmodeHTTPConnection(object): - """A fake httplib.HTTPConnection for netapp tests. + """A fake http_client.HTTPConnection for netapp tests. Requests made via this connection actually get translated and routed into the fake direct handler above, we then turn the response into - the httplib.HTTPResponse that the caller expects. + the http_client.HTTPResponse that the caller expects. """ def __init__(self, host, timeout=None): self.host = host @@ -278,7 +277,7 @@ class FakeDirectCmodeHTTPConnection(object): self.app = FakeDirectCMODEServerHandler(sock, '127.0.0.1:80', None) self.sock = FakeHttplibSocket(sock.result) - self.http_response = httplib.HTTPResponse(self.sock) + self.http_response = http_client.HTTPResponse(self.sock) def set_debuglevel(self, level): pass @@ -372,7 +371,7 @@ class SscUtilsTestCase(test.TestCase): def setUp(self): super(SscUtilsTestCase, self).setUp() - self.stubs.Set(httplib, 'HTTPConnection', + self.stubs.Set(http_client, 'HTTPConnection', FakeDirectCmodeHTTPConnection) def test_cl_vols_ssc_all(self): diff --git a/cinder/tests/unit/test_prophetstor_dpl.py b/cinder/tests/unit/test_prophetstor_dpl.py index eab0f753c84..ada7b8125de 100644 --- a/cinder/tests/unit/test_prophetstor_dpl.py +++ b/cinder/tests/unit/test_prophetstor_dpl.py @@ -14,11 +14,11 @@ import copy import errno -import httplib import re import mock from oslo_utils import units +from six.moves import http_client from cinder import exception from cinder import test @@ -206,7 +206,7 @@ class TestProphetStorDPLVolume(test.TestCase): 'GET', '/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_SYSTEM), None, - [httplib.OK, httplib.ACCEPTED]) + [http_client.OK, http_client.ACCEPTED]) def test_createvdev(self): self.dplcmd.create_vdev(DATA_IN_VOLUME['id'], @@ -229,7 +229,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, http_client.CREATED]) def test_extendvdev(self): self.dplcmd.extend_vdev(DATA_IN_VOLUME['id'], @@ -248,7 +248,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, http_client.CREATED]) def test_deletevdev(self): self.dplcmd.delete_vdev(DATA_IN_VOLUME['id'], True) @@ -261,8 +261,8 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, httplib.NOT_FOUND, - httplib.NO_CONTENT]) + [http_client.OK, http_client.ACCEPTED, http_client.NOT_FOUND, + http_client.NO_CONTENT]) def test_createvdevfromsnapshot(self): self.dplcmd.create_vdev_from_snapshot( @@ -287,7 +287,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, http_client.CREATED]) def test_getpool(self): self.dplcmd.get_pool(POOLUUID) @@ -296,7 +296,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_POOL, POOLUUID), None, - [httplib.OK, httplib.ACCEPTED]) + [http_client.OK, http_client.ACCEPTED]) def test_clonevdev(self): self.dplcmd.clone_vdev( @@ -324,7 +324,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME1['id']), params, - [httplib.OK, httplib.CREATED, httplib.ACCEPTED]) + [http_client.OK, http_client.CREATED, http_client.ACCEPTED]) def test_createvdevsnapshot(self): self.dplcmd.create_vdev_snapshot( @@ -346,7 +346,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.CREATED, httplib.ACCEPTED]) + [http_client.OK, http_client.CREATED, http_client.ACCEPTED]) def test_getvdev(self): self.dplcmd.get_vdev(DATA_IN_VOLUME['id']) @@ -355,7 +355,7 @@ class TestProphetStorDPLVolume(test.TestCase): '/%s/%s/%s/' % (DPLCOMMON.DPL_VER_V1, DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), None, - [httplib.OK, httplib.ACCEPTED, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, http_client.NOT_FOUND]) def test_getvdevstatus(self): self.dplcmd.get_vdev_status(DATA_IN_VOLUME['id'], '123456') @@ -366,7 +366,7 @@ class TestProphetStorDPLVolume(test.TestCase): DATA_IN_VOLUME['id'], '123456'), None, - [httplib.OK, httplib.NOT_FOUND]) + [http_client.OK, http_client.NOT_FOUND]) def test_getpoolstatus(self): self.dplcmd.get_pool_status(POOLUUID, '123456') @@ -377,7 +377,7 @@ class TestProphetStorDPLVolume(test.TestCase): POOLUUID, '123456'), None, - [httplib.OK, httplib.NOT_FOUND]) + [http_client.OK, http_client.NOT_FOUND]) def test_assignvdev(self): self.dplcmd.assign_vdev( @@ -411,7 +411,7 @@ class TestProphetStorDPLVolume(test.TestCase): DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, http_client.CREATED]) def test_unassignvdev(self): self.dplcmd.unassign_vdev(DATA_IN_VOLUME['id'], @@ -436,8 +436,8 @@ class TestProphetStorDPLVolume(test.TestCase): DPLCOMMON.DPL_OBJ_VOLUME, DATA_IN_VOLUME['id']), params, - [httplib.OK, httplib.ACCEPTED, - httplib.NO_CONTENT, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NO_CONTENT, http_client.NOT_FOUND]) def test_deletevdevsnapshot(self): self.dplcmd.delete_vdev_snapshot(DATA_IN_VOLUME['id'], @@ -453,8 +453,8 @@ class TestProphetStorDPLVolume(test.TestCase): DPLCOMMON.DPL_OBJ_SNAPSHOT, DATA_IN_SNAPSHOT['id']), None, - [httplib.OK, httplib.ACCEPTED, httplib.NO_CONTENT, - httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, http_client.NO_CONTENT, + http_client.NOT_FOUND]) def test_listvdevsnapshots(self): self.dplcmd.list_vdev_snapshots(DATA_IN_VOLUME['id']) @@ -465,7 +465,7 @@ class TestProphetStorDPLVolume(test.TestCase): DATA_IN_VOLUME['id'], DPLCOMMON.DPL_OBJ_SNAPSHOT), None, - [httplib.OK]) + [http_client.OK]) class TestProphetStorDPLDriver(test.TestCase): diff --git a/cinder/volume/drivers/cloudbyte/cloudbyte.py b/cinder/volume/drivers/cloudbyte/cloudbyte.py index 310e91b36b5..465068f99b5 100644 --- a/cinder/volume/drivers/cloudbyte/cloudbyte.py +++ b/cinder/volume/drivers/cloudbyte/cloudbyte.py @@ -13,13 +13,13 @@ # License for the specific language governing permissions and limitations # under the License. -import httplib import json import uuid from oslo_log import log as logging from oslo_utils import units import six +from six.moves import http_client from six.moves import urllib from cinder import exception @@ -97,7 +97,7 @@ class CloudByteISCSIDriver(san.SanISCSIDriver): res_details = {} try: # Prepare the connection - connection = httplib.HTTPSConnection(host) + connection = http_client.HTTPSConnection(host) # Make the connection connection.request('GET', url) # Extract the response as the connection was successful @@ -153,7 +153,7 @@ class CloudByteISCSIDriver(san.SanISCSIDriver): error_details = res_obj['error'] http_status = res_obj['http_status'] - except httplib.HTTPException as ex: + except http_client.HTTPException as ex: msg = (_("Error executing CloudByte API [%(cmd)s], " "Error: %(err)s.") % {'cmd': cmd, 'err': ex}) diff --git a/cinder/volume/drivers/emc/emc_vmax_https.py b/cinder/volume/drivers/emc/emc_vmax_https.py index 837f717a35d..46b0a583ff8 100644 --- a/cinder/volume/drivers/emc/emc_vmax_https.py +++ b/cinder/volume/drivers/emc/emc_vmax_https.py @@ -14,7 +14,6 @@ # under the License. import base64 -import httplib import os import socket import ssl @@ -25,6 +24,7 @@ from eventlet import patcher import OpenSSL from oslo_log import log as logging import six +from six.moves import http_client from six.moves import urllib from cinder.i18n import _, _LI @@ -74,7 +74,7 @@ def get_default_ca_certs(): class OpenSSLConnectionDelegator(object): """An OpenSSL.SSL.Connection delegator. - Supplies an additional 'makefile' method which httplib requires + Supplies an additional 'makefile' method which http_client requires and is not present in OpenSSL.SSL.Connection. Note: Since it is not possible to inherit from OpenSSL.SSL.Connection a delegator must be used. @@ -89,7 +89,7 @@ class OpenSSLConnectionDelegator(object): return socket._fileobject(self.connection, *args, **kwargs) -class HTTPSConnection(httplib.HTTPSConnection): +class HTTPSConnection(http_client.HTTPSConnection): def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, ca_certs=None, no_verification=False): if not pywbemAvailable: @@ -101,9 +101,9 @@ class HTTPSConnection(httplib.HTTPSConnection): else: excp_lst = () try: - httplib.HTTPSConnection.__init__(self, host, port, - key_file=key_file, - cert_file=cert_file) + http_client.HTTPSConnection.__init__(self, host, port, + key_file=key_file, + cert_file=cert_file) self.key_file = None if key_file is None else key_file self.cert_file = None if cert_file is None else cert_file @@ -255,7 +255,7 @@ def wbem_request(url, data, creds, headers=None, debug=0, x509=None, """Send request over HTTP. Send XML data over HTTP to the specified url. Return the - response in XML. Uses Python's build-in httplib. x509 may be a + response in XML. Uses Python's build-in http_client. x509 may be a dictionary containing the location of the SSL certificate and key files. """ @@ -328,7 +328,7 @@ def wbem_request(url, data, creds, headers=None, debug=0, x509=None, if response.status != 200: raise pywbem.cim_http.Error('HTTP error') - except httplib.BadStatusLine as arg: + except http_client.BadStatusLine as arg: msg = (_("Bad Status line returned: %(arg)s.") % {'arg': arg}) raise pywbem.cim_http.Error(msg) diff --git a/cinder/volume/drivers/huawei/rest_common.py b/cinder/volume/drivers/huawei/rest_common.py index 6b34823448d..ac8ec2f4b20 100644 --- a/cinder/volume/drivers/huawei/rest_common.py +++ b/cinder/volume/drivers/huawei/rest_common.py @@ -15,7 +15,6 @@ """Common class for Huawei 18000 storage drivers.""" import base64 -import cookielib import json import socket import time @@ -26,6 +25,7 @@ from oslo_log import log as logging from oslo_utils import excutils from oslo_utils import units import six +from six.moves import http_cookiejar from six.moves import urllib from cinder import context @@ -54,7 +54,7 @@ class RestCommon(object): def __init__(self, configuration): self.configuration = configuration - self.cookie = cookielib.CookieJar() + self.cookie = http_cookiejar.CookieJar() self.url = None self.productversion = None self.headers = {"Connection": "keep-alive", diff --git a/cinder/volume/drivers/prophetstor/dplcommon.py b/cinder/volume/drivers/prophetstor/dplcommon.py index ce8819fd54d..f9b28354a9b 100644 --- a/cinder/volume/drivers/prophetstor/dplcommon.py +++ b/cinder/volume/drivers/prophetstor/dplcommon.py @@ -22,7 +22,6 @@ Implementation of the class of ProphetStor DPL storage adapter of Federator. import base64 import errno -import httplib import json import random import time @@ -30,6 +29,7 @@ import time from oslo_log import log as logging from oslo_utils import units import six +from six.moves import http_client from cinder import exception from cinder.i18n import _, _LI, _LW, _LE @@ -98,9 +98,9 @@ class DPLCommand(object): retcode = errno.EINVAL for i in range(CONNECTION_RETRY): try: - connection = httplib.HTTPSConnection(self.ip, - self.port, - timeout=60) + connection = http_client.HTTPSConnection(self.ip, + self.port, + timeout=60) if connection: retcode = 0 break @@ -117,12 +117,12 @@ class DPLCommand(object): while (connection and retry): try: connection.request(method, url, payload, header) - except httplib.CannotSendRequest as e: + except http_client.CannotSendRequest as e: connection.close() time.sleep(1) - connection = httplib.HTTPSConnection(self.ip, - self.port, - timeout=60) + connection = http_client.HTTPSConnection(self.ip, + self.port, + timeout=60) retry -= 1 if connection: if retry == 0: @@ -141,7 +141,7 @@ class DPLCommand(object): if retcode == 0: try: response = connection.getresponse() - if response.status == httplib.SERVICE_UNAVAILABLE: + if response.status == http_client.SERVICE_UNAVAILABLE: LOG.error(_LE('The Flexvisor service is unavailable.')) time.sleep(1) retry -= 1 @@ -150,7 +150,7 @@ class DPLCommand(object): else: retcode = 0 break - except httplib.ResponseNotReady as e: + except http_client.ResponseNotReady as e: time.sleep(1) retry -= 1 retcode = errno.EFAULT @@ -162,23 +162,23 @@ class DPLCommand(object): break if (retcode == 0 and response.status in expected_status - and response.status == httplib.NOT_FOUND): + and response.status == http_client.NOT_FOUND): retcode = errno.ENODATA elif retcode == 0 and response.status not in expected_status: LOG.error(_LE('%(method)s %(url)s unexpected response status: ' '%(response)s (expects: %(expects)s).'), {'method': method, 'url': url, - 'response': httplib.responses[response.status], + 'response': http_client.responses[response.status], 'expects': expected_status}) - if response.status == httplib.UNAUTHORIZED: + if response.status == http_client.UNAUTHORIZED: raise exception.NotAuthorized retcode = errno.EACCES else: retcode = errno.EIO - elif retcode == 0 and response.status is httplib.NOT_FOUND: + elif retcode == 0 and response.status is http_client.NOT_FOUND: retcode = errno.ENODATA - elif retcode == 0 and response.status is httplib.ACCEPTED: + elif retcode == 0 and response.status is http_client.ACCEPTED: retcode = errno.EAGAIN try: data = response.read() @@ -192,8 +192,8 @@ class DPLCommand(object): e) retcode = errno.ENOEXEC elif (retcode == 0 and - response.status in [httplib.OK, httplib.CREATED] and - httplib.NO_CONTENT not in expected_status): + response.status in [http_client.OK, http_client.CREATED] and + http_client.NO_CONTENT not in expected_status): try: data = response.read() data = json.loads(data) @@ -229,7 +229,8 @@ class DPLVolume(object): def get_server_info(self): method = 'GET' url = ('/%s/%s/' % (DPL_VER_V1, DPL_OBJ_SYSTEM)) - return self._execute(method, url, None, [httplib.OK, httplib.ACCEPTED]) + return self._execute(method, url, None, + [http_client.OK, http_client.ACCEPTED]) def create_vdev(self, volumeID, volumeName, volumeDesc, poolID, volumeSize, fthinprovision=True, maximum_snapshot=MAXSNAPSHOTS, @@ -253,7 +254,8 @@ class DPLVolume(object): params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def extend_vdev(self, volumeID, volumeName, volumeDesc, volumeSize, maximum_snapshot=MAXSNAPSHOTS, snapshot_quota=None): @@ -274,7 +276,8 @@ class DPLVolume(object): params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def delete_vdev(self, volumeID, force=True): method = 'DELETE' @@ -286,8 +289,8 @@ class DPLVolume(object): params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.NOT_FOUND, - httplib.NO_CONTENT]) + [http_client.OK, http_client.ACCEPTED, + http_client.NOT_FOUND, http_client.NO_CONTENT]) def create_vdev_from_snapshot(self, vdevID, vdevDisplayName, vdevDesc, snapshotID, poolID, fthinprovision=True, @@ -314,7 +317,8 @@ class DPLVolume(object): params['copy'] = self._gen_snapshot_url(vdevID, snapshotID) return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def spawn_vdev_from_snapshot(self, new_vol_id, src_vol_id, vol_display_name, description, snap_id): @@ -333,17 +337,19 @@ class DPLVolume(object): params['copy'] = self._gen_snapshot_url(src_vol_id, snap_id) return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def get_pools(self): method = 'GET' url = '/%s/%s/' % (DPL_VER_V1, DPL_OBJ_POOL) - return self._execute(method, url, None, [httplib.OK]) + return self._execute(method, url, None, [http_client.OK]) def get_pool(self, poolid): method = 'GET' url = '/%s/%s/%s/' % (DPL_VER_V1, DPL_OBJ_POOL, poolid) - return self._execute(method, url, None, [httplib.OK, httplib.ACCEPTED]) + return self._execute(method, url, None, + [http_client.OK, http_client.ACCEPTED]) def clone_vdev(self, SourceVolumeID, NewVolumeID, poolID, volumeName, volumeDesc, volumeSize, fthinprovision=True, @@ -369,7 +375,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.CREATED, httplib.ACCEPTED]) + [http_client.OK, http_client.CREATED, + http_client.ACCEPTED]) def create_vdev_snapshot(self, vdevid, snapshotid, snapshotname='', snapshotdes='', isgroup=False): @@ -392,7 +399,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.CREATED, httplib.ACCEPTED]) + [http_client.OK, http_client.CREATED, + http_client.ACCEPTED]) def get_vdev(self, vdevid): method = 'GET' @@ -400,7 +408,8 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK, httplib.ACCEPTED, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NOT_FOUND]) def get_vdev_status(self, vdevid, eventid): method = 'GET' @@ -409,7 +418,7 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK, httplib.NOT_FOUND]) + [http_client.OK, http_client.NOT_FOUND]) def get_pool_status(self, poolid, eventid): method = 'GET' @@ -418,7 +427,7 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK, httplib.NOT_FOUND]) + [http_client.OK, http_client.NOT_FOUND]) def assign_vdev(self, vdevid, iqn, lunname, portal, lunid=0): method = 'PUT' @@ -445,7 +454,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def assign_vdev_fc(self, vdevid, targetwwpn, initiatorwwpn, lunname, lunid=-1): @@ -468,7 +478,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def unassign_vdev(self, vdevid, initiatorIqn, targetIqn=''): method = 'PUT' @@ -490,8 +501,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, - httplib.NO_CONTENT, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NO_CONTENT, http_client.NOT_FOUND]) def unassign_vdev_fc(self, vdevid, targetwwpn, initiatorwwpns): method = 'PUT' @@ -512,8 +523,8 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, - httplib.NO_CONTENT, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NO_CONTENT, http_client.NOT_FOUND]) def delete_vdev_snapshot(self, objID, snapshotID, isGroup=False): method = 'DELETE' @@ -529,8 +540,8 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK, httplib.ACCEPTED, httplib.NO_CONTENT, - httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NO_CONTENT, http_client.NOT_FOUND]) def rollback_vdev(self, vdevid, snapshotid): method = 'PUT' @@ -541,7 +552,7 @@ class DPLVolume(object): return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED]) + [http_client.OK, http_client.ACCEPTED]) def list_vdev_snapshots(self, vdevid, isGroup=False): method = 'GET' @@ -554,7 +565,7 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK]) + [http_client.OK]) def query_vdev_snapshot(self, vdevid, snapshotID, isGroup=False): method = 'GET' @@ -567,7 +578,7 @@ class DPLVolume(object): return self._execute(method, url, None, - [httplib.OK]) + [http_client.OK]) def create_target(self, targetID, protocol, displayName, targetAddress, description=''): @@ -584,19 +595,20 @@ class DPLVolume(object): metadata['display_name'] = displayName metadata['display_description'] = description metadata['address'] = targetAddress - return self._execute(method, url, params, [httplib.OK]) + return self._execute(method, url, params, [http_client.OK]) def get_target(self, targetID): method = 'GET' url = '/%s/%s/%s/' % (DPL_VER_V1, DPL_OBJ_EXPORT, targetID) - return self._execute(method, url, None, [httplib.OK]) + return self._execute(method, url, None, [http_client.OK]) def delete_target(self, targetID): method = 'DELETE' url = '/%s/%s/%s/' % (DPL_VER_V1, DPL_OBJ_EXPORT, targetID) return self._execute(method, url, None, - [httplib.OK, httplib.ACCEPTED, httplib.NOT_FOUND]) + [http_client.OK, http_client.ACCEPTED, + http_client.NOT_FOUND]) def get_target_list(self, type='target'): # type = target/initiator @@ -605,7 +617,7 @@ class DPLVolume(object): url = '/%s/%s/' % (DPL_VER_V1, DPL_OBJ_EXPORT) else: url = '/%s/%s/?type=%s' % (DPL_VER_V1, DPL_OBJ_EXPORT, type) - return self._execute(method, url, None, [httplib.OK]) + return self._execute(method, url, None, [http_client.OK]) def get_sns_table(self, wwpn): method = 'PUT' @@ -614,7 +626,7 @@ class DPLVolume(object): params['metadata'] = {} params['metadata']['protocol'] = 'fc' params['metadata']['address'] = str(wwpn) - return self._execute(method, url, params, [httplib.OK]) + return self._execute(method, url, params, [http_client.OK]) def create_vg(self, groupID, groupName, groupDesc='', listVolume=None, maxSnapshots=MAXSNAPSHOTS, rotationSnapshot=True): @@ -634,7 +646,8 @@ class DPLVolume(object): metadata['properties'] = properties params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED, httplib.CREATED]) + [http_client.OK, http_client.ACCEPTED, + http_client.CREATED]) def get_vg_list(self, vgtype=None): method = 'GET' @@ -642,12 +655,12 @@ class DPLVolume(object): url = '/%s/?volume_group_type=%s' % (DPL_OBJ_VOLUMEGROUP, vgtype) else: url = '/%s/' % (DPL_OBJ_VOLUMEGROUP) - return self._execute(method, url, None, [httplib.OK]) + return self._execute(method, url, None, [http_client.OK]) def get_vg(self, groupID): method = 'GET' url = '/%s/%s/' % (DPL_OBJ_VOLUMEGROUP, groupID) - return self._execute(method, url, None, [httplib.OK]) + return self._execute(method, url, None, [http_client.OK]) def delete_vg(self, groupID, force=True): method = 'DELETE' @@ -657,7 +670,7 @@ class DPLVolume(object): metadata['force'] = force params['metadata'] = metadata return self._execute(method, url, params, - [httplib.NO_CONTENT, httplib.NOT_FOUND]) + [http_client.NO_CONTENT, http_client.NOT_FOUND]) def join_vg(self, volumeID, groupID): method = 'PUT' @@ -669,7 +682,7 @@ class DPLVolume(object): metadata['volume'].append(volumeID) params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED]) + [http_client.OK, http_client.ACCEPTED]) def leave_vg(self, volumeID, groupID): method = 'PUT' @@ -681,7 +694,7 @@ class DPLVolume(object): metadata['volume'].append(volumeID) params['metadata'] = metadata return self._execute(method, url, params, - [httplib.OK, httplib.ACCEPTED]) + [http_client.OK, http_client.ACCEPTED]) class DPLCOMMONDriver(driver.ConsistencyGroupVD, driver.ExtendVD, diff --git a/cinder/volume/drivers/zfssa/restclient.py b/cinder/volume/drivers/zfssa/restclient.py index 41eb6c264d8..8e90cd390ac 100644 --- a/cinder/volume/drivers/zfssa/restclient.py +++ b/cinder/volume/drivers/zfssa/restclient.py @@ -15,12 +15,12 @@ ZFS Storage Appliance REST API Client Programmatic Interface """ -import httplib import json import StringIO import time from oslo_log import log +from six.moves import http_client from six.moves import urllib from cinder.i18n import _LE, _LI @@ -35,40 +35,40 @@ class Status(object): pass #: Request return OK - OK = httplib.OK + OK = http_client.OK #: New resource created successfully - CREATED = httplib.CREATED + CREATED = http_client.CREATED #: Command accepted - ACCEPTED = httplib.ACCEPTED + ACCEPTED = http_client.ACCEPTED #: Command returned OK but no data will be returned - NO_CONTENT = httplib.NO_CONTENT + NO_CONTENT = http_client.NO_CONTENT #: Bad Request - BAD_REQUEST = httplib.BAD_REQUEST + BAD_REQUEST = http_client.BAD_REQUEST #: User is not authorized - UNAUTHORIZED = httplib.UNAUTHORIZED + UNAUTHORIZED = http_client.UNAUTHORIZED #: The request is not allowed - FORBIDDEN = httplib.FORBIDDEN + FORBIDDEN = http_client.FORBIDDEN #: The requested resource was not found - NOT_FOUND = httplib.NOT_FOUND + NOT_FOUND = http_client.NOT_FOUND #: The request is not allowed - NOT_ALLOWED = httplib.METHOD_NOT_ALLOWED + NOT_ALLOWED = http_client.METHOD_NOT_ALLOWED #: Request timed out - TIMEOUT = httplib.REQUEST_TIMEOUT + TIMEOUT = http_client.REQUEST_TIMEOUT #: Invalid request - CONFLICT = httplib.CONFLICT + CONFLICT = http_client.CONFLICT #: Service Unavailable - BUSY = httplib.SERVICE_UNAVAILABLE + BUSY = http_client.SERVICE_UNAVAILABLE class RestResult(object): @@ -90,7 +90,7 @@ class RestResult(object): if self.error: self.status = self.error.code - self.data = httplib.responses[self.status] + self.data = http_client.responses[self.status] LOG.debug('Response code: %s', self.status) LOG.debug('Response data: %s', self.data) @@ -121,8 +121,8 @@ class RestClientError(Exception): self.code = status self.name = name self.msg = message - if status in httplib.responses: - self.msg = httplib.responses[status] + if status in http_client.responses: + self.msg = http_client.responses[status] def __str__(self): return "%d %s %s" % (self.code, self.name, self.msg) @@ -173,14 +173,14 @@ class RestClientURL(object): try: result = self.post("/access/v1") del self.headers['authorization'] - if result.status == httplib.CREATED: + if result.status == http_client.CREATED: self.headers['x-auth-session'] = \ result.get_header('x-auth-session') self.do_logout = True LOG.info(_LI('ZFSSA version: %s'), result.get_header('x-zfssa-version')) - elif result.status == httplib.NOT_FOUND: + elif result.status == http_client.NOT_FOUND: raise RestClientError(result.status, name="ERR_RESTError", message="REST Not Available: \ Please Upgrade") @@ -277,19 +277,19 @@ class RestClientURL(object): try: response = urllib.request.urlopen(req, timeout=self.timeout) except urllib.error.HTTPError as err: - if err.code == httplib.NOT_FOUND: + if err.code == http_client.NOT_FOUND: LOG.debug('REST Not Found: %s', err.code) else: LOG.error(_LE('REST Not Available: %s'), err.code) - if err.code == httplib.SERVICE_UNAVAILABLE and \ + if err.code == http_client.SERVICE_UNAVAILABLE and \ retry < maxreqretries: retry += 1 time.sleep(1) LOG.error(_LE('Server Busy retry request: %s'), retry) continue - if (err.code == httplib.UNAUTHORIZED or - err.code == httplib.INTERNAL_SERVER_ERROR) and \ + if (err.code == http_client.UNAUTHORIZED or + err.code == http_client.INTERNAL_SERVER_ERROR) and \ '/access/v1' not in zfssaurl: try: LOG.error(_LE('Authorizing request: %(zfssaurl)s ' @@ -313,7 +313,7 @@ class RestClientURL(object): break - if response and response.getcode() == httplib.SERVICE_UNAVAILABLE and \ + if response and response.getcode() == http_client.SERVICE_UNAVAILABLE and \ retry >= maxreqretries: raise RestClientError(response.getcode(), name="ERR_HTTPError", message="REST Not Available: Disabled") diff --git a/cinder/volume/drivers/zfssa/webdavclient.py b/cinder/volume/drivers/zfssa/webdavclient.py index f8ec06dcfe8..f29f68bb111 100644 --- a/cinder/volume/drivers/zfssa/webdavclient.py +++ b/cinder/volume/drivers/zfssa/webdavclient.py @@ -15,10 +15,10 @@ ZFS Storage Appliance WebDAV Client """ -import httplib import time from oslo_log import log +from six.moves import http_client from six.moves import urllib from cinder import exception @@ -31,15 +31,15 @@ bad_gateway_err = _('Check the state of the http service. Also ensure that ' 'in cinder.conf.') WebDAVHTTPErrors = { - httplib.UNAUTHORIZED: _('User not authorized to perform WebDAV ' - 'operations.'), - httplib.BAD_GATEWAY: bad_gateway_err, - httplib.FORBIDDEN: _('Check access permissions for the ZFS share assigned ' - 'to this driver.'), - httplib.NOT_FOUND: _('The source volume for this WebDAV operation not ' - 'found.'), - httplib.INSUFFICIENT_STORAGE: _('Not enough storage space in the ZFS ' - 'share to perform this operation.') + http_client.UNAUTHORIZED: _('User not authorized to perform WebDAV ' + 'operations.'), + http_client.BAD_GATEWAY: bad_gateway_err, + http_client.FORBIDDEN: _('Check access permissions for the ZFS share ' + 'assigned to this driver.'), + http_client.NOT_FOUND: _('The source volume for this WebDAV operation not ' + 'found.'), + http_client.INSUFFICIENT_STORAGE: _('Not enough storage space in the ZFS ' + 'share to perform this operation.') } WebDAVErrors = { @@ -58,8 +58,8 @@ class ZFSSAWebDAVClient(object): def _lookup_error(self, error): msg = '' - if error in httplib.responses: - msg = httplib.responses[error] + if error in http_client.responses: + msg = http_client.responses[error] if error in WebDAVHTTPErrors: msg = WebDAVHTTPErrors[error] @@ -92,7 +92,7 @@ class ZFSSAWebDAVClient(object): '%(method)s call.'), {'code': err.code, 'method': method}) - if err.code == httplib.INTERNAL_SERVER_ERROR: + if err.code == http_client.INTERNAL_SERVER_ERROR: LOG.error(_LE('WebDAV operation failed with error code: ' '%(code)s reason: %(reason)s Retry attempt ' '%(retry)s in progress.'), @@ -109,10 +109,11 @@ class ZFSSAWebDAVClient(object): src=src_file, dst=dst_file, method=method) - except httplib.BadStatusLine as err: + except http_client.BadStatusLine as err: msg = self._lookup_error('BadStatusLine') + code = 'http_client.BadStatusLine' raise exception.WebDAVClientError(msg=msg, - code='httplib.BadStatusLine', + code=code, src=src_file, dst=dst_file, method=method) diff --git a/pylintrc b/pylintrc index eb795980dfc..a5064360fdd 100644 --- a/pylintrc +++ b/pylintrc @@ -33,3 +33,9 @@ max-args=6 [Variables] dummy-variables-rgx=_ + +[Typecheck] +# Disable warnings on the HTTPSConnection classes because pylint doesn't +# support importing from six.moves yet, see: +# https://bitbucket.org/logilab/pylint/issue/550/ +ignored-classes=HTTPSConnection