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))
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))
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))
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))
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)
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)