diff options
author | Lijuan Tu <lijuanx.a.tu@intel.com> | 2017-01-13 13:38:26 +0800 |
---|---|---|
committer | Marvin Liu <yong.liu@intel.com> | 2017-01-16 10:06:50 +0800 |
commit | 4d03808f7245da4f4a0f9dc57f9b6173d8bb3de8 (patch) | |
tree | 480714d66729c04dbf40205a21b7ff0f09d78012 | |
parent | 2dc8785ca9589d456b5d5b68628cff8ec606c457 (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.py | 19 | ||||
-rw-r--r-- | framework/qemu_kvm.py | 30 | ||||
-rw-r--r-- | framework/test_case.py | 6 |
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 |