From: Michael Hanselmann <[email protected]>

“gnt-backup export” requires the target node. Until now, the master
daemon would complain that the “parameter
'OP_BACKUP_EXPORT.target_node' fails validation”. With this patch,
an additional check is done in the client program.
---
 qa/ganeti-qa.py    |    2 ++
 qa/qa_instance.py  |   11 ++++++++++-
 scripts/gnt-backup |    4 ++++
 3 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index 80893f7..7f27000 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -204,6 +204,8 @@ def RunExportImportTests(instance, pnode):
 
   """
   if qa_config.TestEnabled('instance-export'):
+    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
+
     expnode = qa_config.AcquireNode(exclude=pnode)
     try:
       name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
diff --git a/qa/qa_instance.py b/qa/qa_instance.py
index 45b1d6b..b8c692e 100644
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@ -280,7 +280,7 @@ def TestReplaceDisks(instance, pnode, snode, othernode):
 
 
 def TestInstanceExport(instance, node):
-  """gnt-backup export"""
+  """gnt-backup export -n ..."""
   master = qa_config.GetMasterNode()
 
   cmd = ['gnt-backup', 'export', '-n', node['primary'], instance['name']]
@@ -300,6 +300,15 @@ def TestInstanceExportWithRemove(instance, node):
                        utils.ShellQuoteArgs(cmd)).wait(), 0)
 
 
+def TestInstanceExportNoTarget(instance):
+  """gnt-backup export (without target node, should fail)"""
+  master = qa_config.GetMasterNode()
+
+  cmd = ["gnt-backup", "export", instance["name"]]
+  AssertNotEqual(StartSSH(master['primary'],
+                          utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
 def TestInstanceImport(node, newinst, expnode, name):
   """gnt-backup import"""
   master = qa_config.GetMasterNode()
diff --git a/scripts/gnt-backup b/scripts/gnt-backup
index 62ed706..355359a 100755
--- a/scripts/gnt-backup
+++ b/scripts/gnt-backup
@@ -31,6 +31,7 @@ import sys
 from ganeti.cli import *
 from ganeti import opcodes
 from ganeti import constants
+from ganeti import errors
 
 
 _VALUE_TRUE = "true"
@@ -73,6 +74,9 @@ def ExportInstance(opts, args):
   """
   ignore_remove_failures = opts.ignore_remove_failures
 
+  if not opts.node:
+    raise errors.OpPrereqError("Target node must be specified")
+
   op = opcodes.OpExportInstance(instance_name=args[0],
                                 target_node=opts.node,
                                 shutdown=opts.shutdown,
-- 
1.7.0.4

Reply via email to