Replace single- with double-quotes
[ganeti-local] / lib / cli.py
index a920fb0..87f0493 100644 (file)
@@ -1,7 +1,7 @@
 #
 #
 
-# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,7 +30,6 @@ import logging
 import errno
 import itertools
 import shlex
-import optparse
 from cStringIO import StringIO
 
 from ganeti import utils
@@ -45,7 +44,7 @@ from ganeti import compat
 from ganeti import netutils
 from ganeti import qlang
 
-from optparse import (TitledHelpFormatter,
+from optparse import (OptionParser, TitledHelpFormatter,
                       Option, OptionValueError)
 
 
@@ -133,6 +132,7 @@ __all__ = [
   "NONICS_OPT",
   "NONLIVE_OPT",
   "NONPLUS1_OPT",
+  "NORUNTIME_CHGS_OPT",
   "NOSHUTDOWN_OPT",
   "NOSTART_OPT",
   "NOSSH_KEYCHECK_OPT",
@@ -173,7 +173,8 @@ __all__ = [
   "SPECS_DISK_SIZE_OPT",
   "SPECS_MEM_SIZE_OPT",
   "SPECS_NIC_COUNT_OPT",
-  "SPECS_DISK_TEMPLATES",
+  "IPOLICY_DISK_TEMPLATES",
+  "IPOLICY_VCPU_RATIO",
   "SPICE_CACERT_OPT",
   "SPICE_CERT_OPT",
   "SRC_DIR_OPT",
@@ -551,7 +552,9 @@ def check_ident_key_val(option, opt, value):  # pylint: disable=W0613
       msg = "Cannot pass options when removing parameter groups: %s" % value
       raise errors.ParameterError(msg)
     retval = (ident[len(NO_PREFIX):], False)
-  elif ident.startswith(UN_PREFIX):
+  elif (ident.startswith(UN_PREFIX) and
+        (len(ident) <= len(UN_PREFIX) or
+         not ident[len(UN_PREFIX)][0].isdigit())):
     if rest:
       msg = "Cannot pass options when removing parameter groups: %s" % value
       raise errors.ParameterError(msg)
@@ -771,6 +774,11 @@ NO_INSTALL_OPT = cli_option("--no-install", dest="no_install",
                             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")
@@ -806,11 +814,16 @@ SPECS_NIC_COUNT_OPT = cli_option("--specs-nic-count", dest="ispecs_nic_count",
                                  type="keyval", default={},
                                  help="NIC count specs: min, max, std")
 
-SPECS_DISK_TEMPLATES = cli_option("--specs-disk-templates",
-                                  dest="ispecs_disk_templates",
-                                  type="list", default=None,
-                                  help="Comma-separated list of"
-                                  " enabled disk templates")
+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="float", default=None,
+                                 help="The maximum allowed vcpu-to-cpu ratio")
 
 HYPERVISOR_OPT = cli_option("-H", "--hypervisor-parameters", dest="hypervisor",
                             help="Hypervisor and hypervisor options, in the"
@@ -1402,7 +1415,8 @@ INSTANCE_POLICY_OPTS = [
   SPECS_DISK_SIZE_OPT,
   SPECS_MEM_SIZE_OPT,
   SPECS_NIC_COUNT_OPT,
-  SPECS_DISK_TEMPLATES,
+  IPOLICY_DISK_TEMPLATES,
+  IPOLICY_VCPU_RATIO,
   ]
 
 
@@ -1481,10 +1495,10 @@ def _ParseArgs(argv, commands, aliases, env_override):
       argv = utils.InsertAtPos(argv, 1, shlex.split(env_args))
 
   func, args_def, parser_opts, usage, description = commands[cmd]
-  parser = CustomOptionParser(option_list=parser_opts + COMMON_OPTS,
-                              description=description,
-                              formatter=TitledHelpFormatter(),
-                              usage="%%prog %s %s" % (cmd, usage))
+  parser = OptionParser(option_list=parser_opts + COMMON_OPTS,
+                        description=description,
+                        formatter=TitledHelpFormatter(),
+                        usage="%%prog %s %s" % (cmd, usage))
   parser.disable_interspersed_args()
   options, args = parser.parse_args(args=argv[1:])
 
@@ -1494,21 +1508,6 @@ def _ParseArgs(argv, commands, aliases, env_override):
   return func, options, args
 
 
-class CustomOptionParser(optparse.OptionParser):
-  def _match_long_opt(self, opt):
-    """Override C{OptionParser}'s function for matching long options.
-
-    The default implementation does prefix-based abbreviation matching. We
-    disable such behaviour as it can can lead to confusing conflicts (e.g.
-    C{--force} and C{--force-multi}).
-
-    """
-    if opt in self._long_opt:
-      return opt
-    else:
-      raise optparse.BadOptionError(opt)
-
-
 def _CheckArguments(cmd, args_def, args):
   """Verifies the arguments using the argument definition.
 
@@ -2151,15 +2150,19 @@ def GenericMain(commands, override=None, aliases=None,
   """
   # save the program name and the entire command line for later logging
   if sys.argv:
-    binary = os.path.basename(sys.argv[0]) or sys.argv[0]
+    binary = os.path.basename(sys.argv[0])
+    if not binary:
+      binary = sys.argv[0]
+
     if len(sys.argv) >= 2:
-      binary += " " + sys.argv[1]
-      old_cmdline = " ".join(sys.argv[2:])
+      logname = utils.ShellQuoteArgs([binary, sys.argv[1]])
     else:
-      old_cmdline = ""
+      logname = binary
+
+    cmdline = utils.ShellQuoteArgs([binary] + sys.argv[1:])
   else:
     binary = "<unknown program>"
-    old_cmdline = ""
+    cmdline = "<unknown>"
 
   if aliases is None:
     aliases = {}
@@ -2178,13 +2181,10 @@ def GenericMain(commands, override=None, aliases=None,
     for key, val in override.iteritems():
       setattr(options, key, val)
 
-  utils.SetupLogging(constants.LOG_COMMANDS, binary, debug=options.debug,
+  utils.SetupLogging(constants.LOG_COMMANDS, logname, debug=options.debug,
                      stderr_logging=True)
 
-  if old_cmdline:
-    logging.info("run with arguments '%s'", old_cmdline)
-  else:
-    logging.info("run with no arguments")
+  logging.info("Command line: %s", cmdline)
 
   try:
     result = func(options, args)