From efbb4fd227bd1aabe0386068c32d44a391f8c75e Mon Sep 17 00:00:00 2001 From: Luca Bigliardi <shammash@google.com> Date: Wed, 16 Sep 2009 14:19:18 +0100 Subject: [PATCH] Confd: add primary IPs queries Extend confd to answer queries about nodes primary IPs and master candidates primary IPs. Signed-off-by: Luca Bigliardi <shammash@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- lib/confd/querylib.py | 41 +++++++++++++++++++++++++++++++++++++++++ lib/confd/server.py | 2 ++ lib/constants.py | 4 ++++ lib/ssconf.py | 14 ++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py index 0aaf04cd0..11dad046f 100644 --- a/lib/confd/querylib.py +++ b/lib/confd/querylib.py @@ -167,3 +167,44 @@ class InstanceIpToNodePrimaryIpQuery(ConfdQuery): return QUERY_INTERNAL_ERROR return constants.CONFD_REPL_STATUS_OK, pnode_primary_ip + + +class NodesPipsQuery(ConfdQuery): + """A query for nodes primary IPs. + + It returns the list of nodes primary IPs. + + """ + def Exec(self, query): + """NodesPipsQuery main execution. + + """ + if query is None: + status = constants.CONFD_REPL_STATUS_OK + answer = self.reader.GetNodesPrimaryIps() + else: + status = constants.CONFD_REPL_STATUS_ERROR + answer = "non-empty node primary IPs query" + + return status, answer + + +class MasterCandidatesPipsQuery(ConfdQuery): + """A query for master candidates primary IPs. + + It returns the list of master candidates primary IPs. + + """ + def Exec(self, query): + """MasterCandidatesPipsQuery main execution. + + """ + if query is None: + status = constants.CONFD_REPL_STATUS_OK + answer = self.reader.GetMasterCandidatesPrimaryIps() + else: + status = constants.CONFD_REPL_STATUS_ERROR + answer = "non-empty master candidates primary IPs query" + + return status, answer + diff --git a/lib/confd/server.py b/lib/confd/server.py index 607a8dc8e..0df006163 100644 --- a/lib/confd/server.py +++ b/lib/confd/server.py @@ -52,6 +52,8 @@ class ConfdProcessor(object): constants.CONFD_REQ_NODE_PIP_BY_INSTANCE_IP: querylib.InstanceIpToNodePrimaryIpQuery, constants.CONFD_REQ_CLUSTER_MASTER: querylib.ClusterMasterQuery, + constants.CONFD_REQ_NODE_PIP_LIST: querylib.NodesPipsQuery, + constants.CONFD_REQ_MC_PIP_LIST: querylib.MasterCandidatesPipsQuery, } def __init__(self): diff --git a/lib/constants.py b/lib/constants.py index ee03bb25b..1ad446100 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -639,12 +639,16 @@ CONFD_REQ_PING = 0 CONFD_REQ_NODE_ROLE_BYNAME = 1 CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2 CONFD_REQ_CLUSTER_MASTER = 3 +CONFD_REQ_NODE_PIP_LIST = 4 +CONFD_REQ_MC_PIP_LIST = 5 CONFD_REQS = frozenset([ CONFD_REQ_PING, CONFD_REQ_NODE_ROLE_BYNAME, CONFD_REQ_NODE_PIP_BY_INSTANCE_IP, CONFD_REQ_CLUSTER_MASTER, + CONFD_REQ_NODE_PIP_LIST, + CONFD_REQ_MC_PIP_LIST, ]) CONFD_REPL_STATUS_OK = 0 diff --git a/lib/ssconf.py b/lib/ssconf.py index 56e89ec33..b08518a19 100644 --- a/lib/ssconf.py +++ b/lib/ssconf.py @@ -106,6 +106,14 @@ class SimpleConfigReader(object): if 'ip' in nic and nic['ip']: self._ip_to_instance[nic['ip']] = iname + self._nodes_primary_ips = [] + self._mc_primary_ips = [] + for node_name in self._config_data["nodes"]: + node = self._config_data["nodes"][node_name] + self._nodes_primary_ips.append(node["primary_ip"]) + if node["master_candidate"]: + self._mc_primary_ips.append(node["primary_ip"]) + return True # Clients can request a reload of the config file, so we export our internal @@ -187,6 +195,12 @@ class SimpleConfigReader(object): return None return self._config_data["instances"][instance]["primary_node"] + def GetNodesPrimaryIps(self): + return self._nodes_primary_ips + + def GetMasterCandidatesPrimaryIps(self): + return self._mc_primary_ips + class SimpleStore(object): """Interface to static cluster data. -- GitLab