Skip to content
Snippets Groups Projects
command.py 3.61 KiB
Newer Older
Seblu's avatar
Seblu committed
#!/usr/bin/env python
#coding=utf8

'''
CloudControl CLI command module
'''

from cccli.exception import *
from sjrpc.core.exceptions import *
from cccli.printer import Printer, color
from optparse import OptionParser

Seblu's avatar
Seblu committed
class Command(object):
    '''Base of all command class'''
Seblu's avatar
Seblu committed

    def __init__(self, cli, argv0):
Seblu's avatar
Seblu committed
        self.cli = cli
        self.printer = self.cli.printer
Seblu's avatar
Seblu committed
    def __call__(self, argv):
        raise NotImplementedError

    def usage(self):
        return "Usage: %s"%self.name

    def help(self):
        return self.__doc__


class OptionCommand(Command):
    '''Add options parser to Command'''
    class OptionCommandParser(OptionParser):
        '''Parser of Option for OptionCommand'''

        def error(self, e):
            raise cmdBadArgument(e)

        def exit(self):
            raise cmdExit()

    def __init__(self, cli, argv0):
        Command.__init__(self, cli, argv0)
        self.optionparser = OptionCommand.OptionCommandParser(prog=argv0)
        self.options = None
        self.args = list()
Seblu's avatar
Seblu committed

    def usage(self):
        '''Return usage string'''
        return self.optionparser.format_help().strip()

    def parse_args(self, argv):
        '''Wrapper to parse_args'''
        (self.options, self.args) = self.optionparser.parse_args(argv[1:])

    def add_option(self, *args, **kwargs):
        '''Proxy to OptionParser'''
        self.optionparser.add_option(*args, **kwargs)
Seblu's avatar
Seblu committed

    def remove_option(self, *args, **kwargs):
        '''Proxy to OptionParser'''
        self.optionparser.remove_option(*args, **kwargs)

    def set_usage(self, *args, **kwargs):
        '''Proxy to OptionParser'''
        self.optionparser.set_usage(*args, **kwargs)

class TqlCommand(OptionCommand):
    '''Add Tql stuff to Command'''

    def __init__(self, cli, argv0):
        OptionCommand.__init__(self, cli, argv0)
        self.rpc = cli.rpc
        self.set_usage("%prog [options] <tql>")
        # set tql status stuff
        self.add_option("-s", "--status", action="store_true", dest="status",
                        help="Show status of each tql object")
        # set tagdisplay stuff
        self.tdr = self.cli.tagdisplay.resolve
        self.tdc = self.cli.tagdisplay.color
        self.tdtc = self.cli.tagdisplay.titlecolor
        self.add_option("-n", "--no-tagdisplay", action="callback", dest="tagdisplay",
                        callback=self._cb_notagdisplay,
                        help="No tagdisplay custom display")

    def _cb_notagdisplay(self, option, opt, value, parser):
        '''Callback for option --no-tagdisplay'''
        self.tdr = lambda tagname, tagvalue: tagvalue
        self.tdc = self.cli.tagdisplay.default_color
        self.tdtc = self.cli.tagdisplay.default_titlecolor

    def rpccall(self, *args, **kwargs):
        '''Call a RPC method an show tql return'''
        try:
            d = self.rpc.call(*args, **kwargs)
            if self.options.status:
                self.show_status(d)
            return d
        except RpcError as e:
            raise cmdError("RPCError: %s"%str(e))


    def show_status(self, ans):
        '''Show status of an Tql request'''
            self.printer.out("Status:")
                s = "%sid: %s%s %sstatus: %s%s %smessage:%s%s%s"%(
                    self.tdtc("id"), self.tdc("id"), self.tdr("id", o),
                    self.tdtc("status"), self.tdc("status"), ans[o][0],
                    self.tdtc("message"), self.tdc("message"), ans[o][1],
                    color["reset"])
                if s:
                    self.printer.out(s)