New RPC to get size and spindles of disks
[ganeti-local] / lib / client / gnt_backup.py
index 23e9f7c..4a18593 100644 (file)
@@ -1,7 +1,7 @@
 #
 #
 
-# Copyright (C) 2006, 2007, 2010 Google Inc.
+# Copyright (C) 2006, 2007, 2010, 2011, 2013 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
@@ -20,7 +20,7 @@
 
 """Backup related commands"""
 
-# pylint: disable-msg=W0401,W0613,W0614,C0103
+# pylint: disable=W0401,W0613,W0614,C0103
 # W0401: Wildcard import ganeti.cli
 # W0613: Unused argument, since all functions follow the same API
 # W0614: Unused import %s from wildcard import (since we need cli)
@@ -30,6 +30,10 @@ from ganeti.cli import *
 from ganeti import opcodes
 from ganeti import constants
 from ganeti import errors
+from ganeti import qlang
+
+
+_LIST_DEF_FIELDS = ["node", "export"]
 
 
 def PrintExportList(opts, args):
@@ -42,18 +46,31 @@ def PrintExportList(opts, args):
   @return: the desired exit code
 
   """
-  exports = GetClient().QueryExports(opts.nodes, False)
-  retcode = 0
-  for node in exports:
-    ToStdout("Node: %s", node)
-    ToStdout("Exports:")
-    if isinstance(exports[node], list):
-      for instance_name in exports[node]:
-        ToStdout("\t%s", instance_name)
-    else:
-      ToStdout("  Could not get exports list")
-      retcode = 1
-  return retcode
+  selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
+
+  qfilter = qlang.MakeSimpleFilter("node", opts.nodes)
+
+  cl = GetClient(query=True)
+
+  return GenericList(constants.QR_EXPORT, selected_fields, None, opts.units,
+                     opts.separator, not opts.no_headers,
+                     verbose=opts.verbose, qfilter=qfilter, cl=cl)
+
+
+def ListExportFields(opts, args):
+  """List export fields.
+
+  @param opts: the command line options selected by the user
+  @type args: list
+  @param args: fields to list, or empty for all
+  @rtype: int
+  @return: the desired exit code
+
+  """
+  cl = GetClient(query=True)
+
+  return GenericListFields(constants.QR_EXPORT, args, opts.separator,
+                           not opts.no_headers, cl=cl)
 
 
 def ExportInstance(opts, args):
@@ -73,14 +90,14 @@ def ExportInstance(opts, args):
     raise errors.OpPrereqError("Target node must be specified",
                                errors.ECODE_INVAL)
 
-  op = opcodes.OpExportInstance(instance_name=args[0],
-                                target_node=opts.node,
-                                shutdown=opts.shutdown,
-                                shutdown_timeout=opts.shutdown_timeout,
-                                remove_instance=opts.remove_instance,
-                                ignore_remove_failures=ignore_remove_failures)
+  op = opcodes.OpBackupExport(instance_name=args[0],
+                              target_node=opts.node,
+                              shutdown=opts.shutdown,
+                              shutdown_timeout=opts.shutdown_timeout,
+                              remove_instance=opts.remove_instance,
+                              ignore_remove_failures=ignore_remove_failures)
 
-  SubmitOpCode(op, opts=opts)
+  SubmitOrSend(op, opts)
   return 0
 
 
@@ -104,9 +121,9 @@ def RemoveExport(opts, args):
   @return: the desired exit code
 
   """
-  op = opcodes.OpRemoveExport(instance_name=args[0])
+  op = opcodes.OpBackupRemove(instance_name=args[0])
 
-  SubmitOpCode(op, opts=opts)
+  SubmitOrSend(op, opts)
   return 0
 
 
@@ -115,27 +132,34 @@ import_opts = [
   IDENTIFY_DEFAULTS_OPT,
   SRC_DIR_OPT,
   SRC_NODE_OPT,
+  IGNORE_IPOLICY_OPT,
   ]
 
 
 commands = {
-  'list': (
+  "list": (
     PrintExportList, ARGS_NONE,
-    [NODE_LIST_OPT],
+    [NODE_LIST_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, VERBOSE_OPT],
     "", "Lists instance exports available in the ganeti cluster"),
-  'export': (
+  "list-fields": (
+    ListExportFields, [ArgUnknown()],
+    [NOHDR_OPT, SEP_OPT],
+    "[fields...]",
+    "Lists all available fields for exports"),
+  "export": (
     ExportInstance, ARGS_ONE_INSTANCE,
     [FORCE_OPT, SINGLE_NODE_OPT, NOSHUTDOWN_OPT, SHUTDOWN_TIMEOUT_OPT,
      REMOVE_INSTANCE_OPT, IGNORE_REMOVE_FAILURES_OPT, DRY_RUN_OPT,
-     PRIORITY_OPT],
+     PRIORITY_OPT, SUBMIT_OPT],
     "-n <target_node> [opts...] <name>",
     "Exports an instance to an image"),
-  'import': (
+  "import": (
     ImportInstance, ARGS_ONE_INSTANCE, COMMON_CREATE_OPTS + import_opts,
     "[...] -t disk-type -n node[:secondary-node] <name>",
     "Imports an instance from an exported image"),
-  'remove': (
-    RemoveExport, [ArgUnknown(min=1, max=1)], [DRY_RUN_OPT, PRIORITY_OPT],
+  "remove": (
+    RemoveExport, [ArgUnknown(min=1, max=1)],
+    [DRY_RUN_OPT, PRIORITY_OPT, SUBMIT_OPT],
     "<name>", "Remove exports of named instance from the filesystem."),
   }