[PATCH 1/2] Controller: conditional VirtUtils import
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
Since running the lnst controller doesn't necessarily depend on having
libvirt running or installed this commit adds a condition to the import
of the VirtUtils module. This will fix lnst-ctl crashing on machines
that don't have libvirt running.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Machine.py | 6 +++++-
lnst/Controller/NetTestController.py | 5 ++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 75c0d8a..25749e0 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -24,11 +24,15 @@ from pprint import pprint, pformat
from lnst.Common.Config import lnst_config
from lnst.Common.Logs import log_exc_traceback
from lnst.Common.NetUtils import MacPool, normalize_hwaddr
-from lnst.Common.VirtUtils import VirtNetCtl, VirtDomainCtl
from lnst.Common.Utils import wait_for, md5sum, dir_md5sum, create_tar_archive
+from lnst.Common.Utils import check_process_running
from lnst.Common.ConnectionHandler import send_data, recv_data
from lnst.Common.ConnectionHandler import ConnectionHandler
+# conditional support for libvirt
+if check_process_running("libvirtd"):
+ from lnst.Common.VirtUtils import VirtNetCtl, VirtDomainCtl
+
DEFAULT_TIMEOUT = 60
class MachineError(Exception):
diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py
index 1831a71..39bc83a 100644
--- a/lnst/Controller/NetTestController.py
+++ b/lnst/Controller/NetTestController.py
@@ -21,7 +21,6 @@ import imp
from time import sleep
from xmlrpclib import Binary
from lnst.Common.NetUtils import MacPool
-from lnst.Common.VirtUtils import VirtNetCtl, VirtDomainCtl
from lnst.Common.Utils import wait_for, md5sum, dir_md5sum, create_tar_archive
from lnst.Common.Utils import check_process_running, bool_it
from lnst.Common.NetTestCommand import NetTestCommandContext, NetTestCommand
@@ -37,6 +36,10 @@ from lnst.Common.Colours import decorate_with_preset
from lnst.Common.NetUtils import test_tcp_connection
import lnst.Controller.Task as Task
+# conditional support for libvirt
+if check_process_running("libvirtd"):
+ from lnst.Common.VirtUtils import VirtNetCtl, VirtDomainCtl
+
class NetTestError(Exception):
pass
--
1.8.5.3
10 years, 2 months
[PATCH] NetConfigDevice: fix bridge configuration
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
Just typos that raised exceptions...
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/NetConfigDevice.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index ee93ec8..e279d66 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -131,15 +131,15 @@ class NetConfigDeviceBridge(NetConfigDeviceGeneric):
_modulename = "bridge"
def _add_rm_bridge(self, prefix):
- exec_cmd("brctl %sbr %s " % (prefix, self._dev_conf["name"]))
+ exec_cmd("brctl %sbr %s " % (prefix, self._dev_config["name"]))
- def _add_rm_port(self, prefix, slave_if_index):
+ def _add_rm_port(self, prefix, slave_id):
port_name = self._if_manager.get_mapped_device(slave_id).get_name()
- exec_cmd("brctl %sif %s %s" % (prefix, self._dev_conf["name"],
+ exec_cmd("brctl %sif %s %s" % (prefix, self._dev_config["name"],
port_name))
def _add_rm_ports(self, prefix):
- for slave_id in get_slaves(self._dev_conf):
+ for slave_id in get_slaves(self._dev_config):
self._add_rm_port(prefix, slave_id)
def configure(self):
--
1.8.5.3
10 years, 2 months
[PATCH] InterfaceManager: call master deconfiguration just once
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
When the deconfigure_all method of the InterfaceManager is called we do
not listen to netlink updates between device deconfigurations. This
results in the master being deconfigured by each associated slave and
raising an exception. This commit fixes that.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/InterfaceManager.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index 94153ed..c120555 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -227,7 +227,8 @@ class Device(object):
def clear_configuration(self):
if self._master != None:
master_dev = self._if_manager.get_device(self._master)
- master_dev.clear_configuration()
+ if master_dev != None:
+ master_dev.clear_configuration()
if self._conf != None:
self.down()
@@ -243,7 +244,8 @@ class Device(object):
def deconfigure(self):
if self._master != None:
master_dev = self._if_manager.get_device(self._master)
- master_dev.deconfigure()
+ if master_dev != None:
+ master_dev.deconfigure()
if self._conf != None and self._configured:
self._conf.deconfigure()
--
1.8.5.3
10 years, 2 months
[PATCH] NetConfigDevice: cleanup unused functions
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
This commit removes the functions NetConfigDeviceType and
NetConfigDeviceAllCleanup that are no longer used.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/NetConfigDevice.py | 19 -------------------
1 file changed, 19 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 997f22d..ee93ec8 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -311,22 +311,3 @@ def NetConfigDevice(dev_config, if_manager):
return nm_type_class_mapping[dev_config["type"]](dev_config, if_manager)
else:
return type_class_mapping[dev_config["type"]](dev_config, if_manager)
-
-def NetConfigDeviceType(netdev, config):
- '''
- Class dispatcher for classmethods
- '''
- if is_nm_managed(netdev, config):
- return nm_type_class_mapping[netdev["type"]]
- else:
- return type_class_mapping[netdev["type"]]
-
-def NetConfigDeviceAllCleanup():
- logging.debug("Performing interface type cleanup.")
- if check_process_running("NetworkManager") and \
- lnst_config.get_option("environment", "use_nm"):
- for dev_type in nm_type_class_mapping:
- nm_type_class_mapping[dev_type].type_cleanup()
- else:
- for dev_type in type_class_mapping:
- type_class_mapping[dev_type].type_cleanup()
--
1.8.5.3
10 years, 2 months
[PATCH] remove NetConfig.py and NetConfigDevNames
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
Cleanup of deprecated modules. These modules are no longer needed as
their functionality is now handled by the InterfaceManager module.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/NetConfig.py | 169 ----------------------------------------
lnst/Slave/NetConfigDevNames.py | 87 ---------------------
lnst/Slave/NetTestSlave.py | 1 -
3 files changed, 257 deletions(-)
delete mode 100644 lnst/Slave/NetConfig.py
delete mode 100644 lnst/Slave/NetConfigDevNames.py
diff --git a/lnst/Slave/NetConfig.py b/lnst/Slave/NetConfig.py
deleted file mode 100644
index f622848..0000000
--- a/lnst/Slave/NetConfig.py
+++ /dev/null
@@ -1,169 +0,0 @@
-"""
-This module defines NetConfig class useful for netdevs config
-
-Copyright 2011 Red Hat, Inc.
-Licensed under the GNU General Public License, version 2 as
-published by the Free Software Foundation; see COPYING for details.
-"""
-
-__author__ = """
-jpirko(a)redhat.com (Jiri Pirko)
-"""
-
-import logging
-import copy
-from lnst.Slave.NetConfigDevNames import NetConfigDevNames
-from lnst.Slave.NetConfigDevice import NetConfigDevice
-from lnst.Slave.NetConfigDevice import NetConfigDeviceType
-from lnst.Slave.NetConfigCommon import get_slaves
-
-class NetConfig:
- def __init__(self):
- devnames = NetConfigDevNames()
- config = {}
- self._devnames = devnames
- self._config = config
- self._dev_configs = {}
-
- def _get_leafs(self):
- leafs = []
- for dev_id in self._config:
- netdev = self._config[dev_id]
- if len(get_slaves(netdev)) == 0:
- leafs.append(dev_id)
- return leafs
-
- def _get_masters(self, slave_dev_id):
- masters = []
- for dev_id in self._config:
- netdev = self._config[dev_id]
- if slave_dev_id in get_slaves(netdev):
- masters.append(dev_id)
- return masters
-
- def _get_dev_order(self):
- order = self._get_leafs()
- prev_order = []
- while order != prev_order:
- prev_order = list(order)
- for dev_id in prev_order:
- for master in self._get_masters(dev_id):
- if master and not master in order:
- order.append(master)
- return order
-
- def _get_used_types(self):
- types = set()
- for dev_id in self._config:
- netdev = self._config[dev_id]
- types.add(netdev["type"])
- return types
-
- def add_interface_config(self, if_id, config):
- dev_type = config["type"]
- class_initialized = dev_type in self._get_used_types()
-
- self._config[if_id] = config
-
- self._devnames.rescan_netdevs()
- self._devnames.assign_name(if_id, self._config)
-
- dev_config = NetConfigDevice(config, self._config)
- self._dev_configs[if_id] = dev_config
-
- if not class_initialized:
- logging.info("Initializing '%s' device class", dev_type)
- dev_config.type_init()
-
- def remove_interface_config(self, if_id):
- config = self._config[if_id]
- del self._config[if_id]
- del self._dev_configs[if_id]
-
- dev_type = config["type"]
- if not dev_type in self._get_used_types():
- logging.info("Cleaning up '%s' device class.", dev_type)
- NetConfigDeviceType(config, self._config).type_cleanup()
-
- def get_interface_config(self, if_id):
- return self._config[if_id]
-
- def configure(self, dev_id):
- device = self._dev_configs[dev_id]
- device.configure()
- device.up()
-
- def configure_all(self):
- dev_order = self._get_dev_order()
- for dev_id in dev_order:
- self.configure(dev_id)
-
- def deconfigure(self, dev_id):
- device = self._dev_configs[dev_id]
- device.down()
- device.deconfigure()
-
- def deconfigure_all(self):
- logging.debug("Deconfiguring interfaces.")
- dev_order = self._get_dev_order()
- for dev_id in reversed(dev_order):
- self.deconfigure(dev_id)
-
- def dump_config(self):
- return copy.deepcopy(self._config)
-
- def _find_free_id(self):
- i = 1
- while i in self._config:
- i += 1
- return i
-
- def set_notes(self, dev_id, notes):
- self._config[dev_id]["notes"] = notes
-
- def get_notes(self, dev_id):
- return self._config[dev_id]["notes"]
-
- def netdev_add(self, dev_type, params=None):
- dev_id = self._find_free_id()
- netdev = {"type": dev_type}
- if params:
- if "options" in params:
- netdev["options"] = params["options"]
- if "slaves" in params:
- netdev["slaves"] = params["slaves"]
- self._config[dev_id] = netdev
-
- self._devnames.rescan_netdevs()
- self._devnames.assign_name(dev_id, self._config)
- return dev_id
-
- def netdev_del(self, dev_id):
- del self._config[dev_id]
-
- def slave_add(self, dev_id, slave_dev_id):
- netdev = self._config[dev_id]
- if not "slaves" in netdev:
- netdev["slaves"] = []
- elif slave_dev_id in netdev["slaves"]:
- return False
- netdev["slaves"].append(slave_dev_id)
- device = NetConfigDevice(netdev, self._config)
- device.slave_add(slave_dev_id)
- return True
-
- def slave_del(self, dev_id, slave_dev_id):
- netdev = self._config[dev_id]
- if not "slaves" in netdev or not slave_dev_id in netdev["slaves"]:
- return False
- netdev["slaves"].remove(slave_dev_id)
- device = NetConfigDevice(netdev, self._config)
- device.slave_del(slave_dev_id)
- return True
-
- def cleanup(self):
- for dev_id in self._config.keys():
- del self._config[dev_id]
- for dev_id in self._dev_configs.keys():
- del self._dev_configs[dev_id]
- self._devnames.rescan_netdevs()
diff --git a/lnst/Slave/NetConfigDevNames.py b/lnst/Slave/NetConfigDevNames.py
deleted file mode 100644
index 8033b35..0000000
--- a/lnst/Slave/NetConfigDevNames.py
+++ /dev/null
@@ -1,87 +0,0 @@
-"""
-This module defines NetConfigDevNames class useful to obtain names for devices
-
-Copyright 2011 Red Hat, Inc.
-Licensed under the GNU General Public License, version 2 as
-published by the Free Software Foundation; see COPYING for details.
-"""
-
-__author__ = """
-jpirko(a)redhat.com (Jiri Pirko)
-"""
-
-import logging
-import os
-from lnst.Slave.NetConfigCommon import get_option
-from lnst.Common.NetUtils import normalize_hwaddr
-from lnst.Common.NetUtils import scan_netdevs
-
-class NetConfigDevNames:
- def __init__(self):
- self._scan = scan_netdevs()
-
- def rescan_netdevs(self):
- self._scan = scan_netdevs()
-
- def assign_name_by_scan(self, dev_id, netdev):
- if (not "hwaddr" in netdev or
- "name" in netdev): # name was previously assigned
- return
-
- hwaddr = normalize_hwaddr(netdev["hwaddr"])
- for entry in self._scan:
- if hwaddr == entry["hwaddr"]:
- netdev["name"] = entry["name"]
- if not "name" in netdev:
- logging.error("Name for addr \"%s\" (netdevice id \"%s\") not found"
- % (hwaddr, dev_id))
- raise Exception
-
- def _is_name_used(self, name, config):
- for key in config:
- netdev = config[key]
- if "name" in netdev:
- if netdev["name"] == name:
- return True
- return False
-
- def _assign_name_generic(self, prefix, netdev, config):
- index = 0
- while (self._is_name_used(prefix + str(index), config)):
- index += 1
- netdev["name"] = prefix + str(index)
-
- def _assign_name_bond(self, netdev, config):
- self._assign_name_generic("t_bond", netdev, config)
-
- def _assign_name_bridge(self, netdev, config):
- self._assign_name_generic("t_br", netdev, config)
-
- def _assign_name_macvlan(self, netdev, config):
- self._assign_name_generic("t_macvlan", netdev, config)
-
- def _assign_name_team(self, netdev, config):
- self._assign_name_generic("t_team", netdev, config)
-
- def _assign_name_vlan(self, netdev, config):
- real_netdev = config[netdev["slaves"][0]]
- vlan_tci = get_option(netdev, "vlan_tci")
- netdev["name"] = "%s.%s" % (real_netdev["name"], vlan_tci)
-
- def assign_name(self, dev_id, config):
- netdev = config[dev_id]
- if "name" in netdev:
- return
- dev_type = netdev["type"]
- if dev_type == "eth":
- self.assign_name_by_scan(dev_id, netdev)
- elif dev_type == "bond":
- self._assign_name_bond(netdev, config)
- elif dev_type == "bridge":
- self._assign_name_bridge(netdev, config)
- elif dev_type == "macvlan":
- self._assign_name_macvlan(netdev, config)
- elif dev_type == "team":
- self._assign_name_team(netdev, config)
- elif dev_type == "vlan":
- self._assign_name_vlan(netdev, config)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 50ccf13..28c595e 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -30,7 +30,6 @@ from lnst.Common.ExecCmd import exec_cmd
from lnst.Common.ResourceCache import ResourceCache
from lnst.Common.NetTestCommand import NetTestCommandContext
from lnst.Common.NetTestCommand import CommandException, NetTestCommand
-from lnst.Slave.NetConfig import NetConfig
from lnst.Slave.NmConfigDevice import is_nm_managed_by_name
from lnst.Common.Utils import check_process_running
from lnst.Common.ConnectionHandler import recv_data, send_data
--
1.8.5.3
10 years, 2 months
virtualization software is currently required by lnst
by Jan Tluka
Hi, I've hit following traceback:
Traceback (most recent call last):
File "/usr/bin/lnst-ctl", line 24, in <module>
from lnst.Controller.NetTestController import NetTestController, NetTestError
File "/usr/lib/python2.7/site-packages/lnst/Controller/NetTestController.py", line 24, in <module>
from lnst.Common.VirtUtils import VirtNetCtl, VirtDomainCtl
File "/usr/lib/python2.7/site-packages/lnst/Common/VirtUtils.py", line 23, in <module>
_libvirt_conn = libvirt.open(None)
File "/usr/lib64/python2.7/site-packages/libvirt.py", line 236, in open
if ret is None:raise libvirtError('virConnectOpen() failed')
libvirt.libvirtError: Failed to connect socket to
'/var/run/libvirt/libvirt-sock': No such file or directory
This leads me to the question whether we should implement this
differently in on-demand way, e.g. set _libvirt_conn to None and have a
function that initiates this connection once we know that the guests
will be used. Currently we're relying on virtualization software
installed. In case the pool consists only from bare metal machines this
is not guaranteed.
Any opinion on this?
-Jan
10 years, 2 months
[lnst] NetTestSlave: rescan devices on hello
by Jiří Pírko
commit d2b69ec4633db32f6ad2cac1302fe31397a977e6
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Feb 14 11:34:55 2014 +0100
NetTestSlave: rescan devices on hello
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>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
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)
10 years, 2 months
[lnst] NetTestSlave: fix cleanup
by Jiří Pírko
commit 8d111e3644b07b57ca1bf202f12dd67a41ba765a
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Feb 14 11:34:54 2014 +0100
NetTestSlave: fix cleanup
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>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Slave/NetTestSlave.py | 10 ++--------
1 files 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):
10 years, 2 months
[lnst] Machine: fix static interface mapping
by Jiří Pírko
commit 3bd29d836e8f1b2d0bf2f709ede7a42af6527652
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Feb 14 11:34:53 2014 +0100
Machine: fix static interface mapping
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>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
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()
10 years, 2 months
[lnst] NetTestController: cleanup of saved configuration waits for results
by Jiří Pírko
commit 517e1036ca063b6290cc44547c99c14f2cd2df9c
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Feb 14 11:34:52 2014 +0100
NetTestController: cleanup of saved configuration waits for results
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>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Controller/NetTestController.py | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
---
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"]
10 years, 2 months