[dts] [PATCH v2] framework: add kill qemu script.

Lijuan Tu lijuanx.a.tu at intel.com
Fri Jan 13 06:38:26 CET 2017


If vm not quit normally, VF will not released.
and this will cause next testsuite failed.

Signed-off-by: Lijuan Tu <lijuanx.a.tu at intel.com>
---
 framework/dut.py       | 19 +++++++++++++++++++
 framework/qemu_kvm.py  | 30 ++++++++++++++++++++++++++++++
 framework/test_case.py |  6 ++++++
 3 files changed, 55 insertions(+)

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
-- 
1.9.3



More information about the dts mailing list