From 6daf26a084866e62d9078d3ad3e6ab6b1a0258c0 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Tue, 11 Aug 2009 10:35:50 +0100
Subject: [PATCH] Add NodeRoleQuery

This implements CONFD_REQ_NODE_ROLE_BYNAME.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 lib/confd/querylib.py | 34 ++++++++++++++++++++++++++++++++++
 lib/confd/server.py   |  2 +-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py
index d442fb697..c51bfa2fa 100644
--- a/lib/confd/querylib.py
+++ b/lib/confd/querylib.py
@@ -75,3 +75,37 @@ class PingQuery(ConfdQuery):
 
     return status, answer
 
+
+class NodeRoleQuery(ConfdQuery):
+  """An empty confd query.
+
+  It will return success on an empty argument, and an error on any other argument.
+
+  """
+  def Exec(self, query):
+    """EmptyQuery main execution
+
+    """
+    node = query
+    if self.reader.GetMasterNode() == node:
+      status = constants.CONFD_REPL_STATUS_OK
+      answer = constants.CONFD_NODE_ROLE_MASTER
+      return status, answer
+    flags = self.reader.GetNodeStatusFlags(node)
+    if flags is None:
+      status = constants.CONFD_REPL_STATUS_ERROR
+      answer = constants.CONFD_ERROR_UNKNOWN_ENTRY
+      return status, answer
+
+    master_candidate, drained, offline = flags
+    if master_candidate:
+      answer = constants.CONFD_NODE_ROLE_CANDIDATE
+    elif drained:
+      answer = constants.CONFD_NODE_ROLE_DRAINED
+    elif offline:
+      answer = constants.CONFD_NODE_ROLE_OFFLINE
+    else:
+      answer = constants.CONFD_NODE_ROLE_REGULAR
+
+    return constants.CONFD_REPL_STATUS_OK, answer
+
diff --git a/lib/confd/server.py b/lib/confd/server.py
index efea38d51..a39a53581 100644
--- a/lib/confd/server.py
+++ b/lib/confd/server.py
@@ -44,7 +44,7 @@ class ConfdProcessor(object):
   """
   DISPATCH_TABLE = {
       constants.CONFD_REQ_PING: querylib.PingQuery,
-      constants.CONFD_REQ_NODE_ROLE_BYNAME: querylib.ConfdQuery,
+      constants.CONFD_REQ_NODE_ROLE_BYNAME: querylib.NodeRoleQuery,
       constants.CONFD_REQ_NODE_PIP_BY_INSTANCE_IP: querylib.ConfdQuery,
   }
 
-- 
GitLab