Unify the multiple 'verbose' options
[ganeti-local] / lib / cli.py
index cee7e2b..46510c3 100644 (file)
@@ -42,28 +42,70 @@ from optparse import (OptionParser, TitledHelpFormatter,
                       Option, OptionValueError)
 
 
-__all__ = ["DEBUG_OPT", "NOHDR_OPT", "SEP_OPT", "GenericMain",
-           "SubmitOpCode", "GetClient",
-           "cli_option",
-           "GenerateTable", "AskUser",
-           "USEUNITS_OPT", "FIELDS_OPT", "FORCE_OPT", "SUBMIT_OPT",
-           "ListTags", "AddTags", "RemoveTags", "TAG_SRC_OPT",
-           "FormatError", "SplitNodeOption", "SubmitOrSend",
-           "JobSubmittedException", "FormatTimestamp", "ParseTimespec",
-           "ToStderr", "ToStdout", "UsesRPC",
-           "GetOnlineNodes", "JobExecutor", "SYNC_OPT", "CONFIRM_OPT",
-           "ArgJobId", "ArgSuggest", "ArgUnknown", "ArgFile", "ArgCommand",
-           "ArgInstance", "ArgNode", "ArgChoice", "ArgHost",
-           "ARGS_NONE", "ARGS_ONE_INSTANCE", "ARGS_ONE_NODE",
-           "ARGS_MANY_INSTANCES", "ARGS_MANY_NODES",
-           ]
+__all__ = [
+  # Command line options
+  "CONFIRM_OPT",
+  "DEBUG_OPT",
+  "FIELDS_OPT",
+  "FORCE_OPT",
+  "NOHDR_OPT",
+  "SEP_OPT",
+  "SUBMIT_OPT",
+  "SYNC_OPT",
+  "TAG_SRC_OPT",
+  "USEUNITS_OPT",
+  "VERBOSE_OPT",
+  # Generic functions for CLI programs
+  "GenericMain",
+  "GetClient",
+  "GetOnlineNodes",
+  "JobExecutor",
+  "JobSubmittedException",
+  "ParseTimespec",
+  "SubmitOpCode",
+  "SubmitOrSend",
+  "UsesRPC",
+  # Formatting functions
+  "ToStderr", "ToStdout",
+  "FormatError",
+  "GenerateTable",
+  "AskUser",
+  "FormatTimestamp",
+  # Tags functions
+  "ListTags",
+  "AddTags",
+  "RemoveTags",
+  # command line options support infrastructure
+  "ARGS_MANY_INSTANCES",
+  "ARGS_MANY_NODES",
+  "ARGS_NONE",
+  "ARGS_ONE_INSTANCE",
+  "ARGS_ONE_NODE",
+  "ArgChoice",
+  "ArgCommand",
+  "ArgFile",
+  "ArgHost",
+  "ArgInstance",
+  "ArgJobId",
+  "ArgNode",
+  "ArgSuggest",
+  "ArgUnknown",
+  "OPT_COMPL_INST_ADD_NODES",
+  "OPT_COMPL_MANY_NODES",
+  "OPT_COMPL_ONE_IALLOCATOR",
+  "OPT_COMPL_ONE_INSTANCE",
+  "OPT_COMPL_ONE_NODE",
+  "OPT_COMPL_ONE_OS",
+  "cli_option",
+  "SplitNodeOption",
+  ]
 
 NO_PREFIX = "no_"
 UN_PREFIX = "-"
 
 
 class _Argument:
-  def __init__(self, min=0, max=None, suggest=None):
+  def __init__(self, min=0, max=None):
     self.min = min
     self.max = max
 
@@ -144,6 +186,7 @@ ARGS_ONE_INSTANCE = [ArgInstance(min=1, max=1)]
 ARGS_ONE_NODE = [ArgNode(min=1, max=1)]
 
 
+
 def _ExtractTagsObject(opts, args):
   """Extract the tag type object.
 
@@ -330,6 +373,25 @@ def check_key_val(option, opt, value):
   return _SplitKeyVal(opt, value)
 
 
+# completion_suggestion is normally a list. Using numeric values not evaluating
+# to False for dynamic completion.
+(OPT_COMPL_MANY_NODES,
+ OPT_COMPL_ONE_NODE,
+ OPT_COMPL_ONE_INSTANCE,
+ OPT_COMPL_ONE_OS,
+ OPT_COMPL_ONE_IALLOCATOR,
+ OPT_COMPL_INST_ADD_NODES) = range(100, 106)
+
+OPT_COMPL_ALL = frozenset([
+  OPT_COMPL_MANY_NODES,
+  OPT_COMPL_ONE_NODE,
+  OPT_COMPL_ONE_INSTANCE,
+  OPT_COMPL_ONE_OS,
+  OPT_COMPL_ONE_IALLOCATOR,
+  OPT_COMPL_INST_ADD_NODES,
+  ])
+
+
 class CliOption(Option):
   """Custom option class for optparse.
 
@@ -398,6 +460,10 @@ _DRY_RUN_OPT = cli_option("--dry-run", default=False,
                                 " check steps and verify it it could be"
                                 " executed"))
 
+VERBOSE_OPT = cli_option("-v", "--verbose", default=False,
+                         action="store_true",
+                         help="Increase the verbosity of the operation")
+
 
 def _ParseArgs(argv, commands, aliases):
   """Parser for the command line arguments.
@@ -716,6 +782,7 @@ def PollJob(job_id, cl=None, feedback_fn=None):
       if status == constants.OP_STATUS_SUCCESS:
         has_ok = True
       elif status == constants.OP_STATUS_ERROR:
+        errors.MaybeRaise(msg)
         if has_ok:
           raise errors.OpExecError("partial failure (opcode %d): %s" %
                                    (idx, msg))