+ Both libvirt and KVM had nearly identical needs_restart
implimentations. This patch allows them to inherit common checks while
allowing specialty checks via subclass overrides.
+ Fix networking bug in needs_restart() for virt-kvm and virt-libvirt.
Before each test, preprocess_vm() checks any VM instances stored in
env file against requested parameters, using vm.needs_restart(). However,
as implemented, only parameters encoded on the qemu or virt-install
command-line are tested. This patch adds a check to also compare networking
parameters.
N.B. It does NOT verify non-networking related hot-added devices.
Signed-off-by: Chris Evich<[email protected]>
---
client/tests/virt/virttest/kvm_vm.py | 18 +++---------------
client/tests/virt/virttest/libvirt_vm.py | 30 ++++++++----------------------
client/tests/virt/virttest/virt_vm.py | 27 +++++++++++++++++++++++++++
3 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/client/tests/virt/virttest/kvm_vm.py
b/client/tests/virt/virttest/kvm_vm.py
index 078ef0f..247f0eb 100644
--- a/client/tests/virt/virttest/kvm_vm.py
+++ b/client/tests/virt/virttest/kvm_vm.py
@@ -157,7 +157,7 @@ class VM(virt_vm.BaseVM):
return VM(name, params, root_dir, address_cache, state)
- def __make_qemu_command(self, name=None, params=None, root_dir=None):
+ def make_create_command(self, name=None, params=None, root_dir=None):
"""
Generate a qemu command line. All parameters are optional. If a
parameter is not supplied, the corresponding value stored in the
@@ -1490,7 +1490,7 @@ class VM(virt_vm.BaseVM):
# Generate basic parameter values for all NICs and create TAP fd
for nic in self.virtnet:
# fill in key values, validate nettype
- # note: __make_qemu_command() calls vm.add_nic (i.e. on a copy)
+ # note: make_create_command() calls vm.add_nic (i.e. on a copy)
nic = self.add_nic(**dict(nic)) # implied add_netdev
if mac_source:
# Will raise exception if source doesn't
@@ -1580,7 +1580,7 @@ class VM(virt_vm.BaseVM):
raise virt_vm.VMPAError(pa_type)
# Make qemu command
- qemu_command = self.__make_qemu_command()
+ qemu_command = self.make_create_command()
# Add migration parameters if required
if migration_mode == "tcp":
@@ -2624,18 +2624,6 @@ class VM(virt_vm.BaseVM):
migration_exec_cmd="cat "+path, mac_source=self)
self.verify_status('running') # Throws exception if not
- def needs_restart(self, name, params, basedir):
- """
- Verifies whether the current qemu commandline matches the requested
- one, based on the test parameters.
- """
- if (self.__make_qemu_command() !=
- self.__make_qemu_command(name, params, basedir)):
- logging.debug("VM params in env don't match requested,
restarting.")
- return True
- else:
- logging.debug("VM params in env do match requested, continuing.")
- return False
def pause(self):
"""
diff --git a/client/tests/virt/virttest/libvirt_vm.py
b/client/tests/virt/virttest/libvirt_vm.py
index 2ec7cf0..4e03835 100644
--- a/client/tests/virt/virttest/libvirt_vm.py
+++ b/client/tests/virt/virttest/libvirt_vm.py
@@ -104,7 +104,7 @@ class VM(virt_vm.BaseVM):
@param name: The name of the object
@param params: A dict containing VM params
- (see method __make_libvirt_command for a full description)
+ (see method make_create_command for a full description)
@param root_dir: Base directory for relative filenames
@param address_cache: A dict that maps MAC addresses to IP addresses
@param state: If provided, use this as self.__dict__
@@ -250,7 +250,7 @@ class VM(virt_vm.BaseVM):
@param root_dir: Optional new base directory for relative filenames
@param address_cache: A dict that maps MAC addresses to IP addresses
@param copy_state: If True, copy the original VM's state to the clone.
- Mainly useful for __make_libvirt_command().
+ Mainly useful for make_create_command().
"""
if name is None:
name = self.name
@@ -267,7 +267,7 @@ class VM(virt_vm.BaseVM):
return VM(name, params, root_dir, address_cache, state)
- def __make_libvirt_command(self, name=None, params=None, root_dir=None):
+ def make_create_command(self, name=None, params=None, root_dir=None):
"""
Generate a libvirt command line. All parameters are optional. If a
parameter is not supplied, the corresponding value stored in the
@@ -498,7 +498,7 @@ class VM(virt_vm.BaseVM):
result += ',mac=%s' % mac
elif mac: # possible to specify --mac w/o --network
result += " --mac=%s" % mac
- logging.debug("vm.__make_libvirt_command.add_nic returning: %s"
+ logging.debug("vm.make_create_command.add_nic returning: %s"
% result)
return result
@@ -723,9 +723,9 @@ class VM(virt_vm.BaseVM):
# setup networking parameters
for nic in vm.virtnet:
- # __make_libvirt_command can be called w/o vm.create()
+ # make_create_command can be called w/o vm.create()
nic = vm.add_nic(**dict(nic))
- logging.debug("__make_libvirt_command() setting up command for"
+ logging.debug("make_create_command() setting up command for"
" nic: %s" % str(nic))
virt_install_cmd += add_nic(help,nic)
@@ -881,13 +881,13 @@ class VM(virt_vm.BaseVM):
logging.debug("Copying mac for nic %s from VM %s"
% (nic.nic_name, mac_source.nam))
nic_params['mac'] =
mac_source.get_mac_address(nic.nic_name)
- # __make_libvirt_command() calls vm.add_nic (i.e. on a copy)
+ # make_create_command() calls vm.add_nic (i.e. on a copy)
nic = self.add_nic(**nic_params)
logging.debug('VM.create activating nic %s' % nic)
self.activate_nic(nic.nic_name)
# Make qemu command
- install_command = self.__make_libvirt_command()
+ install_command = self.make_create_command()
logging.info("Running libvirt command (reformatted):")
for item in install_command.replace(" -", " \n
-").splitlines():
@@ -1184,20 +1184,6 @@ class VM(virt_vm.BaseVM):
return self.wait_for_login(nic_index, timeout=timeout)
- def needs_restart(self, name, params, basedir):
- """
- Verifies whether the current virt_install commandline matches the
- requested one, based on the test parameters.
- """
- if (self.__make_libvirt_command() !=
- self.__make_libvirt_command(name, params, basedir)):
- logging.debug("VM params in env don't match requested,
restarting.")
- return True
- else:
- logging.debug("VM params in env do match requested, continuing.")
- return False
-
-
def screendump(self, filename, debug=False):
if debug:
logging.debug("Requesting screenshot %s" % filename)
diff --git a/client/tests/virt/virttest/virt_vm.py
b/client/tests/virt/virttest/virt_vm.py
index aca2838..f87c766 100644
--- a/client/tests/virt/virttest/virt_vm.py
+++ b/client/tests/virt/virttest/virt_vm.py
@@ -432,6 +432,33 @@ class BaseVM(object):
#
# Public API - could be reimplemented with virt specific code
#
+
+
+ def needs_restart(self, name, params, basedir):
+ """
+ Verifies whether the current virt_install commandline matches the
+ requested one, based on the test parameters.
+ """
+ if (self.make_create_command() !=
+ self.make_create_command(name, params, basedir)):
+ logging.debug("VM params in env don't match requested,
restarting.")
+ return True
+ else:
+ # Command-line encoded state doesn't include all params
+ # TODO: Check more than just networking
+ other_virtnet = utils_misc.VirtNet(params, name, self.instance)
+ if self.virtnet != other_virtnet
+ logging.debug("VM params in env match, but network differs, "
+ "restarting")
+ logging.debug("\t" + str(self.virtnet))
+ logging.debug("\t!=")
+ logging.debug("\t" + str(other_virtnet)
+ return True
+ else:
+ logging.debug("VM params in env do match requested,
continuing.")
+ return False
+
+
def verify_alive(self):
"""
Make sure the VM is alive and that the main monitor is responsive.