]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Remove Brick iser dependency on cinder
authorWalter A. Boring IV <walter.boring@hp.com>
Thu, 8 Aug 2013 22:29:54 +0000 (15:29 -0700)
committerWalter A. Boring IV <walter.boring@hp.com>
Mon, 12 Aug 2013 17:58:25 +0000 (10:58 -0700)
This patch removes the brick iser.py's dependency
on cinder exceptions and volume_utils.
This required moving some exceptions out of cinder's
exception.py that the iser.py raises.  Also had
to create a BrickException and refactor existing
brick exceptions to use the new BrickException model.

Fixes Bug #1210312

Change-Id: I672375807fed4952e5321fbcd9b57b9ef369f68f

cinder/brick/exception.py [new file with mode: 0644]
cinder/brick/exceptions.py [deleted file]
cinder/brick/initiator/connector.py
cinder/brick/iser/iser.py
cinder/exception.py
cinder/tests/brick/test_brick_connector.py

diff --git a/cinder/brick/exception.py b/cinder/brick/exception.py
new file mode 100644 (file)
index 0000000..b103e16
--- /dev/null
@@ -0,0 +1,114 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+"""Exceptions for the Brick library."""
+
+import sys
+
+from oslo.config import cfg
+
+from cinder.openstack.common import log as logging
+
+
+LOG = logging.getLogger(__name__)
+
+exc_log_opts = [
+    cfg.BoolOpt('fatal_exception_format_errors',
+                default=False,
+                help='make exception message format errors fatal'),
+]
+
+CONF = cfg.CONF
+CONF.register_opts(exc_log_opts)
+
+
+class BrickException(Exception):
+    """Base Brick Exception
+
+    To correctly use this class, inherit from it and define
+    a 'msg_fmt' property. That msg_fmt will get printf'd
+    with the keyword arguments provided to the constructor.
+    """
+    msg_fmt = _("An unknown exception occurred.")
+    code = 500
+    headers = {}
+    safe = False
+
+    def __init__(self, message=None, **kwargs):
+        self.kwargs = kwargs
+
+        if 'code' not in self.kwargs:
+            try:
+                self.kwargs['code'] = self.code
+            except AttributeError:
+                pass
+
+        if not message:
+            try:
+                message = self.msg_fmt % kwargs
+
+            except Exception:
+                exc_info = sys.exc_info()
+                # kwargs doesn't match a variable in the message
+                # log the issue and the kwargs
+                LOG.exception(_('Exception in string format operation'))
+                for name, value in kwargs.iteritems():
+                    LOG.error("%s: %s" % (name, value))
+
+                if CONF.fatal_exception_format_errors:
+                    raise exc_info[0], exc_info[1], exc_info[2]
+                else:
+                    # at least get the core message out if something happened
+                    message = self.msg_fmt
+
+        super(BrickException, self).__init__(message)
+
+
+class NotFound(BrickException):
+    message = _("Resource could not be found.")
+    code = 404
+    safe = True
+
+
+class Invalid(BrickException):
+    message = _("Unacceptable parameters.")
+    code = 400
+
+
+# Cannot be templated as the error syntax varies.
+# msg needs to be constructed when raised.
+class InvalidParameterValue(Invalid):
+    message = _("%(err)s")
+
+
+class NoFibreChannelHostsFound(BrickException):
+    message = _("We are unable to locate any Fibre Channel devices.")
+
+
+class NoFibreChannelVolumeDeviceFound(BrickException):
+    message = _("Unable to find a Fibre Channel volume device.")
+
+
+class VolumeDeviceNotFound(BrickException):
+    message = _("Volume device not found at %(device)s.")
+
+
+class ISERTargetCreateFailed(BrickException):
+    message = _("Failed to create iser target for volume %(volume_id)s.")
+
+
+class ISERTargetRemoveFailed(BrickException):
+    message = _("Failed to remove iser target for volume %(volume_id)s.")
diff --git a/cinder/brick/exceptions.py b/cinder/brick/exceptions.py
deleted file mode 100644 (file)
index d046e3f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-"""Exceptions for the Brick library."""
-
-
-class NoFibreChannelHostsFound(Exception):
-    def __init__(self):
-        message = _("We are unable to locate any Fibre Channel devices")
-        super(NoFibreChannelHostsFound, self).__init__(message)
-
-
-class NoFibreChannelVolumeDeviceFound(Exception):
-    def __init__(self):
-        message = _("Unable to find a Fibre Channel volume device")
-        super(NoFibreChannelVolumeDeviceFound, self).__init__(message)
-
-
-class VolumeDeviceNotFound(Exception):
-    def __init__(self, device):
-        message = _("Volume device not found at %s") % device
-        super(VolumeDeviceNotFound, self).__init__(message)
index 44d4698f9bbfbd1363c2b74fcba4aca66857146a..26a706755c71e03f7b9dcc8e1317552596b973ca 100644 (file)
@@ -25,7 +25,7 @@ import time
 
 from oslo.config import cfg
 
-from cinder.brick import exceptions
+from cinder.brick import exception
 from cinder.openstack.common.gettextutils import _
 from cinder.openstack.common import lockutils
 from cinder.openstack.common import log as logging
@@ -177,7 +177,7 @@ class ISCSIConnector(InitiatorConnector):
         tries = 0
         while not os.path.exists(host_device):
             if tries >= CONF.num_iscsi_scan_tries:
-                raise exceptions.VolumeDeviceNotFound(host_device)
+                raise exception.VolumeDeviceNotFound(device=host_device)
 
             LOG.warn(_("ISCSI volume not yet found at: %(host_device)s. "
                        "Will rescan & retry.  Try number: %(tries)s"),
@@ -514,7 +514,7 @@ class FibreChannelConnector(InitiatorConnector):
             # this is empty because we don't have any FC HBAs
             msg = _("We are unable to locate any Fibre Channel devices")
             LOG.warn(msg)
-            raise exceptions.NoFibreChannelHostsFound()
+            raise exception.NoFibreChannelHostsFound()
 
         # The /dev/disk/by-path/... node is not always present immediately
         # We only need to find the first device.  Once we see the first device
@@ -534,7 +534,7 @@ class FibreChannelConnector(InitiatorConnector):
             if self.tries >= CONF.num_iscsi_scan_tries:
                 msg = _("Fibre Channel volume device not found.")
                 LOG.error(msg)
-                raise exceptions.NoFibreChannelVolumeDeviceFound()
+                raise exception.NoFibreChannelVolumeDeviceFound()
 
             LOG.warn(_("Fibre volume not yet found. "
                        "Will rescan & retry.  Try number: %(tries)s"),
index cafb2ac951e1acd980f1fd1885a4d02ecfa93ae6..5c2d8e6c7d22d8762336d05d50b451a3249addee 100755 (executable)
@@ -20,16 +20,13 @@ Helper code for the iSER volume driver.
 
 
 import os
-import re
 
 from oslo.config import cfg
 
-from cinder import exception
+from cinder.brick import exception
 from cinder.openstack.common import fileutils
 from cinder.openstack.common import log as logging
-from cinder import utils
-from cinder.volume import utils as volume_utils
-
+from cinder.openstack.common import processutils as putils
 
 LOG = logging.getLogger(__name__)
 
@@ -98,7 +95,7 @@ class TargetAdmin(object):
 class TgtAdm(TargetAdmin):
     """iSER target administration using tgtadm."""
 
-    def __init__(self, execute=utils.execute):
+    def __init__(self, execute=putils.execute):
         super(TgtAdm, self).__init__('tgtadm', execute)
 
     def _get_target(self, iqn):
@@ -154,7 +151,7 @@ class TgtAdm(TargetAdmin):
                                        '--update',
                                        name,
                                        run_as_root=True)
-        except exception.ProcessExecutionError as e:
+        except putils.ProcessExecutionError as e:
             LOG.error(_("Failed to create iser target for volume "
                         "id:%(vol_id)s: %(e)s")
                       % {'vol_id': vol_id, 'e': str(e)})
@@ -194,7 +191,7 @@ class TgtAdm(TargetAdmin):
                           '--delete',
                           iqn,
                           run_as_root=True)
-        except exception.ProcessExecutionError as e:
+        except putils.ProcessExecutionError as e:
             LOG.error(_("Failed to remove iser target for volume "
                         "id:%(vol_id)s: %(e)s")
                       % {'vol_id': vol_id, 'e': str(e)})
index 50b995e46f728ee8cdf2c119c3cd4238a5d3d63c..f9fb69fc797d2e816cf2bb27939be9d6d9d73e35 100644 (file)
@@ -310,22 +310,6 @@ class ISCSITargetRemoveFailed(CinderException):
     message = _("Failed to remove iscsi target for volume %(volume_id)s.")
 
 
-class ISERTargetNotFoundForVolume(NotFound):
-    message = _("No target id found for volume %(volume_id)s.")
-
-
-class ISERTargetCreateFailed(CinderException):
-    message = _("Failed to create iser target for volume %(volume_id)s.")
-
-
-class ISERTargetAttachFailed(CinderException):
-    message = _("Failed to attach iser target for volume %(volume_id)s.")
-
-
-class ISERTargetRemoveFailed(CinderException):
-    message = _("Failed to remove iser target for volume %(volume_id)s.")
-
-
 class DiskNotFound(NotFound):
     message = _("No disk at %(location)s")
 
index 934c6c61886cd995043738ddf3096f60e6cae8f9..13eef922cda1eb4325db9978334f17d877cb8fc5 100644 (file)
@@ -17,7 +17,7 @@
 import os.path
 import string
 
-from cinder.brick import exceptions
+from cinder.brick import exception
 from cinder.brick.initiator import connector
 from cinder.brick.initiator import host_driver
 from cinder.brick.initiator import linuxfc
@@ -251,6 +251,6 @@ class FibreChannelConnectorTestCase(ConnectorTestCase):
                        lambda: [])
         self.stubs.Set(self.connector._linuxfc, 'get_fc_hbas_info',
                        lambda: [])
-        self.assertRaises(exceptions.NoFibreChannelHostsFound,
+        self.assertRaises(exception.NoFibreChannelHostsFound,
                           self.connector.connect_volume,
                           connection_info['data'])