import errno
import json
+import logging
+import traceback
from mgr_module import MgrModule
import orchestrator
from .fs.volume import VolumeClient
+log = logging.getLogger(__name__)
+
+class VolumesInfoWrapper():
+ def __init__(self, f, context):
+ self.f = f
+ self.context = context
+ def __enter__(self):
+ log.info("Starting {}".format(self.context))
+ def __exit__(self, exc_type, exc_value, tb):
+ if exc_type is not None:
+ log.error("Failed {}:\n{}".format(self.context, "".join(traceback.format_exception(exc_type, exc_value, tb))))
+ else:
+ log.info("Finishing {}".format(self.context))
+
+def mgr_cmd_wrap(f):
+ def wrap(self, inbuf, cmd):
+ astr = []
+ for k in cmd:
+ astr.append("{}:{}".format(k, cmd[k]))
+ context = "{}({}) < \"{}\"".format(f.__name__, ", ".join(astr), inbuf)
+ with VolumesInfoWrapper(f, context):
+ return f(self, inbuf, cmd)
+ return wrap
+
class Module(orchestrator.OrchestratorClientMixin, MgrModule):
COMMANDS = [
{
return handler(inbuf, cmd)
+ @mgr_cmd_wrap
def _cmd_fs_volume_create(self, inbuf, cmd):
vol_id = cmd['name']
return self.vc.create_fs_volume(vol_id)
+ @mgr_cmd_wrap
def _cmd_fs_volume_rm(self, inbuf, cmd):
vol_name = cmd['vol_name']
confirm = cmd.get('yes-i-really-mean-it', None)
return self.vc.delete_fs_volume(vol_name, confirm)
+ @mgr_cmd_wrap
def _cmd_fs_volume_ls(self, inbuf, cmd):
return self.vc.list_fs_volumes()
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_create(self, inbuf, cmd):
"""
:return: a 3-tuple of return code(int), empty string(str), error message (str)
pool_layout=cmd.get('pool_layout', None), mode=cmd.get('mode', '755'),
uid=cmd.get('uid', None), gid=cmd.get('gid', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_rm(self, inbuf, cmd):
"""
:return: a 3-tuple of return code(int), empty string(str), error message (str)
group_name=cmd['group_name'],
force=cmd.get('force', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_ls(self, inbuf, cmd):
return self.vc.list_subvolume_groups(vol_name=cmd['vol_name'])
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_create(self, inbuf, cmd):
"""
:return: a 3-tuple of return code(int), empty string(str), error message (str)
mode=cmd.get('mode', '755'),
namespace_isolated=cmd.get('namespace_isolated', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_rm(self, inbuf, cmd):
"""
:return: a 3-tuple of return code(int), empty string(str), error message (str)
group_name=cmd.get('group_name', None),
force=cmd.get('force', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_ls(self, inbuf, cmd):
return self.vc.list_subvolumes(vol_name=cmd['vol_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_getpath(self, inbuf, cmd):
return self.vc.getpath_subvolume_group(
vol_name=cmd['vol_name'], group_name=cmd['group_name'])
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_getpath(self, inbuf, cmd):
return self.vc.subvolume_getpath(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_info(self, inbuf, cmd):
return self.vc.subvolume_info(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_snapshot_create(self, inbuf, cmd):
return self.vc.create_subvolume_group_snapshot(vol_name=cmd['vol_name'],
group_name=cmd['group_name'],
snap_name=cmd['snap_name'])
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_snapshot_rm(self, inbuf, cmd):
return self.vc.remove_subvolume_group_snapshot(vol_name=cmd['vol_name'],
group_name=cmd['group_name'],
snap_name=cmd['snap_name'],
force=cmd.get('force', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolumegroup_snapshot_ls(self, inbuf, cmd):
return self.vc.list_subvolume_group_snapshots(vol_name=cmd['vol_name'],
group_name=cmd['group_name'])
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_create(self, inbuf, cmd):
return self.vc.create_subvolume_snapshot(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
snap_name=cmd['snap_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_rm(self, inbuf, cmd):
return self.vc.remove_subvolume_snapshot(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
group_name=cmd.get('group_name', None),
force=cmd.get('force', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_info(self, inbuf, cmd):
return self.vc.subvolume_snapshot_info(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
snap_name=cmd['snap_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_ls(self, inbuf, cmd):
return self.vc.list_subvolume_snapshots(vol_name=cmd['vol_name'],
sub_name=cmd['sub_name'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_resize(self, inbuf, cmd):
return self.vc.resize_subvolume(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
new_size=cmd['new_size'], group_name=cmd.get('group_name', None),
no_shrink=cmd.get('no_shrink', False))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_protect(self, inbuf, cmd):
return self.vc.protect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_unprotect(self, inbuf, cmd):
return self.vc.unprotect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_clone(self, inbuf, cmd):
return self.vc.clone_subvolume_snapshot(
vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], snap_name=cmd['snap_name'],
group_name=cmd.get('group_name', None), pool_layout=cmd.get('pool_layout', None),
target_sub_name=cmd['target_sub_name'], target_group_name=cmd.get('target_group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_clone_status(self, inbuf, cmd):
return self.vc.clone_status(
vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
def _cmd_fs_clone_cancel(self, inbuf, cmd):
return self.vc.clone_cancel(
vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None))