From 8cb70e56f3658e45f51cfcda402207ae689d2ade Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Wed, 5 May 2010 12:17:52 +0200
Subject: [PATCH] RAPI QA: Test instance creation/removal via RAPI

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 qa/ganeti-qa.py |  6 ++++++
 qa/qa_rapi.py   | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index a51473668..64026c606 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -307,6 +307,12 @@ def main():
     if qa_rapi.Enabled():
       RunTest(qa_rapi.TestNode, pnode)
 
+      if qa_config.TestEnabled("instance-add-plain-disk"):
+        rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode)
+        RunCommonInstanceTests(rapi_instance)
+        RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance)
+        del rapi_instance
+
     if qa_config.TestEnabled('instance-add-plain-disk'):
       instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
       RunCommonInstanceTests(instance)
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index c11de803b..cefed6614 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -288,3 +288,60 @@ def TestTags(kind, name, tags):
   _DoTests([
     (uri, _VerifyTags, 'GET', None),
     ])
+
+
+def _WaitForRapiJob(job_id):
+  """Waits for a job to finish.
+
+  """
+  master = qa_config.GetMasterNode()
+
+  def _VerifyJob(data):
+    AssertEqual(data["id"], job_id)
+    for field in JOB_FIELDS:
+      AssertIn(field, data)
+
+  _DoTests([
+    ("/2/jobs/%s" % job_id, _VerifyJob, "GET", None),
+    ])
+
+  # FIXME: Use "gnt-job watch" until RAPI supports waiting for job
+  cmd = ["gnt-job", "watch", str(job_id)]
+  AssertEqual(StartSSH(master["primary"],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+def TestRapiInstanceAdd(node):
+  """Test adding a new instance via RAPI"""
+  instance = qa_config.AcquireInstance()
+  try:
+    body = {
+      "name": instance["name"],
+      "os": qa_config.get("os"),
+      "disk_template": constants.DT_PLAIN,
+      "pnode": node["primary"],
+      "memory": utils.ParseUnit(qa_config.get("mem")),
+      "disks": [utils.ParseUnit(size) for size in qa_config.get("disk")],
+      }
+
+    (job_id, ) = _DoTests([
+      ("/2/instances", _VerifyReturnsJob, "POST", body),
+      ])
+
+    _WaitForRapiJob(job_id)
+
+    return instance
+  except:
+    qa_config.ReleaseInstance(instance)
+    raise
+
+
+def TestRapiInstanceRemove(instance):
+  """Test removing instance via RAPI"""
+  (job_id, ) = _DoTests([
+    ("/2/instances/%s" % instance["name"], _VerifyReturnsJob, "DELETE", None),
+    ])
+
+  _WaitForRapiJob(job_id)
+
+  qa_config.ReleaseInstance(instance)
-- 
GitLab