check-python-code: Report EOL whitespace
[ganeti-local] / scripts / gnt-backup
index cbbde51..12a667d 100755 (executable)
@@ -24,7 +24,6 @@
 # W0614: Unused import %s from wildcard import (since we need cli)
 
 import sys
-from optparse import make_option
 
 from ganeti.cli import *
 from ganeti import opcodes
@@ -35,6 +34,7 @@ from ganeti import utils
 
 _VALUE_TRUE = "true"
 
+
 def PrintExportList(opts, args):
   """Prints a list of all the exported system images.
 
@@ -123,6 +123,9 @@ def ImportInstance(opts, args):
     nics = [{}] * nic_max
     for nidx, ndict in opts.nics:
       nidx = int(nidx)
+      if not isinstance(ndict, dict):
+        msg = "Invalid nic/%d value: expected dict, got %s" % (nidx, ndict)
+        raise errors.OpPrereqError(msg)
       nics[nidx] = ndict
   elif opts.no_nics:
     # no nics
@@ -151,7 +154,10 @@ def ImportInstance(opts, args):
     disks = [{}] * disk_max
     for didx, ddict in opts.disks:
       didx = int(didx)
-      if "size" not in ddict:
+      if not isinstance(ddict, dict):
+        msg = "Invalid disk/%d value: expected dict, got %s" % (didx, ddict)
+        raise errors.OpPrereqError(msg)
+      elif "size" not in ddict:
         raise errors.OpPrereqError("Missing size for disk %d" % didx)
       try:
         ddict["size"] = utils.ParseUnit(ddict["size"])
@@ -205,16 +211,18 @@ def RemoveExport(opts, args):
 # this is defined separately due to readability only
 import_opts = [
   DEBUG_OPT,
-  make_option("-n", "--node", dest="node",
-              help="Target node and optional secondary node",
-              metavar="<pnode>[:<snode>]"),
-  keyval_option("-B", "--backend", dest="beparams",
-                type="keyval", default={},
-                help="Backend parameters"),
-  make_option("-t", "--disk-template", dest="disk_template",
-              help="Custom disk setup (diskless, file, plain, drbd)",
-              default=None, metavar="TEMPL"),
-  ikv_option("--disk", help="Disk information",
+  cli_option("-n", "--node", dest="node",
+             help="Target node and optional secondary node",
+             metavar="<pnode>[:<snode>]",
+             completion_suggest=OPT_COMPL_INST_ADD_NODES),
+  cli_option("-B", "--backend", dest="beparams",
+             type="keyval", default={},
+             help="Backend parameters"),
+  cli_option("-t", "--disk-template", dest="disk_template",
+             help="Custom disk setup (diskless, file, plain, drbd)",
+             default=None, metavar="TEMPL",
+             choices=list(constants.DISK_TEMPLATES)),
+  cli_option("--disk", help="Disk information",
              default=[], dest="disks",
              action="append",
              type="identkeyval"),
@@ -222,62 +230,68 @@ import_opts = [
              " single-disk configuration, when not using the --disk option,"
              " in MiB unless a suffix is used",
              default=None, type="unit", metavar="<size>"),
-  ikv_option("--net", help="NIC information",
+  cli_option("--net", help="NIC information",
              default=[], dest="nics",
              action="append",
              type="identkeyval"),
-  make_option("--no-nics", default=False, action="store_true",
-              help="Do not create any network cards for the instance"),
-  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
-              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
-  make_option("--src-node", dest="src_node", help="Source node",
-              metavar="<node>"),
-  make_option("--src-dir", dest="src_dir", help="Source directory",
-              metavar="<dir>"),
-  make_option("--no-ip-check", dest="ip_check", default=True,
-              action="store_false", help="Don't check that the instance's IP"
-              " is alive"),
-  make_option("-I", "--iallocator", metavar="<NAME>",
-              help="Select nodes for the instance automatically using the"
-              " <NAME> iallocator plugin", default=None, type="string"),
-  make_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>"),
-  make_option("--file-driver", dest="file_driver", help="Driver to use"
-              " for image files", default="loop", metavar="<DRIVER>"),
-  ikv_option("-H", "--hypervisor", dest="hypervisor",
-              help="Hypervisor and hypervisor options, in the format"
-              " hypervisor:option=value,option=value,...", default=None,
-              type="identkeyval"),
+  cli_option("--no-nics", default=False, action="store_true",
+             help="Do not create any network cards for the instance"),
+  cli_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
+             action="store_false", help="Don't wait for sync (DANGEROUS!)"),
+  cli_option("--src-node", dest="src_node", help="Source node",
+             metavar="<node>",
+             completion_suggest=OPT_COMPL_ONE_NODE),
+  cli_option("--src-dir", dest="src_dir", help="Source directory",
+             metavar="<dir>"),
+  cli_option("--no-ip-check", dest="ip_check", default=True,
+             action="store_false", help="Don't check that the instance's IP"
+             " is alive"),
+  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),
+  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>"),
+  cli_option("--file-driver", dest="file_driver", help="Driver to use"
+             " for image files", default="loop", metavar="<DRIVER>",
+             choices=list(constants.FILE_DRIVER)),
+  cli_option("-H", "--hypervisor", dest="hypervisor",
+             help="Hypervisor and hypervisor options, in the format"
+             " hypervisor:option=value,option=value,...", default=None,
+             type="identkeyval"),
   ]
 
 commands = {
   'list': (PrintExportList, ARGS_NONE,
            [DEBUG_OPT,
-            make_option("--node", dest="nodes", default=[], action="append",
-                        help="List only backups stored on this node"
-                             " (can be used multiple times)"),
+            cli_option("--node", dest="nodes", default=[], action="append",
+                       help="List only backups stored on this node"
+                            " (can be used multiple times)",
+                       completion_suggest=OPT_COMPL_ONE_NODE),
             ],
            "", "Lists instance exports available in the ganeti cluster"),
-  'export': (ExportInstance, ARGS_ONE,
+  'export': (ExportInstance, ARGS_ONE_INSTANCE,
              [DEBUG_OPT, FORCE_OPT,
-              make_option("-n", "--node", dest="node", help="Target node",
-                          metavar="<node>"),
-              make_option("","--noshutdown", dest="shutdown",
-                          action="store_false", default=True,
-                          help="Don't shutdown the instance (unsafe)"), ],
+              cli_option("-n", "--node", dest="node", help="Target node",
+                         metavar="<node>",
+                         completion_suggest=OPT_COMPL_ONE_NODE),
+              cli_option("","--noshutdown", dest="shutdown",
+                         action="store_false", default=True,
+                         help="Don't shutdown the instance (unsafe)"), ],
              "-n <target_node> [opts...] <name>",
              "Exports an instance to an image"),
-  'import': (ImportInstance, ARGS_ONE, import_opts,
+  'import': (ImportInstance, ARGS_ONE_INSTANCE, import_opts,
              ("[...] -t disk-type -n node[:secondary-node]"
               " <name>"),
              "Imports an instance from an exported image"),
-  'remove': (RemoveExport, ARGS_ONE,
+  'remove': (RemoveExport, [ArgUnknown(min=1, max=1)],
              [DEBUG_OPT],
              "<name>",
              "Remove exports of named instance from the filesystem."),
   }
 
+
 if __name__ == '__main__':
   sys.exit(GenericMain(commands))