From 65d8167a0f247026760fb1ff1901454ccbf677f9 Mon Sep 17 00:00:00 2001 From: Yulia Portnova <yportnova@mirantis.com> Date: Thu, 5 Sep 2013 10:20:33 +0300 Subject: [PATCH] deleted brick --- manila/brick/__init__.py | 16 - manila/brick/iscsi/__init__.py | 16 - manila/brick/iscsi/iscsi.py | 468 ----------------------------- manila/brick/local_dev/__init__.py | 16 - manila/brick/local_dev/lvm.py | 368 ----------------------- 5 files changed, 884 deletions(-) delete mode 100644 manila/brick/__init__.py delete mode 100644 manila/brick/iscsi/__init__.py delete mode 100644 manila/brick/iscsi/iscsi.py delete mode 100644 manila/brick/local_dev/__init__.py delete mode 100644 manila/brick/local_dev/lvm.py diff --git a/manila/brick/__init__.py b/manila/brick/__init__.py deleted file mode 100644 index 5e8da711fb..0000000000 --- a/manila/brick/__init__.py +++ /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/manila/brick/iscsi/__init__.py b/manila/brick/iscsi/__init__.py deleted file mode 100644 index 5e8da711fb..0000000000 --- a/manila/brick/iscsi/__init__.py +++ /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/manila/brick/iscsi/iscsi.py b/manila/brick/iscsi/iscsi.py deleted file mode 100644 index a62937c88d..0000000000 --- a/manila/brick/iscsi/iscsi.py +++ /dev/null @@ -1,468 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2010 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# 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 iSCSI volume driver. - -""" -import os -import re - -from oslo.config import cfg - -from manila import exception -from manila import flags -from manila.openstack.common import log as logging -from manila import utils -from manila.volume import utils as volume_utils - -LOG = logging.getLogger(__name__) - -iscsi_helper_opt = [cfg.StrOpt('iscsi_helper', - default='tgtadm', - help='iscsi target user-land tool to use'), - cfg.StrOpt('volumes_dir', - default='$state_path/volumes', - help='Volume configuration file storage ' - 'directory'), - cfg.StrOpt('iet_conf', - default='/etc/iet/ietd.conf', - help='IET configuration file'), - cfg.StrOpt('lio_initiator_iqns', - default='', - help=('Comma-separatd list of initiator IQNs ' - 'allowed to connect to the ' - 'iSCSI target. (From Nova compute nodes.)' - ) - ), - cfg.StrOpt('iscsi_iotype', - default='fileio', - help=('Sets the behavior of the iSCSI target ' - 'to either perform blockio or fileio ' - 'optionally, auto can be set and Manila ' - 'will autodetect type of backing device') - ) - ] - -FLAGS = flags.FLAGS -FLAGS.register_opts(iscsi_helper_opt) -FLAGS.import_opt('volume_name_template', 'manila.db') - - -class TargetAdmin(object): - """iSCSI target administration. - - Base class for iSCSI target admin helpers. - """ - - def __init__(self, cmd, execute): - self._cmd = cmd - self.set_execute(execute) - - def set_execute(self, execute): - """Set the function to be used to execute commands.""" - self._execute = execute - - def _run(self, *args, **kwargs): - self._execute(self._cmd, *args, run_as_root=True, **kwargs) - - def create_iscsi_target(self, name, tid, lun, path, - chap_auth=None, **kwargs): - """Create a iSCSI target and logical unit""" - raise NotImplementedError() - - def remove_iscsi_target(self, tid, lun, vol_id, **kwargs): - """Remove a iSCSI target and logical unit""" - raise NotImplementedError() - - def _new_target(self, name, tid, **kwargs): - """Create a new iSCSI 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): - """iSCSI target administration using tgtadm.""" - - def __init__(self, execute=utils.execute): - super(TgtAdm, self).__init__('tgtadm', execute) - - 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_iscsi_target(self, name, tid, lun, path, - chap_auth=None, **kwargs): - # Note(jdg) tid and lun aren't used by TgtAdm but remain for - # compatibility - - utils.ensure_tree(FLAGS.volumes_dir) - - vol_id = name.split(':')[1] - if chap_auth is None: - volume_conf = """ - <target %s> - backing-store %s - </target> - """ % (name, path) - else: - volume_conf = """ - <target %s> - backing-store %s - %s - </target> - """ % (name, path, chap_auth) - - LOG.info(_('Creating iscsi_target for: %s') % vol_id) - volumes_dir = FLAGS.volumes_dir - volume_path = os.path.join(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(volumes_dir, old_name) - - try: - (out, err) = self._execute('tgt-admin', - '--update', - name, - run_as_root=True) - except exception.ProcessExecutionError, e: - LOG.error(_("Failed to create iscsi target for volume " - "id:%(vol_id)s.") % locals()) - - #Don't forget to remove the persistent file we created - os.unlink(volume_path) - raise exception.ISCSITargetCreateFailed(volume_id=vol_id) - - iqn = '%s%s' % (FLAGS.iscsi_target_prefix, vol_id) - tid = self._get_target(iqn) - if tid is None: - LOG.error(_("Failed to create iscsi target for volume " - "id:%(vol_id)s. Please ensure your tgtd config file " - "contains 'include %(volumes_dir)s/*'") % locals()) - 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_iscsi_target(self, tid, lun, vol_id, **kwargs): - LOG.info(_('Removing iscsi_target for: %s') % vol_id) - vol_uuid_file = FLAGS.volume_name_template % vol_id - volume_path = os.path.join(FLAGS.volumes_dir, vol_uuid_file) - if os.path.isfile(volume_path): - iqn = '%s%s' % (FLAGS.iscsi_target_prefix, - vol_uuid_file) - else: - raise exception.ISCSITargetRemoveFailed(volume_id=vol_id) - try: - # NOTE(vish): --force is a workaround for bug: - # https://bugs.launchpad.net/manila/+bug/1159948 - self._execute('tgt-admin', - '--force', - '--delete', - iqn, - run_as_root=True) - except exception.ProcessExecutionError, e: - LOG.error(_("Failed to remove iscsi target for volume " - "id:%(vol_id)s.") % locals()) - raise exception.ISCSITargetRemoveFailed(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 IetAdm(TargetAdmin): - """iSCSI target administration using ietadm.""" - - def __init__(self, execute=utils.execute): - super(IetAdm, self).__init__('ietadm', execute) - - def _iotype(self, path): - if FLAGS.iscsi_iotype == 'auto': - return 'blockio' if volume_utils.is_block(path) else 'fileio' - else: - return FLAGS.iscsi_iotype - - def create_iscsi_target(self, name, tid, lun, path, - chap_auth=None, **kwargs): - - # NOTE (jdg): Address bug: 1175207 - kwargs.pop('old_name', None) - - self._new_target(name, tid, **kwargs) - self._new_logicalunit(tid, lun, path, **kwargs) - if chap_auth is not None: - (type, username, password) = chap_auth.split() - self._new_auth(tid, type, username, password, **kwargs) - - conf_file = FLAGS.iet_conf - if os.path.exists(conf_file): - try: - volume_conf = """ - Target %s - %s - Lun 0 Path=%s,Type=%s - """ % (name, chap_auth, path, self._iotype(path)) - - with utils.temporary_chown(conf_file): - f = open(conf_file, 'a+') - f.write(volume_conf) - f.close() - except exception.ProcessExecutionError, e: - vol_id = name.split(':')[1] - LOG.error(_("Failed to create iscsi target for volume " - "id:%(vol_id)s.") % locals()) - raise exception.ISCSITargetCreateFailed(volume_id=vol_id) - return tid - - def remove_iscsi_target(self, tid, lun, vol_id, **kwargs): - LOG.info(_('Removing iscsi_target for volume: %s') % vol_id) - self._delete_logicalunit(tid, lun, **kwargs) - self._delete_target(tid, **kwargs) - vol_uuid_file = FLAGS.volume_name_template % vol_id - conf_file = FLAGS.iet_conf - if os.path.exists(conf_file): - with utils.temporary_chown(conf_file): - try: - iet_conf_text = open(conf_file, 'r+') - full_txt = iet_conf_text.readlines() - new_iet_conf_txt = [] - count = 0 - for line in full_txt: - if count > 0: - count -= 1 - continue - elif re.search(vol_uuid_file, line): - count = 2 - continue - else: - new_iet_conf_txt.append(line) - - iet_conf_text.seek(0) - iet_conf_text.truncate(0) - iet_conf_text.writelines(new_iet_conf_txt) - finally: - iet_conf_text.close() - - def _new_target(self, name, tid, **kwargs): - self._run('--op', 'new', - '--tid=%s' % tid, - '--params', 'Name=%s' % name, - **kwargs) - - def _delete_target(self, tid, **kwargs): - self._run('--op', 'delete', - '--tid=%s' % tid, - **kwargs) - - def show_target(self, tid, iqn=None, **kwargs): - self._run('--op', 'show', - '--tid=%s' % tid, - **kwargs) - - def _new_logicalunit(self, tid, lun, path, **kwargs): - self._run('--op', 'new', - '--tid=%s' % tid, - '--lun=%d' % lun, - '--params', 'Path=%s,Type=%s' % (path, self._iotype(path)), - **kwargs) - - def _delete_logicalunit(self, tid, lun, **kwargs): - self._run('--op', 'delete', - '--tid=%s' % tid, - '--lun=%d' % lun, - **kwargs) - - def _new_auth(self, tid, type, username, password, **kwargs): - self._run('--op', 'new', - '--tid=%s' % tid, - '--user', - '--params=%s=%s,Password=%s' % (type, username, password), - **kwargs) - - -class FakeIscsiHelper(object): - - def __init__(self): - self.tid = 1 - - def set_execute(self, execute): - self._execute = execute - - def create_iscsi_target(self, *args, **kwargs): - self.tid += 1 - return self.tid - - -class LioAdm(TargetAdmin): - """iSCSI target administration for LIO using python-rtslib.""" - def __init__(self, execute=utils.execute): - super(LioAdm, self).__init__('rtstool', execute) - - try: - self._execute('rtstool', 'verify') - except (OSError, exception.ProcessExecutionError): - LOG.error(_('rtstool is not installed correctly')) - raise - - def _get_target(self, iqn): - (out, err) = self._execute('rtstool', - 'get-targets', - run_as_root=True) - lines = out.split('\n') - for line in lines: - if iqn in line: - return line - - return None - - def create_iscsi_target(self, name, tid, lun, path, - chap_auth=None, **kwargs): - # tid and lun are not used - - vol_id = name.split(':')[1] - - LOG.info(_('Creating iscsi_target for volume: %s') % vol_id) - - # rtstool requires chap_auth, but unit tests don't provide it - chap_auth_userid = 'test_id' - chap_auth_password = 'test_pass' - - if chap_auth != None: - (chap_auth_userid, chap_auth_password) = chap_auth.split(' ')[1:] - - extra_args = [] - if FLAGS.lio_initiator_iqns: - extra_args.append(FLAGS.lio_initiator_iqns) - - try: - command_args = ['rtstool', - 'create', - path, - name, - chap_auth_userid, - chap_auth_password] - if extra_args != []: - command_args += extra_args - self._execute(*command_args, run_as_root=True) - except exception.ProcessExecutionError as e: - LOG.error(_("Failed to create iscsi target for volume " - "id:%(vol_id)s.") % locals()) - LOG.error("%s" % str(e)) - - raise exception.ISCSITargetCreateFailed(volume_id=vol_id) - - iqn = '%s%s' % (FLAGS.iscsi_target_prefix, vol_id) - tid = self._get_target(iqn) - if tid is None: - LOG.error(_("Failed to create iscsi target for volume " - "id:%(vol_id)s.") % locals()) - raise exception.NotFound() - - return tid - - def remove_iscsi_target(self, tid, lun, vol_id, **kwargs): - LOG.info(_('Removing iscsi_target: %s') % vol_id) - vol_uuid_name = 'volume-%s' % vol_id - iqn = '%s%s' % (FLAGS.iscsi_target_prefix, vol_uuid_name) - - try: - self._execute('rtstool', - 'delete', - iqn, - run_as_root=True) - except exception.ProcessExecutionError as e: - LOG.error(_("Failed to remove iscsi target for volume " - "id:%(vol_id)s.") % locals()) - LOG.error("%s" % str(e)) - raise exception.ISCSITargetRemoveFailed(volume_id=vol_id) - - 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() - - def initialize_connection(self, volume, connector): - volume_iqn = volume['provider_location'].split(' ')[1] - - (auth_method, auth_user, auth_pass) = \ - volume['provider_auth'].split(' ', 3) - - # Add initiator iqns to target ACL - try: - self._execute('rtstool', 'add-initiator', - volume_iqn, - auth_user, - auth_pass, - connector['initiator'], - run_as_root=True) - except exception.ProcessExecutionError as e: - LOG.error(_("Failed to add initiator iqn %s to target") % - connector['initiator']) - raise exception.ISCSITargetAttachFailed(volume_id=volume['id']) - - -def get_target_admin(): - if FLAGS.iscsi_helper == 'tgtadm': - return TgtAdm() - elif FLAGS.iscsi_helper == 'fake': - return FakeIscsiHelper() - elif FLAGS.iscsi_helper == 'lioadm': - return LioAdm() - else: - return IetAdm() diff --git a/manila/brick/local_dev/__init__.py b/manila/brick/local_dev/__init__.py deleted file mode 100644 index 5e8da711fb..0000000000 --- a/manila/brick/local_dev/__init__.py +++ /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/manila/brick/local_dev/lvm.py b/manila/brick/local_dev/lvm.py deleted file mode 100644 index e798056c43..0000000000 --- a/manila/brick/local_dev/lvm.py +++ /dev/null @@ -1,368 +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. - -""" -LVM class for performing LVM operations. -""" - -import math - -from itertools import izip - -from manila.openstack.common.gettextutils import _ -from manila.openstack.common import log as logging -from manila.openstack.common import processutils as putils - -LOG = logging.getLogger(__name__) - - -class VolumeGroupNotFound(Exception): - def __init__(self, vg_name): - message = (_('Unable to find Volume Group: %s') % vg_name) - super(VolumeGroupNotFound, self).__init__(message) - - -class VolumeGroupCreationFailed(Exception): - def __init__(self, vg_name): - message = (_('Failed to create Volume Group: %s') % vg_name) - super(VolumeGroupCreationFailed, self).__init__(message) - - -class LVM(object): - """LVM object to enable various LVM related operations.""" - - def __init__(self, vg_name, create_vg=False, - physical_volumes=None): - """Initialize the LVM object. - - The LVM object is based on an LVM VolumeGroup, one instantiation - for each VolumeGroup you have/use. - - :param vg_name: Name of existing VG or VG to create - :param create_vg: Indicates the VG doesn't exist - and we want to create it - :param physical_volumes: List of PVs to build VG on - - """ - self.vg_name = vg_name - self.pv_list = [] - self.lv_list = [] - self.vg_size = 0 - self.vg_available_space = 0 - self.vg_lv_count = 0 - self.vg_uuid = None - - if create_vg and physical_volumes is not None: - self.pv_list = physical_volumes - - try: - self._create_vg(physical_volumes) - except putils.ProcessExecutionError as err: - LOG.exception(_('Error creating Volume Group')) - LOG.error(_('Cmd :%s') % err.cmd) - LOG.error(_('StdOut :%s') % err.stdout) - LOG.error(_('StdErr :%s') % err.stderr) - raise VolumeGroupCreationFailed(vg_name=self.vg_name) - - if self._vg_exists() is False: - LOG.error(_('Unable to locate Volume Group %s') % vg_name) - raise VolumeGroupNotFound(vg_name=vg_name) - - def _size_str(self, size_in_g): - if '.00' in size_in_g: - size_in_g = size_in_g.replace('.00', '') - - if int(size_in_g) == 0: - return '100M' - - return '%sG' % size_in_g - - def _vg_exists(self): - """Simple check to see if VG exists. - - :returns: True if vg specified in object exists, else False - - """ - exists = False - cmd = ['vgs', '--noheadings', '-o', 'name'] - (out, err) = putils.execute(*cmd, root_helper='sudo', run_as_root=True) - - if out is not None: - volume_groups = out.split() - if self.vg_name in volume_groups: - exists = True - - return exists - - def _create_vg(self, pv_list): - cmd = ['vgcreate', self.vg_name, ','.join(pv_list)] - putils.execute(*cmd, root_helper='sudo', run_as_root=True) - - def _get_vg_uuid(self): - (out, err) = putils.execute('vgs', '--noheadings', - '-o uuid', self.vg_name) - if out is not None: - return out.split() - else: - return [] - - @staticmethod - def supports_thin_provisioning(): - """Static method to check for thin LVM support on a system. - - :returns: True if supported, False otherwise - - """ - cmd = ['vgs', '--version'] - (out, err) = putils.execute(*cmd, root_helper='sudo', run_as_root=True) - lines = out.split('\n') - - for line in lines: - if 'LVM version' in line: - version_list = line.split() - version = version_list[2] - if '(2)' in version: - version = version.replace('(2)', '') - version_tuple = tuple(map(int, version.split('.'))) - if version_tuple >= (2, 2, 95): - return True - return False - - @staticmethod - def get_all_volumes(vg_name=None): - """Static method to get all LV's on a system. - - :param vg_name: optional, gathers info for only the specified VG - :returns: List of Dictionaries with LV info - - """ - cmd = ['lvs', '--noheadings', '-o', 'vg_name,name,size'] - if vg_name is not None: - cmd += [vg_name] - - (out, err) = putils.execute(*cmd, root_helper='sudo', run_as_root=True) - - lv_list = [] - if out is not None: - volumes = out.split() - for vg, name, size in izip(*[iter(volumes)] * 3): - lv_list.append({"vg": vg, "name": name, "size": size}) - - return lv_list - - def get_volumes(self): - """Get all LV's associated with this instantiation (VG). - - :returns: List of Dictionaries with LV info - - """ - self.lv_list = self.get_all_volumes(self.vg_name) - return self.lv_list - - def get_volume(self, name): - """Get reference object of volume specified by name. - - :returns: dict representation of Logical Volume if exists - - """ - ref_list = self.get_volumes() - for r in ref_list: - if r['name'] == name: - return r - - @staticmethod - def get_all_physical_volumes(vg_name=None): - """Static method to get all PVs on a system. - - :param vg_name: optional, gathers info for only the specified VG - :returns: List of Dictionaries with PV info - - """ - cmd = ['pvs', '--noheadings', - '-o', 'vg_name,name,size,free', - '--separator', ':'] - if vg_name is not None: - cmd += [vg_name] - - (out, err) = putils.execute(*cmd, root_helper='sudo', run_as_root=True) - - pv_list = [] - if out is not None: - pvs = out.split() - for pv in pvs: - fields = pv.split(':') - pv_list.append({'vg': fields[0], - 'name': fields[1], - 'size': fields[2], - 'available': fields[3]}) - - return pv_list - - def get_physical_volumes(self): - """Get all PVs associated with this instantiation (VG). - - :returns: List of Dictionaries with PV info - - """ - self.pv_list = self.get_all_physical_volumes(self.vg_name) - return self.pv_list - - @staticmethod - def get_all_volume_groups(vg_name=None): - """Static method to get all VGs on a system. - - :param vg_name: optional, gathers info for only the specified VG - :returns: List of Dictionaries with VG info - - """ - cmd = ['vgs', '--noheadings', - '-o', 'name,size,free,lv_count,uuid', - '--separator', ':'] - if vg_name is not None: - cmd += [vg_name] - - (out, err) = putils.execute(*cmd, root_helper='sudo', run_as_root=True) - - vg_list = [] - if out is not None: - vgs = out.split() - for vg in vgs: - fields = vg.split(':') - vg_list.append({'name': fields[0], - 'size': fields[1], - 'available': fields[2], - 'lv_count': fields[3], - 'uuid': fields[4]}) - - return vg_list - - def update_volume_group_info(self): - """Update VG info for this instantiation. - - Used to update member fields of object and - provide a dict of info for caller. - - :returns: Dictionaries of VG info - - """ - vg_list = self.get_all_volume_groups(self.vg_name) - - if len(vg_list) != 1: - LOG.error(_('Unable to find VG: %s') % self.vg_name) - raise VolumeGroupNotFound(vg_name=self.vg_name) - - self.vg_size = vg_list[0]['size'] - self.vg_available_space = vg_list[0]['available'] - self.vg_lv_count = vg_list[0]['lv_count'] - self.vg_uuid = vg_list[0]['uuid'] - - return vg_list[0] - - def create_thin_pool(self, name=None, size_str=0): - """Creates a thin provisioning pool for this VG. - - :param name: Name to use for pool, default is "<vg-name>-pool" - :param size_str: Size to allocate for pool, default is entire VG - - """ - - if not self.supports_thin_provisioning(): - LOG.error(_('Requested to setup thin provisioning, ' - 'however current LVM version does not ' - 'support it.')) - return None - - if name is None: - name = '%s-pool' % self.vg_name - - if size_str == 0: - self.update_volume_group_info() - size_str = self.vg_size - - self.create_volume(name, size_str, 'thin') - - def create_volume(self, name, size_str, lv_type='default', mirror_count=0): - """Creates a logical volume on the object's VG. - - :param name: Name to use when creating Logical Volume - :param size_str: Size to use when creating Logical Volume - :param lv_type: Type of Volume (default or thin) - :param mirror_count: Use LVM mirroring with specified count - - """ - size = self._size_str(size_str) - cmd = ['lvcreate', '-n', name, self.vg_name] - if lv_type == 'thin': - cmd += ['-T', '-V', size] - else: - cmd += ['-L', size] - - if mirror_count > 0: - cmd += ['-m', mirror_count, '--nosync'] - terras = int(size[:-1]) / 1024.0 - if terras >= 1.5: - rsize = int(2 ** math.ceil(math.log(terras) / math.log(2))) - # NOTE(vish): Next power of two for region size. See: - # http://red.ht/U2BPOD - cmd += ['-R', str(rsize)] - - putils.execute(*cmd, - root_helper='sudo', - run_as_root=True) - - def create_lv_snapshot(self, name, source_lv_name, lv_type='default'): - """Creates a snapshot of a logical volume. - - :param name: Name to assign to new snapshot - :param source_lv_name: Name of Logical Volume to snapshot - :param lv_type: Type of LV (default or thin) - - """ - source_lvref = self.get_volume(source_lv_name) - if source_lvref is None: - LOG.error(_("Unable to find LV: %s") % source_lv_name) - return False - cmd = ['lvcreate', '--name', name, - '--snapshot', '%s/%s' % (self.vg_name, source_lv_name)] - if lv_type != 'thin': - size = source_lvref['size'] - cmd += ['-L', size] - - putils.execute(*cmd, - root_helper='sudo', - run_as_root=True) - - def delete(self, name): - """Delete logical volume or snapshot. - - :param name: Name of LV to delete - - """ - putils.execute('lvremove', - '-f', - '%s/%s' % (self.vg_name, name), - root_helper='sudo', run_as_root=True) - - def revert(self, snapshot_name): - """Revert an LV from snapshot. - - :param snapshot_name: Name of snapshot to revert - - """ - putils.execute('lvconvert', '--merge', - snapshot_name, root_helper='sudo', - run_as_root=True)