コード例 #1
0
    def _get_driver_code(self):
        """
        CP driver, compare versions, allow local code to be updated with version from current package
        """
        version = OpenStackManagement._get_version()
        remote_driver = "/opt/OpenvStorage/config/templates/cinder-volume-driver/%s/openvstorage.py" % version

        existing_version = OpenStackManagement._get_existing_driver_version()
        remote_version = OpenStackManagement._get_remote_driver_version(
            remote_driver)
        if self.is_devstack:
            cinder_base_path = OpenStackManagement._get_base_path('cinder')
            local_driver = '{0}/volume/drivers/openvstorage.py'.format(
                cinder_base_path)
        elif self.is_openstack:
            driver_location = OSManager.get_openstack_package_base_path()
            local_driver = '{0}/cinder/volume/drivers/openvstorage.py'.format(
                driver_location)
        else:
            raise ValueError('OpenStack or DevStack only')
        if remote_version > existing_version:
            logger.debug(
                'Updating existing driver using {0} from version {1} to version {2}'
                .format(remote_driver, existing_version, remote_version))
            if self.is_devstack:
                self.client.run(
                    'cp -f {0} /opt/stack/cinder/cinder/volume/drivers'.format(
                        remote_driver))
            elif self.is_openstack:
                self.client.run('cp -f {0} {1}'.format(remote_driver,
                                                       local_driver))
        else:
            logger.debug('Using driver {0} version {1}'.format(
                local_driver, existing_version))
コード例 #2
0
ファイル: openstack_mgmt.py プロジェクト: dawnpower/framework
    def __init__(self, cinder_client):
        self.client = SSHClient('127.0.0.1', username='******')
        self.cinder_client = cinder_client

        self._NOVA_CONF = '/etc/nova/nova.conf'
        self._CINDER_CONF = '/etc/cinder/cinder.conf'
        self._is_openstack = ServiceManager.has_service(OSManager.get_openstack_cinder_service_name(), self.client)
        self._nova_installed = self.client.file_exists(self._NOVA_CONF)
        self._cinder_installed = self.client.file_exists(self._CINDER_CONF)
        self._driver_location = OSManager.get_openstack_package_base_path()
        self._openstack_users = OSManager.get_openstack_users()
        self._devstack_driver = '/opt/stack/cinder/cinder/volume/drivers/openvstorage.py'

        try:
            self._is_devstack = 'stack' in str(self.client.run('ps aux | grep SCREEN | grep stack | grep -v grep || true'))
        except SystemExit:  # ssh client raises system exit 1
            self._is_devstack = False
        except Exception:
            self._is_devstack = False

        try:
            from cinder import version
            version_string = version.version_string()
            if version_string.startswith('2015.2') or version_string.startswith('7.0'):
                self._stack_version = 'liberty'
            elif version_string.startswith('2015.1'):
                self._stack_version = 'kilo'
            elif version_string.startswith('2014.2'):
                self._stack_version = 'juno'
            else:
                raise ValueError('Unsupported cinder version: {0}'.format(version_string))
        except Exception as ex:
            raise ValueError('Cannot determine cinder version: {0}'.format(ex))
コード例 #3
0
    def _get_driver_code(self):
        """
        CP driver, compare versions, allow local code to be updated with version from current package
        """
        version = OpenStackManagement._get_version()
        remote_driver = "/opt/OpenvStorage/config/templates/cinder-volume-driver/%s/openvstorage.py" % version

        existing_version = OpenStackManagement._get_existing_driver_version()
        remote_version = OpenStackManagement._get_remote_driver_version(remote_driver)
        if self.is_devstack:
            cinder_base_path = OpenStackManagement._get_base_path('cinder')
            local_driver = '{0}/volume/drivers/openvstorage.py'.format(cinder_base_path)
        elif self.is_openstack:
            driver_location = OSManager.get_openstack_package_base_path()
            local_driver = '{0}/cinder/volume/drivers/openvstorage.py'.format(driver_location)
        else:
            raise ValueError('OpenStack or DevStack only')
        if remote_version > existing_version:
            logger.debug('Updating existing driver using {0} from version {1} to version {2}'.format(remote_driver, existing_version, remote_version))
            if self.is_devstack:
                self.client.run('cp -f {0} /opt/stack/cinder/cinder/volume/drivers'.format(remote_driver))
            elif self.is_openstack:
                self.client.run('cp -f {0} {1}'.format(remote_driver, local_driver))
        else:
            logger.debug('Using driver {0} version {1}'.format(local_driver, existing_version))
コード例 #4
0
    def __init__(self, cinder_client):
        self._logger = LogHandler.get('extensions', name='openstack_mgmt')
        self.client = SSHClient('127.0.0.1', username='******')
        self.cinder_client = cinder_client

        self._NOVA_CONF = '/etc/nova/nova.conf'
        self._CINDER_CONF = '/etc/cinder/cinder.conf'
        self._is_openstack = ServiceManager.has_service(
            OSManager.get_openstack_cinder_service_name(), self.client)
        self._nova_installed = self.client.file_exists(self._NOVA_CONF)
        self._cinder_installed = self.client.file_exists(self._CINDER_CONF)
        self._driver_location = OSManager.get_openstack_package_base_path()
        self._openstack_users = OSManager.get_openstack_users()
        self._devstack_driver = '/opt/stack/cinder/cinder/volume/drivers/openvstorage.py'

        try:
            self._is_devstack = 'stack' in str(
                self.client.run(
                    'ps aux | grep SCREEN | grep stack | grep -v grep || true')
            )
        except SystemExit:  # ssh client raises system exit 1
            self._is_devstack = False
        except Exception:
            self._is_devstack = False

        try:
            from cinder import version
            version_string = version.version_string()
            if version_string.startswith('9.0'):
                self._stack_version = 'newton'
            elif version_string.startswith('8.0'):
                self._stack_version = 'mitaka'
            elif version_string.startswith(
                    '2015.2') or version_string.startswith('7.0'):
                self._stack_version = 'liberty'
            elif version_string.startswith('2015.1'):
                self._stack_version = 'kilo'
            elif version_string.startswith('2014.2'):
                self._stack_version = 'juno'
            else:
                raise ValueError(
                    'Unsupported cinder version: {0}'.format(version_string))
        except Exception as ex:
            raise ValueError('Cannot determine cinder version: {0}'.format(ex))
コード例 #5
0
    def _apply_patches(self):
        nova_base_path = OpenStackManagement._get_base_path('nova')
        cinder_base_path = OpenStackManagement._get_base_path('cinder')

        version = OpenStackManagement._get_version()
        # fix "blockdev" issue
        if self.is_devstack:
            nova_volume_file = '{0}/virt/libvirt/volume.py'.format(
                nova_base_path)
            nova_driver_file = '{0}/virt/libvirt/driver.py'.format(
                nova_base_path)
            cinder_brick_initiator_file = '{0}/brick/initiator/connector.py'.format(
                cinder_base_path)
        elif self.is_openstack:
            driver_location = OSManager.get_openstack_package_base_path()
            nova_volume_file = '{0}/nova/virt/libvirt/volume.py'.format(
                driver_location)
            nova_driver_file = '{0}/nova/virt/libvirt/driver.py'.format(
                driver_location)
            cinder_brick_initiator_file = '{0}/cinder/brick/initiator/connector.py'.format(
                driver_location)
        else:
            raise ValueError('OpenStack or DevStack only')

        self.client.run("""python -c "
import os
version = '%s'
nova_volume_file = '%s'
nova_driver_file = '%s'

with open(nova_volume_file, 'r') as f:
    file_contents = f.readlines()
new_class = '''
class LibvirtFileVolumeDriver(LibvirtBaseVolumeDriver):
    def __init__(self, connection):
        super(LibvirtFileVolumeDriver,
              self).__init__(connection, is_block_dev=False)

    def get_config(self, connection_info, disk_info):
        conf = super(LibvirtFileVolumeDriver,
                     self).get_config(connection_info, disk_info)
        conf.source_type = 'file'
        conf.source_path = connection_info['data']['device_path']
        return conf
'''

patched = False
for line in file_contents:
    if 'class LibvirtFileVolumeDriver(LibvirtBaseVolumeDriver):' in line:
        patched = True
        break

if not patched:
    fc = None
    for line in file_contents[:]:
        if line.startswith('class LibvirtVolumeDriver(LibvirtBaseVolumeDriver):'):
            fc = file_contents[:file_contents.index(line)] + [l+'\\n' for l in new_class.split('\\n')] + file_contents[file_contents.index(line):]
            break
    if fc is not None:
        with open(nova_volume_file, 'w') as f:
            f.writelines(fc)
with open(nova_driver_file, 'r') as f:
    file_contents = f.readlines()
patched = False
for line in file_contents:
    if 'file=nova.virt.libvirt.volume.LibvirtFileVolumeDriver' in line:
        patched = True
        break
if not patched:
    fc = None
    for line in file_contents[:]:
        if 'local=nova.virt.libvirt.volume.LibvirtVolumeDriver' in line:
            fc = file_contents[:file_contents.index(line)] + ['''                  'file=nova.virt.libvirt.volume.LibvirtFileVolumeDriver',\\n'''] + file_contents[file_contents.index(line):]
            break
    if fc is not None:
        with open(nova_driver_file, 'w') as f:
            f.writelines(fc)

" """ % (version, nova_volume_file, nova_driver_file))

        # fix brick/upload to glance
        if os.path.exists(cinder_brick_initiator_file):
            self.client.run(
                """sed -i 's/elif protocol == "LOCAL":/elif protocol in ["LOCAL", "FILE"]:/g' %s"""
                % cinder_brick_initiator_file)
コード例 #6
0
    def _apply_patches(self):
        nova_base_path = OpenStackManagement._get_base_path('nova')
        cinder_base_path = OpenStackManagement._get_base_path('cinder')

        version = OpenStackManagement._get_version()
        # fix "blockdev" issue
        if self.is_devstack:
            nova_volume_file = '{0}/virt/libvirt/volume.py'.format(nova_base_path)
            nova_driver_file = '{0}/virt/libvirt/driver.py'.format(nova_base_path)
            cinder_brick_initiator_file = '{0}/brick/initiator/connector.py'.format(cinder_base_path)
        elif self.is_openstack:
            driver_location = OSManager.get_openstack_package_base_path()
            nova_volume_file = '{0}/nova/virt/libvirt/volume.py'.format(driver_location)
            nova_driver_file = '{0}/nova/virt/libvirt/driver.py'.format(driver_location)
            cinder_brick_initiator_file = '{0}/cinder/brick/initiator/connector.py'.format(driver_location)
        else:
            raise ValueError('OpenStack or DevStack only')

        self.client.run("""python -c "
import os
version = '%s'
nova_volume_file = '%s'
nova_driver_file = '%s'

with open(nova_volume_file, 'r') as f:
    file_contents = f.readlines()
new_class = '''
class LibvirtFileVolumeDriver(LibvirtBaseVolumeDriver):
    def __init__(self, connection):
        super(LibvirtFileVolumeDriver,
              self).__init__(connection, is_block_dev=False)

    def get_config(self, connection_info, disk_info):
        conf = super(LibvirtFileVolumeDriver,
                     self).get_config(connection_info, disk_info)
        conf.source_type = 'file'
        conf.source_path = connection_info['data']['device_path']
        return conf
'''

patched = False
for line in file_contents:
    if 'class LibvirtFileVolumeDriver(LibvirtBaseVolumeDriver):' in line:
        patched = True
        break

if not patched:
    fc = None
    for line in file_contents[:]:
        if line.startswith('class LibvirtVolumeDriver(LibvirtBaseVolumeDriver):'):
            fc = file_contents[:file_contents.index(line)] + [l+'\\n' for l in new_class.split('\\n')] + file_contents[file_contents.index(line):]
            break
    if fc is not None:
        with open(nova_volume_file, 'w') as f:
            f.writelines(fc)
with open(nova_driver_file, 'r') as f:
    file_contents = f.readlines()
patched = False
for line in file_contents:
    if 'file=nova.virt.libvirt.volume.LibvirtFileVolumeDriver' in line:
        patched = True
        break
if not patched:
    fc = None
    for line in file_contents[:]:
        if 'local=nova.virt.libvirt.volume.LibvirtVolumeDriver' in line:
            fc = file_contents[:file_contents.index(line)] + ['''                  'file=nova.virt.libvirt.volume.LibvirtFileVolumeDriver',\\n'''] + file_contents[file_contents.index(line):]
            break
    if fc is not None:
        with open(nova_driver_file, 'w') as f:
            f.writelines(fc)

" """ % (version, nova_volume_file, nova_driver_file))

        # fix brick/upload to glance
        if os.path.exists(cinder_brick_initiator_file):
            self.client.run("""sed -i 's/elif protocol == "LOCAL":/elif protocol in ["LOCAL", "FILE"]:/g' %s""" % cinder_brick_initiator_file)