From 725ec2f10019c35bafeb1aabfce6f14174bf4f46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Nussbaumer?= <rn@google.com>
Date: Mon, 12 Apr 2010 16:04:22 +0200
Subject: [PATCH] QA: Make the rapi credential handling less involving
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: RenΓ© Nussbaumer <rn@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 qa/ganeti-qa.py  | 15 ++++++++++++---
 qa/qa_cluster.py | 24 ++++++++----------------
 qa/qa_rapi.py    | 17 +++++++++++++++--
 3 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index 0925796a6..a51473668 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -38,6 +38,8 @@ import qa_rapi
 import qa_tags
 import qa_utils
 
+from ganeti import utils
+
 
 def RunTest(fn, *args):
   """Runs a test after printing a header.
@@ -70,12 +72,15 @@ def RunEnvTests():
   RunTest(qa_env.TestGanetiCommands)
 
 
-def SetupCluster():
+def SetupCluster(rapi_user, rapi_secret):
   """Initializes the cluster.
 
+  @param rapi_user: Login user for RAPI
+  @param rapi_secret: Login secret for RAPI
+
   """
   if qa_config.TestEnabled('create-cluster'):
-    RunTest(qa_cluster.TestClusterInit)
+    RunTest(qa_cluster.TestClusterInit, rapi_user, rapi_secret)
     RunTest(qa_node.TestNodeAddAll)
   else:
     # consider the nodes are already there
@@ -274,8 +279,12 @@ def main():
 
   qa_config.Load(config_file)
 
+  rapi_user = "ganeti-qa"
+  rapi_secret = utils.GenerateSecret()
+  qa_rapi.OpenerFactory.SetCredentials(rapi_user, rapi_secret)
+
   RunEnvTests()
-  SetupCluster()
+  SetupCluster(rapi_user, rapi_secret)
   RunClusterTests()
   RunOsTests()
 
diff --git a/qa/qa_cluster.py b/qa/qa_cluster.py
index 37d1c45a9..489800b56 100644
--- a/qa/qa_cluster.py
+++ b/qa/qa_cluster.py
@@ -56,10 +56,17 @@ def _CheckFileOnAllNodes(filename, content):
                 content)
 
 
-def TestClusterInit():
+def TestClusterInit(rapi_user, rapi_secret):
   """gnt-cluster init"""
   master = qa_config.GetMasterNode()
 
+  # First create the RAPI credentials
+  cred_string = "%s %s write" % (rapi_user, rapi_secret)
+  cmd = ("echo %s > %s" %
+         (utils.ShellQuote(cred_string),
+          utils.ShellQuote(constants.RAPI_USERS_FILE)))
+  AssertEqual(StartSSH(master['primary'], cmd).wait(), 0)
+
   cmd = ['gnt-cluster', 'init']
 
   if master.get('secondary', None):
@@ -79,21 +86,6 @@ def TestClusterInit():
   AssertEqual(StartSSH(master['primary'],
                        utils.ShellQuoteArgs(cmd)).wait(), 0)
 
-  # Create RAPI credentials
-  rapi_user = qa_config.get("rapi-user", default=None)
-  rapi_pass = qa_config.get("rapi-pass", default=None)
-
-  if rapi_user and rapi_pass:
-    cmds = []
-
-    cred_string = "%s %s write" % (rapi_user, rapi_pass)
-    cmds.append(("echo %s >> %s" %
-                 (utils.ShellQuote(cred_string),
-                  utils.ShellQuote(constants.RAPI_USERS_FILE))))
-    cmds.append("%s stop-master" % constants.DAEMON_UTIL)
-    cmds.append("%s start-master" % constants.DAEMON_UTIL)
-    AssertEqual(StartSSH(master['primary'], ' && '.join(cmds)).wait(), 0)
-
 
 def TestClusterRename():
   """gnt-cluster rename"""
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index 919dc7869..179ce8a9b 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -44,6 +44,16 @@ class OpenerFactory:
 
   """
   _opener = None
+  _rapi_user = None
+  _rapi_secret = None
+
+  @classmethod
+  def SetCredentials(cls, rapi_user, rapi_secret):
+    """Set the credentials for authorized access.
+
+    """
+    cls._rapi_user = rapi_user
+    cls._rapi_secret = rapi_secret
 
   @classmethod
   def Opener(cls):
@@ -51,14 +61,17 @@ class OpenerFactory:
 
     """
     if not cls._opener:
+      if not cls._rapi_user or not cls._rapi_secret:
+        raise errors.ProgrammerError("SetCredentials was never called.")
+
       # Create opener which doesn't try to look for proxies and does auth
       master = qa_config.GetMasterNode()
       host = master["primary"]
       port = qa_config.get("rapi-port", default=constants.DEFAULT_RAPI_PORT)
       passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
       passman.add_password(None, 'https://%s:%s' % (host, port),
-                           qa_config.get("rapi-user", default=""),
-                           qa_config.get("rapi-pass", default=""))
+                           cls._rapi_user,
+                           cls._rapi_secret)
       authhandler = urllib2.HTTPBasicAuthHandler(passman)
       cls._opener = urllib2.build_opener(urllib2.ProxyHandler({}), authhandler)
 
-- 
GitLab