]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Remove duplication of brick.iscsi in brick.iser
authorAnn Kamyshnikova <akamyshnikova@mirantis.com>
Tue, 3 Sep 2013 13:44:50 +0000 (17:44 +0400)
committerAnn Kamyshnikova <akamyshnikova@mirantis.com>
Tue, 22 Oct 2013 08:02:58 +0000 (12:02 +0400)
TargetAdmin and TgtAdm in iser is mostly a copy of TargetAdmin and
TgtAdm in iscsi.

Change-Id: I8d89a35c478485370b41f4dfd376de07b9fc9314

cinder/brick/exception.py
cinder/brick/iscsi/iscsi.py
cinder/brick/iser/__init__.py [deleted file]
cinder/brick/iser/iser.py [deleted file]
cinder/tests/test_iscsi.py
cinder/tests/test_iser.py [deleted file]
cinder/volume/driver.py
cinder/volume/drivers/lvm.py

index 33ccfb391458e4435b7a2203dd1c008acc780d69..0e9ed4b4366328ec00f363e208e365e801aca728 100644 (file)
@@ -95,14 +95,6 @@ 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.")
-
-
 class VolumeGroupNotFound(BrickException):
     message = _('Unable to find Volume Group: %(vg_name)s')
 
index 103014e9855c4d1c6fef5d8ef9402efa866d6dfc..098ce56248d71061e0cec5ee9fa3acf1c35f8aae 100644 (file)
@@ -82,6 +82,17 @@ class TargetAdmin(executor.Executor):
 
 class TgtAdm(TargetAdmin):
     """iSCSI target administration using tgtadm."""
+    VOLUME_CONF = """
+                <target %s>
+                    backing-store %s
+                </target>
+                  """
+    VOLUME_CONF_WITH_CHAP_AUTH = """
+                                <target %s>
+                                    backing-store %s
+                                    %s
+                                </target>
+                                 """
 
     def __init__(self, root_helper, volumes_dir,
                  target_prefix='iqn.2010-10.org.openstack:',
@@ -156,18 +167,10 @@ class TgtAdm(TargetAdmin):
 
         vol_id = name.split(':')[1]
         if chap_auth is None:
-            volume_conf = """
-                <target %s>
-                    backing-store %s
-                </target>
-            """ % (name, path)
+            volume_conf = self.VOLUME_CONF % (name, path)
         else:
-            volume_conf = """
-                <target %s>
-                    backing-store %s
-                    %s
-                </target>
-            """ % (name, path, chap_auth)
+            volume_conf = self.VOLUME_CONF_WITH_CHAP_AUTH % (name,
+                                                             path, chap_auth)
 
         LOG.info(_('Creating iscsi_target for: %s') % vol_id)
         volumes_dir = self.volumes_dir
@@ -550,3 +553,25 @@ class LioAdm(TargetAdmin):
             LOG.error(_("Failed to add initiator iqn %s to target") %
                       connector['initiator'])
             raise exception.ISCSITargetAttachFailed(volume_id=volume['id'])
+
+
+class ISERTgtAdm(TgtAdm):
+    VOLUME_CONF = """
+                <target %s>
+                    driver iser
+                    backing-store %s
+                </target>
+                  """
+    VOLUME_CONF_WITH_CHAP_AUTH = """
+                                <target %s>
+                                    driver iser
+                                    backing-store %s
+                                    %s
+                                </target>
+                                 """
+
+    def __init__(self, root_helper, volumes_dir,
+                 target_prefix='iqn.2010-10.org.iser.openstack:',
+                 execute=putils.execute):
+        super(ISERTgtAdm, self).__init__(root_helper, volumes_dir,
+                                         target_prefix, execute)
diff --git a/cinder/brick/iser/__init__.py b/cinder/brick/iser/__init__.py
deleted file mode 100644 (file)
index 5e8da71..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-#    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.
diff --git a/cinder/brick/iser/iser.py b/cinder/brick/iser/iser.py
deleted file mode 100644 (file)
index 2522b8f..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright (c) 2013 Mellanox Technologies. All rights reserved.
-#
-#    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.
-"""
-Helper code for the iSER volume driver.
-
-"""
-
-
-import os
-
-from cinder.brick import exception
-from cinder.brick import executor
-from cinder.openstack.common import fileutils
-from cinder.openstack.common.gettextutils import _
-from cinder.openstack.common import log as logging
-from cinder.openstack.common import processutils as putils
-
-LOG = logging.getLogger(__name__)
-
-
-class TargetAdmin(executor.Executor):
-    """iSER target administration.
-
-    Base class for iSER target admin helpers.
-    """
-
-    def __init__(self, cmd, root_helper, execute):
-        super(TargetAdmin, self).__init__(root_helper, execute=execute)
-        self._cmd = cmd
-
-    def _run(self, *args, **kwargs):
-        self._execute(self._cmd, *args, run_as_root=True, **kwargs)
-
-    def create_iser_target(self, name, tid, lun, path,
-                           chap_auth=None, **kwargs):
-        """Create a iSER target and logical unit."""
-        raise NotImplementedError()
-
-    def remove_iser_target(self, tid, lun, vol_id, vol_name, **kwargs):
-        """Remove a iSER target and logical unit."""
-        raise NotImplementedError()
-
-    def _new_target(self, name, tid, **kwargs):
-        """Create a new iSER target."""
-        raise NotImplementedError()
-
-    def _delete_target(self, tid, **kwargs):
-        """Delete a target."""
-        raise NotImplementedError()
-
-    def show_target(self, tid, iqn=None, **kwargs):
-        """Query the given target ID."""
-        raise NotImplementedError()
-
-    def _new_logicalunit(self, tid, lun, path, **kwargs):
-        """Create a new LUN on a target using the supplied path."""
-        raise NotImplementedError()
-
-    def _delete_logicalunit(self, tid, lun, **kwargs):
-        """Delete a logical unit from a target."""
-        raise NotImplementedError()
-
-
-class TgtAdm(TargetAdmin):
-    """iSER target administration using tgtadm."""
-
-    def __init__(self, root_helper, volumes_dir, execute=putils.execute,
-                 target_prefix='iqn.2010-10.org.iser.openstack:'):
-        super(TgtAdm, self).__init__('tgtadm', root_helper, execute)
-        self.volumes_dir = volumes_dir
-        self.iser_target_prefix = target_prefix
-
-    def _get_target(self, iqn):
-        (out, err) = self._execute('tgt-admin', '--show', run_as_root=True)
-        lines = out.split('\n')
-        for line in lines:
-            if iqn in line:
-                parsed = line.split()
-                tid = parsed[1]
-                return tid[:-1]
-
-        return None
-
-    def create_iser_target(self, name, tid, lun, path,
-                           chap_auth=None, **kwargs):
-        # Note(jdg) tid and lun aren't used by TgtAdm but remain for
-        # compatibility
-
-        fileutils.ensure_tree(self.volumes_dir)
-
-        vol_id = name.split(':')[1]
-        if chap_auth is None:
-            volume_conf = """
-                <target %s>
-                    driver iser
-                    backing-store %s
-                </target>
-            """ % (name, path)
-        else:
-            volume_conf = """
-                <target %s>
-                    driver iser
-                    backing-store %s
-                    %s
-                </target>
-            """ % (name, path, chap_auth)
-
-        LOG.info(_('Creating iser_target for: %s') % vol_id)
-        volume_path = os.path.join(self.volumes_dir, vol_id)
-
-        f = open(volume_path, 'w+')
-        f.write(volume_conf)
-        f.close()
-
-        old_persist_file = None
-        old_name = kwargs.get('old_name', None)
-        if old_name is not None:
-            old_persist_file = os.path.join(self.volumes_dir, old_name)
-
-        try:
-            (out, err) = self._execute('tgt-admin',
-                                       '--update',
-                                       name,
-                                       run_as_root=True)
-        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)})
-
-            #Don't forget to remove the persistent file we created
-            os.unlink(volume_path)
-            raise exception.ISERTargetCreateFailed(volume_id=vol_id)
-
-        iqn = '%s%s' % (self.iser_target_prefix, vol_id)
-        tid = self._get_target(iqn)
-        if tid is None:
-            LOG.error(_("Failed to create iser target for volume "
-                        "id:%(vol_id)s. Please ensure your tgtd config file "
-                        "contains 'include %(volumes_dir)s/*'") %
-                      {'vol_id': vol_id, 'volumes_dir': self.volumes_dir})
-            raise exception.NotFound()
-
-        if old_persist_file is not None and os.path.exists(old_persist_file):
-            os.unlink(old_persist_file)
-
-        return tid
-
-    def remove_iser_target(self, tid, lun, vol_id, vol_name, **kwargs):
-        LOG.info(_('Removing iser_target for: %s') % vol_id)
-        vol_uuid_file = vol_name
-        volume_path = os.path.join(self.volumes_dir, vol_uuid_file)
-        if os.path.isfile(volume_path):
-            iqn = '%s%s' % (self.iser_target_prefix,
-                            vol_uuid_file)
-        else:
-            raise exception.ISERTargetRemoveFailed(volume_id=vol_id)
-        try:
-            # NOTE(vish): --force is a workaround for bug:
-            #             https://bugs.launchpad.net/cinder/+bug/1159948
-            self._execute('tgt-admin',
-                          '--force',
-                          '--delete',
-                          iqn,
-                          run_as_root=True)
-        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)})
-            raise exception.ISERTargetRemoveFailed(volume_id=vol_id)
-
-        os.unlink(volume_path)
-
-    def show_target(self, tid, iqn=None, **kwargs):
-        if iqn is None:
-            raise exception.InvalidParameterValue(
-                err=_('valid iqn needed for show_target'))
-
-        tid = self._get_target(iqn)
-        if tid is None:
-            raise exception.NotFound()
-
-
-class FakeIserHelper(object):
-
-    def __init__(self):
-        self.tid = 1
-
-    def set_execute(self, execute):
-        self._execute = execute
-
-    def create_iser_target(self, *args, **kwargs):
-        self.tid += 1
-        return self.tid
index f7b62bce821b7f3314f4c5020639691af04ca6bb..bf2b6056e6d6fcd9c25583f3c7b46ad500bfc659 100644 (file)
@@ -201,3 +201,10 @@ class LioAdmTestCase(test.TestCase, TargetAdminTestCase):
             'rtstool create '
             '/foo iqn.2011-09.org.foo.bar:blaa test_id test_pass',
             'rtstool delete iqn.2010-10.org.openstack:volume-blaa'])
+
+
+class ISERTgtAdmTestCase(TgtAdmTestCase):
+
+    def setUp(self):
+        super(ISERTgtAdmTestCase, self).setUp()
+        self.flags(iscsi_helper='iseradm')
diff --git a/cinder/tests/test_iser.py b/cinder/tests/test_iser.py
deleted file mode 100644 (file)
index 7986371..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright (c) 2013 Mellanox Technologies. All rights reserved.
-#
-#    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.
-
-import os.path
-import shutil
-import string
-import tempfile
-
-from cinder.brick.iser import iser
-from cinder.openstack.common import fileutils
-from cinder import test
-from cinder.volume import driver
-from cinder.volume import utils as volume_utils
-
-
-class TargetAdminTestCase(object):
-
-    def setUp(self):
-        self.cmds = []
-
-        self.tid = 1
-        self.target_name = 'iqn.2011-09.org.foo.bar:blaa'
-        self.lun = 10
-        self.path = '/foo'
-        self.vol_id = 'blaa'
-        self.vol_name = 'volume-blaa'
-
-        self.script_template = None
-        self.stubs.Set(os.path, 'isfile', lambda _: True)
-        self.stubs.Set(os, 'unlink', lambda _: '')
-        self.stubs.Set(iser.TgtAdm, '_get_target', self.fake_get_target)
-        self.persist_tempdir = tempfile.mkdtemp()
-        self.driver = driver.ISERDriver()
-
-    def fake_init(obj):
-        return
-
-    def fake_get_target(obj, iqn):
-        return 1
-
-    def get_script_params(self):
-        return {'tid': self.tid,
-                'target_name': self.target_name,
-                'lun': self.lun,
-                'path': self.path}
-
-    def get_script(self):
-        return self.script_template % self.get_script_params()
-
-    def fake_execute(self, *cmd, **kwargs):
-        self.cmds.append(string.join(cmd))
-        return "", None
-
-    def clear_cmds(self):
-        self.cmds = []
-
-    def verify_cmds(self, cmds):
-        self.assertEqual(len(cmds), len(self.cmds))
-        for a, b in zip(cmds, self.cmds):
-            self.assertEqual(a, b)
-
-    def verify(self):
-        script = self.get_script()
-        cmds = []
-        for line in script.split('\n'):
-            if not line.strip():
-                continue
-            cmds.append(line)
-        self.verify_cmds(cmds)
-
-    def run_commands(self):
-        tgtadm = self.driver.get_target_admin()
-        tgtadm.set_execute(self.fake_execute)
-        tgtadm.create_iser_target(self.target_name, self.tid,
-                                  self.lun, self.path)
-        tgtadm.show_target(self.tid, iqn=self.target_name)
-        tgtadm.remove_iser_target(self.tid, self.lun, self.vol_id,
-                                  self.vol_name)
-
-    def test_target_admin(self):
-        self.clear_cmds()
-        self.run_commands()
-        self.verify()
-
-
-class TgtAdmTestCase(test.TestCase, TargetAdminTestCase):
-
-    def setUp(self):
-        super(TgtAdmTestCase, self).setUp()
-        TargetAdminTestCase.setUp(self)
-        self.persist_tempdir = tempfile.mkdtemp()
-        self.flags(iser_helper='tgtadm')
-        self.flags(volumes_dir=self.persist_tempdir)
-        self.script_template = "\n".join([
-            'tgt-admin --update iqn.2011-09.org.foo.bar:blaa',
-            'tgt-admin --force '
-            '--delete iqn.2010-10.org.iser.openstack:volume-blaa'])
-
-    def tearDown(self):
-        try:
-            shutil.rmtree(self.persist_tempdir)
-        except OSError:
-            pass
-        super(TgtAdmTestCase, self).tearDown()
index 9fc9f85344434b6cd7ba4a2d50337b9e6239ccf1..64b958e1f726f1f02eb1ebb2b6713d07e681ac39 100644 (file)
@@ -27,7 +27,6 @@ from oslo.config import cfg
 
 from cinder.brick.initiator import connector as initiator
 from cinder.brick.iscsi import iscsi
-from cinder.brick.iser import iser
 from cinder import exception
 from cinder.image import image_utils
 from cinder.openstack.common import excutils
@@ -691,8 +690,10 @@ class ISCSIDriver(VolumeDriver):
 
     def get_target_admin(self):
         root_helper = utils.get_root_helper()
-
-        if CONF.iscsi_helper == 'tgtadm':
+        if CONF.iscsi_helper == 'iseradm':
+            return iscsi.ISERTgtAdm(root_helper, CONF.volumes_dir,
+                                    CONF.iscsi_target_prefix)
+        elif CONF.iscsi_helper == 'tgtadm':
             return iscsi.TgtAdm(root_helper,
                                 CONF.volumes_dir,
                                 CONF.iscsi_target_prefix)
@@ -994,10 +995,10 @@ class ISERDriver(ISCSIDriver):
         root_helper = utils.get_root_helper()
 
         if CONF.iser_helper == 'fake':
-            return iser.FakeIserHelper()
+            return iscsi.FakeIscsiHelper()
         else:
-            return iser.TgtAdm(root_helper,
-                               CONF.volumes_dir)
+            return iscsi.ISERTgtAdm(root_helper,
+                                    CONF.volumes_dir)
 
 
 class FakeISERDriver(FakeISCSIDriver):
index 862fe238f118995f069b21a04c7274d8fdad969a..6983a8c8238e21816e3b288dd00bc1a504fd86f2 100644 (file)
@@ -28,7 +28,6 @@ from oslo.config import cfg
 
 from cinder.brick import exception as brick_exception
 from cinder.brick.iscsi import iscsi
-from cinder.brick.iser import iser
 from cinder.brick.local_dev import lvm as lvm
 from cinder import exception
 from cinder.image import image_utils
@@ -761,7 +760,7 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
     def ensure_export(self, context, volume):
         """Synchronously recreates an export for a logical volume."""
 
-        if not isinstance(self.tgtadm, iser.TgtAdm):
+        if not isinstance(self.tgtadm, iscsi.TgtAdm):
             try:
                 iser_target = self.db.volume_get_iscsi_target_num(
                     context,
@@ -788,19 +787,19 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
                 volume_name = old_name
                 old_name = None
 
-        iser_name = "%s%s" % (self.configuration.iser_target_prefix,
+        iser_name = "%s%s" % (self.configuration.iscsi_target_prefix,
                               volume_name)
         volume_path = "/dev/%s/%s" % (self.configuration.volume_group,
                                       volume_name)
 
-        self.tgtadm.create_iser_target(iser_name, iser_target,
-                                       0, volume_path, chap_auth,
-                                       check_exit_code=False,
-                                       old_name=old_name)
+        self.tgtadm.create_iscsi_target(iser_name, iser_target,
+                                        0, volume_path, chap_auth,
+                                        check_exit_code=False,
+                                        old_name=old_name)
 
     def _ensure_iser_targets(self, context, host):
         """Ensure that target ids have been created in datastore."""
-        if not isinstance(self.tgtadm, iser.TgtAdm):
+        if not isinstance(self.tgtadm, iscsi.TgtAdm):
             host_iser_targets = self.db.iscsi_target_count_by_host(context,
                                                                    host)
             if host_iser_targets >= self.configuration.iser_num_targets:
@@ -815,7 +814,7 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
     def create_export(self, context, volume):
         """Creates an export for a logical volume."""
 
-        iser_name = "%s%s" % (self.configuration.iser_target_prefix,
+        iser_name = "%s%s" % (self.configuration.iscsi_target_prefix,
                               volume['name'])
         volume_path = "/dev/%s/%s" % (self.configuration.volume_group,
                                       volume['name'])
@@ -823,7 +822,7 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
 
         # TODO(jdg): In the future move all of the dependent stuff into the
         # cooresponding target admin class
-        if not isinstance(self.tgtadm, iser.TgtAdm):
+        if not isinstance(self.tgtadm, iscsi.TgtAdm):
             lun = 0
             self._ensure_iser_targets(context, volume['host'])
             iser_target = self.db.volume_allocate_iscsi_target(context,
@@ -838,13 +837,13 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
         chap_password = utils.generate_password()
         chap_auth = self._iser_authentication('IncomingUser', chap_username,
                                               chap_password)
-        tid = self.tgtadm.create_iser_target(iser_name,
-                                             iser_target,
-                                             0,
-                                             volume_path,
-                                             chap_auth)
+        tid = self.tgtadm.create_iscsi_target(iser_name,
+                                              iser_target,
+                                              0,
+                                              volume_path,
+                                              chap_auth)
         model_update['provider_location'] = self._iser_location(
-            self.configuration.iser_ip_address, tid, iser_name, lun)
+            self.configuration.iscsi_ip_address, tid, iser_name, lun)
         model_update['provider_auth'] = self._iser_authentication(
             'CHAP', chap_username, chap_password)
         return model_update
@@ -852,7 +851,7 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
     def remove_export(self, context, volume):
         """Removes an export for a logical volume."""
 
-        if not isinstance(self.tgtadm, iser.TgtAdm):
+        if not isinstance(self.tgtadm, iscsi.TgtAdm):
             try:
                 iser_target = self.db.volume_get_iscsi_target_num(
                     context,
@@ -878,11 +877,11 @@ class LVMISERDriver(LVMISCSIDriver, driver.ISERDriver):
                        "is presently exported for volume: %s"), volume['id'])
             return
 
-        self.tgtadm.remove_iser_target(iser_target, 0, volume['id'],
-                                       volume['name'])
+        self.tgtadm.remove_iscsi_target(iser_target, 0, volume['id'],
+                                        volume['name'])
 
     def _iser_location(self, ip, target, iqn, lun=None):
-        return "%s:%s,%s %s %s" % (ip, self.configuration.iser_port,
+        return "%s:%s,%s %s %s" % (ip, self.configuration.iscsi_port,
                                    target, iqn, lun)
 
     def _iser_authentication(self, chap, name, password):