From 238246415007957e5806ccc5914d0b6d09387a18 Mon Sep 17 00:00:00 2001
From: Luca Bigliardi <shammash@google.com>
Date: Wed, 30 Sep 2009 14:51:11 +0100
Subject: [PATCH] Extend confd instances ips query

The query now accepts a link parameter.

Signed-off-by: Luca Bigliardi <shammash@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>
---
 lib/confd/querylib.py | 12 +++++-------
 lib/ssconf.py         | 16 ++++++++++++++--
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py
index 5ede415f7..46d25cb33 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 a0ba135a4..582564a73 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):
-- 
GitLab