From 1e28e3b8f156055fab703d33690999d463777d85 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Wed, 23 Feb 2011 18:04:48 +0100
Subject: [PATCH] Add constants for node roles

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/constants.py              | 14 ++++++++++++++
 lib/query.py                  | 10 +++++-----
 lib/rapi/rlib2.py             | 12 +++++++-----
 test/ganeti.query_unittest.py | 35 ++++++++++++++++++-----------------
 4 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/lib/constants.py b/lib/constants.py
index 117b43cc3..63c4880b0 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -879,6 +879,20 @@ INSTST_ALL = frozenset([
   INSTST_ERRORDOWN,
   ])
 
+# Node roles
+NR_REGULAR = "R"
+NR_MASTER = "M"
+NR_MCANDIDATE = "C"
+NR_DRAINED = "D"
+NR_OFFLINE = "O"
+NR_ALL = frozenset([
+  NR_REGULAR,
+  NR_MASTER,
+  NR_MCANDIDATE,
+  NR_DRAINED,
+  NR_OFFLINE,
+  ])
+
 # SSL certificate check constants (in days)
 SSL_CERT_EXPIRATION_WARN = 30
 SSL_CERT_EXPIRATION_ERROR = 7
diff --git a/lib/query.py b/lib/query.py
index b185170ef..47a4d5c86 100644
--- a/lib/query.py
+++ b/lib/query.py
@@ -381,15 +381,15 @@ def _GetNodeRole(node, master_name):
 
   """
   if node.name == master_name:
-    return "M"
+    return constants.NR_MASTER
   elif node.master_candidate:
-    return "C"
+    return constants.NR_MCANDIDATE
   elif node.drained:
-    return "D"
+    return constants.NR_DRAINED
   elif node.offline:
-    return "O"
+    return constants.NR_OFFLINE
   else:
-    return "R"
+    return constants.NR_REGULAR
 
 
 def _GetItemAttr(attr):
diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index 6504ab284..70d8215d0 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -86,13 +86,15 @@ _NR_OFFLINE = "offline"
 _NR_REGULAR = "regular"
 
 _NR_MAP = {
-  "M": _NR_MASTER,
-  "C": _NR_MASTER_CANDIATE,
-  "D": _NR_DRAINED,
-  "O": _NR_OFFLINE,
-  "R": _NR_REGULAR,
+  constants.NR_MASTER: _NR_MASTER,
+  constants.NR_MCANDIDATE: _NR_MASTER_CANDIATE,
+  constants.NR_DRAINED: _NR_DRAINED,
+  constants.NR_OFFLINE: _NR_OFFLINE,
+  constants.NR_REGULAR: _NR_REGULAR,
   }
 
+assert frozenset(_NR_MAP.keys()) == constants.NR_ALL
+
 # Request data version field
 _REQ_DATA_VERSION = "__version__"
 
diff --git a/test/ganeti.query_unittest.py b/test/ganeti.query_unittest.py
index 8994425a1..8039435a8 100755
--- a/test/ganeti.query_unittest.py
+++ b/test/ganeti.query_unittest.py
@@ -275,25 +275,26 @@ class TestQuery(unittest.TestCase):
 
 
 class TestGetNodeRole(unittest.TestCase):
-  def testMaster(self):
-    node = objects.Node(name="node1")
-    self.assertEqual(query._GetNodeRole(node, "node1"), "M")
-
-  def testMasterCandidate(self):
-    node = objects.Node(name="node1", master_candidate=True)
-    self.assertEqual(query._GetNodeRole(node, "master"), "C")
-
-  def testRegular(self):
-    node = objects.Node(name="node1")
-    self.assertEqual(query._GetNodeRole(node, "master"), "R")
+  def test(self):
+    tested_role = set()
+
+    checks = [
+      (constants.NR_MASTER, "node1", objects.Node(name="node1")),
+      (constants.NR_MCANDIDATE, "master",
+       objects.Node(name="node1", master_candidate=True)),
+      (constants.NR_REGULAR, "master", objects.Node(name="node1")),
+      (constants.NR_DRAINED, "master",
+       objects.Node(name="node1", drained=True)),
+      (constants.NR_OFFLINE,
+       "master", objects.Node(name="node1", offline=True)),
+      ]
 
-  def testDrained(self):
-    node = objects.Node(name="node1", drained=True)
-    self.assertEqual(query._GetNodeRole(node, "master"), "D")
+    for (role, master_name, node) in checks:
+      result = query._GetNodeRole(node, master_name)
+      self.assertEqual(result, role)
+      tested_role.add(result)
 
-  def testOffline(self):
-    node = objects.Node(name="node1", offline=True)
-    self.assertEqual(query._GetNodeRole(node, "master"), "O")
+    self.assertEqual(tested_role, constants.NR_ALL)
 
 
 class TestNodeQuery(unittest.TestCase):
-- 
GitLab