summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLijuan Tu <lijuanx.a.tu@intel.com>2017-01-13 13:38:26 +0800
committerMarvin Liu <yong.liu@intel.com>2017-01-16 10:06:50 +0800
commit4d03808f7245da4f4a0f9dc57f9b6173d8bb3de8 (patch)
tree480714d66729c04dbf40205a21b7ff0f09d78012
parent2dc8785ca9589d456b5d5b68628cff8ec606c457 (diff)
framework: cleanup vm when suite finished
If vm not quit normally, VF devices will not be released. This will cause later virtualization cases failed. So add vm environment cleanup function and called at suite done. Signed-off-by: Lijuan Tu <lijuanx.a.tu@intel.com>
-rw-r--r--framework/dut.py19
-rw-r--r--framework/qemu_kvm.py30
-rw-r--r--framework/test_case.py6
3 files changed, 55 insertions, 0 deletions
diff --git a/framework/dut.py b/framework/dut.py
index 1d4a383..9cbdaf7 100644
--- a/framework/dut.py
+++ b/framework/dut.py
@@ -73,6 +73,8 @@ class Dut(Crb):
self.conf = PortConf()
self.ports_map = []
self.virt_pool = None
+ # hypervisor pid list, used for cleanup
+ self.virt_pids = []
def init_host_session(self):
if self.host_init_flag:
@@ -816,6 +818,13 @@ class Dut(Crb):
pci = self.ports_info[port_id]['pci']
self.virt_pool.del_vf_on_pf(pf_pci=pci, vflist=vflist)
+ def destroy_all_sriov_vfs(self):
+
+ if self.ports_info == None:
+ return
+ for port_id in range(len(self.ports_info)):
+ self.destroy_sriov_vfs_by_port(port_id)
+
def get_vm_core_list(self):
return VMCORELIST[self.crb['VM CoreList']]
@@ -966,6 +975,16 @@ class Dut(Crb):
if self.host_init_flag:
self.host_session.close()
+ def virt_exit(self):
+ """
+ Stop all unstopped hypervisors process
+ """
+ # try to kill all hypervisor process
+ for pid in self.virt_pids:
+ self.send_expect("kill -s SIGTERM %d" % pid, "# ", alt_session=True)
+ time.sleep(3)
+ self.virt_pids = []
+
def crb_exit(self):
"""
Recover all resource before crb exit
diff --git a/framework/qemu_kvm.py b/framework/qemu_kvm.py
index e9d29cc..79e8417 100644
--- a/framework/qemu_kvm.py
+++ b/framework/qemu_kvm.py
@@ -105,6 +105,7 @@ class QEMUKvm(VirtBase):
def set_vm_default(self):
self.set_vm_name(self.vm_name)
self.set_vm_enable_kvm()
+ self.set_vm_pid_file()
self.set_vm_qga()
self.set_vm_daemon()
self.set_vm_monitor()
@@ -244,6 +245,25 @@ class QEMUKvm(VirtBase):
enable_kvm_boot_line = '-enable-kvm'
self.__add_boot_line(enable_kvm_boot_line)
+ def set_vm_pid_file(self):
+ """
+ Set VM pidfile option for manage qemu process
+ """
+ self.__pid_file = '/tmp/.%s.pid' % self.vm_name
+ index = self.find_option_index('pid_file')
+ if index:
+ self.params[index] = {'pid_file': [{'name': '%s' % self.__pid_file}]}
+ else:
+ self.params.append({'pid_file': [{'name': '%s' % self.__pid_file}]})
+
+ def add_vm_pid_file(self, **options):
+ """
+ 'name' : '/tmp/.qemu_vm0.pid'
+ """
+ if 'name' in options.keys():
+ self.__add_boot_line('-pidfile %s' % options['name'])
+
+
def set_vm_name(self, vm_name):
"""
Set VM name.
@@ -1155,6 +1175,16 @@ class QEMUKvm(VirtBase):
else:
self.vm_status = ST_UNKNOWN
+ info = self.host_session.send_expect('cat %s' % self.__pid_file, "# ")
+ try:
+ pid = int(info)
+ # save pid into dut structure
+ self.host_dut.virt_pids.append(pid)
+ except:
+ self.host_logger.info("Failed to capture pid!!!")
+
+
+
def __strip_guest_pci(self):
"""
Strip all pci-passthrough device information, based on qemu monitor
diff --git a/framework/test_case.py b/framework/test_case.py
index 85fdb70..270f7b9 100644
--- a/framework/test_case.py
+++ b/framework/test_case.py
@@ -335,6 +335,12 @@ class TestCase(object):
dutobj.kill_all()
self.tester.kill_all()
+ for dutobj in self.duts:
+ dutobj.virt_exit()
+ # destroy all vfs
+ dutobj.destroy_all_sriov_vfs()
+
+
def wirespeed(self, nic, frame_size, num_ports):
"""
Calculate bit rate. It is depended for NICs