From e80edd3b2dc7b2e75f86155c6d5c7d9bc684d148 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Wed, 6 Feb 2013 14:04:43 +0100
Subject: [PATCH] qa_config: Add __repr__ for instance/node classes

Having a readable representation makes debugging easier.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Bernardo Dal Seno <bdalseno@google.com>
---
 qa/qa_config.py                  | 22 +++++++++++++
 test/py/qa.qa_config_unittest.py | 54 ++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)

diff --git a/qa/qa_config.py b/qa/qa_config.py
index d879d2df3..664baace9 100644
--- a/qa/qa_config.py
+++ b/qa/qa_config.py
@@ -70,6 +70,17 @@ class _QaInstance(object):
 
     return cls(name=data["name"], nicmac=nicmac)
 
+  def __repr__(self):
+    status = [
+      "%s.%s" % (self.__class__.__module__, self.__class__.__name__),
+      "name=%s" % self.name,
+      "nicmac=%s" % self.nicmac,
+      "used=%s" % self._used,
+      "disk_template=%s" % self._disk_template,
+      ]
+
+    return "<%s at %#x>" % (" ".join(status), id(self))
+
   def Use(self):
     """Marks instance as being in use.
 
@@ -150,6 +161,17 @@ class _QaNode(object):
     """
     return cls(primary=data["primary"], secondary=data.get("secondary"))
 
+  def __repr__(self):
+    status = [
+      "%s.%s" % (self.__class__.__module__, self.__class__.__name__),
+      "primary=%s" % self.primary,
+      "secondary=%s" % self.secondary,
+      "added=%s" % self._added,
+      "use_count=%s" % self._use_count,
+      ]
+
+    return "<%s at %#x>" % (" ".join(status), id(self))
+
   def Use(self):
     """Marks a node as being in use.
 
diff --git a/test/py/qa.qa_config_unittest.py b/test/py/qa.qa_config_unittest.py
index b3e4b58c3..ce987f887 100755
--- a/test/py/qa.qa_config_unittest.py
+++ b/test/py/qa.qa_config_unittest.py
@@ -350,5 +350,59 @@ class TestQaConfig(unittest.TestCase):
                       exclude=acquired, _cfg=self.config)
 
 
+class TestRepresentation(unittest.TestCase):
+  def _Check(self, target, part):
+    self.assertTrue(part in repr(target).split())
+
+  def testQaInstance(self):
+    inst = qa_config._QaInstance("inst1.example.com", [])
+    self._Check(inst, "name=inst1.example.com")
+    self._Check(inst, "nicmac=[]")
+
+    # Default values
+    self._Check(inst, "disk_template=None")
+    self._Check(inst, "used=None")
+
+    # Use instance
+    inst.Use()
+    self._Check(inst, "used=True")
+
+    # Disk template
+    inst.SetDiskTemplate(constants.DT_DRBD8)
+    self._Check(inst, "disk_template=%s" % constants.DT_DRBD8)
+
+    # Release instance
+    inst.Release()
+    self._Check(inst, "used=False")
+    self._Check(inst, "disk_template=None")
+
+  def testQaNode(self):
+    node = qa_config._QaNode("primary.example.com", "192.0.2.1")
+    self._Check(node, "primary=primary.example.com")
+    self._Check(node, "secondary=192.0.2.1")
+    self._Check(node, "added=False")
+    self._Check(node, "use_count=0")
+
+    # Mark as added
+    node.MarkAdded()
+    self._Check(node, "added=True")
+
+    # Use node
+    for i in range(1, 5):
+      node.Use()
+      self._Check(node, "use_count=%s" % i)
+
+    # Release node
+    for i in reversed(range(1, 5)):
+      node.Release()
+      self._Check(node, "use_count=%s" % (i - 1))
+
+    self._Check(node, "use_count=0")
+
+    # Mark as added
+    node.MarkRemoved()
+    self._Check(node, "added=False")
+
+
 if __name__ == "__main__":
   testutils.GanetiTestProgram()
-- 
GitLab