X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/dff8507840e35f6f59422dbb6fb0eab181dd817d..91e0748c38b1b629961564362c90a29b218193b9:/lib/cli.py diff --git a/lib/cli.py b/lib/cli.py index 0f2fc9b..c81bf54 100644 --- a/lib/cli.py +++ b/lib/cli.py @@ -42,21 +42,76 @@ 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 + "BACKEND_OPT", + "CONFIRM_OPT", + "DEBUG_OPT", + "DEBUG_SIMERR_OPT", + "DISK_TEMPLATE_OPT", + "FIELDS_OPT", + "FILESTORE_DIR_OPT", + "FILESTORE_DRIVER_OPT", + "HVLIST_OPT", + "HVOPTS_OPT", + "HYPERVISOR_OPT", + "IALLOCATOR_OPT", + "FORCE_OPT", + "NOHDR_OPT", + "NOIPCHECK_OPT", + "NONICS_OPT", + "NWSYNC_OPT", + "OS_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 = "-" @@ -144,6 +199,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 +386,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 +473,73 @@ _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") + +DEBUG_SIMERR_OPT = cli_option("--debug-simulate-errors", default=False, + action="store_true", dest="simulate_errors", + help="Debugging option that makes the operation" + " treat most runtime checks as failed") + +NWSYNC_OPT = cli_option("--no-wait-for-sync", dest="wait_for_sync", + default=True, action="store_false", + help="Don't wait for sync (DANGEROUS!)") + +DISK_TEMPLATE_OPT = cli_option("-t", "--disk-template", dest="disk_template", + help="Custom disk setup (diskless, file," + " plain or drbd)", + default=None, metavar="TEMPL", + choices=list(constants.DISK_TEMPLATES)) + +NONICS_OPT = cli_option("--no-nics", default=False, action="store_true", + help="Do not create any network cards for" + " the instance") + +FILESTORE_DIR_OPT = cli_option("--file-storage-dir", dest="file_storage_dir", + help="Relative path under default cluster-wide" + " file storage dir to store file-based disks", + default=None, metavar="") + +FILESTORE_DRIVER_OPT = cli_option("--file-driver", dest="file_driver", + help="Driver to use for image files", + default="loop", metavar="", + choices=list(constants.FILE_DRIVER)) + +IALLOCATOR_OPT = cli_option("-I", "--iallocator", metavar="", + help="Select nodes for the instance automatically" + " using the iallocator plugin", + default=None, type="string", + completion_suggest=OPT_COMPL_ONE_IALLOCATOR) + +OS_OPT = cli_option("-o", "--os-type", dest="os", help="What OS to run", + metavar="", + completion_suggest=OPT_COMPL_ONE_OS) + +BACKEND_OPT = cli_option("-B", "--backend-parameters", dest="beparams", + type="keyval", default={}, + help="Backend parameters") + +HVOPTS_OPT = cli_option("-H", "--hypervisor-parameters", type="keyval", + default={}, dest="hvparams", + help="Hypervisor parameters") + +HYPERVISOR_OPT = cli_option("-H", "--hypervisor-parameters", dest="hypervisor", + help="Hypervisor and hypervisor options, in the" + " format hypervisor:option=value,option=value,...", + default=None, type="identkeyval") + +HVLIST_OPT = cli_option("-H", "--hypervisor-parameters", dest="hvparams", + help="Hypervisor and hypervisor options, in the" + " format hypervisor:option=value,option=value,...", + default=[], action="append", type="identkeyval") + +NOIPCHECK_OPT = cli_option("--no-ip-check", dest="ip_check", default=True, + action="store_false", + help="Don't check that the instance's IP" + " is alive") + + def _ParseArgs(argv, commands, aliases): """Parser for the command line arguments. @@ -716,6 +858,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))