Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
 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
Пример #6
0
    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
Пример #7
0
 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
Пример #8
0
    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
Пример #9
0
 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
Пример #10
0
    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