diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py index 0aaf04cd065f808ec533e7f0e3a7bdf39f7f3d4d..11dad046fb50de95cd320ff42197dec07810edbb 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 607a8dc8e1c22f05fffa15c90783fcab5132264f..0df0061636d323a8a65cbe5fd34ecb5a37e783f7 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 ee03bb25b5217dc5810a842540e02ea616f7e7a0..1ad446100aac8e0ec85ae4052609e97045e20ba2 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 56e89ec33d48367aaaf364eb2edd4607691bf59c..b08518a19fd0268d4c8d02aec1b00041d14c706f 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.