From 1f9ddd81a278c8fa3389a7172cdce65fb5125317 Mon Sep 17 00:00:00 2001 From: Ernesto Puerta Date: Thu, 10 Oct 2019 11:07:10 +0200 Subject: [PATCH] mgr: add new Command helper Fixes: https://tracker.ceph.com/issues/41990 Signed-off-by: Ernesto Puerta --- src/pybind/mgr/mgr_module.py | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/pybind/mgr/mgr_module.py b/src/pybind/mgr/mgr_module.py index e6b74ef72f733..245620012286f 100644 --- a/src/pybind/mgr/mgr_module.py +++ b/src/pybind/mgr/mgr_module.py @@ -413,6 +413,57 @@ class Option(dict): (k, v) for k, v in vars().items() if k != 'self' and v is not None) +class Command(dict): + """ + Helper class to declare options for COMMANDS list. + + It also allows to specify prefix and args separately, as well as storing a + handler callable. + + Usage: + >>> Command(prefix="example", + ... args="name=arg,type=CephInt", + ... perm='w', + ... desc="Blah") + {'poll': False, 'cmd': 'example name=arg,type=CephInt', 'perm': 'w', 'desc': 'Blah'} + """ + + def __init__( + self, + prefix, + args=None, + perm="rw", + desc=None, + poll=False, + handler=None + ): + super(Command, self).__init__( + cmd=prefix + (' ' + args if args else ''), + perm=perm, + desc=desc, + poll=poll) + self.prefix = prefix + self.args = args + self.handler = handler + + def register(self, instance=False): + """ + Register a CLICommand handler. It allows an instance to register bound + methods. In that case, the mgr instance is not passed, and it's expected + to be available in the class instance. + It also uses HandleCommandResult helper to return a wrapped a tuple of 3 + items. + """ + return CLICommand( + prefix=self.prefix, + args=self.args, + desc=self['desc'], + perm=self['perm'] + )( + func=lambda mgr, *args, **kwargs: HandleCommandResult(*self.handler( + *((instance or mgr,) + args), **kwargs)) + ) + class MgrStandbyModule(ceph_module.BaseMgrStandbyModule): """ -- 2.39.5