Merge branch 'stable-2.12' into stable-2.13
[ganeti-github.git] / lib / cli.py
index 5e0b68f..9c29764 100644 (file)
@@ -54,206 +54,16 @@ from ganeti import qlang
 from ganeti import objects
 from ganeti import pathutils
 from ganeti import serializer
+import ganeti.cli_opts
+# Import constants
+from ganeti.cli_opts import *  # pylint: disable=W0401
 
 from ganeti.runtime import (GetClient)
 
-from optparse import (OptionParser, TitledHelpFormatter,
-                      Option, OptionValueError)
+from optparse import (OptionParser, TitledHelpFormatter)
 
 
 __all__ = [
-  # Command line options
-  "ABSOLUTE_OPT",
-  "ADD_UIDS_OPT",
-  "ADD_RESERVED_IPS_OPT",
-  "ALLOCATABLE_OPT",
-  "ALLOC_POLICY_OPT",
-  "ALL_OPT",
-  "ALLOW_FAILOVER_OPT",
-  "AUTO_PROMOTE_OPT",
-  "AUTO_REPLACE_OPT",
-  "BACKEND_OPT",
-  "BLK_OS_OPT",
-  "CAPAB_MASTER_OPT",
-  "CAPAB_VM_OPT",
-  "CLEANUP_OPT",
-  "CLUSTER_DOMAIN_SECRET_OPT",
-  "CONFIRM_OPT",
-  "CP_SIZE_OPT",
-  "COMPRESSION_TOOLS_OPT",
-  "DEBUG_OPT",
-  "DEBUG_SIMERR_OPT",
-  "DISKIDX_OPT",
-  "DISK_OPT",
-  "DISK_PARAMS_OPT",
-  "DISK_TEMPLATE_OPT",
-  "DRAINED_OPT",
-  "DRY_RUN_OPT",
-  "DRBD_HELPER_OPT",
-  "DST_NODE_OPT",
-  "EARLY_RELEASE_OPT",
-  "ENABLED_HV_OPT",
-  "ENABLED_DISK_TEMPLATES_OPT",
-  "ENABLED_USER_SHUTDOWN_OPT",
-  "ERROR_CODES_OPT",
-  "FAILURE_ONLY_OPT",
-  "FIELDS_OPT",
-  "FILESTORE_DIR_OPT",
-  "FILESTORE_DRIVER_OPT",
-  "FORCE_FAILOVER_OPT",
-  "FORCE_FILTER_OPT",
-  "FORCE_OPT",
-  "FORCE_VARIANT_OPT",
-  "GATEWAY_OPT",
-  "GATEWAY6_OPT",
-  "GLOBAL_FILEDIR_OPT",
-  "HID_OS_OPT",
-  "GLOBAL_GLUSTER_FILEDIR_OPT",
-  "GLOBAL_SHARED_FILEDIR_OPT",
-  "HOTPLUG_OPT",
-  "HOTPLUG_IF_POSSIBLE_OPT",
-  "HVLIST_OPT",
-  "HVOPTS_OPT",
-  "HYPERVISOR_OPT",
-  "IALLOCATOR_OPT",
-  "DEFAULT_IALLOCATOR_OPT",
-  "DEFAULT_IALLOCATOR_PARAMS_OPT",
-  "IDENTIFY_DEFAULTS_OPT",
-  "IGNORE_CONSIST_OPT",
-  "IGNORE_ERRORS_OPT",
-  "IGNORE_FAILURES_OPT",
-  "IGNORE_OFFLINE_OPT",
-  "IGNORE_REMOVE_FAILURES_OPT",
-  "IGNORE_SECONDARIES_OPT",
-  "IGNORE_SIZE_OPT",
-  "INCLUDEDEFAULTS_OPT",
-  "INTERVAL_OPT",
-  "INSTALL_IMAGE_OPT",
-  "INSTANCE_COMMUNICATION_OPT",
-  "INSTANCE_COMMUNICATION_NETWORK_OPT",
-  "MAC_PREFIX_OPT",
-  "MAINTAIN_NODE_HEALTH_OPT",
-  "MASTER_NETDEV_OPT",
-  "MASTER_NETMASK_OPT",
-  "MAX_TRACK_OPT",
-  "MC_OPT",
-  "MIGRATION_MODE_OPT",
-  "MODIFY_ETCHOSTS_OPT",
-  "NET_OPT",
-  "NETWORK_OPT",
-  "NETWORK6_OPT",
-  "NEW_CLUSTER_CERT_OPT",
-  "NEW_NODE_CERT_OPT",
-  "NEW_CLUSTER_DOMAIN_SECRET_OPT",
-  "NEW_CONFD_HMAC_KEY_OPT",
-  "NEW_RAPI_CERT_OPT",
-  "NEW_PRIMARY_OPT",
-  "NEW_SECONDARY_OPT",
-  "NEW_SPICE_CERT_OPT",
-  "NIC_PARAMS_OPT",
-  "NOCONFLICTSCHECK_OPT",
-  "NODE_FORCE_JOIN_OPT",
-  "NODE_LIST_OPT",
-  "NODE_PLACEMENT_OPT",
-  "NODEGROUP_OPT",
-  "NODE_PARAMS_OPT",
-  "NODE_POWERED_OPT",
-  "NOHDR_OPT",
-  "NOIPCHECK_OPT",
-  "NO_INSTALL_OPT",
-  "NONAMECHECK_OPT",
-  "NOMODIFY_ETCHOSTS_OPT",
-  "NOMODIFY_SSH_SETUP_OPT",
-  "NONICS_OPT",
-  "NONLIVE_OPT",
-  "NONPLUS1_OPT",
-  "NORUNTIME_CHGS_OPT",
-  "NOSHUTDOWN_OPT",
-  "NOSTART_OPT",
-  "NOSSH_KEYCHECK_OPT",
-  "NOVOTING_OPT",
-  "NO_REMEMBER_OPT",
-  "NWSYNC_OPT",
-  "OFFLINE_INST_OPT",
-  "ONLINE_INST_OPT",
-  "ON_PRIMARY_OPT",
-  "ON_SECONDARY_OPT",
-  "OFFLINE_OPT",
-  "OS_OPT",
-  "OSPARAMS_OPT",
-  "OSPARAMS_PRIVATE_OPT",
-  "OSPARAMS_SECRET_OPT",
-  "OS_SIZE_OPT",
-  "OOB_TIMEOUT_OPT",
-  "POWER_DELAY_OPT",
-  "PREALLOC_WIPE_DISKS_OPT",
-  "PRIMARY_IP_VERSION_OPT",
-  "PRIMARY_ONLY_OPT",
-  "PRINT_JOBID_OPT",
-  "PRIORITY_OPT",
-  "RAPI_CERT_OPT",
-  "READD_OPT",
-  "REASON_OPT",
-  "REBOOT_TYPE_OPT",
-  "REMOVE_INSTANCE_OPT",
-  "REMOVE_RESERVED_IPS_OPT",
-  "REMOVE_UIDS_OPT",
-  "RESERVED_LVS_OPT",
-  "RQL_OPT",
-  "RUNTIME_MEM_OPT",
-  "ROMAN_OPT",
-  "SECONDARY_IP_OPT",
-  "SECONDARY_ONLY_OPT",
-  "SELECT_OS_OPT",
-  "SEP_OPT",
-  "SHOWCMD_OPT",
-  "SHOW_MACHINE_OPT",
-  "COMPRESS_OPT",
-  "TRANSPORT_COMPRESSION_OPT",
-  "SHUTDOWN_TIMEOUT_OPT",
-  "SINGLE_NODE_OPT",
-  "SPECS_CPU_COUNT_OPT",
-  "SPECS_DISK_COUNT_OPT",
-  "SPECS_DISK_SIZE_OPT",
-  "SPECS_MEM_SIZE_OPT",
-  "SPECS_NIC_COUNT_OPT",
-  "SPLIT_ISPECS_OPTS",
-  "IPOLICY_STD_SPECS_OPT",
-  "IPOLICY_DISK_TEMPLATES",
-  "IPOLICY_VCPU_RATIO",
-  "IPOLICY_SPINDLE_RATIO",
-  "SEQUENTIAL_OPT",
-  "SPICE_CACERT_OPT",
-  "SPICE_CERT_OPT",
-  "SRC_DIR_OPT",
-  "SRC_NODE_OPT",
-  "SUBMIT_OPT",
-  "SUBMIT_OPTS",
-  "STARTUP_PAUSED_OPT",
-  "STATIC_OPT",
-  "SYNC_OPT",
-  "TAG_ADD_OPT",
-  "TAG_SRC_OPT",
-  "TIMEOUT_OPT",
-  "TO_GROUP_OPT",
-  "UIDPOOL_OPT",
-  "USEUNITS_OPT",
-  "USE_EXTERNAL_MIP_SCRIPT",
-  "USE_REPL_NET_OPT",
-  "VERBOSE_OPT",
-  "VG_NAME_OPT",
-  "WFSYNC_OPT",
-  "YES_DOIT_OPT",
-  "ZEROING_IMAGE_OPT",
-  "ZERO_FREE_SPACE_OPT",
-  "HELPER_STARTUP_TIMEOUT_OPT",
-  "HELPER_SHUTDOWN_TIMEOUT_OPT",
-  "ZEROING_TIMEOUT_FIXED_OPT",
-  "ZEROING_TIMEOUT_PER_MIB_OPT",
-  "DISK_STATE_OPT",
-  "HV_STATE_OPT",
-  "IGNORE_IPOLICY_OPT",
-  "INSTANCE_POLICY_OPTS",
   # Generic functions for CLI programs
   "ConfirmOperation",
   "CreateIPolicyFromOpts",
@@ -264,6 +74,7 @@ __all__ = [
   "GetClient",
   "GetOnlineNodes",
   "GetNodesSshPorts",
+  "GetNodeUUIDs",
   "JobExecutor",
   "JobSubmittedException",
   "ParseTimespec",
@@ -295,12 +106,14 @@ __all__ = [
   "ARGS_MANY_NODES",
   "ARGS_MANY_GROUPS",
   "ARGS_MANY_NETWORKS",
+  "ARGS_MANY_FILTERS",
   "ARGS_NONE",
   "ARGS_ONE_INSTANCE",
   "ARGS_ONE_NODE",
   "ARGS_ONE_GROUP",
   "ARGS_ONE_OS",
   "ARGS_ONE_NETWORK",
+  "ARGS_ONE_FILTER",
   "ArgChoice",
   "ArgCommand",
   "ArgFile",
@@ -312,39 +125,14 @@ __all__ = [
   "ArgNode",
   "ArgOs",
   "ArgExtStorage",
+  "ArgFilter",
   "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_NODEGROUP",
-  "OPT_COMPL_ONE_NETWORK",
-  "OPT_COMPL_ONE_OS",
-  "OPT_COMPL_ONE_EXTSTORAGE",
-  "cli_option",
   "FixHvParams",
   "SplitNodeOption",
   "CalculateOSNames",
   "ParseFields",
-  "COMMON_CREATE_OPTS",
-  ]
-
-NO_PREFIX = "no_"
-UN_PREFIX = "-"
-
-#: Priorities (sorted)
-_PRIORITY_NAMES = [
-  ("low", constants.OP_PRIO_LOW),
-  ("normal", constants.OP_PRIO_NORMAL),
-  ("high", constants.OP_PRIO_HIGH),
-  ]
-
-#: Priority dictionary for easier lookup
-# TODO: Replace this and _PRIORITY_NAMES with a single sorted dictionary once
-# we migrate to Python 2.6
-_PRIONAME_TO_VALUE = dict(_PRIORITY_NAMES)
+  ] + ganeti.cli_opts.__all__ # Command line options
 
 # Query result status for clients
 (QR_NORMAL,
@@ -481,17 +269,24 @@ class ArgExtStorage(_Argument):
   """
 
 
+class ArgFilter(_Argument):
+  """Filter UUID argument.
+
+  """
+
+
 ARGS_NONE = []
 ARGS_MANY_INSTANCES = [ArgInstance()]
 ARGS_MANY_NETWORKS = [ArgNetwork()]
 ARGS_MANY_NODES = [ArgNode()]
 ARGS_MANY_GROUPS = [ArgGroup()]
+ARGS_MANY_FILTERS = [ArgFilter()]
 ARGS_ONE_INSTANCE = [ArgInstance(min=1, max=1)]
 ARGS_ONE_NETWORK = [ArgNetwork(min=1, max=1)]
 ARGS_ONE_NODE = [ArgNode(min=1, max=1)]
-# TODO
 ARGS_ONE_GROUP = [ArgGroup(min=1, max=1)]
 ARGS_ONE_OS = [ArgOs(min=1, max=1)]
+ARGS_ONE_FILTER = [ArgFilter(min=1, max=1)]
 
 
 def _ExtractTagsObject(opts, args):
@@ -600,1295 +395,6 @@ def RemoveTags(opts, args):
   SubmitOrSend(op, opts)
 
 
-def check_unit(option, opt, value): # pylint: disable=W0613
-  """OptParsers custom converter for units.
-
-  """
-  try:
-    return utils.ParseUnit(value)
-  except errors.UnitParseError, err:
-    raise OptionValueError("option %s: %s" % (opt, err))
-
-
-def _SplitKeyVal(opt, data, parse_prefixes):
-  """Convert a KeyVal string into a dict.
-
-  This function will convert a key=val[,...] string into a dict. Empty
-  values will be converted specially: keys which have the prefix 'no_'
-  will have the value=False and the prefix stripped, keys with the prefix
-  "-" will have value=None and the prefix stripped, and the others will
-  have value=True.
-
-  @type opt: string
-  @param opt: a string holding the option name for which we process the
-      data, used in building error messages
-  @type data: string
-  @param data: a string of the format key=val,key=val,...
-  @type parse_prefixes: bool
-  @param parse_prefixes: whether to handle prefixes specially
-  @rtype: dict
-  @return: {key=val, key=val}
-  @raises errors.ParameterError: if there are duplicate keys
-
-  """
-  kv_dict = {}
-  if data:
-    for elem in utils.UnescapeAndSplit(data, sep=","):
-      if "=" in elem:
-        key, val = elem.split("=", 1)
-      elif parse_prefixes:
-        if elem.startswith(NO_PREFIX):
-          key, val = elem[len(NO_PREFIX):], False
-        elif elem.startswith(UN_PREFIX):
-          key, val = elem[len(UN_PREFIX):], None
-        else:
-          key, val = elem, True
-      else:
-        raise errors.ParameterError("Missing value for key '%s' in option %s" %
-                                    (elem, opt))
-      if key in kv_dict:
-        raise errors.ParameterError("Duplicate key '%s' in option %s" %
-                                    (key, opt))
-      kv_dict[key] = val
-  return kv_dict
-
-
-def _SplitIdentKeyVal(opt, value, parse_prefixes):
-  """Helper function to parse "ident:key=val,key=val" options.
-
-  @type opt: string
-  @param opt: option name, used in error messages
-  @type value: string
-  @param value: expected to be in the format "ident:key=val,key=val,..."
-  @type parse_prefixes: bool
-  @param parse_prefixes: whether to handle prefixes specially (see
-      L{_SplitKeyVal})
-  @rtype: tuple
-  @return: (ident, {key=val, key=val})
-  @raises errors.ParameterError: in case of duplicates or other parsing errors
-
-  """
-  if ":" not in value:
-    ident, rest = value, ""
-  else:
-    ident, rest = value.split(":", 1)
-
-  if parse_prefixes and ident.startswith(NO_PREFIX):
-    if rest:
-      msg = "Cannot pass options when removing parameter groups: %s" % value
-      raise errors.ParameterError(msg)
-    retval = (ident[len(NO_PREFIX):], False)
-  elif (parse_prefixes and ident.startswith(UN_PREFIX) and
-        (len(ident) <= len(UN_PREFIX) or not ident[len(UN_PREFIX)].isdigit())):
-    if rest:
-      msg = "Cannot pass options when removing parameter groups: %s" % value
-      raise errors.ParameterError(msg)
-    retval = (ident[len(UN_PREFIX):], None)
-  else:
-    kv_dict = _SplitKeyVal(opt, rest, parse_prefixes)
-    retval = (ident, kv_dict)
-  return retval
-
-
-def check_ident_key_val(option, opt, value):  # pylint: disable=W0613
-  """Custom parser for ident:key=val,key=val options.
-
-  This will store the parsed values as a tuple (ident, {key: val}). As such,
-  multiple uses of this option via action=append is possible.
-
-  """
-  return _SplitIdentKeyVal(opt, value, True)
-
-
-def check_key_val(option, opt, value):  # pylint: disable=W0613
-  """Custom parser class for key=val,key=val options.
-
-  This will store the parsed values as a dict {key: val}.
-
-  """
-  return _SplitKeyVal(opt, value, True)
-
-
-def check_key_private_val(option, opt, value):  # pylint: disable=W0613
-  """Custom parser class for private and secret key=val,key=val options.
-
-  This will store the parsed values as a dict {key: val}.
-
-  """
-  return serializer.PrivateDict(_SplitKeyVal(opt, value, True))
-
-
-def _SplitListKeyVal(opt, value):
-  retval = {}
-  for elem in value.split("/"):
-    if not elem:
-      raise errors.ParameterError("Empty section in option '%s'" % opt)
-    (ident, valdict) = _SplitIdentKeyVal(opt, elem, False)
-    if ident in retval:
-      msg = ("Duplicated parameter '%s' in parsing %s: %s" %
-             (ident, opt, elem))
-      raise errors.ParameterError(msg)
-    retval[ident] = valdict
-  return retval
-
-
-def check_multilist_ident_key_val(_, opt, value):
-  """Custom parser for "ident:key=val,key=val/ident:key=val//ident:.." options.
-
-  @rtype: list of dictionary
-  @return: [{ident: {key: val, key: val}, ident: {key: val}}, {ident:..}]
-
-  """
-  retval = []
-  for line in value.split("//"):
-    retval.append(_SplitListKeyVal(opt, line))
-  return retval
-
-
-def check_bool(option, opt, value): # pylint: disable=W0613
-  """Custom parser for yes/no options.
-
-  This will store the parsed value as either True or False.
-
-  """
-  value = value.lower()
-  if value == constants.VALUE_FALSE or value == "no":
-    return False
-  elif value == constants.VALUE_TRUE or value == "yes":
-    return True
-  else:
-    raise errors.ParameterError("Invalid boolean value '%s'" % value)
-
-
-def check_list(option, opt, value): # pylint: disable=W0613
-  """Custom parser for comma-separated lists.
-
-  """
-  # we have to make this explicit check since "".split(",") is [""],
-  # not an empty list :(
-  if not value:
-    return []
-  else:
-    return utils.UnescapeAndSplit(value)
-
-
-def check_maybefloat(option, opt, value): # pylint: disable=W0613
-  """Custom parser for float numbers which might be also defaults.
-
-  """
-  value = value.lower()
-
-  if value == constants.VALUE_DEFAULT:
-    return value
-  else:
-    return float(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_EXTSTORAGE,
- OPT_COMPL_ONE_IALLOCATOR,
- OPT_COMPL_ONE_NETWORK,
- OPT_COMPL_INST_ADD_NODES,
- OPT_COMPL_ONE_NODEGROUP) = range(100, 109)
-
-OPT_COMPL_ALL = compat.UniqueFrozenset([
-  OPT_COMPL_MANY_NODES,
-  OPT_COMPL_ONE_NODE,
-  OPT_COMPL_ONE_INSTANCE,
-  OPT_COMPL_ONE_OS,
-  OPT_COMPL_ONE_EXTSTORAGE,
-  OPT_COMPL_ONE_IALLOCATOR,
-  OPT_COMPL_ONE_NETWORK,
-  OPT_COMPL_INST_ADD_NODES,
-  OPT_COMPL_ONE_NODEGROUP,
-  ])
-
-
-class CliOption(Option):
-  """Custom option class for optparse.
-
-  """
-  ATTRS = Option.ATTRS + [
-    "completion_suggest",
-    ]
-  TYPES = Option.TYPES + (
-    "multilistidentkeyval",
-    "identkeyval",
-    "keyval",
-    "keyprivateval",
-    "unit",
-    "bool",
-    "list",
-    "maybefloat",
-    )
-  TYPE_CHECKER = Option.TYPE_CHECKER.copy()
-  TYPE_CHECKER["multilistidentkeyval"] = check_multilist_ident_key_val
-  TYPE_CHECKER["identkeyval"] = check_ident_key_val
-  TYPE_CHECKER["keyval"] = check_key_val
-  TYPE_CHECKER["keyprivateval"] = check_key_private_val
-  TYPE_CHECKER["unit"] = check_unit
-  TYPE_CHECKER["bool"] = check_bool
-  TYPE_CHECKER["list"] = check_list
-  TYPE_CHECKER["maybefloat"] = check_maybefloat
-
-
-# optparse.py sets make_option, so we do it for our own option class, too
-cli_option = CliOption
-
-
-_YORNO = "yes|no"
-
-DEBUG_OPT = cli_option("-d", "--debug", default=0, action="count",
-                       help="Increase debugging level")
-
-NOHDR_OPT = cli_option("--no-headers", default=False,
-                       action="store_true", dest="no_headers",
-                       help="Don't display column headers")
-
-SEP_OPT = cli_option("--separator", default=None,
-                     action="store", dest="separator",
-                     help=("Separator between output fields"
-                           " (defaults to one space)"))
-
-USEUNITS_OPT = cli_option("--units", default=None,
-                          dest="units", choices=("h", "m", "g", "t"),
-                          help="Specify units for output (one of h/m/g/t)")
-
-FIELDS_OPT = cli_option("-o", "--output", dest="output", action="store",
-                        type="string", metavar="FIELDS",
-                        help="Comma separated list of output fields")
-
-FORCE_OPT = cli_option("-f", "--force", dest="force", action="store_true",
-                       default=False, help="Force the operation")
-
-CONFIRM_OPT = cli_option("--yes", dest="confirm", action="store_true",
-                         default=False, help="Do not require confirmation")
-
-IGNORE_OFFLINE_OPT = cli_option("--ignore-offline", dest="ignore_offline",
-                                  action="store_true", default=False,
-                                  help=("Ignore offline nodes and do as much"
-                                        " as possible"))
-
-TAG_ADD_OPT = cli_option("--tags", dest="tags",
-                         default=None, help="Comma-separated list of instance"
-                                            " tags")
-
-TAG_SRC_OPT = cli_option("--from", dest="tags_source",
-                         default=None, help="File with tag names")
-
-SUBMIT_OPT = cli_option("--submit", dest="submit_only",
-                        default=False, action="store_true",
-                        help=("Submit the job and return the job ID, but"
-                              " don't wait for the job to finish"))
-
-PRINT_JOBID_OPT = cli_option("--print-jobid", dest="print_jobid",
-                             default=False, action="store_true",
-                             help=("Additionally print the job as first line"
-                                   " on stdout (for scripting)."))
-
-SEQUENTIAL_OPT = cli_option("--sequential", dest="sequential",
-                            default=False, action="store_true",
-                            help=("Execute all resulting jobs sequentially"))
-
-SYNC_OPT = cli_option("--sync", dest="do_locking",
-                      default=False, action="store_true",
-                      help=("Grab locks while doing the queries"
-                            " in order to ensure more consistent results"))
-
-DRY_RUN_OPT = cli_option("--dry-run", default=False,
-                         action="store_true",
-                         help=("Do not execute the operation, just run the"
-                               " check steps and verify if 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!)")
-
-WFSYNC_OPT = cli_option("--wait-for-sync", dest="wait_for_sync",
-                        default=False, action="store_true",
-                        help="Wait for disks to sync")
-
-ONLINE_INST_OPT = cli_option("--online", dest="online_inst",
-                             action="store_true", default=False,
-                             help="Enable offline instance")
-
-OFFLINE_INST_OPT = cli_option("--offline", dest="offline_inst",
-                              action="store_true", default=False,
-                              help="Disable down instance")
-
-DISK_TEMPLATE_OPT = cli_option("-t", "--disk-template", dest="disk_template",
-                               help=("Custom disk setup (%s)" %
-                                     utils.CommaJoin(constants.DISK_TEMPLATES)),
-                               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="<DIR>")
-
-FILESTORE_DRIVER_OPT = cli_option("--file-driver", dest="file_driver",
-                                  help="Driver to use for image files",
-                                  default=None, metavar="<DRIVER>",
-                                  choices=list(constants.FILE_DRIVER))
-
-IALLOCATOR_OPT = cli_option("-I", "--iallocator", metavar="<NAME>",
-                            help="Select nodes for the instance automatically"
-                            " using the <NAME> iallocator plugin",
-                            default=None, type="string",
-                            completion_suggest=OPT_COMPL_ONE_IALLOCATOR)
-
-DEFAULT_IALLOCATOR_OPT = cli_option("-I", "--default-iallocator",
-                                    metavar="<NAME>",
-                                    help="Set the default instance"
-                                    " allocator plugin",
-                                    default=None, type="string",
-                                    completion_suggest=OPT_COMPL_ONE_IALLOCATOR)
-
-DEFAULT_IALLOCATOR_PARAMS_OPT = cli_option("--default-iallocator-params",
-                                           dest="default_iallocator_params",
-                                           help="iallocator template"
-                                           " parameters, in the format"
-                                           " template:option=value,"
-                                           " option=value,...",
-                                           type="keyval",
-                                           default=None)
-
-OS_OPT = cli_option("-o", "--os-type", dest="os", help="What OS to run",
-                    metavar="<os>",
-                    completion_suggest=OPT_COMPL_ONE_OS)
-
-OSPARAMS_OPT = cli_option("-O", "--os-parameters", dest="osparams",
-                          type="keyval", default={},
-                          help="OS parameters")
-
-OSPARAMS_PRIVATE_OPT = cli_option("--os-parameters-private",
-                                  dest="osparams_private",
-                                  type="keyprivateval",
-                                  default=serializer.PrivateDict(),
-                                  help="Private OS parameters"
-                                       " (won't be logged)")
-
-OSPARAMS_SECRET_OPT = cli_option("--os-parameters-secret",
-                                 dest="osparams_secret",
-                                 type="keyprivateval",
-                                 default=serializer.PrivateDict(),
-                                 help="Secret OS parameters (won't be logged or"
-                                      " saved; you must supply these for every"
-                                      " operation.)")
-
-FORCE_VARIANT_OPT = cli_option("--force-variant", dest="force_variant",
-                               action="store_true", default=False,
-                               help="Force an unknown variant")
-
-NO_INSTALL_OPT = cli_option("--no-install", dest="no_install",
-                            action="store_true", default=False,
-                            help="Do not install the OS (will"
-                            " enable no-start)")
-
-NORUNTIME_CHGS_OPT = cli_option("--no-runtime-changes",
-                                dest="allow_runtime_chgs",
-                                default=True, action="store_false",
-                                help="Don't allow runtime changes")
-
-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")
-
-DISK_PARAMS_OPT = cli_option("-D", "--disk-parameters", dest="diskparams",
-                             help="Disk template parameters, in the format"
-                             " template:option=value,option=value,...",
-                             type="identkeyval", action="append", default=[])
-
-SPECS_MEM_SIZE_OPT = cli_option("--specs-mem-size", dest="ispecs_mem_size",
-                                 type="keyval", default={},
-                                 help="Memory size specs: list of key=value,"
-                                " where key is one of min, max, std"
-                                 " (in MB or using a unit)")
-
-SPECS_CPU_COUNT_OPT = cli_option("--specs-cpu-count", dest="ispecs_cpu_count",
-                                 type="keyval", default={},
-                                 help="CPU count specs: list of key=value,"
-                                 " where key is one of min, max, std")
-
-SPECS_DISK_COUNT_OPT = cli_option("--specs-disk-count",
-                                  dest="ispecs_disk_count",
-                                  type="keyval", default={},
-                                  help="Disk count specs: list of key=value,"
-                                  " where key is one of min, max, std")
-
-SPECS_DISK_SIZE_OPT = cli_option("--specs-disk-size", dest="ispecs_disk_size",
-                                 type="keyval", default={},
-                                 help="Disk size specs: list of key=value,"
-                                 " where key is one of min, max, std"
-                                 " (in MB or using a unit)")
-
-SPECS_NIC_COUNT_OPT = cli_option("--specs-nic-count", dest="ispecs_nic_count",
-                                 type="keyval", default={},
-                                 help="NIC count specs: list of key=value,"
-                                 " where key is one of min, max, std")
-
-IPOLICY_BOUNDS_SPECS_STR = "--ipolicy-bounds-specs"
-IPOLICY_BOUNDS_SPECS_OPT = cli_option(IPOLICY_BOUNDS_SPECS_STR,
-                                      dest="ipolicy_bounds_specs",
-                                      type="multilistidentkeyval", default=None,
-                                      help="Complete instance specs limits")
-
-IPOLICY_STD_SPECS_STR = "--ipolicy-std-specs"
-IPOLICY_STD_SPECS_OPT = cli_option(IPOLICY_STD_SPECS_STR,
-                                   dest="ipolicy_std_specs",
-                                   type="keyval", default=None,
-                                   help="Complete standard instance specs")
-
-IPOLICY_DISK_TEMPLATES = cli_option("--ipolicy-disk-templates",
-                                    dest="ipolicy_disk_templates",
-                                    type="list", default=None,
-                                    help="Comma-separated list of"
-                                    " enabled disk templates")
-
-IPOLICY_VCPU_RATIO = cli_option("--ipolicy-vcpu-ratio",
-                                 dest="ipolicy_vcpu_ratio",
-                                 type="maybefloat", default=None,
-                                 help="The maximum allowed vcpu-to-cpu ratio")
-
-IPOLICY_SPINDLE_RATIO = cli_option("--ipolicy-spindle-ratio",
-                                   dest="ipolicy_spindle_ratio",
-                                   type="maybefloat", default=None,
-                                   help=("The maximum allowed instances to"
-                                         " spindle ratio"))
-
-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")
-
-NONAMECHECK_OPT = cli_option("--no-name-check", dest="name_check",
-                             default=True, action="store_false",
-                             help="Don't check that the instance's name"
-                             " is resolvable")
-
-NET_OPT = cli_option("--net",
-                     help="NIC parameters", default=[],
-                     dest="nics", action="append", type="identkeyval")
-
-DISK_OPT = cli_option("--disk", help="Disk parameters", default=[],
-                      dest="disks", action="append", type="identkeyval")
-
-DISKIDX_OPT = cli_option("--disks", dest="disks", default=None,
-                         help="Comma-separated list of disks"
-                         " indices to act on (e.g. 0,2) (optional,"
-                         " defaults to all disks)")
-
-OS_SIZE_OPT = cli_option("-s", "--os-size", dest="sd_size",
-                         help="Enforces a single-disk configuration using the"
-                         " given disk size, in MiB unless a suffix is used",
-                         default=None, type="unit", metavar="<size>")
-
-IGNORE_CONSIST_OPT = cli_option("--ignore-consistency",
-                                dest="ignore_consistency",
-                                action="store_true", default=False,
-                                help="Ignore the consistency of the disks on"
-                                " the secondary")
-
-ALLOW_FAILOVER_OPT = cli_option("--allow-failover",
-                                dest="allow_failover",
-                                action="store_true", default=False,
-                                help="If migration is not possible fallback to"
-                                     " failover")
-
-FORCE_FAILOVER_OPT = cli_option("--force-failover",
-                                dest="force_failover",
-                                action="store_true", default=False,
-                                help="Do not use migration, always use"
-                                     " failover")
-
-NONLIVE_OPT = cli_option("--non-live", dest="live",
-                         default=True, action="store_false",
-                         help="Do a non-live migration (this usually means"
-                         " freeze the instance, save the state, transfer and"
-                         " only then resume running on the secondary node)")
-
-MIGRATION_MODE_OPT = cli_option("--migration-mode", dest="migration_mode",
-                                default=None,
-                                choices=list(constants.HT_MIGRATION_MODES),
-                                help="Override default migration mode (choose"
-                                " either live or non-live")
-
-NODE_PLACEMENT_OPT = cli_option("-n", "--node", dest="node",
-                                help="Target node and optional secondary node",
-                                metavar="<pnode>[:<snode>]",
-                                completion_suggest=OPT_COMPL_INST_ADD_NODES)
-
-NODE_LIST_OPT = cli_option("-n", "--node", dest="nodes", default=[],
-                           action="append", metavar="<node>",
-                           help="Use only this node (can be used multiple"
-                           " times, if not given defaults to all nodes)",
-                           completion_suggest=OPT_COMPL_ONE_NODE)
-
-NODEGROUP_OPT_NAME = "--node-group"
-NODEGROUP_OPT = cli_option("-g", NODEGROUP_OPT_NAME,
-                           dest="nodegroup",
-                           help="Node group (name or uuid)",
-                           metavar="<nodegroup>",
-                           default=None, type="string",
-                           completion_suggest=OPT_COMPL_ONE_NODEGROUP)
-
-SINGLE_NODE_OPT = cli_option("-n", "--node", dest="node", help="Target node",
-                             metavar="<node>",
-                             completion_suggest=OPT_COMPL_ONE_NODE)
-
-NOSTART_OPT = cli_option("--no-start", dest="start", default=True,
-                         action="store_false",
-                         help="Don't start the instance after creation")
-
-SHOWCMD_OPT = cli_option("--show-cmd", dest="show_command",
-                         action="store_true", default=False,
-                         help="Show command instead of executing it")
-
-CLEANUP_OPT = cli_option("--cleanup", dest="cleanup",
-                         default=False, action="store_true",
-                         help="Instead of performing the migration/failover,"
-                         " try to recover from a failed cleanup. This is safe"
-                         " to run even if the instance is healthy, but it"
-                         " will create extra replication traffic and "
-                         " disrupt briefly the replication (like during the"
-                         " migration/failover")
-
-STATIC_OPT = cli_option("-s", "--static", dest="static",
-                        action="store_true", default=False,
-                        help="Only show configuration data, not runtime data")
-
-ALL_OPT = cli_option("--all", dest="show_all",
-                     default=False, action="store_true",
-                     help="Show info on all instances on the cluster."
-                     " This can take a long time to run, use wisely")
-
-SELECT_OS_OPT = cli_option("--select-os", dest="select_os",
-                           action="store_true", default=False,
-                           help="Interactive OS reinstall, lists available"
-                           " OS templates for selection")
-
-IGNORE_FAILURES_OPT = cli_option("--ignore-failures", dest="ignore_failures",
-                                 action="store_true", default=False,
-                                 help="Remove the instance from the cluster"
-                                 " configuration even if there are failures"
-                                 " during the removal process")
-
-IGNORE_REMOVE_FAILURES_OPT = cli_option("--ignore-remove-failures",
-                                        dest="ignore_remove_failures",
-                                        action="store_true", default=False,
-                                        help="Remove the instance from the"
-                                        " cluster configuration even if there"
-                                        " are failures during the removal"
-                                        " process")
-
-REMOVE_INSTANCE_OPT = cli_option("--remove-instance", dest="remove_instance",
-                                 action="store_true", default=False,
-                                 help="Remove the instance from the cluster")
-
-DST_NODE_OPT = cli_option("-n", "--target-node", dest="dst_node",
-                               help="Specifies the new node for the instance",
-                               metavar="NODE", default=None,
-                               completion_suggest=OPT_COMPL_ONE_NODE)
-
-NEW_SECONDARY_OPT = cli_option("-n", "--new-secondary", dest="dst_node",
-                               help="Specifies the new secondary node",
-                               metavar="NODE", default=None,
-                               completion_suggest=OPT_COMPL_ONE_NODE)
-
-NEW_PRIMARY_OPT = cli_option("--new-primary", dest="new_primary_node",
-                             help="Specifies the new primary node",
-                             metavar="<node>", default=None,
-                             completion_suggest=OPT_COMPL_ONE_NODE)
-
-ON_PRIMARY_OPT = cli_option("-p", "--on-primary", dest="on_primary",
-                            default=False, action="store_true",
-                            help="Replace the disk(s) on the primary"
-                                 " node (applies only to internally mirrored"
-                                 " disk templates, e.g. %s)" %
-                                 utils.CommaJoin(constants.DTS_INT_MIRROR))
-
-ON_SECONDARY_OPT = cli_option("-s", "--on-secondary", dest="on_secondary",
-                              default=False, action="store_true",
-                              help="Replace the disk(s) on the secondary"
-                                   " node (applies only to internally mirrored"
-                                   " disk templates, e.g. %s)" %
-                                   utils.CommaJoin(constants.DTS_INT_MIRROR))
-
-AUTO_PROMOTE_OPT = cli_option("--auto-promote", dest="auto_promote",
-                              default=False, action="store_true",
-                              help="Lock all nodes and auto-promote as needed"
-                              " to MC status")
-
-AUTO_REPLACE_OPT = cli_option("-a", "--auto", dest="auto",
-                              default=False, action="store_true",
-                              help="Automatically replace faulty disks"
-                                   " (applies only to internally mirrored"
-                                   " disk templates, e.g. %s)" %
-                                   utils.CommaJoin(constants.DTS_INT_MIRROR))
-
-IGNORE_SIZE_OPT = cli_option("--ignore-size", dest="ignore_size",
-                             default=False, action="store_true",
-                             help="Ignore current recorded size"
-                             " (useful for forcing activation when"
-                             " the recorded size is wrong)")
-
-SRC_NODE_OPT = cli_option("--src-node", dest="src_node", help="Source node",
-                          metavar="<node>",
-                          completion_suggest=OPT_COMPL_ONE_NODE)
-
-SRC_DIR_OPT = cli_option("--src-dir", dest="src_dir", help="Source directory",
-                         metavar="<dir>")
-
-SECONDARY_IP_OPT = cli_option("-s", "--secondary-ip", dest="secondary_ip",
-                              help="Specify the secondary ip for the node",
-                              metavar="ADDRESS", default=None)
-
-READD_OPT = cli_option("--readd", dest="readd",
-                       default=False, action="store_true",
-                       help="Readd old node after replacing it")
-
-NOSSH_KEYCHECK_OPT = cli_option("--no-ssh-key-check", dest="ssh_key_check",
-                                default=True, action="store_false",
-                                help="Disable SSH key fingerprint checking")
-
-NODE_FORCE_JOIN_OPT = cli_option("--force-join", dest="force_join",
-                                 default=False, action="store_true",
-                                 help="Force the joining of a node")
-
-MC_OPT = cli_option("-C", "--master-candidate", dest="master_candidate",
-                    type="bool", default=None, metavar=_YORNO,
-                    help="Set the master_candidate flag on the node")
-
-OFFLINE_OPT = cli_option("-O", "--offline", dest="offline", metavar=_YORNO,
-                         type="bool", default=None,
-                         help=("Set the offline flag on the node"
-                               " (cluster does not communicate with offline"
-                               " nodes)"))
-
-DRAINED_OPT = cli_option("-D", "--drained", dest="drained", metavar=_YORNO,
-                         type="bool", default=None,
-                         help=("Set the drained flag on the node"
-                               " (excluded from allocation operations)"))
-
-CAPAB_MASTER_OPT = cli_option("--master-capable", dest="master_capable",
-                              type="bool", default=None, metavar=_YORNO,
-                              help="Set the master_capable flag on the node")
-
-CAPAB_VM_OPT = cli_option("--vm-capable", dest="vm_capable",
-                          type="bool", default=None, metavar=_YORNO,
-                          help="Set the vm_capable flag on the node")
-
-ALLOCATABLE_OPT = cli_option("--allocatable", dest="allocatable",
-                             type="bool", default=None, metavar=_YORNO,
-                             help="Set the allocatable flag on a volume")
-
-ENABLED_HV_OPT = cli_option("--enabled-hypervisors",
-                            dest="enabled_hypervisors",
-                            help="Comma-separated list of hypervisors",
-                            type="string", default=None)
-
-ENABLED_DISK_TEMPLATES_OPT = cli_option("--enabled-disk-templates",
-                                        dest="enabled_disk_templates",
-                                        help="Comma-separated list of "
-                                             "disk templates",
-                                        type="string", default=None)
-
-ENABLED_USER_SHUTDOWN_OPT = cli_option("--user-shutdown",
-                                       default=None,
-                                       dest="enabled_user_shutdown",
-                                       help="Whether user shutdown is enabled",
-                                       type="bool")
-
-NIC_PARAMS_OPT = cli_option("-N", "--nic-parameters", dest="nicparams",
-                            type="keyval", default={},
-                            help="NIC parameters")
-
-CP_SIZE_OPT = cli_option("-C", "--candidate-pool-size", default=None,
-                         dest="candidate_pool_size", type="int",
-                         help="Set the candidate pool size")
-
-RQL_OPT = cli_option("--max-running-jobs", dest="max_running_jobs",
-                     type="int", help="Set the maximal number of jobs to "
-                                      "run simultaneously")
-
-MAX_TRACK_OPT = cli_option("--max-tracked-jobs", dest="max_tracked_jobs",
-                           type="int", help="Set the maximal number of jobs to "
-                                            "be tracked simultaneously for "
-                                            "scheduling")
-
-COMPRESSION_TOOLS_OPT = \
-    cli_option("--compression-tools",
-               dest="compression_tools", type="string", default=None,
-               help="Comma-separated list of compression tools which are"
-                    " allowed to be used by Ganeti in various operations")
-
-VG_NAME_OPT = cli_option("--vg-name", dest="vg_name",
-                         help=("Enables LVM and specifies the volume group"
-                               " name (cluster-wide) for disk allocation"
-                               " [%s]" % constants.DEFAULT_VG),
-                         metavar="VG", default=None)
-
-YES_DOIT_OPT = cli_option("--yes-do-it", "--ya-rly", dest="yes_do_it",
-                          help="Destroy cluster", action="store_true")
-
-NOVOTING_OPT = cli_option("--no-voting", dest="no_voting",
-                          help="Skip node agreement check (dangerous)",
-                          action="store_true", default=False)
-
-MAC_PREFIX_OPT = cli_option("-m", "--mac-prefix", dest="mac_prefix",
-                            help="Specify the mac prefix for the instance IP"
-                            " addresses, in the format XX:XX:XX",
-                            metavar="PREFIX",
-                            default=None)
-
-MASTER_NETDEV_OPT = cli_option("--master-netdev", dest="master_netdev",
-                               help="Specify the node interface (cluster-wide)"
-                               " on which the master IP address will be added"
-                               " (cluster init default: %s)" %
-                               constants.DEFAULT_BRIDGE,
-                               metavar="NETDEV",
-                               default=None)
-
-MASTER_NETMASK_OPT = cli_option("--master-netmask", dest="master_netmask",
-                                help="Specify the netmask of the master IP",
-                                metavar="NETMASK",
-                                default=None)
-
-USE_EXTERNAL_MIP_SCRIPT = cli_option("--use-external-mip-script",
-                                     dest="use_external_mip_script",
-                                     help="Specify whether to run a"
-                                     " user-provided script for the master"
-                                     " IP address turnup and"
-                                     " turndown operations",
-                                     type="bool", metavar=_YORNO, default=None)
-
-GLOBAL_FILEDIR_OPT = cli_option("--file-storage-dir", dest="file_storage_dir",
-                                help="Specify the default directory (cluster-"
-                                "wide) for storing the file-based disks [%s]" %
-                                pathutils.DEFAULT_FILE_STORAGE_DIR,
-                                metavar="DIR",
-                                default=None)
-
-GLOBAL_SHARED_FILEDIR_OPT = cli_option(
-  "--shared-file-storage-dir",
-  dest="shared_file_storage_dir",
-  help="Specify the default directory (cluster-wide) for storing the"
-  " shared file-based disks [%s]" %
-  pathutils.DEFAULT_SHARED_FILE_STORAGE_DIR,
-  metavar="SHAREDDIR", default=None)
-
-GLOBAL_GLUSTER_FILEDIR_OPT = cli_option(
-  "--gluster-storage-dir",
-  dest="gluster_storage_dir",
-  help="Specify the default directory (cluster-wide) for mounting Gluster"
-  " file systems [%s]" %
-  pathutils.DEFAULT_GLUSTER_STORAGE_DIR,
-  metavar="GLUSTERDIR",
-  default=pathutils.DEFAULT_GLUSTER_STORAGE_DIR)
-
-NOMODIFY_ETCHOSTS_OPT = cli_option("--no-etc-hosts", dest="modify_etc_hosts",
-                                   help="Don't modify %s" % pathutils.ETC_HOSTS,
-                                   action="store_false", default=True)
-
-MODIFY_ETCHOSTS_OPT = \
- cli_option("--modify-etc-hosts", dest="modify_etc_hosts", metavar=_YORNO,
-            default=None, type="bool",
-            help="Defines whether the cluster should autonomously modify"
-            " and keep in sync the /etc/hosts file of the nodes")
-
-NOMODIFY_SSH_SETUP_OPT = cli_option("--no-ssh-init", dest="modify_ssh_setup",
-                                    help="Don't initialize SSH keys",
-                                    action="store_false", default=True)
-
-ERROR_CODES_OPT = cli_option("--error-codes", dest="error_codes",
-                             help="Enable parseable error messages",
-                             action="store_true", default=False)
-
-NONPLUS1_OPT = cli_option("--no-nplus1-mem", dest="skip_nplusone_mem",
-                          help="Skip N+1 memory redundancy tests",
-                          action="store_true", default=False)
-
-REBOOT_TYPE_OPT = cli_option("-t", "--type", dest="reboot_type",
-                             help="Type of reboot: soft/hard/full",
-                             default=constants.INSTANCE_REBOOT_HARD,
-                             metavar="<REBOOT>",
-                             choices=list(constants.REBOOT_TYPES))
-
-IGNORE_SECONDARIES_OPT = cli_option("--ignore-secondaries",
-                                    dest="ignore_secondaries",
-                                    default=False, action="store_true",
-                                    help="Ignore errors from secondaries")
-
-NOSHUTDOWN_OPT = cli_option("--noshutdown", dest="shutdown",
-                            action="store_false", default=True,
-                            help="Don't shutdown the instance (unsafe)")
-
-TIMEOUT_OPT = cli_option("--timeout", dest="timeout", type="int",
-                         default=constants.DEFAULT_SHUTDOWN_TIMEOUT,
-                         help="Maximum time to wait")
-
-COMPRESS_OPT = cli_option("--compress", dest="compress",
-                          type="string", default=constants.IEC_NONE,
-                          help="The compression mode to use")
-
-TRANSPORT_COMPRESSION_OPT = \
-    cli_option("--transport-compression", dest="transport_compression",
-               type="string", default=constants.IEC_NONE,
-               help="The compression mode to use during transport")
-
-SHUTDOWN_TIMEOUT_OPT = cli_option("--shutdown-timeout",
-                                  dest="shutdown_timeout", type="int",
-                                  default=constants.DEFAULT_SHUTDOWN_TIMEOUT,
-                                  help="Maximum time to wait for instance"
-                                  " shutdown")
-
-INTERVAL_OPT = cli_option("--interval", dest="interval", type="int",
-                          default=None,
-                          help=("Number of seconds between repetions of the"
-                                " command"))
-
-EARLY_RELEASE_OPT = cli_option("--early-release",
-                               dest="early_release", default=False,
-                               action="store_true",
-                               help="Release the locks on the secondary"
-                               " node(s) early")
-
-NEW_CLUSTER_CERT_OPT = cli_option("--new-cluster-certificate",
-                                  dest="new_cluster_cert",
-                                  default=False, action="store_true",
-                                  help="Generate a new cluster certificate")
-
-NEW_NODE_CERT_OPT = cli_option(
-  "--new-node-certificates", dest="new_node_cert", default=False,
-  action="store_true", help="Generate new node certificates (for all nodes)")
-
-RAPI_CERT_OPT = cli_option("--rapi-certificate", dest="rapi_cert",
-                           default=None,
-                           help="File containing new RAPI certificate")
-
-NEW_RAPI_CERT_OPT = cli_option("--new-rapi-certificate", dest="new_rapi_cert",
-                               default=None, action="store_true",
-                               help=("Generate a new self-signed RAPI"
-                                     " certificate"))
-
-SPICE_CERT_OPT = cli_option("--spice-certificate", dest="spice_cert",
-                            default=None,
-                            help="File containing new SPICE certificate")
-
-SPICE_CACERT_OPT = cli_option("--spice-ca-certificate", dest="spice_cacert",
-                              default=None,
-                              help="File containing the certificate of the CA"
-                              " which signed the SPICE certificate")
-
-NEW_SPICE_CERT_OPT = cli_option("--new-spice-certificate",
-                                dest="new_spice_cert", default=None,
-                                action="store_true",
-                                help=("Generate a new self-signed SPICE"
-                                      " certificate"))
-
-NEW_CONFD_HMAC_KEY_OPT = cli_option("--new-confd-hmac-key",
-                                    dest="new_confd_hmac_key",
-                                    default=False, action="store_true",
-                                    help=("Create a new HMAC key for %s" %
-                                          constants.CONFD))
-
-CLUSTER_DOMAIN_SECRET_OPT = cli_option("--cluster-domain-secret",
-                                       dest="cluster_domain_secret",
-                                       default=None,
-                                       help=("Load new new cluster domain"
-                                             " secret from file"))
-
-NEW_CLUSTER_DOMAIN_SECRET_OPT = cli_option("--new-cluster-domain-secret",
-                                           dest="new_cluster_domain_secret",
-                                           default=False, action="store_true",
-                                           help=("Create a new cluster domain"
-                                                 " secret"))
-
-USE_REPL_NET_OPT = cli_option("--use-replication-network",
-                              dest="use_replication_network",
-                              help="Whether to use the replication network"
-                              " for talking to the nodes",
-                              action="store_true", default=False)
-
-MAINTAIN_NODE_HEALTH_OPT = \
-    cli_option("--maintain-node-health", dest="maintain_node_health",
-               metavar=_YORNO, default=None, type="bool",
-               help="Configure the cluster to automatically maintain node"
-               " health, by shutting down unknown instances, shutting down"
-               " unknown DRBD devices, etc.")
-
-IDENTIFY_DEFAULTS_OPT = \
-    cli_option("--identify-defaults", dest="identify_defaults",
-               default=False, action="store_true",
-               help="Identify which saved instance parameters are equal to"
-               " the current cluster defaults and set them as such, instead"
-               " of marking them as overridden")
-
-UIDPOOL_OPT = cli_option("--uid-pool", default=None,
-                         action="store", dest="uid_pool",
-                         help=("A list of user-ids or user-id"
-                               " ranges separated by commas"))
-
-ADD_UIDS_OPT = cli_option("--add-uids", default=None,
-                          action="store", dest="add_uids",
-                          help=("A list of user-ids or user-id"
-                                " ranges separated by commas, to be"
-                                " added to the user-id pool"))
-
-REMOVE_UIDS_OPT = cli_option("--remove-uids", default=None,
-                             action="store", dest="remove_uids",
-                             help=("A list of user-ids or user-id"
-                                   " ranges separated by commas, to be"
-                                   " removed from the user-id pool"))
-
-RESERVED_LVS_OPT = cli_option("--reserved-lvs", default=None,
-                              action="store", dest="reserved_lvs",
-                              help=("A comma-separated list of reserved"
-                                    " logical volumes names, that will be"
-                                    " ignored by cluster verify"))
-
-ROMAN_OPT = cli_option("--roman",
-                       dest="roman_integers", default=False,
-                       action="store_true",
-                       help="Use roman numbers for positive integers")
-
-DRBD_HELPER_OPT = cli_option("--drbd-usermode-helper", dest="drbd_helper",
-                             action="store", default=None,
-                             help="Specifies usermode helper for DRBD")
-
-PRIMARY_IP_VERSION_OPT = \
-    cli_option("--primary-ip-version", default=constants.IP4_VERSION,
-               action="store", dest="primary_ip_version",
-               metavar="%d|%d" % (constants.IP4_VERSION,
-                                  constants.IP6_VERSION),
-               help="Cluster-wide IP version for primary IP")
-
-SHOW_MACHINE_OPT = cli_option("-M", "--show-machine-names", default=False,
-                              action="store_true",
-                              help="Show machine name for every line in output")
-
-FAILURE_ONLY_OPT = cli_option("--failure-only", default=False,
-                              action="store_true",
-                              help=("Hide successful results and show failures"
-                                    " only (determined by the exit code)"))
-
-REASON_OPT = cli_option("--reason", default=None,
-                        help="The reason for executing the command")
-
-
-def _PriorityOptionCb(option, _, value, parser):
-  """Callback for processing C{--priority} option.
-
-  """
-  value = _PRIONAME_TO_VALUE[value]
-
-  setattr(parser.values, option.dest, value)
-
-
-PRIORITY_OPT = cli_option("--priority", default=None, dest="priority",
-                          metavar="|".join(name for name, _ in _PRIORITY_NAMES),
-                          choices=_PRIONAME_TO_VALUE.keys(),
-                          action="callback", type="choice",
-                          callback=_PriorityOptionCb,
-                          help="Priority for opcode processing")
-
-OPPORTUNISTIC_OPT = cli_option("--opportunistic-locking",
-                               dest="opportunistic_locking",
-                               action="store_true", default=False,
-                               help="Opportunistically acquire locks")
-
-HID_OS_OPT = cli_option("--hidden", dest="hidden",
-                        type="bool", default=None, metavar=_YORNO,
-                        help="Sets the hidden flag on the OS")
-
-BLK_OS_OPT = cli_option("--blacklisted", dest="blacklisted",
-                        type="bool", default=None, metavar=_YORNO,
-                        help="Sets the blacklisted flag on the OS")
-
-PREALLOC_WIPE_DISKS_OPT = cli_option("--prealloc-wipe-disks", default=None,
-                                     type="bool", metavar=_YORNO,
-                                     dest="prealloc_wipe_disks",
-                                     help=("Wipe disks prior to instance"
-                                           " creation"))
-
-NODE_PARAMS_OPT = cli_option("--node-parameters", dest="ndparams",
-                             type="keyval", default=None,
-                             help="Node parameters")
-
-ALLOC_POLICY_OPT = cli_option("--alloc-policy", dest="alloc_policy",
-                              action="store", metavar="POLICY", default=None,
-                              help="Allocation policy for the node group")
-
-NODE_POWERED_OPT = cli_option("--node-powered", default=None,
-                              type="bool", metavar=_YORNO,
-                              dest="node_powered",
-                              help="Specify if the SoR for node is powered")
-
-OOB_TIMEOUT_OPT = cli_option("--oob-timeout", dest="oob_timeout", type="int",
-                             default=constants.OOB_TIMEOUT,
-                             help="Maximum time to wait for out-of-band helper")
-
-POWER_DELAY_OPT = cli_option("--power-delay", dest="power_delay", type="float",
-                             default=constants.OOB_POWER_DELAY,
-                             help="Time in seconds to wait between power-ons")
-
-FORCE_FILTER_OPT = cli_option("-F", "--filter", dest="force_filter",
-                              action="store_true", default=False,
-                              help=("Whether command argument should be treated"
-                                    " as filter"))
-
-NO_REMEMBER_OPT = cli_option("--no-remember",
-                             dest="no_remember",
-                             action="store_true", default=False,
-                             help="Perform but do not record the change"
-                             " in the configuration")
-
-PRIMARY_ONLY_OPT = cli_option("-p", "--primary-only",
-                              default=False, action="store_true",
-                              help="Evacuate primary instances only")
-
-SECONDARY_ONLY_OPT = cli_option("-s", "--secondary-only",
-                                default=False, action="store_true",
-                                help="Evacuate secondary instances only"
-                                     " (applies only to internally mirrored"
-                                     " disk templates, e.g. %s)" %
-                                     utils.CommaJoin(constants.DTS_INT_MIRROR))
-
-STARTUP_PAUSED_OPT = cli_option("--paused", dest="startup_paused",
-                                action="store_true", default=False,
-                                help="Pause instance at startup")
-
-TO_GROUP_OPT = cli_option("--to", dest="to", metavar="<group>",
-                          help="Destination node group (name or uuid)",
-                          default=None, action="append",
-                          completion_suggest=OPT_COMPL_ONE_NODEGROUP)
-
-IGNORE_ERRORS_OPT = cli_option("-I", "--ignore-errors", default=[],
-                               action="append", dest="ignore_errors",
-                               choices=list(constants.CV_ALL_ECODES_STRINGS),
-                               help="Error code to be ignored")
-
-DISK_STATE_OPT = cli_option("--disk-state", default=[], dest="disk_state",
-                            action="append",
-                            help=("Specify disk state information in the"
-                                  " format"
-                                  " storage_type/identifier:option=value,...;"
-                                  " note this is unused for now"),
-                            type="identkeyval")
-
-HV_STATE_OPT = cli_option("--hypervisor-state", default=[], dest="hv_state",
-                          action="append",
-                          help=("Specify hypervisor state information in the"
-                                " format hypervisor:option=value,...;"
-                                " note this is unused for now"),
-                          type="identkeyval")
-
-IGNORE_IPOLICY_OPT = cli_option("--ignore-ipolicy", dest="ignore_ipolicy",
-                                action="store_true", default=False,
-                                help="Ignore instance policy violations")
-
-RUNTIME_MEM_OPT = cli_option("-m", "--runtime-memory", dest="runtime_mem",
-                             help="Sets the instance's runtime memory,"
-                             " ballooning it up or down to the new value",
-                             default=None, type="unit", metavar="<size>")
-
-ABSOLUTE_OPT = cli_option("--absolute", dest="absolute",
-                          action="store_true", default=False,
-                          help="Marks the grow as absolute instead of the"
-                          " (default) relative mode")
-
-NETWORK_OPT = cli_option("--network",
-                         action="store", default=None, dest="network",
-                         help="IP network in CIDR notation")
-
-GATEWAY_OPT = cli_option("--gateway",
-                         action="store", default=None, dest="gateway",
-                         help="IP address of the router (gateway)")
-
-ADD_RESERVED_IPS_OPT = cli_option("--add-reserved-ips",
-                                  action="store", default=None,
-                                  dest="add_reserved_ips",
-                                  help="Comma-separated list of"
-                                  " reserved IPs to add")
-
-REMOVE_RESERVED_IPS_OPT = cli_option("--remove-reserved-ips",
-                                     action="store", default=None,
-                                     dest="remove_reserved_ips",
-                                     help="Comma-delimited list of"
-                                     " reserved IPs to remove")
-
-NETWORK6_OPT = cli_option("--network6",
-                          action="store", default=None, dest="network6",
-                          help="IP network in CIDR notation")
-
-GATEWAY6_OPT = cli_option("--gateway6",
-                          action="store", default=None, dest="gateway6",
-                          help="IP6 address of the router (gateway)")
-
-NOCONFLICTSCHECK_OPT = cli_option("--no-conflicts-check",
-                                  dest="conflicts_check",
-                                  default=True,
-                                  action="store_false",
-                                  help="Don't check for conflicting IPs")
-
-INCLUDEDEFAULTS_OPT = cli_option("--include-defaults", dest="include_defaults",
-                                 default=False, action="store_true",
-                                 help="Include default values")
-
-HOTPLUG_OPT = cli_option("--hotplug", dest="hotplug",
-                         action="store_true", default=False,
-                         help="Hotplug supported devices (NICs and Disks)")
-
-HOTPLUG_IF_POSSIBLE_OPT = cli_option("--hotplug-if-possible",
-                                     dest="hotplug_if_possible",
-                                     action="store_true", default=False,
-                                     help="Hotplug devices in case"
-                                          " hotplug is supported")
-
-INSTALL_IMAGE_OPT = \
-    cli_option("--install-image",
-               dest="install_image",
-               action="store",
-               type="string",
-               default=None,
-               help="The OS image to use for running the OS scripts safely")
-
-INSTANCE_COMMUNICATION_OPT = \
-    cli_option("-c", "--communication",
-               dest="instance_communication",
-               help=constants.INSTANCE_COMMUNICATION_DOC,
-               type="bool")
-
-INSTANCE_COMMUNICATION_NETWORK_OPT = \
-    cli_option("--instance-communication-network",
-               dest="instance_communication_network",
-               type="string",
-               help="Set the network name for instance communication")
-
-ZEROING_IMAGE_OPT = \
-    cli_option("--zeroing-image",
-               dest="zeroing_image", action="store", default=None,
-               help="The OS image to use to zero instance disks")
-
-ZERO_FREE_SPACE_OPT = \
-    cli_option("--zero-free-space",
-               dest="zero_free_space", action="store_true", default=False,
-               help="Whether to zero the free space on the disks of the "
-                    "instance prior to the export")
-
-HELPER_STARTUP_TIMEOUT_OPT = \
-    cli_option("--helper-startup-timeout",
-               dest="helper_startup_timeout", action="store", type="int",
-               help="Startup timeout for the helper VM")
-
-HELPER_SHUTDOWN_TIMEOUT_OPT = \
-    cli_option("--helper-shutdown-timeout",
-               dest="helper_shutdown_timeout", action="store", type="int",
-               help="Shutdown timeout for the helper VM")
-
-ZEROING_TIMEOUT_FIXED_OPT = \
-    cli_option("--zeroing-timeout-fixed",
-               dest="zeroing_timeout_fixed", action="store", type="int",
-               help="The fixed amount of time to wait before assuming that the "
-                    "zeroing failed")
-
-ZEROING_TIMEOUT_PER_MIB_OPT = \
-    cli_option("--zeroing-timeout-per-mib",
-               dest="zeroing_timeout_per_mib", action="store", type="float",
-               help="The amount of time to wait per MiB of data to zero, in "
-                    "addition to the fixed timeout")
-
-#: Options provided by all commands
-COMMON_OPTS = [DEBUG_OPT, REASON_OPT]
-
-# options related to asynchronous job handling
-
-SUBMIT_OPTS = [
-  SUBMIT_OPT,
-  PRINT_JOBID_OPT,
-  ]
-
-# common options for creating instances. add and import then add their own
-# specific ones.
-COMMON_CREATE_OPTS = [
-  BACKEND_OPT,
-  DISK_OPT,
-  DISK_TEMPLATE_OPT,
-  FILESTORE_DIR_OPT,
-  FILESTORE_DRIVER_OPT,
-  HYPERVISOR_OPT,
-  IALLOCATOR_OPT,
-  NET_OPT,
-  NODE_PLACEMENT_OPT,
-  NOIPCHECK_OPT,
-  NOCONFLICTSCHECK_OPT,
-  NONAMECHECK_OPT,
-  NONICS_OPT,
-  NWSYNC_OPT,
-  OSPARAMS_OPT,
-  OSPARAMS_PRIVATE_OPT,
-  OSPARAMS_SECRET_OPT,
-  OS_SIZE_OPT,
-  OPPORTUNISTIC_OPT,
-  SUBMIT_OPT,
-  PRINT_JOBID_OPT,
-  TAG_ADD_OPT,
-  DRY_RUN_OPT,
-  PRIORITY_OPT,
-  ]
-
-# common instance policy options
-INSTANCE_POLICY_OPTS = [
-  IPOLICY_BOUNDS_SPECS_OPT,
-  IPOLICY_DISK_TEMPLATES,
-  IPOLICY_VCPU_RATIO,
-  IPOLICY_SPINDLE_RATIO,
-  ]
-
-# instance policy split specs options
-SPLIT_ISPECS_OPTS = [
-  SPECS_CPU_COUNT_OPT,
-  SPECS_DISK_COUNT_OPT,
-  SPECS_DISK_SIZE_OPT,
-  SPECS_MEM_SIZE_OPT,
-  SPECS_NIC_COUNT_OPT,
-  ]
-
-
 class _ShowUsage(Exception):
   """Exception class for L{_ParseArgs}.
 
@@ -2903,6 +1409,7 @@ def GenericInstanceCreate(mode, opts, args):
     instance_name=instance,
     disks=disks,
     disk_template=opts.disk_template,
+    group_name=opts.nodegroup,
     nics=nics,
     conflicts_check=opts.conflicts_check,
     pnode=pnode, snode=snode,
@@ -3029,7 +1536,9 @@ class _RunWhileDaemonsStoppedHelper(object):
       self._RunCmd(None, [pathutils.DAEMON_UTIL, "stop-master"])
       try:
         # Stop daemons on all nodes
-        for node_name in self.online_nodes:
+        online_nodes = [self.master_node] + [n for n in self.online_nodes
+                                             if n != self.master_node]
+        for node_name in online_nodes:
           self.feedback_fn("Stopping daemons on %s" % node_name)
           self._RunCmd(node_name, [pathutils.DAEMON_UTIL, "stop-all"])
           # Starting any daemons listed as exception
@@ -3783,6 +2292,7 @@ def GetNodesSshPorts(nodes, cl):
   @type cl: L{ganeti.luxi.Client}
   @return: the list of SSH ports corresponding to the nodes
   @rtype: a list of tuples
+
   """
   return map(lambda t: t[0],
              cl.QueryNodes(names=nodes,
@@ -3790,6 +2300,23 @@ def GetNodesSshPorts(nodes, cl):
                            use_locking=False))
 
 
+def GetNodeUUIDs(nodes, cl):
+  """Retrieves the UUIDs of given nodes.
+
+  @param nodes: the names of nodes
+  @type nodes: a list of string
+  @param cl: a client to use for the query
+  @type cl: L{ganeti.luxi.Client}
+  @return: the list of UUIDs corresponding to the nodes
+  @rtype: a list of tuples
+
+  """
+  return map(lambda t: t[0],
+             cl.QueryNodes(names=nodes,
+                           fields=["uuid"],
+                           use_locking=False))
+
+
 def _ToStream(stream, txt, *args):
   """Write a message to a stream, bypassing the logging system