def _remove_vol(self, vol_name): origin_data = [] try: exec_args = [ self._cmd_vgs, 'get', '-H', '-p', 'origin', utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) zpool_proc = subprocess.Popen( exec_args, env=self._subproc_env, stdout=subprocess.PIPE, close_fds=True ) origin_data = zpool_proc.stdout.readline() origin_data = origin_data.strip().split() except: pass try: exec_args = [ self._cmd_remove, self.ZVOL_REMOVE, '-R', utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) subprocess.call( exec_args, 0, self._cmd_remove, env=self._subproc_env, close_fds=True ) except OSError as os_err: logging.error( "Zvol: LV remove failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_remove, str(os_err)) ) raise StoragePluginException try: if len(origin_data) == 4: # rm origin exec_args = [ self._cmd_remove, self.ZVOL_REMOVE, origin_data[2] ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) subprocess.call( exec_args, 0, self._cmd_remove, env=self._subproc_env, close_fds=True ) except: pass
def _check_vol_exists(self, vol_name): exists = False try: exec_args = [self._cmd_list, self.ZVOL_LIST] if '.' in vol_name: vol_name = self._vol_name_to_snapshot(vol_name) exec_args += ['-t', 'snapshot'] exec_args.append( utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name)) utils.debug_log_exec_args(self.__class__.__name__, exec_args) zfs_proc = subprocess.Popen(exec_args, 0, self._cmd_list, env=self._subproc_env, close_fds=True) zfs_rc = zfs_proc.wait() if zfs_rc == 0: exists = True except OSError: logging.error( "Zvol2: Unable to retrieve the list of existing Zvols") raise StoragePluginCheckFailedException return exists
def _create_vol(self, vol_name, size, thin=False): size, bs = self._final_size(size) zfs_vol_name = utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) try: exec_args = [self._cmd_create, self.ZFS_CREATE] if thin: exec_args.append('-s') exec_args += ['-b'+bs, '-V', str(size) + 'k', zfs_vol_name] utils.debug_log_exec_args(self.__class__.__name__, exec_args) zfs_proc = subprocess.Popen( exec_args, 0, self._cmd_create, env=self._subproc_env, close_fds=True ) zfs_rc = zfs_proc.wait() if zfs_rc == 0: path = os.path.join(self._conf[self.KEY_DEV_PATH], zfs_vol_name) if not self._wait_dev_to_settle(path): raise StoragePluginException except OSError as os_err: logging.error( "Zvol: LV creation failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_create, str(os_err)) ) raise StoragePluginException
def _create_snapshot_impl(self, snaps_name, lv_name): try: zfs_snap_name = utils.build_path(self._conf[consts.KEY_VG_NAME], lv_name) + '@' + snaps_name exec_args = [ self._cmd_create, self.ZVOL_SNAP_CREATE, zfs_snap_name ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) subprocess.call( exec_args, 0, self._cmd_create, env=self._subproc_env, close_fds=True ) exec_args = [ self._cmd_create, self.ZVOL_SNAP_CLONE, zfs_snap_name, utils.build_path(self._conf[consts.KEY_VG_NAME], snaps_name) ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) zfs_proc = subprocess.Popen( exec_args, 0, self._cmd_create, env=self._subproc_env, close_fds=True ) zfs_rc = zfs_proc.wait() if zfs_rc == 0: path = os.path.join(self._conf[self.KEY_DEV_PATH], utils.build_path(self._conf[consts.KEY_VG_NAME], snaps_name)) if not self._wait_dev_to_settle(path): raise StoragePluginException except OSError as os_err: logging.error( "Zvol: Snapshot creation failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_create, str(os_err)) ) raise StoragePluginException
def _restore_snapshot(self, vol_name, source_blockdev): try: snaps_name = source_blockdev.get_name() orig = source_blockdev.get_name() vol = orig[-3:] orig = orig.split('.')[0] orig = orig + vol zfs_snap_name = utils.build_path(self._conf[consts.KEY_VG_NAME], orig) + '@' + snaps_name new_vol = utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) exec_args = [ self._cmd_create, self.ZVOL_SNAP_CLONE, zfs_snap_name, new_vol ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) zfs_proc = subprocess.Popen(exec_args, 0, self._cmd_create, env=self._subproc_env, close_fds=True) zfs_rc = zfs_proc.wait() if zfs_rc == 0: path = os.path.join(self._conf[self.KEY_DEV_PATH], new_vol) if not self._wait_dev_to_settle(path): raise StoragePluginException except OSError as os_err: logging.error( "Zvol: Snapshot creation failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_create, str(os_err))) raise StoragePluginException retblockdevice = storcore.BlockDevice(vol_name, 0, self._vg_path + vol_name) self._volumes[vol_name] = retblockdevice self.save_state(self._volumes) return retblockdevice
def reconfigure(self, config=None): try: # Setup the environment for subprocesses self._subproc_env = dict(os.environ.items()) self._subproc_env["LC_ALL"] = "C" self._subproc_env["LANG"] = "C" if config: self._conf = config else: self._conf = LvmThinPool.CONF_DEFAULTS.copy() # Setup cached settings self._vg_path = utils.build_path( self._conf[LvmThinPool.KEY_DEV_PATH], self._conf[consts.KEY_VG_NAME]) + "/" self._cmd_create = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_CREATE) self._cmd_extend = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_EXTEND) self._cmd_remove = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_REMOVE) self._cmd_lvchange = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_LV_CHANGE) self._cmd_vgchange = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_VG_CHANGE) self._cmd_lvs = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_LVS) self._cmd_vgs = utils.build_path( self._conf[LvmThinPool.KEY_LVM_PATH], LvmThinPool.LVM_VGS) # Load the saved state self._pools, self._volumes, self._pool_lookup = self.load_state() except exc.PersistenceException as pers_exc: logging.warning("LvmThinPool plugin: Cannot load state file '%s'" % (self.STATEFILE)) raise pers_exc except Exception as unhandled_exc: logging.error( "LvmThinPool: initialization failed, unhandled exception: %s" % (str(unhandled_exc))) # Re-raise raise unhandled_exc
def _create_snapshot_impl(self, snaps_name, lv_name): try: zfs_snap_name = utils.build_path(self._conf[consts.KEY_VG_NAME], lv_name) + '@' + snaps_name exec_args = [ self._cmd_create, self.ZVOL_SNAP_CREATE, zfs_snap_name ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) subprocess.call(exec_args, 0, self._cmd_create, env=self._subproc_env, close_fds=True) except OSError as os_err: logging.error( "Zvol2: Snapshot creation failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_create, str(os_err))) raise StoragePluginException
def _remove_vol(self, vol_name): if '.' in vol_name: vol_name = self._vol_name_to_snapshot(vol_name) try: exec_args = [ self._cmd_remove, self.ZVOL_REMOVE, utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) subprocess.call(exec_args, 0, self._cmd_remove, env=self._subproc_env, close_fds=True) except OSError as os_err: logging.error( "Zvol2: LV remove failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_remove, str(os_err))) raise StoragePluginException
def _extend_vol(self, vol_name, size): status = False size, _ = self._final_size(size) try: exec_args = [ self._cmd_extend, self.ZFS_EXTEND, 'volsize=%sk' % str(size), utils.build_path(self._conf[consts.KEY_VG_NAME], vol_name) ] utils.debug_log_exec_args(self.__class__.__name__, exec_args) proc_rc = subprocess.call( exec_args, 0, self._cmd_extend, env=self._subproc_env, close_fds=True ) if proc_rc == 0: status = True except OSError as os_err: logging.error( self.NAME + ": vol extension failed, unable to run " "external program '%s', error message from the OS: %s" % (self._cmd_extend, str(os_err)) ) return status
def reconfigure(self, config=None): try: # Setup the environment for subprocesses self._subproc_env = dict(os.environ.items()) self._subproc_env["LC_ALL"] = "C" self._subproc_env["LANG"] = "C" if config: self._conf = config else: self._conf = Zvol2.CONF_DEFAULTS.copy() # Setup cached settings self._vg_path = utils.build_path( self._conf[Zvol2.KEY_DEV_PATH], self._conf[consts.KEY_VG_NAME]) + "/" self._cmd_create = utils.build_path( self._conf[Zvol2.KEY_ZVOL_PATH], Zvol2.ZFS_BASE) self._cmd_extend = utils.build_path( self._conf[Zvol2.KEY_ZVOL_PATH], Zvol2.ZFS_BASE) self._cmd_remove = utils.build_path( self._conf[Zvol2.KEY_ZVOL_PATH], Zvol2.ZFS_BASE) self._cmd_list = utils.build_path(self._conf[Zvol2.KEY_ZVOL_PATH], Zvol2.ZFS_BASE) self._cmd_vgs = utils.build_path(self._conf[Zvol2.KEY_ZVOL_PATH], Zvol2.ZVOL_VGS) # Load the saved state self._volumes = self.load_state() except exc.PersistenceException as pers_exc: logging.warning("Zvol2 plugin: Cannot load state file '%s'" % (Zvol2.STATEFILE)) raise pers_exc except Exception as unhandled_exc: logging.error( "Zvol2: initialization failed, unhandled exception: %s" % (str(unhandled_exc))) # Re-raise raise unhandled_exc