From: Ondrej Lichtner <olichtne(a)redhat.com>
This commit makes the InterfaceManager send update messages to the
controller. These contain changes in devname and hwaddress of network
devices. This fixes the regression that controller would use old
information when resolving template functions.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Machine.py | 13 +++++++------
lnst/Slave/InterfaceManager.py | 20 +++++++++++++++++---
lnst/Slave/NetTestSlave.py | 4 ++--
3 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index d73aedd..a849e3b 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -85,12 +85,13 @@ class Machine(object):
return iface
def interface_update(self, if_data):
- for iface in self._interfaces:
- try:
- if iface.get_devname() == if_data["devname"]:
- iface.set_hwaddr(if_data["hwaddr"])
- except:
- pass
+ try:
+ iface = self.get_interface(if_data["if_id"])
+ except:
+ iface = None
+ if iface:
+ iface.set_hwaddr(if_data["hwaddr"])
+ iface.set_devname(if_data["devname"])
#
# Factory methods for constructing interfaces on this machine. The
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index c120555..a69e4d4 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -26,7 +26,7 @@ class IfMgrError(Exception):
pass
class InterfaceManager(object):
- def __init__(self):
+ def __init__(self, server_handler):
self._devices = {}
self._id_mapping = {} #id from the ctl to device
@@ -35,6 +35,8 @@ class InterfaceManager(object):
self.rescan_devices()
+ self._server_handler = server_handler
+
def map_if(self, if_id, if_index):
if if_id in self._id_mapping:
raise IfMgrError("Interface already mapped.")
@@ -67,7 +69,14 @@ class InterfaceManager(object):
def _handle_netlink_msg(self, msg):
if msg['header']['type'] == RTM_NEWLINK:
if msg['index'] in self._devices:
- self._devices[msg['index']].update_netlink(msg)
+ update_msg = self._devices[msg['index']].update_netlink(msg)
+ if update_msg != None:
+ for if_id, dev in self._id_mapping.iteritems():
+ if dev.get_if_index() == msg['index']:
+ update_msg["if_id"] = if_id
+ break
+ if "if_id" in update_msg:
+ self._server_handler.send_data_to_ctl(update_msg)
else:
dev = None
for d in self._id_mapping.values():
@@ -194,7 +203,12 @@ class Device(object):
self._name = nl_msg.get_attr("IFLA_IFNAME")
self._ip = None #TODO
self._master = nl_msg.get_attr("IFLA_MASTER")
- #send update msg
+
+ #return an update message that will be sent to the controller
+ return {"type": "if_update",
+ "devname": self._name,
+ "hwaddr": self._hwaddr}
+ return None
def get_if_index(self):
return self._if_index
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index dca0a59..eb1dcc9 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -417,10 +417,10 @@ class NetTestSlave:
die_when_parent_die()
self._cmd_context = NetTestCommandContext()
- self._if_manager = InterfaceManager()
+ self._server_handler = ServerHandler(("", port))
+ self._if_manager = InterfaceManager(self._server_handler)
self._methods = SlaveMethods(self._cmd_context, log_ctl,
self._if_manager)
- self._server_handler = ServerHandler(("", port))
self.register_die_signal(signal.SIGHUP)
self.register_die_signal(signal.SIGINT)
--
1.8.5.3
Show replies by thread