[lnst] InterfaceManager: deconfigure masters before slaves
by Jiří Pírko
commit 953d6b537964e572b3b30a3e9408e5899d57846d
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Feb 14 11:34:51 2014 +0100
InterfaceManager: deconfigure masters before slaves
The device class now reads the IFLA_MASTER attribute (recieved through
netlink) of the device. This is later used to deconfigure masters before
deconfiguring slaves.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Slave/InterfaceManager.py | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index bc5793d..aa818fd 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -175,6 +175,7 @@ class Device(object):
self._conf_dict = None
self._ip = None
self._state = None
+ self._master = None
self._if_manager = if_manager
@@ -184,12 +185,14 @@ class Device(object):
self._name = nl_msg.get_attr("IFLA_IFNAME")
self._state = nl_msg.get_attr("IFLA_OPERSTATE")
self._ip = None #TODO
+ self._master = nl_msg.get_attr("IFLA_MASTER")
def update_netlink(self, nl_msg):
if self._if_index == nl_msg['index']:
self._hwaddr = normalize_hwaddr(nl_msg.get_attr("IFLA_ADDRESS"))
self._name = nl_msg.get_attr("IFLA_IFNAME")
self._ip = None #TODO
+ self._master = nl_msg.get_attr("IFLA_MASTER")
#send update msg
def get_if_index(self):
@@ -221,6 +224,10 @@ class Device(object):
return self._conf
def clear_configuration(self):
+ if self._master != None:
+ master_dev = self._if_manager.get_device(self._master)
+ master_dev.clear_configuration()
+
if self._conf != None:
self.down()
self.deconfigure()
@@ -233,6 +240,10 @@ class Device(object):
self._configured = True
def deconfigure(self):
+ if self._master != None:
+ master_dev = self._if_manager.get_device(self._master)
+ master_dev.deconfigure()
+
if self._conf != None and self._configured:
self._conf.deconfigure()
self._configured = False
10 years, 1 month
[PATCH] NetTestSlave: rescan devices on hello
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
There seems to be a bug on older kernels (2.6.32 in RHEL6.5) that
results in the RTM_NEWLINK netlink message being sent after the
RTM_DELLINK message when a device is removed. This causes the slave to
first delete the device from the database and subsequently add it again
even though it doesn't exist in the kernel anymore. Newer kernels don't
have this problem.
This commit fixes the behaviour by adding a call of the rescan_devices
method to the "hello" method. I also made the rescan_devices method
public.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/InterfaceManager.py | 5 +++--
lnst/Slave/NetTestSlave.py | 2 ++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index aa818fd..94153ed 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -33,7 +33,7 @@ class InterfaceManager(object):
self._nl_socket = IPRSocket()
self._nl_socket.bind()
- self._rescan_devices()
+ self.rescan_devices()
def map_if(self, if_id, if_index):
if if_id in self._id_mapping:
@@ -50,7 +50,8 @@ class InterfaceManager(object):
def get_nl_socket(self):
return self._nl_socket
- def _rescan_devices(self):
+ def rescan_devices(self):
+ self._devices = {}
devs = scan_netdevs()
for dev in devs:
if dev['index'] not in self._devices:
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 52679ee..50ccf13 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -69,6 +69,8 @@ class SlaveMethods:
self._cache.del_old_entries()
self.reset_file_transfers()
+ self._if_manager.rescan_devices()
+
date = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
self._log_ctl.set_recipe(recipe_path, expand=date)
sleep(1)
--
1.8.5.3
10 years, 1 month
[PATCH] NetTestSlave: fix cleanup
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
This commit removes the state variable _ctl_clean_exit. The original
idea was to use this variable to differentiate between the config_only
controller run from a controller crash/disconnection. However this posed
more problems than it solved so now the slave will simply do a complete
machine cleanup every time the "hello" method is called or when the
slave is terminated.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/NetTestSlave.py | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index a436f9f..52679ee 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -61,18 +61,13 @@ class SlaveMethods:
self._resource_table = {}
- self._ctl_clean_exit = True
-
def hello(self, recipe_path):
- if not self._ctl_clean_exit:
- self.machine_cleanup()
- self._ctl_clean_exit = True
+ self.machine_cleanup()
logging.info("Recieved a controller connection.")
self.clear_resource_table()
self._cache.del_old_entries()
self.reset_file_transfers()
- self._ctl_clean_exit = False
date = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
self._log_ctl.set_recipe(recipe_path, expand=date)
@@ -94,8 +89,6 @@ class SlaveMethods:
self._cache.del_old_entries()
self.reset_file_transfers()
self._remove_capture_files()
- self._if_manager.clear_if_mapping()
- self._ctl_clean_exit = True
return "bye"
def kill_cmds(self):
@@ -263,6 +256,7 @@ class SlaveMethods:
self._if_manager.clear_if_mapping()
self._cache.del_old_entries()
self.restore_system_config()
+ self._remove_capture_files()
return True
def clear_resource_table(self):
--
1.8.5.3
10 years, 1 month
[PATCH] Machine: fix static interface mapping
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
When reimplementing the slave configuration I changed the way how static
interfaces are initialized on the controller. This would work fine, but
I also removed a helpful error report. This commit fixes that.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Machine.py | 14 +++++++++-----
lnst/Slave/NetTestSlave.py | 13 +++++--------
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 193f611..75c0d8a 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -474,15 +474,19 @@ class Interface(object):
self._machine._rpc_call("set_device_down", self._id)
def initialize(self):
- phys_dev = self._machine._rpc_call("map_if_by_hwaddr",
- self._id, self._hwaddr)
+ phys_devs = self._machine._rpc_call("map_if_by_hwaddr",
+ self._id, self._hwaddr)
- if phys_dev != None:
- self.set_devname(phys_dev["name"])
- else:
+ if len(phys_devs) == 1:
+ self.set_devname(phys_devs[0]["name"])
+ elif len(phys_devs) < 1:
msg = "Device %s not found on machine %s" \
% (self.get_id(), self._machine.get_id())
raise MachineError(msg)
+ elif len(phys_devs) > 1:
+ msg = "More than one device with hwaddr %s found on machine %s" \
+ % (self._hwaddr, self._machine.get_id())
+ raise MachineError(msg)
self.down()
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index f81a23a..a436f9f 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -104,16 +104,13 @@ class SlaveMethods:
return "Commands killed"
def map_if_by_hwaddr(self, if_id, hwaddr):
- devices = self._if_manager.get_devices()
+ devices = self.get_devices_by_hwaddr(hwaddr)
- entry = None
- for dev in devices:
- if dev.get_hwaddr() == hwaddr:
- entry = {"name": dev.get_name(),
- "hwaddr": dev.get_hwaddr()}
- self._if_manager.map_if(if_id, dev.get_if_index())
+ if len(devices) == 1:
+ dev = self._if_manager.get_device_by_hwaddr(hwaddr)
+ self._if_manager.map_if(if_id, dev.get_if_index())
- return entry
+ return devices
def get_devices_by_devname(self, devname):
name_scan = self._if_manager.get_devices()
--
1.8.5.3
10 years, 1 month
[PATCH] NetTestController: cleanup of saved configuration waits for results
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
When cleaning up a saved configuration the controller will wait for a
result message from the slave when calling the "machine_cleanup" method.
Without this the controller would sometimes remove the virtual devices
before the slave had the time to deconfigure them which will cause an
exception on the slave.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/NetTestController.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py
index 6e0954f..1831a71 100644
--- a/lnst/Controller/NetTestController.py
+++ b/lnst/Controller/NetTestController.py
@@ -465,6 +465,10 @@ class NetTestController:
logging.debug("Calling cleanup on slave '%s'" % hostname)
send_data(rpc_con, rpc_msg)
+ while True:
+ msg = recv_data(rpc_con)
+ if msg['type'] == 'result':
+ break
rpc_con.close()
libvirt_dom = machine["libvirt_dom"]
--
1.8.5.3
10 years, 1 month
[PATCH] InterfaceManager: deconfigure masters before slaves
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
The device class now reads the IFLA_MASTER attribute (recieved through
netlink) of the device. This is later used to deconfigure masters before
deconfiguring slaves.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/InterfaceManager.py | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index bc5793d..aa818fd 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -175,6 +175,7 @@ class Device(object):
self._conf_dict = None
self._ip = None
self._state = None
+ self._master = None
self._if_manager = if_manager
@@ -184,12 +185,14 @@ class Device(object):
self._name = nl_msg.get_attr("IFLA_IFNAME")
self._state = nl_msg.get_attr("IFLA_OPERSTATE")
self._ip = None #TODO
+ self._master = nl_msg.get_attr("IFLA_MASTER")
def update_netlink(self, nl_msg):
if self._if_index == nl_msg['index']:
self._hwaddr = normalize_hwaddr(nl_msg.get_attr("IFLA_ADDRESS"))
self._name = nl_msg.get_attr("IFLA_IFNAME")
self._ip = None #TODO
+ self._master = nl_msg.get_attr("IFLA_MASTER")
#send update msg
def get_if_index(self):
@@ -221,6 +224,10 @@ class Device(object):
return self._conf
def clear_configuration(self):
+ if self._master != None:
+ master_dev = self._if_manager.get_device(self._master)
+ master_dev.clear_configuration()
+
if self._conf != None:
self.down()
self.deconfigure()
@@ -233,6 +240,10 @@ class Device(object):
self._configured = True
def deconfigure(self):
+ if self._master != None:
+ master_dev = self._if_manager.get_device(self._master)
+ master_dev.deconfigure()
+
if self._conf != None and self._configured:
self._conf.deconfigure()
self._configured = False
--
1.8.5.3
10 years, 1 month
[lnst] Normalize MAC addresses from mac_pool generator
by Jiří Pírko
commit 4f4b36a7c5eaf2066b07c9aea98d6349f98a8c8f
Author: Jan Tluka <jtluka(a)redhat.com>
Date: Tue Feb 11 14:30:12 2014 +0100
Normalize MAC addresses from mac_pool generator
The addresses from mac_pool generator were not sanitized so any address
containing some letter would fail comparison check because of case
sensitivity. I used normalize_hwaddr() function that we used globally
in the code for hardware address manipulation.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Controller/Machine.py | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
---
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 78ba622..193f611 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -558,8 +558,9 @@ class VirtualInterface(Interface):
msg = "Device with hwaddr %s already exists" % self._hwaddr
raise MachineError(msg)
else:
+ mac_pool = self._machine.get_mac_pool()
while True:
- self._hwaddr = self._machine.get_mac_pool().get_addr()
+ self._hwaddr = normalize_hwaddr(mac_pool.get_addr())
query = self._machine._rpc_call('get_devices_by_hwaddr',
self._hwaddr)
if not len(query):
10 years, 1 month
[PATCH] Normalize MAC addresses from mac_pool generator
by Jan Tluka
The addresses from mac_pool generator were not sanitized so any address
containing some letter would fail comparison check because of case
sensitivity. I used normalize_hwaddr() function that we used globally
in the code for hardware address manipulation.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Controller/Machine.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 78ba622..193f611 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -558,8 +558,9 @@ class VirtualInterface(Interface):
msg = "Device with hwaddr %s already exists" % self._hwaddr
raise MachineError(msg)
else:
+ mac_pool = self._machine.get_mac_pool()
while True:
- self._hwaddr = self._machine.get_mac_pool().get_addr()
+ self._hwaddr = normalize_hwaddr(mac_pool.get_addr())
query = self._machine._rpc_call('get_devices_by_hwaddr',
self._hwaddr)
if not len(query):
--
1.8.1.4
10 years, 1 month
[lnst] NetUtils: add netlink msg to scan_netdevs return
by Jiří Pírko
commit 8468135d308ddf3c8d6a6b5a7770aebab9580d89
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Mon Feb 10 12:13:42 2014 +0100
NetUtils: add netlink msg to scan_netdevs return
The list returned by the scan_netdevs function will now also contain the
netlink message describing the device this will be used later when
creating the slave local device database.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Common/NetUtils.py | 11 ++++++-----
1 files changed, 6 insertions(+), 5 deletions(-)
---
diff --git a/lnst/Common/NetUtils.py b/lnst/Common/NetUtils.py
index b649483..79d2de7 100644
--- a/lnst/Common/NetUtils.py
+++ b/lnst/Common/NetUtils.py
@@ -52,12 +52,13 @@ def scan_netdevs():
if part["header"]["type"] == RTM_NEWLINK:
new_link = {}
- for name, value in part["attrs"]:
- if name == "IFLA_IFNAME":
- new_link["name"] = value
- elif name == "IFLA_ADDRESS":
- new_link["hwaddr"] = normalize_hwaddr(value)
+ new_link["netlink_msg"] = part
new_link["index"] = part["index"]
+ new_link["name"] = part.get_attr("IFLA_IFNAME")
+
+ hwaddr = part.get_attr("IFLA_ADDRESS")
+ new_link["hwaddr"] = normalize_hwaddr(hwaddr)
+
scan.append(new_link)
nl_socket.close()
10 years, 1 month
[PATCH] NetUtils: add netlink msg to scan_netdevs return
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
The list returned by the scan_netdevs function will now also contain the
netlink message describing the device this will be used later when
creating the slave local device database.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Common/NetUtils.py | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/lnst/Common/NetUtils.py b/lnst/Common/NetUtils.py
index b649483..79d2de7 100644
--- a/lnst/Common/NetUtils.py
+++ b/lnst/Common/NetUtils.py
@@ -52,12 +52,13 @@ def scan_netdevs():
if part["header"]["type"] == RTM_NEWLINK:
new_link = {}
- for name, value in part["attrs"]:
- if name == "IFLA_IFNAME":
- new_link["name"] = value
- elif name == "IFLA_ADDRESS":
- new_link["hwaddr"] = normalize_hwaddr(value)
+ new_link["netlink_msg"] = part
new_link["index"] = part["index"]
+ new_link["name"] = part.get_attr("IFLA_IFNAME")
+
+ hwaddr = part.get_attr("IFLA_ADDRESS")
+ new_link["hwaddr"] = normalize_hwaddr(hwaddr)
+
scan.append(new_link)
nl_socket.close()
--
1.8.5.3
10 years, 1 month