diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py index 5ede415f728af999ff179ddb4ac9f4090140b0f9..46d25cb33ded82b8dddef3a1328155d7c1b9479c 100644 --- a/lib/confd/querylib.py +++ b/lib/confd/querylib.py @@ -212,19 +212,17 @@ class MasterCandidatesPipsQuery(ConfdQuery): class InstancesIpsQuery(ConfdQuery): """A query for instances IPs. - It returns the list of instances IPs. + It returns the list of IPs of NICs connected to the requested link or all the + instances IPs if no link is submitted. """ def Exec(self, query): """InstancesIpsQuery main execution. """ - if query is None: - status = constants.CONFD_REPL_STATUS_OK - answer = self.reader.GetInstancesIps() - else: - status = constants.CONFD_REPL_STATUS_ERROR - answer = "non-empty instances IPs query" + link = query + status = constants.CONFD_REPL_STATUS_OK + answer = self.reader.GetInstancesIps(link) return status, answer diff --git a/lib/ssconf.py b/lib/ssconf.py index a0ba135a4f3d13de1412c66325a374374e7b9170..582564a73256c57186e0126b8e319553bd8466d1 100644 --- a/lib/ssconf.py +++ b/lib/ssconf.py @@ -34,6 +34,7 @@ from ganeti import errors from ganeti import constants from ganeti import utils from ganeti import serializer +from ganeti import objects SSCONF_LOCK_TIMEOUT = 10 @@ -101,12 +102,18 @@ class SimpleConfigReader(object): self._ip_to_instance = {} self._instances_ips = [] + self._inst_ips_by_link = {} + c_nparams = self._config_data['cluster']['nicparams'][constants.PP_DEFAULT] for iname in self._config_data['instances']: instance = self._config_data['instances'][iname] for nic in instance['nics']: if 'ip' in nic and nic['ip']: self._instances_ips.append(nic['ip']) self._ip_to_instance[nic['ip']] = iname + params = objects.FillDict(c_nparams, nic['nicparams']) + if not params['link'] in self._inst_ips_by_link: + self._inst_ips_by_link[params['link']] = [] + self._inst_ips_by_link[params['link']].append(nic['ip']) self._nodes_primary_ips = [] self._mc_primary_ips = [] @@ -203,8 +210,13 @@ class SimpleConfigReader(object): def GetMasterCandidatesPrimaryIps(self): return self._mc_primary_ips - def GetInstancesIps(self): - return self._instances_ips + def GetInstancesIps(self, link): + if link is None: + return self._instances_ips + if link in self._inst_ips_by_link: + return self._inst_ips_by_link[link] + else: + return [] class SimpleStore(object):