[dts] [PATCH v2 13/16] framework/virt_dut: support multiple VMs module
Marvin Liu
yong.liu at intel.com
Wed Jan 10 01:11:11 CET 2018
1. Add DUT index argument and protect tester interactive process by
lock.
2. Only create one ssh connection to virtual machine.
3. Support disable auto-detect function which must be protected, thus
can save virtual machine instantiate time.
4. Without alternative session, kill_all function should be handled by
control session.
Signed-off-by: Marvin Liu <yong.liu at intel.com>
diff --git a/framework/virt_dut.py b/framework/virt_dut.py
index 348279d..83f661d 100644
--- a/framework/virt_dut.py
+++ b/framework/virt_dut.py
@@ -32,8 +32,8 @@
import os
import re
import time
-import utils
import settings
+from utils import RED, parallel_lock
from config import PortConf
from settings import NICS, LOG_NAME_SEP, get_netdev
from project_dpdk import DPDKdut
@@ -53,14 +53,16 @@ class VirtDut(DPDKdut):
or CRBBareMetal.
"""
- def __init__(self, hyper, crb, serializer, virttype, vm_name, suite, cpu_topo):
+ def __init__(self, hyper, crb, serializer, virttype, vm_name, suite, cpu_topo, dut_id):
self.vm_name = vm_name
self.hyper = hyper
self.cpu_topo = cpu_topo
+ self.dut_id = dut_id
self.vm_ip = crb['IP']
self.NAME = 'virtdut' + LOG_NAME_SEP + '%s' % self.vm_ip
- super(Dut, self).__init__(crb, serializer, self.NAME)
+ # do not create addition alt_session
+ super(Dut, self).__init__(crb, serializer, self.NAME, alt_session=False, dut_id=self.dut_id)
# load port config from suite cfg
self.suite = suite
@@ -73,15 +75,13 @@ class VirtDut(DPDKdut):
self.virttype = virttype
def init_log(self):
- self.logger.config_suite(self.host_dut.test_classname, 'virtdut')
+ if hasattr(self.host_dut, "test_classname"):
+ self.logger.config_suite(self.host_dut.test_classname, 'virtdut')
def close(self, force=False):
if self.session:
self.session.close(force)
self.session = None
- if self.alt_session:
- self.alt_session.close(force)
- self.alt_session = None
RemoveNicObj(self)
def set_nic_type(self, nic_type):
@@ -91,6 +91,7 @@ class VirtDut(DPDKdut):
self.nic_type = nic_type
# vm_dut config will load from vm configuration file
+ @parallel_lock()
def load_portconf(self):
"""
Load port config for this virtual machine
@@ -99,12 +100,24 @@ class VirtDut(DPDKdut):
self.conf.load_ports_config(self.vm_name)
self.ports_cfg = self.conf.get_ports_config()
- return
+ @parallel_lock()
+ def detect_portmap(self, dut_id):
+ """
+ Detect port mapping with ping6 message, should be locked for protect
+ tester operations.
+ """
+ # enable tester port ipv6
+ self.host_dut.enable_tester_ipv6()
+
+ self.map_available_ports()
- def create_portmap(self):
- # if not config ports in vm port config file, used ping6 get portmap
- if not self.ports_cfg:
- self.map_available_ports()
+ # disable tester port ipv6
+ self.host_dut.disable_tester_ipv6()
+
+ def load_portmap(self):
+ """
+ Generate port mapping base on loaded port configuration
+ """
port_num = len(self.ports_info)
self.ports_map = [-1] * port_num
for key in self.ports_cfg.keys():
@@ -142,7 +155,7 @@ class VirtDut(DPDKdut):
if bind_dev:
self.bind_interfaces_linux('igb_uio')
- def prerequisites(self, pkgName, patch):
+ def prerequisites(self, pkgName, patch, autodetect_topo):
"""
Prerequest function should be called before execute any test case.
Will call function to scan all lcore's information which on DUT.
@@ -152,7 +165,10 @@ class VirtDut(DPDKdut):
if not self.skip_setup:
self.prepare_package()
- self.send_expect("cd %s" % self.base_dir, "# ")
+ out = self.send_expect("cd %s" % self.base_dir, "# ")
+ if 'No such file or directory' in out:
+ self.logger.error("Can't switch to dpdk folder!!!")
+
self.send_expect("alias ls='ls --color=none'", "#")
if self.get_os_type() == 'freebsd':
@@ -180,14 +196,14 @@ class VirtDut(DPDKdut):
# load port infor from config file
self.load_portconf()
- # enable tester port ipv6
- self.host_dut.enable_tester_ipv6()
self.mount_procfs()
- self.create_portmap()
-
- # disable tester port ipv6
- self.host_dut.disable_tester_ipv6()
+ if self.ports_cfg:
+ self.load_portmap()
+ else:
+ # if no config ports in port config file, will auto-detect portmap
+ if autodetect_topo:
+ self.detect_portmap(dut_id=self.dut_id)
# print latest ports_info
for port_info in self.ports_info:
@@ -196,7 +212,7 @@ class VirtDut(DPDKdut):
def init_core_list(self):
self.cores = []
cpuinfo = self.send_expect("grep --color=never \"processor\""
- " /proc/cpuinfo", "#", alt_session=False)
+ " /proc/cpuinfo", "#")
cpuinfo = cpuinfo.split('\r\n')
if self.cpu_topo != '':
topo_reg = r"(\d)S/(\d)C/(\d)T"
@@ -394,3 +410,21 @@ class VirtDut(DPDKdut):
self.ports_map[vmPort] = remotePort
hits[remotePort] = True
continue
+
+ def kill_all(self, alt_session=False):
+ """
+ Kill all dpdk applications on VM
+ """
+ control = getattr(self.hyper, 'control_session', None)
+ if callable(control):
+ out = control("lsof -Fp /var/run/.rte_config")
+ pids = []
+ pid_reg = r'p(\d+)'
+ if len(out):
+ lines = out.split('\r\n')
+ for line in lines:
+ m = re.match(pid_reg, line)
+ if m:
+ pids.append(m.group(1))
+ for pid in pids:
+ control('kill -9 %s' % pid)
--
1.9.3
More information about the dts
mailing list