From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 6246F592C for ; Fri, 13 Jan 2017 06:37:22 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga105.fm.intel.com with ESMTP; 12 Jan 2017 21:37:21 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,220,1477983600"; d="scan'208";a="1111937556" Received: from unknown (HELO dpdk-fedora20.icx.intel.com) ([10.240.176.135]) by fmsmga002.fm.intel.com with ESMTP; 12 Jan 2017 21:37:20 -0800 From: Lijuan Tu To: dts@dpdk.org Cc: Lijuan Tu Date: Fri, 13 Jan 2017 13:38:26 +0800 Message-Id: <1484285906-44003-1-git-send-email-lijuanx.a.tu@intel.com> X-Mailer: git-send-email 1.9.3 Subject: [dts] [PATCH v2] framework: add kill qemu script. X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Jan 2017 05:37:22 -0000 If vm not quit normally, VF will not released. and this will cause next testsuite failed. Signed-off-by: Lijuan Tu --- 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