summaryrefslogtreecommitdiffstats
path: root/testsuites/vstf/vstf_scripts/vstf/agent
diff options
context:
space:
mode:
Diffstat (limited to 'testsuites/vstf/vstf_scripts/vstf/agent')
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/agent.py144
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py112
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py56
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py154
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py156
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py79
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py167
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py237
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py84
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py56
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py46
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py42
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py50
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py236
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py21
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py120
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py71
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py58
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py47
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py74
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py37
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py67
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py206
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py78
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py179
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py69
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py20
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py59
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py165
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py178
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py109
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py191
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py162
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py177
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py88
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py48
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py113
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py111
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/softagent.py139
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py8
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py334
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py386
-rw-r--r--testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py17
52 files changed, 0 insertions, 5023 deletions
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/agent.py b/testsuites/vstf/vstf_scripts/vstf/agent/agent.py
deleted file mode 100644
index 4d92c510..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/agent.py
+++ /dev/null
@@ -1,144 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-# !/usr/bin/env python
-# coding=utf-8
-
-import logging
-import argparse
-import signal
-
-from oslo.config import cfg
-
-from vstf.rpc_frame_work import rpc_consumer
-from vstf.common.log import setup_logging
-from vstf.common import daemon
-from vstf.common.cfgparser import CfgParser
-
-LOG = logging.getLogger(__name__)
-
-server_opts = [
- cfg.StrOpt('user', default='guest', help="the rabbit's user, default guest"),
- cfg.StrOpt('passwd', default='guest', help="the rabbit's passwd, default guest"),
- cfg.StrOpt('host', default='localhost', help="tell the process wich interface to listen"),
- cfg.StrOpt('port', default=5672, help=""),
- cfg.StrOpt('id', default='agent', help="")
-
-]
-
-stc_opts = [
- cfg.StrOpt('package', default='', help="the STC python path")
-]
-
-
-class Client(daemon.Daemon):
- """This is a consumer of vstf-agent which will create two channel to the
- rabbitmq-server, one for direct call, one for fan call.
-
- agent start with a config file which record rabbitmq's ip, port and user passwd
- also each agent has its own id.
-
- """
-
- def __init__(self, agent, config_file):
- """Record the config file, init the daemon.
-
- :param str config_file: the config of a VSTF agent.
-
- """
- super(Client, self).__init__('/tmp/esp_rpc_client.pid')
- self.config_file = config_file
- self.agent = agent
- self.config = None
- self.proxy = None
- self.run_flag = True
-
- def init_config(self):
- """Use olso.config to analyse the config file
-
- """
- parser = CfgParser(self.config_file)
- parser.register_my_opts(server_opts, "rabbit")
- parser.register_my_opts(stc_opts, "spirent")
- self.config = parser.parse()
-
- def loop_thread(self):
- LOG.info("Try to create direct proxy...")
- self.proxy = rpc_consumer.VstfConsumer(self.agent,
- self.config.rabbit.user,
- self.config.rabbit.passwd,
- self.config.rabbit.host,
- self.config.rabbit.port,
- self.config.rabbit.id)
- self.proxy.run()
-
- def run(self):
- """Run the rabbitmq consumers as a daemon.
-
- """
- signal.signal(signal.SIGTERM, self.process_exit)
- self.loop_thread()
- LOG.info("agent start ok!")
-
- def process_exit(self, signum, frame):
- """This function try to stop the agent after running agent stop.
- When we call vstf-agent stop which will send a signal SIGTERM to agent
- When the agent catch the SIGTERM signal will call this function.
-
- """
- LOG.info("daemon catch the signalterm, start to stop the process.")
- self.run_flag = False
- if self.proxy:
- self.proxy.stop()
-
- def start_agent(self):
- self.init_config()
- self.start()
-
- def stop_agent(self):
- """Notice that: this function just kill the agent by pid file, it has
- none vars of the agent.
-
- """
- LOG.info("call daemon stop.")
- # kill the main thread
- self.stop()
-
-
-def main():
- setup_logging(level=logging.INFO, log_file="/var/log/vstf/vstf-agent.log")
- parser = argparse.ArgumentParser(description='agent option')
- parser.add_argument('action', choices=('start', 'stop', "restart"),
- default="start", help="start or stop agent")
- parser.add_argument('--agent_type', action='store',
- default="soft",
- choices=["soft", "spirent"],
- help="the agent type, as now, just soft and spirent")
- parser.add_argument(
- '--config_file',
- action='store',
- default="/etc/vstf/amqp/amqp.ini",
- help="some env_build params recorded in the config file")
-
- args = parser.parse_args()
-
- client = Client(args.agent_type, args.config_file)
- if "start" == args.action:
- client.start_agent()
- elif "stop" == args.action:
- client.stop_agent()
- elif "restart" == args.action:
- client.stop_agent()
- client.start_agent()
- else:
- raise Exception("only support actions: start/stop/restart")
-
-
-if __name__ == '__main__':
- main()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py
deleted file mode 100644
index 1d39d7b7..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py
+++ /dev/null
@@ -1,112 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import platform
-import logging
-from collections import OrderedDict
-
-from vstf.agent.env.basic.commandline import CommandLine
-from vstf.common import constants as const
-
-log = logging.getLogger(__name__)
-CMD = CommandLine()
-
-
-class Collect(object):
- """collect host information such as _cpu, memory and so on"""
-
- def __init__(self):
- super(Collect, self).__init__()
- self._system = self._system()
- self._cpu = self._cpu()
-
- def _system(self):
- """the base _system info
- {'os info':{'_system':'ubuntu', 'kernel': '3.13.3'}}"""
- return {const.OS_INFO:
- {
- '_system': open('/etc/issue.net').readline().strip(),
- 'kernel': platform.uname()[2]
- }
- }
-
- def _memery(self):
- """ Return the information in /proc/meminfo
- as a dictionary """
- meminfo = OrderedDict()
- with open('/proc/meminfo') as f:
- for line in f:
- meminfo[line.split(':')[0]] = line.split(':')[1].strip()
-
- return {const.MEMORY_INFO:
- {
- "Mem Total": meminfo['MemTotal'],
- "Mem Swap": meminfo['SwapTotal']
- }
- }
-
- def _lscpu(self):
- ret = {}
- with os.popen("lscpu") as f:
- for line in f:
- ret[line.split(':')[0].strip()] = line.split(':')[1].strip()
- return ret
-
- def _cpu(self):
- ret = []
- with open('/proc/cpuinfo') as f:
- cpuinfo = OrderedDict()
- for line in f:
- if not line.strip():
- ret.append(cpuinfo)
- cpuinfo = OrderedDict()
- elif len(line.split(':')) == 2:
- cpuinfo[line.split(':')[0].strip()] = line.split(':')[
- 1].strip()
- else:
- log.error("_cpu info unknow format <%(c)s>", {'c': line})
- return {const.CPU_INFO:
- dict(
- {
- "Model Name": ret[0]['model name'],
- "Address sizes": ret[0]['address sizes']
- },
- **(self._lscpu())
- )
- }
-
- def _hw_sysinfo(self):
- cmdline = "dmidecode | grep -A 2 'System Information' | grep -v 'System Information'"
- ret, output = CMD.execute(cmdline, shell=True)
- if ret:
- result = {}
- # del the stderr
- for tmp in output.strip().split('\n'):
- if tmp is None or tmp is "":
- continue
- # split the items
- tmp = tmp.split(":")
- if len(tmp) >= 2:
- # first item as key, and the other as value
- result[tmp[0].strip("\t")] = ";".join(tmp[1:])
- return {const.HW_INFO: result}
- else:
- return {
- const.HW_INFO: "get hw info failed. check the host by cmd: dmidecode"}
-
- def collect_host_info(self):
- return [self._system, self._cpu, self._memery(), self._hw_sysinfo()]
-
-
-if __name__ == "__main__":
- c = Collect()
- import json
-
- print json.dumps(c.collect_host_info(), indent=4)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py
deleted file mode 100644
index 29dd2c02..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py
+++ /dev/null
@@ -1,56 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import threading
-import logging
-from vstf.common import constants
-
-LOG = logging.getLogger(__name__)
-
-
-class CommandLine(object):
-
- def __init__(self):
- super(CommandLine, self).__init__()
- self.proc = None
- self.is_timeout = False
-
- def __kill_proc(self):
- self.is_timeout = True
- self.proc.kill()
-
- def execute(self, cmd, timeout=constants.TIMEOUT, shell=False):
- """this func call subprocess.Popen(),
- here setup a timer to deal with timeout.
- :param cmd: cmd list like ['ls', 'home']
- :param timeout: for timer count for timeout
- :return: (ret, output) the output (stdout+'\n'+stderr)
- """
- # reset the timeout flag
- self.is_timeout = False
- self.proc = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- shell=shell)
-
- timer = threading.Timer(timeout, self.__kill_proc, [])
- timer.start()
- stdout, stderr = self.proc.communicate()
- timer.cancel()
-
- if self.proc.returncode or self.is_timeout:
- if self.is_timeout:
- LOG.error("run cmd<%(cmd)s> timeout", {"cmd": cmd})
- ret = False
- output = "".join([stderr, stdout])
- else:
- ret = True
- output = stdout
- return ret, output
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py
deleted file mode 100644
index c34f5e06..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py
+++ /dev/null
@@ -1,154 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import re
-import logging
-from vstf.agent.perf import netns
-from vstf.common.utils import check_output, get_device_name, my_sleep, check_call, call, IPCommandHelper
-
-LOG = logging.getLogger(__name__)
-
-default_drivers = {
- '82599': 'ixgbe',
- '82576': 'igb',
-}
-
-
-class LspciHelper(object):
-
- def __init__(self):
- self.bdf_desc_map = {}
- self.bdf_device_map = {}
- self.device_bdf_map = {}
- self.bdf_ip_map = {}
- self.bdf_driver_map = {}
- self.mac_bdf_map = {}
- self.bdf_mac_map = {}
- self._get_bdfs()
- self._get_devices()
- self._get_drivers()
- self._get_ip_macs()
-
- def _get_bdfs(self):
- self.bdf_desc_map = {}
- out = check_output('lspci |grep Eth', shell=True)
- for line in out.splitlines():
- bdf, desc = line.split(' ', 1)
- self.bdf_desc_map[bdf] = desc
-
- def _get_devices(self):
- for bdf, desc in self.bdf_desc_map.items():
- device = get_device_name(bdf)
- if device is None:
- LOG.info(
- "cann't find device name for bdf:%s, no driver is available.", bdf)
- try:
- self._load_driver(desc)
- except:
- LOG.warn("!!!unable to load_driver for device:%s", bdf)
- my_sleep(0.2)
- device = get_device_name(bdf)
- self.bdf_device_map[bdf] = device
- if device:
- self.device_bdf_map[device] = bdf
- check_call("ip link set dev %s up" % device, shell=True)
-
- def _get_drivers(self):
- for device, bdf in self.device_bdf_map.items():
- buf = check_output('ethtool -i %s | head -n1' % device, shell=True)
- driver = buf.split()[1]
- self.bdf_driver_map[bdf] = driver
-
- def _get_ip_macs(self):
- for device, bdf in self.device_bdf_map.items():
- buf = check_output("ip addr show dev %s" % device, shell=True)
- macs = re.compile(
- "[A-F0-9]{2}(?::[A-F0-9]{2}){5}",
- re.IGNORECASE | re.MULTILINE)
- for mac in macs.findall(buf):
- if mac.lower() in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'):
- continue
- else:
- break
- ips = re.compile(
- r"inet (\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}/\d{1,2})",
- re.MULTILINE)
- ip = ips.findall(buf)
- if ip:
- self.bdf_ip_map[bdf] = ip[0]
- else:
- self.bdf_ip_map[bdf] = None
- self.bdf_mac_map[bdf] = mac
- self.mac_bdf_map[mac] = bdf
-
- def _load_driver(self, desc):
- for key in default_drivers:
- if key in desc:
- driver = default_drivers[key]
- LOG.info("try to load default driver [%s]", driver)
- check_call('modprobe %s' % driver, shell=True)
- break
- else:
- LOG.warn("unsupported nic type:%s", desc)
-
-
-class DeviceManager(object):
-
- def __init__(self):
- super(DeviceManager, self).__init__()
- mgr = netns.NetnsManager()
- mgr.clean_all_namespace()
- self.lspci_helper = LspciHelper()
-
- def _get_device_detail(self, bdf):
- device = self.lspci_helper.bdf_device_map[bdf]
- mac = self.lspci_helper.bdf_mac_map[bdf]
- ip = self.lspci_helper.bdf_ip_map[bdf]
- desc = self.lspci_helper.bdf_desc_map[bdf]
- driver = self.lspci_helper.bdf_driver_map[bdf]
- detail = {
- 'bdf': bdf,
- 'device': device,
- 'mac': mac,
- 'ip': ip,
- 'desc': desc,
- 'driver': driver
- }
- return detail
-
- def get_device_detail(self, identity):
- """
- Gets the detail of a network card.
-
- :param identity: be it the mac address, bdf, device name of a network card.
- :return: device detail of a network card.
- """
- if identity in self.lspci_helper.bdf_device_map:
- bdf = identity
- elif identity in self.lspci_helper.device_bdf_map:
- bdf = self.lspci_helper.device_bdf_map[identity]
- elif identity in self.lspci_helper.mac_bdf_map:
- bdf = self.lspci_helper.mac_bdf_map[identity]
- else:
- raise Exception("cann't find the device by identity:%s" % identity)
- return self._get_device_detail(bdf)
-
- def get_device_verbose(self, identity):
- return IPCommandHelper().get_device_verbose(identity)
-
- def list_nic_devices(self):
- """
- Get all the details of network devices in the host.
- :return: a list of network card detail.
- """
- device_list = []
- for bdf in self.lspci_helper.bdf_device_map.keys():
- detail = self._get_device_detail(bdf)
- device_list.append(detail)
- return device_list
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py
deleted file mode 100644
index 4bae49d2..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py
+++ /dev/null
@@ -1,156 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from vstf.common.utils import check_call
-import os
-import logging
-
-LOG = logging.getLogger(__name__)
-
-
-class _ImageManager(object):
- """
- A qemu-img wrapper to create qcow2 child image from a parent image.
-
- """
-
- def __init__(self, parent_image_path, child_image_dir):
- """
- :param parent_image_path str: the parent image path.
- :param child_image_dir str: the destination path to put child images.
- """
- self._create_child_str = 'qemu-img create -f %(image_type)s %(child_path)s -o backing_file=%(parent_path)s'
- self._convert_str = "qemu-img convert -O %(image_type)s %(parent_path)s %(child_path)s"
- self.child_image_dir = child_image_dir
- self.parent_image_path = parent_image_path
- assert os.path.isfile(self.parent_image_path)
- assert os.path.isdir(self.child_image_dir)
-
- def create_child_image(
- self,
- child_name,
- full_clone=False,
- image_type='qcow2'):
- """
- create a child image and put it in self.child_image_dir.
-
- :param child_name: the image name to be created..
- :return: return the path of child image.
- """
-
- image_path = os.path.join(
- self.child_image_dir,
- child_name) + '.' + image_type
- if full_clone:
- cmd = self._convert_str % {
- 'image_type': image_type,
- 'child_path': image_path,
- 'parent_path': self.parent_image_path}
- else:
- cmd = self._create_child_str % {
- 'child_path': image_path,
- 'parent_path': self.parent_image_path,
- 'image_type': image_type}
- check_call(cmd.split())
- return image_path
-
-
-class ImageManager(object):
-
- def __init__(self, cfg):
- """
- ImageManager creates images from configuration context.
-
- :param cfg: dict, example:
- {
- 'parent_image': "/mnt/sdb/ubuntu_salt_master.img",
- 'dst_location': "/mnt/sdb",
- 'full_clone':False,
- 'type': "qcow2",
- 'names': ['vm1','vm2','vm3','vm4']
- }
- :return:
- """
- super(ImageManager, self).__init__()
- cfg = self._check_cfg(cfg)
- self.parent_image = cfg['parent_image']
- self.image_dir = cfg['dst_location']
- self.full_clone = cfg['full_clone']
- self.image_type = cfg['type']
- self.names = cfg['names']
- self.mgr = _ImageManager(self.parent_image, self.image_dir)
-
- @staticmethod
- def _check_cfg(cfg):
- for key in (
- 'parent_image',
- 'dst_location',
- 'full_clone',
- 'type',
- 'names'):
- if key not in cfg:
- raise Exception("does't find %s config" % key)
- if cfg['type'] not in ('raw', 'qcow2'):
- raise Exception(
- "type:%s not supported, only support 'raw' and 'qcow2'" %
- cfg['type'])
- if not cfg['full_clone'] and cfg['type'] == 'raw':
- raise Exception(
- "only support 'qcow2' for not full_clone image creation" %
- cfg['type'])
- return cfg
-
- def create_all(self):
- """
- create images by configuration context.
-
- :return: True for success, False for failure.
- """
- for name in self.names:
- image = self.mgr.create_child_image(
- name, self.full_clone, self.image_type)
- LOG.info("image: %s created", image)
- return True
-
- def clean_all(self):
- """
- remove all the images created in one go.
-
- :return: True for success. Raise exception otherwise.
- """
- for name in self.names:
- image_path = os.path.join(
- self.image_dir, name + '.' + self.image_type)
- try:
- os.unlink(image_path)
- LOG.info("remove:%s successfully", image_path)
- except Exception:
- LOG.info("cann't find path:%s", image_path)
- return True
-
-
-if __name__ == '__main__':
- import argparse
- import json
- parser = argparse.ArgumentParser()
- parser.add_argument(
- 'action',
- choices=(
- 'create',
- 'clean'),
- help='action:create|clean')
- parser.add_argument('--config', help='config file to parse')
- args = parser.parse_args()
- logging.basicConfig(level=logging.INFO)
- image_cfg = json.load(open(args.config))
- mgr = ImageManager(image_cfg)
- if args.action == 'create':
- mgr.create_all()
- if args.action == 'clean':
- mgr.clean_all()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py
deleted file mode 100644
index 5aca5368..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py
+++ /dev/null
@@ -1,79 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import logging
-import contextlib
-from subprocess import CalledProcessError
-from vstf.common.utils import check_call
-
-LOG = logging.getLogger(__name__)
-
-
-@contextlib.contextmanager
-def my_chdir(file_path):
- old_cwd = os.path.realpath(os.curdir)
- os.chdir(file_path)
- LOG.info("cd %s", file_path)
- yield
- os.chdir(old_cwd)
- LOG.info("cd %s", old_cwd)
-
-
-class SourceCodeManager(object):
-
- def __init__(self):
- super(SourceCodeManager, self).__init__()
- self.base_path = '/opt/vstf/'
-
- @staticmethod
- def _git_pull(url, dest):
- if not os.path.isdir(dest):
- check_call("git clone %s %s" % (url, dest), shell=True)
- else:
- with my_chdir(dest):
- check_call("git pull", shell=True)
-
- @staticmethod
- def _install(dest):
- with my_chdir(dest):
- try:
- check_call("make && make install", shell=True)
- except CalledProcessError:
- LOG.info("retry make again")
- check_call("make clean; make && make install", shell=True)
-
- def src_install(self, cfg):
- for key, item in cfg.items():
- repo_type = item['repo_type']
- url = item['url']
- install = item['install']
- if install is True:
- LOG.info("installing src repo:%s", key)
- if repo_type == "git":
- target = self.base_path + key
- self._git_pull(url, target)
- self._install(target)
- else:
- raise Exception("unsupported repo type:%s" % repo_type)
- else:
- LOG.info("skip src repo:%s", key)
- return True
-
-
-if __name__ == '__main__':
- import argparse
- import json
- parser = argparse.ArgumentParser()
- parser.add_argument('--config', help='config file to parse')
- args = parser.parse_args()
- logging.basicConfig(level=logging.INFO)
- cfg = json.load(open(args.config))
- mgr = SourceCodeManager()
- mgr.src_install(cfg)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py
deleted file mode 100644
index 4b7b31b1..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py
+++ /dev/null
@@ -1,167 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import logging
-import textwrap
-from vstf.common.utils import my_sleep
-from vstf.agent.env.fsmonitor import constant
-
-LOG = logging.getLogger(__name__)
-
-
-class VMConfigBy9pfs(object):
- """
- host side implemetation of a self-defined communication protocol using libvirt 9pfs to give commands to the Virtual Machine.
-
- """
-
- def __init__(self, vm_9p_path):
- """
- :param vm_9p_path: The host path of libvirt 9pfs for a vm.
- :return:
- """
- self.vm_9p_path = vm_9p_path
-
- def clean(self):
- self._unlink(self._path(constant.VM_CMD_RETURN_CODE_FILE))
- self._unlink(self._path(constant.VM_CMD_DONE_FLAG_FILE))
-
- def _path(self, relative_path):
- return os.path.join(self.vm_9p_path, relative_path)
-
- def _unlink(self, file_path):
- os.unlink(file_path)
- LOG.info("os.unlink(%s)", file_path)
-
- def _read(self, filename):
- filepath = self._path(filename)
- with open(filepath, 'r') as f:
- ret = f.read()
- LOG.info("read(%s) -> %s", filepath, ret)
- return ret
-
- def _write(self, filename, cmd):
- filepath = self._path(filename)
- with open(filepath, 'w') as f:
- f.write("%s" % cmd)
- LOG.info("write(%s) <- %s", filepath, cmd)
-
- def _wait_flag_file_to_exist(self, filename, timeout):
- filepath = self._path(filename)
- while timeout > 0:
- if os.path.exists(filepath):
- LOG.info("wait and find file:%s", filepath)
- return True
- my_sleep(1)
- timeout -= 1
- LOG.info("waiting file to exist:%s", filepath)
- return False
-
- def _get_cmd_return_code(self):
- ret = self._read(constant.VM_CMD_RETURN_CODE_FILE)
- return ret == constant.VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT
-
- def _wait_command_done(self):
- done = self._wait_flag_file_to_exist(
- constant.VM_CMD_DONE_FLAG_FILE,
- constant.VM_COMMON_CMD_EXCUTE_TIME_OUT)
- if done:
- return self._get_cmd_return_code()
- else:
- return 'timeout'
-
- def _set_cmd(self, cmd):
- self._write(constant.VM_CMD_CONTENT_FILE, cmd)
- self._write(constant.VM_CMD_SET_FLAG_FILE, '')
- ret = self._wait_command_done()
- if ret:
- self.clean()
- return ret
- else:
- raise Exception("9pfs command failure: timeout.")
-
- def wait_up(self):
- return self._wait_flag_file_to_exist(
- constant.VM_UP_Flag_FILE, constant.VM_UP_TIME_OUT)
-
- def config_ip(self, mac, ip):
- cmd = 'config_ip %s %s' % (mac, ip)
- return self._set_cmd(cmd)
-
- def config_gw(self, ip):
- cmd = 'config_gw %s' % ip
- return self._set_cmd(cmd)
-
- def set_pktloop_dpdk(self, macs):
- """
- To connect two network devices together in the vm and loop the packets received to another.
- Use dpdk testpmd to loop the packets. See FSMonitor.
-
- :param macs: the mac address list of network cards of the vm.
- :return: True for success, Exception for Failure.
- """
- mac_str = ' '.join(macs)
- cmd = 'set_pktloop_dpdk ' + mac_str
- return self._set_cmd(cmd)
-
- def recover_nic_binding(self, macs):
- """
- in contrast to set_pktloop_dpdk, disconnect the looping.
- :param macs: the mac address list of network cards of the vm.
- :return: True for success, Exception for Failure.
- """
- mac_str = ' '.join(macs)
- cmd = 'recover_nic_binding ' + mac_str
- return self._set_cmd(cmd)
-
- def config_amqp(
- self,
- identity,
- server,
- port=5672,
- user="guest",
- passwd="guest"):
- data = {
- 'server': server,
- 'port': port,
- 'id': identity,
- 'user': user,
- 'passwd': passwd
- }
- header = "[rabbit]"
- content = '''
- user=%(user)s
- passwd=%(passwd)s
- host=%(server)s
- port=%(port)s
- id=%(id)s''' % data
- file_name = "amqp.ini"
- dedented_text = textwrap.dedent(content)
- self._write(file_name, header + dedented_text)
- cmd = 'config_amqp %s' % file_name
- return self._set_cmd(cmd)
-
- def stop_vstf(self):
- cmd = "stop_vstf"
- return self._set_cmd(cmd)
-
- def __repr__(self):
- return self.__class__.__name__ + ':' + self.vm_9p_path
-
-
-if __name__ == '__main__':
- fs = VMConfigBy9pfs('/tmp/tmp4T6p7L')
- print os.listdir(os.curdir)
- print fs.config_ip('56:6f:44:a5:3f:a4', '192.168.188.200/23')
- print fs.config_gw('192.168.188.1')
- print fs.set_pktloop_dpdk(['56:6f:44:a5:3f:a2', '56:6f:44:a5:3f:a3'])
- print fs.recover_nic_binding(['56:6f:44:a5:3f:a2', '56:6f:44:a5:3f:a3'])
- print fs.config_amqp('192.168.188.200', '192.168.188.10')
- print os.listdir(os.curdir)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py
deleted file mode 100644
index d0a2060d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py
+++ /dev/null
@@ -1,237 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import shutil
-import logging
-from vstf.common.utils import check_and_kill, randomMAC, my_mkdir, check_call, check_output, my_sleep
-from vstf.agent.env.basic.vm9pfs import VMConfigBy9pfs
-
-LOG = logging.getLogger(__name__)
-
-
-class VMControlOperation(object):
- """
- a libivrt virsh wrapper for creating virtual machine.
- """
-
- def __init__(self):
- """
- all tmp files will be created under '/tmp/atf_vm_manager'
-
- """
- work_dir = '/tmp/atf_vm_manager'
- shutil.rmtree(work_dir, ignore_errors=True)
- my_mkdir(work_dir)
- self.work_dir = work_dir
- self.vnc_index = 0
- self.pci_index = 3
- self.net_index = 0
- self.vm_9p_controllers = {}
- self.vm_configs = {}
- self.image_mgr = None
-
- @staticmethod
- def composite_xml(context):
- """
- composit a libvirt xml configuration for creating vm from context.
-
- :param context: a dict containing all necessary options for creating a vm.
- :return: libvirt xml configuration string
- """
- from vm_xml_help import xml_head, xml_disk, xml_ovs, xml_pci, xml_9p, xml_tail, xml_ctrl_br, xml_br
- xml = ''
- tmp = xml_head.replace('VM_NAME', context['vm_name'])
- tmp = tmp.replace('VM_MEMORY', str(context['vm_memory']))
- tmp = tmp.replace('CPU_NUM', str(context['vm_cpu']))
- xml += tmp
- tmp = xml_disk.replace('IMAGE_TYPE', context['image_type'])
- tmp = tmp.replace('IMAGE_PATH', context['image_path'])
- xml += tmp
-
- if context['9p_path']:
- tmp = xml_9p.replace('9P_PATH', context['9p_path'])
- xml += tmp
-
- if context['eth_pci']:
- for pci in context['eth_pci']:
- bus = pci[:2]
- slot = pci[3:5]
- func = pci[6:7]
- tmp = xml_pci.replace('BUS', bus)
- tmp = tmp.replace('SLOT', slot)
- tmp = tmp.replace('FUNCTION', func)
- xml += tmp
-
- if context['ctrl_br']:
- tmp = xml_ctrl_br.replace('CTRL_BR', context['ctrl_br'])
- tmp = tmp.replace('CTRL_MAC', context['ctrl_mac'])
- tmp = tmp.replace('CTRL_MODEL', context['ctrl_model'])
- xml += tmp
-
- for tap_cfg in context['taps']:
- if tap_cfg['br_type'] == "ovs":
- br_type = "openvswitch"
- else:
- br_type = tap_cfg['br_type']
- if br_type == 'bridge':
- xml_ovs = xml_br
- tmp = xml_ovs.replace('BR_TYPE', br_type)
- tmp = tmp.replace('TAP_MAC', tap_cfg['tap_mac'])
- tmp = tmp.replace('TAP_NAME', tap_cfg['tap_name'])
- tmp = tmp.replace('BR_NAME', tap_cfg['br_name'])
- xml += tmp
-
- xml += xml_tail
- return xml
-
- @staticmethod
- def check_required_options(context):
- for key in (
- 'vm_name',
- 'vm_memory',
- 'vm_cpu',
- 'image_path',
- 'image_type',
- 'taps'):
- if key not in context:
- raise Exception("vm config error, must set %s option" % key)
-
- def set_vm_defaults(self, context):
- vm_9p_path = '%s/%s' % (self.work_dir, context['vm_name'])
- shutil.rmtree(vm_9p_path, ignore_errors=True)
- my_mkdir(vm_9p_path)
- default = {'vm_memory': 4194304,
- 'vm_cpu': 4,
- 'image_type': 'qcow2',
- 'br_type': 'ovs',
- '9p_path': vm_9p_path,
- 'eth_pci': None,
- 'ctrl_br': 'br0',
- 'ctrl_mac': randomMAC(),
- 'ctrl_model': 'virtio',
- 'ctrl_ip_setting': '192.168.100.100/24',
- 'ctrl_gw': '192.168.100.1'
- }
- for k, v in default.items():
- context.setdefault(k, v)
-
- def _shutdown_vm(self):
- out = check_output(
- "virsh list | sed 1,2d | awk '{print $2}'",
- shell=True)
- vm_set = set(out.split())
- for vm in vm_set:
- check_call("virsh shutdown %s" % vm, shell=True)
- timeout = 60
- # wait for gracefully shutdown
- while timeout > 0:
- out = check_output(
- "virsh list | sed 1,2d | awk '{print $2}'",
- shell=True)
- vm_set = set(out.split())
- if len(vm_set) == 0:
- break
- timeout -= 2
- my_sleep(2)
- LOG.info("waiting for vms:%s to shutdown gracefully", vm_set)
- # destroy by force
- for vm in vm_set:
- check_call("virsh destroy %s" % vm, shell=True)
- # undefine all
- out = check_output(
- "virsh list --all | sed 1,2d | awk '{print $2}'",
- shell=True)
- vm_set = set(out.split())
- for vm in vm_set:
- check_call("virsh undefine %s" % vm, shell=True)
- # kill all qemu
- check_and_kill('qemu-system-x86_64')
-
- def clean_all_vms(self):
- self._shutdown_vm()
- for _, ctrl in self.vm_9p_controllers.items():
- LOG.debug("remove vm9pfs dir:%s", ctrl.vm_9p_path)
- shutil.rmtree(ctrl.vm_9p_path, ignore_errors=True)
- self.vm_9p_controllers = {}
- self.vm_configs = {}
- # shutil.rmtree(self.work_dir, ignore_errors=True)
- self.vnc_index = 0
- self.pci_index = 3
- self.net_index = 0
- self.vms = []
- return True
-
- def create_vm(self, context):
- self.set_vm_defaults(context)
- self.check_required_options(context)
- xml = self.composite_xml(context)
- vm_name = context['vm_name']
- file_name = os.path.join(self.work_dir, vm_name + '.xml')
- with open(file_name, 'w') as f:
- f.write(xml)
- check_call('virsh define %s' % file_name, shell=True)
- check_call('virsh start %s' % vm_name, shell=True)
- vm_name = context['vm_name']
- vm_9pfs = context['9p_path']
- self.vm_9p_controllers[vm_name] = VMConfigBy9pfs(vm_9pfs)
- self.vm_configs[vm_name] = context
- LOG.debug("%s's vm_9pfs path:%s", vm_name, vm_9pfs)
- return True
-
- def wait_vm(self, vm_name):
- vm9pctrl = self.vm_9p_controllers[vm_name]
- ret = vm9pctrl.wait_up()
- if ret not in (True,):
- raise Exception(
- 'vm running but stuck in boot process, please manully check.')
- LOG.debug('waitVM %s up ok, ret:%s', vm_name, ret)
- return True
-
- def init_config_vm(self, vm_name):
- """
- using libvirt 9pfs to config boot up options like network ip/gw.
-
- :param vm_name: the vm to be config with.
- :return: True if succeed, Exception if fail.
- """
- vm_cfg = self.vm_configs[vm_name]
- vm9pctrl = self.vm_9p_controllers[vm_name]
- # print self.vm_9p_controllers
- init_cfg = vm_cfg['init_config']
- if "ctrl_ip_setting" in init_cfg:
- ret = vm9pctrl.config_ip(
- vm_cfg['ctrl_mac'],
- init_cfg['ctrl_ip_setting'])
- assert ret
- LOG.info('initConfigVM config ip ok')
- if 'ctrl_gw' in init_cfg:
- ret = vm9pctrl.config_gw(init_cfg['ctrl_gw'])
- assert ret
- LOG.info('initConfigVM ctrl_gw ok')
- if "ctrl_ip_setting" in init_cfg and "amqp_server" in init_cfg:
- identity = init_cfg['ctrl_ip_setting'].split('/')[0]
- if init_cfg['amqp_id'].strip():
- identity = init_cfg['amqp_id'].strip()
- server = init_cfg['amqp_server']
- port = init_cfg['amqp_port']
- user = init_cfg['amqp_user']
- passwd = init_cfg['amqp_passwd']
- ret = vm9pctrl.config_amqp(identity, server, port, user, passwd)
- assert ret
- LOG.info('initConfigVM config_amqp ok')
- if 'tap_pktloop_config' in init_cfg:
- taps = vm_cfg['taps']
- macs = []
- for tap in taps:
- macs.append(tap['tap_mac'])
- ret = vm9pctrl.set_pktloop_dpdk(macs)
- assert ret
- LOG.info('initConfigVM set_pktloop_dpdk ok')
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py
deleted file mode 100644
index 89c10963..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py
+++ /dev/null
@@ -1,84 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-xml_head = '''
-<domain type='kvm'>
- <name>VM_NAME</name>
- <memory unit='KiB'>VM_MEMORY</memory>
- <currentMemory unit='KiB'>VM_MEMORY</currentMemory>
- <!--numatune>
- <memory mode='strict' nodeset='0'/>
- </numatune-->
- <vcpu placement='static'>CPU_NUM</vcpu>
- <cpu mode='host-passthrough'>
- </cpu>
- <os>
- <type arch='x86_64' >hvm</type>
- <boot dev='hd'/>
- </os>
- <features>
- <acpi/>
- <apic/>
- <pae/>
- </features>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>restart</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-x86_64</emulator>'''
-xml_disk = '''
- <disk type='file' device='disk'>
- <driver name='qemu' type='IMAGE_TYPE' cache='none' io='native'/>
- <source file='IMAGE_PATH'/>
- <target dev='vda' bus='virtio'/>
- </disk>'''
-
-xml_ctrl_br = '''
-<interface type='bridge'>
- <mac address='CTRL_MAC'/>
- <source bridge='CTRL_BR'/>
- <model type='CTRL_MODEL'/>
-</interface>
-'''
-xml_ovs = '''
- <interface type='bridge'>
- <mac address='TAP_MAC'/>
- <source bridge='BR_NAME'/>
- <virtualport type='BR_TYPE'>
- </virtualport>
- <model type='virtio'/>
- <driver name='vhost' queues='4'/>
- <target dev='TAP_NAME'/>
- </interface>'''
-xml_br = '''
- <interface type='bridge'>
- <mac address='TAP_MAC'/>
- <source bridge='BR_NAME'/>
- <model type='virtio'/>
- <target dev='TAP_NAME'/>
- </interface>'''
-
-xml_pci = '''
- <hostdev mode='subsystem' type='pci' managed='yes'>
- <driver name='kvm'/>
- <source>
- <address domain='0x0000' bus='0xBUS' slot='0xSLOT' function='0xFUNCTION' />
- </source>
- </hostdev>'''
-xml_9p = '''
- <filesystem type='mount' accessmode='passthrough'>
- <source dir='9P_PATH'/>
- <target dir='9pfs'/>
- </filesystem>'''
-xml_tail = '''
- <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
- <listen type='address' address='0.0.0.0'/>
- </graphics>
- </devices>
-</domain>'''
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py
deleted file mode 100644
index 19bf12f2..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py
+++ /dev/null
@@ -1,56 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-
-import stevedore
-
-LOG = logging.getLogger(__name__)
-
-
-class PluginManager(object):
-
- def __init__(self):
- self.instance = None
- self.saved = {}
-
- def build(self, cfg):
- scheme = cfg["scheme"]
- if scheme in self.saved:
- # reuse old instance
- self.instance = self.saved[scheme]
- else:
- mgr = stevedore.driver.DriverManager(namespace="env_build.plugins",
- name=scheme,
- invoke_on_load=False)
- self.instance = mgr.driver()
- self.saved[scheme] = self.instance
-
- self.instance.clean()
- return self.instance.build(cfg)
-
- def clean(self):
- if self.instance:
- self.instance.clean()
- self.instance = None
-
-
-if __name__ == "__main__":
- import argparse
- from vstf.controller.env_build.env_build import IntentParser
-
- parser = argparse.ArgumentParser()
- parser.add_argument('--config', help='config file to parse')
- args = parser.parse_args()
- logging.basicConfig(level=logging.INFO)
- parser = IntentParser(args.config)
- cfg_intent = parser.parse_cfg_file()
- for host_cfg in cfg_intent['env-build']:
- tn = PluginManager()
- tn.build(host_cfg)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py
deleted file mode 100644
index e20b5dd5..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py
+++ /dev/null
@@ -1,46 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import stevedore
-
-
-class DriverPluginManager(object):
-
- def __init__(self):
- self.plugins = {}
- self.mgr = stevedore.extension.ExtensionManager(
- namespace="drivers.plugins", invoke_on_load=True)
-
- def load(self, drivers):
- plugin = self.determine_driver_type(drivers)
- ext = self.mgr[plugin]
- ext.obj.load(drivers)
- return True
-
- def clean(self):
- self.mgr.map(self._clean)
- return True
-
- def _clean(self, ext, *args, **kwargs):
- ext.obj.clean()
-
- def get_all_supported_drivers(self):
- if not self.plugins:
- for ext_name in self.mgr.names():
- ext = self.mgr[ext_name]
- self.plugins[ext_name] = ext.obj.get_supported_drivers()
- return self.plugins
-
- def determine_driver_type(self, drivers):
- s = set(drivers)
- for plugin, supported in self.get_all_supported_drivers().items():
- if not (s - set(supported)):
- return plugin
- else:
- raise Exception('unspported drivers: %s' % drivers)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py
deleted file mode 100644
index 807143f0..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py
+++ /dev/null
@@ -1,42 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from abc import ABCMeta
-from abc import abstractmethod
-
-
-class DriverPlugin:
- __metaclass__ = ABCMeta
-
- @abstractmethod
- def __init__(self):
- """don't pass in any args for __init__.
- """
-
- @abstractmethod
- def clean(self):
- """implement this clean function to clean environment before and after calling any other functions.
-
- """
- pass
-
- @abstractmethod
- def load(self, drivers):
- """load driver modules.
-
- :param list drivers:list of modules to be inserted. for example:[ixgbe,vhost_net]
-
- """
- pass
-
- @abstractmethod
- def get_supported_drivers(self):
- """return a list of supported driver modules.
- """
- pass
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py
deleted file mode 100644
index 2004b8e8..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py
+++ /dev/null
@@ -1,50 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from vstf.agent.env.driver_plugins import model
-from vstf.common.utils import check_and_rmmod, check_call
-
-
-class OriginDriverPlugin(model.DriverPlugin):
- """
- implement for operating linux origin driver modules.
- """
-
- def __init__(self):
- """
- list all origin drivers in self.origin_drivers
- """
- self.origin_drivers = ['ixgbe', 'bnx2x', 'i40e', 'be2net', 'vhost_net']
-
- def clean(self):
- """clean drivers list in self.origin_drivers.
-
- """
- for mod in self.origin_drivers:
- check_and_rmmod(mod)
-
- check_and_rmmod('tun')
- return True
-
- def load(self, drivers):
- """insmod drivers
-
- :param list drivers:list of drivers link ['ixgbe','vhost_net']
- """
- # load implicit 'tun' module dependency for vhost_net
- if 'vhost_net' in drivers:
- check_call("modprobe tun", shell=True)
-
- for drv in drivers:
- check_call("modprobe %s" % drv, shell=True)
-
- return True
-
- def get_supported_drivers(self):
- return self.origin_drivers
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py
deleted file mode 100644
index 53cddebb..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py
+++ /dev/null
@@ -1,236 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-import os
-import time
-import logging
-import subprocess
-import sys
-
-import constant
-from utils import IPCommandHelper, umount, check_and_rmmod, check_output, check_call, call
-
-LOG_FILE = '/tmp/fsmonitor.log'
-PID_FILE = '/tmp/fsmonitor.pid'
-LOG = logging.getLogger('__name__')
-
-
-class VMOperation(object):
-
- def __init__(self):
- self.RTE_SDK = '/home/dpdk-2.0.0'
- self.RTE_TARGET = 'x86_64-native-linuxapp-gcc'
- self.nr_hugepages = '512'
- self.pid = 0
- self.ip_helper = IPCommandHelper()
-
- def config_ip(self, mac, ip):
- device = self.ip_helper.mac_device_map[mac]
- check_call("ifconfig %s %s up" % (device, ip), shell=True)
-
- def config_gw(self, ip):
- call("route del default", shell=True)
- check_call("route add default gw %s" % ip, shell=True)
-
- def recover_nic_binding(self, *tap_macs):
- if self.pid:
- os.kill(self.pid, 9)
- self.pid = None
- bdf_str = ''
- for mac in tap_macs:
- bdf = self.ip_helper.mac_bdf_map[mac]
- bdf_str = bdf_str + ' ' + bdf
- cmd = 'python %s/tools/dpdk_nic_bind.py --bind=virtio-pci %s' % (
- self.RTE_SDK, bdf_str)
- LOG.debug("recover_nic_binding runs cmd = %s", cmd)
- check_call(cmd, shell=True)
-
- def set_pktloop_dpdk(self, *tap_macs):
- RTE_SDK = self.RTE_SDK
- RTE_TARGET = self.RTE_TARGET
- umount("/mnt/huge")
- with open('/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages', 'w') as f:
- f.write(self.nr_hugepages)
- check_call("mkdir -p /mnt/huge", shell=True)
- check_call("mount -t hugetlbfs nodev /mnt/huge", shell=True)
- check_call("modprobe uio", shell=True)
- check_and_rmmod('igb_uio')
- check_call(
- "insmod %s/%s/kmod/igb_uio.ko" %
- (RTE_SDK, RTE_TARGET), shell=True)
-
- bdf_str = ''
- for mac in tap_macs:
- bdf = self.ip_helper.mac_bdf_map[mac]
- bdf_str = bdf_str + ' ' + bdf
-
- check_call(
- 'python %s/tools/dpdk_nic_bind.py --bind=igb_uio %s' %
- (RTE_SDK, bdf_str), shell=True)
- cpu_num = int(
- check_output(
- 'cat /proc/cpuinfo | grep processor | wc -l',
- shell=True))
- cpu_bit_mask = 0
- i = cpu_num
- while i:
- cpu_bit_mask = (cpu_bit_mask << 1) + 1
- i -= 1
- cpu_bit_mask = hex(cpu_bit_mask)
- cmd = "%s/%s/app/testpmd -c %s -n %d -- --disable-hw-vlan --disable-rss --nb-cores=%d --rxq=%d --txq=%d --rxd=4096 --txd=4096" % (
- RTE_SDK, RTE_TARGET, cpu_bit_mask, cpu_num / 2, cpu_num - 1, (cpu_num - 1) / 2, (cpu_num - 1) / 2)
- LOG.info("set_pktloop_dpdk runs cmd = %s", cmd)
- p = subprocess.Popen(cmd.split())
- if not p.poll():
- self.pid = p.pid
- return True
- else:
- raise Exception("start testpmd failed")
-
- def config_amqp(self, file_name):
- if not os.path.isfile(file_name):
- raise Exception("file: %s not exists." % file_name)
- check_call("cp %s /etc/vstf/amqp/amqp.ini" % file_name, shell=True)
- check_call("vstf-agent restart", shell=True)
- return True
-
- def stop_vstf(self):
- check_call("vstf-agent stop", shell=True)
- return True
-
-
-class FSMonitor(object):
-
- def __init__(self, pidfile=None, interval=1):
- if pidfile:
- self.pidfile = pidfile
- else:
- self.pidfile = PID_FILE
- self.interval = interval
- self.handlers = []
- self.kill_old()
- umount(constant.FS_MOUNT_POINT)
- check_call("mkdir -p %s" % constant.FS_MOUNT_POINT, shell=True)
- check_call("mount -t 9p 9pfs %s" % constant.FS_MOUNT_POINT, shell=True)
- os.chdir(constant.FS_MOUNT_POINT)
- with open(constant.VM_UP_Flag_FILE, 'w'):
- pass
-
- def kill_old(self):
- out = check_output(
- "ps -ef | grep -v grep | egrep 'python.*%s' | awk '{print $2}'" %
- sys.argv[0], shell=True)
- if out:
- for pid in out.split():
- if int(pid) != os.getpid():
- os.kill(int(pid), 9)
- LOG.debug("found daemon:pid=%s and kill.", pid)
-
- def set_fail(self, failed_reason):
- with open(constant.VM_CMD_RETURN_CODE_FILE, 'w') as f:
- f.writelines(
- [constant.VM_CMD_EXCUTE_FAILED_FLAG_CONTENT, '\n', failed_reason])
- with open(constant.VM_CMD_DONE_FLAG_FILE, 'w') as f:
- pass
-
- def set_success(self):
- with open(constant.VM_CMD_RETURN_CODE_FILE, 'w') as f:
- f.write(constant.VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT)
- with open(constant.VM_CMD_DONE_FLAG_FILE, 'w') as f:
- pass
-
- def register_handler(self, obj):
- self.handlers.append(obj)
-
- def daemonize(self):
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0)
- except OSError as e:
- sys.stderr.write(
- 'fork #1 failed:%d,(%s)\n' %
- (e.errno, e.strerror))
- sys.exit(1)
- os.setsid()
- os.umask(0)
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0)
- except OSError as e:
- sys.stderr.write(
- 'fork #2 failed:%d,(%s)\n' %
- (e.errno, e.strerror))
- sys.exit(1)
- LOG.debug(
- "pid:%d,ppid:%d,sid:%d",
- os.getpid(),
- os.getppid(),
- os.getsid(
- os.getpid()))
- old = open('/dev/null', 'r')
- os.dup2(old.fileno(), sys.stdin.fileno())
- old = open('/dev/null', 'a+')
- os.dup2(old.fileno(), sys.stdout.fileno())
- old = open('/dev/null', 'a+', 0)
- os.dup2(old.fileno(), sys.stderr.fileno())
- pid = str(os.getpid())
- file(self.pidfile, 'w+').write('%s\n' % pid)
-
- def run_forever(self):
- # todo:resolve handlers name space conflict
- self.daemonize()
- while True:
- time.sleep(self.interval)
- files = os.listdir(constant.FS_MOUNT_POINT)
- if constant.VM_CMD_SET_FLAG_FILE in files and constant.VM_CMD_CONTENT_FILE in files:
- with open(constant.VM_CMD_CONTENT_FILE, 'r') as f:
- out = f.read().strip()
- LOG.debug("new command arrived:%s", out)
- cmd_param = out.split()
- cmd = cmd_param[0]
- param = cmd_param[1:]
- for obj in self.handlers:
- if hasattr(obj, cmd) and callable(getattr(obj, cmd)):
- LOG.debug("method:%s found!", cmd)
- method = getattr(obj, cmd)
- try:
- method(*param)
- self.set_success()
- LOG.debug("cmd sucessfully done")
- except Exception as e:
- LOG.debug(
- 'failed to run:%s %s,reason:%s', cmd, param, str(e))
- self.set_fail(str(e))
- break
- else:
- LOG.debug("method:%s not found!", cmd)
- self.set_fail(constant.VM_CMD_NOT_FOUND)
- os.remove(constant.VM_CMD_SET_FLAG_FILE)
- os.remove(constant.VM_CMD_CONTENT_FILE)
-
-
-if __name__ == '__main__':
- # echo "set_pktloop_dpdk" > command;touch command_set
- # echo "recover_nic_binding" > command;touch command_set
- # echo "config_ip 56:6f:44:a5:3f:a2 192.168.188.200/23" > command;touch command_set
- # echo "config_gw 192.168.188.1" > command;touch command_set
- # echo set_pktloop_dpdk 56:6f:44:a5:3f:a2 56:6f:44:a5:3f:a3 > command;touch command_set
- # echo recover_nic_binding 56:6f:44:a5:3f:a2 56:6f:44:a5:3f:a3 >
- # command;touch command_set
- import os
- logging.basicConfig(level=logging.DEBUG, filename=LOG_FILE, filemode='w')
- os.environ['PATH'] = os.environ["PATH"] + ":/usr/local/bin"
- LOG.info(os.environ['PATH'])
- vm_op = VMOperation()
- agent = FSMonitor()
- agent.register_handler(vm_op)
- agent.run_forever()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py
deleted file mode 100644
index 3ae80a39..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py
+++ /dev/null
@@ -1,21 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-VM_UP_Flag_FILE = 'up'
-VM_CMD_DONE_FLAG_FILE = 'command_done'
-VM_CMD_RESULT_FILE = 'command_result_data'
-VM_CMD_SET_FLAG_FILE = 'command_set'
-VM_CMD_CONTENT_FILE = 'command'
-VM_CMD_RETURN_CODE_FILE = 'command_result'
-VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT = 'success'
-VM_CMD_EXCUTE_FAILED_FLAG_CONTENT = 'fail'
-VM_CMD_NOT_FOUND = 'comamnd_not_found'
-VM_UP_TIME_OUT = 120
-VM_COMMON_CMD_EXCUTE_TIME_OUT = 10
-FS_MOUNT_POINT = '/mnt/9pfs'
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py
deleted file mode 100644
index c28b6ec6..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py
+++ /dev/null
@@ -1,120 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-from StringIO import StringIO
-import re
-import logging
-
-LOG = logging.getLogger(__name__)
-
-
-def call(cmd, shell=False):
- if shell:
- LOG.info(cmd)
- else:
- LOG.info(' '.join(cmd))
- return subprocess.call(cmd, shell=shell)
-
-
-def check_call(cmd, shell=False):
- if shell:
- LOG.info(cmd)
- else:
- LOG.info(' '.join(cmd))
- subprocess.check_call(cmd, shell=shell)
-
-
-def check_output(cmd, shell=False):
- if shell:
- LOG.info(cmd)
- else:
- LOG.info(' '.join(cmd))
- return subprocess.check_output(cmd, shell=shell)
-
-
-def check_and_kill(process):
- cmd = "ps -ef | grep -v grep | awk '{print $8}' | grep -w %s | wc -l" % process
- out = check_output(cmd, shell=True)
- if int(out):
- check_call(['killall', process])
-
-
-def check_and_rmmod(mod):
- cmd = "lsmod | awk '{print $1}' | grep -w %s | wc -l" % mod
- out = check_output(cmd, shell=True)
- if int(out):
- check_call(['rmmod', mod])
-
-
-def umount(path):
- mount_path_set = set()
- out = check_output("cat /proc/mounts", shell=True)
- f = StringIO(out)
- line = f.readline()
- while line:
- line = f.readline()
- if line:
- mpath = line.split()[1]
- mount_path_set.add(mpath)
- if path in mount_path_set:
- ret = call("umount %s" % path, shell=True)
- return ret == 0
- return True
-
-
-class IPCommandHelper(object):
-
- def __init__(self):
- self.devices = []
- self.macs = []
- self.device_mac_map = {}
- self.mac_device_map = {}
- self.bdf_device_map = {}
- self.device_bdf_map = {}
- self.mac_bdf_map = {}
- self.bdf_mac_map = {}
- buf = check_output("ip link", shell=True)
- macs = re.compile(
- "[A-F0-9]{2}(?::[A-F0-9]{2}){5}",
- re.IGNORECASE | re.MULTILINE)
- for mac in macs.findall(buf):
- if mac.lower() in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'):
- continue
- self.macs.append(mac)
- sio = StringIO(buf)
- for line in sio:
- m = re.match(r'^\d+:(.*):.*', line)
- if m and m.group(1).strip() != 'lo':
- self.devices.append(m.group(1).strip())
- for device, mac in zip(self.devices, self.macs):
- self.device_mac_map[device] = mac
- self.mac_device_map[mac] = device
- for device in self.devices:
- buf = check_output("ethtool -i %s" % device, shell=True)
- bdfs = re.findall(
- r'^bus-info: \d{4}:(\d{2}:\d{2}\.\d*)$',
- buf,
- re.MULTILINE)
- if bdfs:
- self.bdf_device_map[bdfs[0]] = device
- self.device_bdf_map[device] = bdfs[0]
- mac = self.device_mac_map[device]
- self.mac_bdf_map[mac] = bdfs[0]
- self.bdf_mac_map[bdfs[0]] = mac
-
-
-if __name__ == '__main__':
- ip_helper = IPCommandHelper()
- print ip_helper.device_mac_map
- print ip_helper.mac_device_map
- print ip_helper.bdf_device_map
- print ip_helper.device_bdf_map
- print ip_helper.mac_bdf_map
- print ip_helper.bdf_mac_map
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py
deleted file mode 100644
index 2fd7d69a..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py
+++ /dev/null
@@ -1,71 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-
-from vstf.common.utils import ping, my_sleep
-from vstf.agent.env.plugins.model import EnvBuilderPlugin
-from vstf.agent.env.basic.source_manager import SourceCodeManager
-from vstf.agent.env.basic.vm_manager import VMControlOperation
-from vstf.agent.env.vswitch_plugins.manager import VswitchPluginManager
-from vstf.agent.env.driver_plugins.manager import DriverPluginManager
-
-LOG = logging.getLogger(__name__)
-
-
-class Plugin(EnvBuilderPlugin):
-
- def __init__(self):
- super(Plugin, self).__init__()
- self.vm_mgr = VMControlOperation()
- self.vs_mgr = VswitchPluginManager()
- self.dr_mgr = DriverPluginManager()
-
- def clean(self):
- self.vm_mgr.clean_all_vms()
- self.vs_mgr.clean()
- self.dr_mgr.clean()
-
- def load_drivers(self):
- drivers = self.host_cfg['drivers']
- self.dr_mgr.load(drivers)
-
- def create_brs(self):
- for br_cfg in self.host_cfg['bridges']:
- plugin = self.vs_mgr.get_vs_plugin(br_cfg['type'])
- plugin.create_br(br_cfg)
-
- def config_br_ports(self):
- for vm_cfg in self.host_cfg['vms']:
- for tap_cfg in vm_cfg['taps']:
- plugin = self.vs_mgr.get_vs_plugin(tap_cfg['br_type'])
- plugin.set_tap_vid(tap_cfg)
- for br_cfg in self.host_cfg['bridges']:
- plugin = self.vs_mgr.get_vs_plugin(br_cfg['type'])
- plugin.set_fastlink(br_cfg)
-
- def create_vms(self):
- for vm_cfg in self.host_cfg['vms']:
- self.vm_mgr.create_vm(vm_cfg)
-
- def wait_vms(self):
- for vm_cfg in self.host_cfg['vms']:
- self.vm_mgr.wait_vm(vm_cfg['vm_name'])
- self.vm_mgr.init_config_vm(vm_cfg['vm_name'])
-
- def check_vm_connectivity(self):
- for vm_cfg in self.host_cfg['vms']:
- vm_ip = vm_cfg['init_config']['ctrl_ip_setting'].split('/')[0]
- for _ in range(3):
- ret = ping(vm_ip)
- if ret:
- break
- my_sleep(3)
- else:
- raise Exception("ping ip:%s failed." % vm_ip)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py
deleted file mode 100644
index b19ceb96..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py
+++ /dev/null
@@ -1,58 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from abc import ABCMeta
-from abc import abstractmethod
-
-
-class EnvBuilderPlugin:
- __metaclass__ = ABCMeta
-
- def __init__(self):
- self.host_cfg = None
- pass
-
- @abstractmethod
- def clean(self):
- pass
-
- @abstractmethod
- def load_drivers(self):
- pass
-
- @abstractmethod
- def create_brs(self):
- pass
-
- @abstractmethod
- def config_br_ports(self):
- pass
-
- @abstractmethod
- def create_vms(self):
- pass
-
- @abstractmethod
- def wait_vms(self):
- pass
-
- @abstractmethod
- def check_vm_connectivity(self):
- pass
-
- def build(self, cfg_intent):
- self.host_cfg = cfg_intent
- self.clean()
- self.load_drivers()
- self.create_brs()
- self.create_vms()
- self.wait_vms()
- self.config_br_ports()
- self.check_vm_connectivity()
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py
deleted file mode 100644
index 0c994d4e..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py
+++ /dev/null
@@ -1,47 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-
-from vstf.agent.env.plugins.model import EnvBuilderPlugin
-from vstf.agent.env.driver_plugins.manager import DriverPluginManager
-
-LOG = logging.getLogger(__name__)
-
-
-class Plugin(EnvBuilderPlugin):
-
- def __init__(self):
- super(Plugin, self).__init__()
- self.dr_mgr = DriverPluginManager()
-
- def clean(self):
- self.dr_mgr.clean()
-
- def install(self):
- pass
-
- def load_drivers(self):
- drivers = self.host_cfg['drivers']
- self.dr_mgr.load(drivers)
-
- def create_brs(self):
- pass
-
- def config_br_ports(self):
- pass
-
- def create_vms(self):
- pass
-
- def wait_vms(self):
- pass
-
- def check_vm_connectivity(self):
- pass
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py
deleted file mode 100644
index fb6a54ce..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py
+++ /dev/null
@@ -1,74 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from vstf.agent.env.vswitch_plugins import model
-from vstf.common.utils import check_call, get_eth_by_bdf, check_output
-
-
-class BridgePlugin(model.VswitchPlugin):
-
- def __init__(self):
- pass
-
- def clean(self):
- """clean brs created before.
-
- """
- out = check_output(
- r"brctl show | grep -v '^\s' | awk '{print $1}'|sed '1,1d'",
- shell=True)
- print out
- for br in out.split():
- if br != 'br0':
- self._del_br(br)
-
- return True
-
- def init(self):
- pass
-
- def _del_br(self, name):
- check_call('ip link set dev %s down' % name, shell=True)
- check_call('brctl delbr %s' % name, shell=True)
-
- def create_br(self, br_cfg):
- """Create a bridge(virtual switch). Return True for success, return False for failure.
-
- :param dict br_cfg: configuration for bridge creation like
- {
- "name": "br1",
- "uplinks": [
- {
- "bdf": "04:00.0",
- },
- {
- "bdf": "04:00.1",
- }
- ]
- }
-
- """
- name, uplinks = br_cfg['name'], br_cfg['uplinks']
- check_call("brctl addbr %s" % name, shell=True)
- for uplink in uplinks:
- device = get_eth_by_bdf(uplink['bdf'])
- check_call("ip link set dev %s up" % device, shell=True)
- check_call("brctl addif %s %s" % (name, device), shell=True)
- check_call("ip link set dev %s up" % name, shell=True)
- return True
-
- def set_tap_vid(self, tap_cfg):
- """linux bridge doesn't support vlan id setting.
- """
- return True
-
- def set_fastlink(self, br_cfg):
- """linux bridge doesn't support openflow protocol.
- """
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py
deleted file mode 100644
index 4890ee11..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py
+++ /dev/null
@@ -1,37 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import stevedore
-
-
-class VswitchPluginManager(object):
-
- def __init__(self):
- self.plugin = None
- self.mgr = stevedore.extension.ExtensionManager(
- namespace="vswitch.plugins", invoke_on_load=True)
-
- def clean(self):
- if self.plugin:
- self.plugin.clean()
- self.plugin = None
- for plugin in self.mgr.names():
- self.mgr[plugin].obj.clean()
- return True
-
- def get_vs_plugin(self, plugin):
- if plugin in self.mgr.names():
- ext = self.mgr[plugin]
- self.plugin = ext.obj
- return self.plugin
- else:
- raise Exception("unsupported vswitch plugin: %s" % plugin)
-
- def get_supported_plugins(self):
- return self.mgr.names()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py
deleted file mode 100644
index 8a80e44e..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py
+++ /dev/null
@@ -1,67 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from abc import ABCMeta
-from abc import abstractmethod
-
-
-class VswitchPlugin:
- __metaclass__ = ABCMeta
-
- @abstractmethod
- def clean(self):
- """implement this clean function to clean environment before and after calling any other functions.
-
- """
- pass
-
- @abstractmethod
- def init(self):
- """implements this init function to setup necessary Preconditions.
-
- """
- pass
-
- @abstractmethod
- def create_br(self, br_cfg):
- """Create a bridge(virtual switch). Return True for success, return False for failure.
-
- :param dict br_cfg: configuration for bridge creation like
- {
- "type": "ovs",
- "name": "ovs1",
- "uplinks": [
- {
- "bdf": "04:00.0",
- "vlan_mode": "access",
- "vlan_id": "1"
- }
- ],
- "vtep": {},
- }
-
- """
- pass
-
- @abstractmethod
- def set_tap_vid(self, tap_cfg):
- """set vlan id or vxlan id for tap device(virtual nic for vm).
-
- :param dict tap_cfg: dictionary config for tap device like
- {
- "tap_name": "tap_in",
- "vlan_mode": "access",
- "vlan_id": "1"
- }
-
- """
- pass
-
- def set_fastlink(self, br_cfg):
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py
deleted file mode 100644
index 66943c1c..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py
+++ /dev/null
@@ -1,206 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import shutil
-import logging
-import time
-import re
-
-from vstf.agent.env.vswitch_plugins import model
-from vstf.common.utils import check_and_kill, check_and_rmmod, check_call, check_output, \
- get_eth_by_bdf, my_mkdir, call
-
-LOG = logging.getLogger(__name__)
-
-
-class OvsPlugin(model.VswitchPlugin):
-
- def __init__(self):
- self.daemons = ['ovs-vswitchd', 'ovsdb-server']
- self.mods = ['openvswitch']
- self.dirs = {'db': "/usr/local/etc/openvswitch"}
- self.cmds = []
- self.cmds.append("mkdir -p /usr/local/etc/openvswitch")
- self.cmds.append(
- "ovsdb-tool create /usr/local/etc/openvswitch/conf.db")
- self.cmds.append("ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
- --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
- --private-key=db:Open_vSwitch,SSL,private_key \
- --certificate=db:Open_vSwitch,SSL,certificate \
- --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
- --pidfile --detach")
- self.cmds.append("ovs-vsctl --no-wait init")
- self.cmds.append("ovs-vswitchd --pidfile --detach")
- self.initialized = False
-
- def init(self):
- if not self.initialized:
- self._start_servers()
- self.initialized = True
-
- def clean(self):
- """clean for ovs. Rmmod openvswitch.ko, kill openvswitch daemon process.
-
- """
- for process in self.daemons:
- check_and_kill(process)
- for mod in self.mods:
- check_and_rmmod(mod)
- for _, directory in self.dirs.items():
- if os.path.isdir(directory):
- LOG.info('rm -rf %s', directory)
- shutil.rmtree(directory, ignore_errors=True)
- self.initialized = False
- return True
-
- def create_br(self, br_cfg):
- """Create a bridge(virtual switch). Return True for success, return False for failure.
-
- :param dict br_cfg: configuration for bridge creation like
- {
- "type": "ovs",
- "name": "ovs1",
- "uplinks": [
- {
- "bdf": "04:00.0",
- "vlan_mode": "access",
- "vlan_id": "1"
- }
- ],
- "vtep": {},
- }
-
- """
- self.init()
- name, uplinks = br_cfg['name'], br_cfg['uplinks']
-
- check_call("ovs-vsctl add-br %s" % (name), shell=True)
- if br_cfg['vtep']: # vxlan supports
- local_ip, remote_ip = br_cfg['vtep'][
- 'local_ip'], br_cfg['vtep']['remote_ip']
- assert len(uplinks) == 1
- uplink = uplinks[0]
- device = get_eth_by_bdf(uplink['bdf'])
- time.sleep(0.5)
- vtep = 'vx1'
- check_call("ifconfig %s %s up" % (device, local_ip), shell=True)
- check_call("ovs-vsctl add-port %s %s" % (name, vtep), shell=True)
- check_call(
- "ovs-vsctl set interface %s type=vxlan options:remote_ip=%s" %
- (vtep, remote_ip), shell=True)
- for uplink in uplinks:
- device = get_eth_by_bdf(uplink['bdf'])
- vlan_mode = uplink['vlan_mode']
- vlan_id = uplink['vlan_id']
- check_call("ip link set dev %s up" % device, shell=True)
- call("ethtool -A %s rx off tx off " % device, shell=True)
- check_call("ovs-vsctl add-port %s %s" % (name, device), shell=True)
- if vlan_mode == 'trunk':
- check_call(
- "ovs-vsctl set port %s trunks=%s" %
- (device, vlan_id), shell=True)
- elif vlan_mode == 'access':
- check_call(
- "ovs-vsctl set port %s tag=%s" %
- (device, vlan_id), shell=True)
- else:
- raise Exception("unreconized vlan_mode:%s" % vlan_mode)
- return True
-
- def set_tap_vid(self, tap_cfg):
- """set vlan id or vxlan id for tap device(virtual nic for vm).
- return True for success, return False for failure.
-
- :param dict tap_cfg: dictionary config for tap device like
- {
- "tap_name": "tap_in",
- "vlan_mode": "access",
- "vlan_id": "1"
- }
-
- """
- port, vlan_mode, vlan = tap_cfg['tap_name'], tap_cfg[
- 'vlan_mode'], tap_cfg['vlan_id']
- assert vlan_mode in ('access', 'vxlan')
- if int(vlan) > '4095':
- # vxlan setting
- self.__set_tap_vid(port, "vxlan", vlan)
- else:
- # vlan setting
- self.__set_tap_vid(port, vlan_mode, vlan)
- return True
-
- def set_fastlink(self, br_cfg):
- """connect two ports directly, so that packets comes from any one port be forwarded to the other.
- return True for success, return False for failure.
-
- :param dict br_cfg: dictionary configuration for linking ports.
- {
- "name": "ovs1",
- "fastlink": [
- {
- "inport": "04:00.0",
- "outport": "tap_in"
- }
- ]
- }
- """
- br_name = br_cfg['name']
- for fast_cfg in br_cfg['fastlink']:
- p1, p2 = fast_cfg['inport'], fast_cfg['outport']
- self.__fastlink(br_name, p1, p2)
- return True
-
- def _start_servers(self):
- for _, directory in self.dirs.items():
- my_mkdir(directory)
- for mod in self.mods:
- check_call("modprobe %s" % mod, shell=True)
- for cmd in self.cmds:
- check_call(cmd, shell=True)
- return True
-
- def __set_tap_vid(self, port, vlan_mode, vlan_id):
- if vlan_mode == 'vxlan':
- raise Exception("don't support vxlan setting right now.")
- elif vlan_mode == 'trunk':
- check_call(
- "ovs-vsctl set port %s trunks=%s" %
- (port, vlan_id), shell=True)
- else:
- check_call(
- "ovs-vsctl set port %s tag=%s" %
- (port, vlan_id), shell=True)
-
- def __fastlink(self, br, p1, p2):
- LOG.info("_fastlink(%s,%s,%s)", br, p1, p2)
- p1 = p1.replace(' ', '')
- p2 = p2.replace(' ', '')
- bdfs = check_output(
- "lspci |grep Eth | awk '{print $1}'",
- shell=True).splitlines()
- if p1 in bdfs:
- p1 = get_eth_by_bdf(p1)
- if p2 in bdfs:
- p2 = get_eth_by_bdf(p2)
- ovs_port = {}
- buf = check_output("ovs-ofctl show %s" % br, shell=True)
- port_info = re.compile(r"[0-9]+\(.*\)", re.IGNORECASE | re.MULTILINE)
- for s in port_info.findall(buf):
- port_num, interface = s.replace('(', ' ').replace(')', ' ').split()
- ovs_port[interface] = port_num
- pn1, pn2 = ovs_port[p1], ovs_port[p2]
- check_call(
- "ovs-ofctl add-flow %s in_port=%s,priority=100,action=output:%s" %
- (br, pn1, pn2), shell=True)
- check_call(
- "ovs-ofctl add-flow %s in_port=%s,priority=100,action=output:%s" %
- (br, pn2, pn1), shell=True)
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py
deleted file mode 100644
index 2fd20db1..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py
+++ /dev/null
@@ -1,78 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import re
-import subprocess
-import logging
-
-log = logging.getLogger(__name__)
-
-
-def run_cmd(cmd, shell=True):
- try:
- ret = subprocess.check_output(cmd, shell=shell)
- except subprocess.CalledProcessError as e:
- raise e
- return ret
-
-
-class Resource(object):
-
- def __init__(self):
- super(Resource, self).__init__()
- self.sysfs = "/sys/devices/system/node"
- self.mapping = {}
- for node in self._init_numa():
- self.mapping[node] = {}
-
- process_mapping = self._get_process_mapping(node)
- for process_index in xrange(0, len(bin(process_mapping)) - 2):
- if process_mapping & 1 << process_index != 0:
- core = self._get_core_id(node, process_index)
- if core not in self.mapping[node]:
- self.mapping[node][core] = []
- self.mapping[node][core].append(process_index)
-
- def _get_process_mapping(self, numa_node):
- ret = run_cmd("cat " + self.sysfs + '/' + numa_node +
- '/cpumap').replace(',', '').lstrip('0')
- return int(ret, 16)
-
- def _get_core_id(self, numa_node, process_index):
- cmd = "cat " + self.sysfs + '/' + numa_node + \
- '/cpu' + str(process_index) + '/topology/core_id'
- return run_cmd(cmd).strip('\n')
-
- def _init_numa(self):
- """the node name is node0, node1......"""
- try:
- node_list = os.listdir(self.sysfs)
- except Exception as e:
- raise e
- ret = []
- partten = re.compile("^node[0-9]{,}$")
- for node in node_list:
- if partten.match(node) is None:
- continue
- ret.append(node)
- return ret
-
-
-class Equalizer(Resource):
-
- def __init__(self):
- super(Equalizer, self).__init__()
-
- def topology(self):
- print self.mapping
-
-
-e = Equalizer()
-e.topology()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py
deleted file mode 100644
index 8a01dfc6..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py
+++ /dev/null
@@ -1,179 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import commands
-
-try:
- import xml.etree.cElementTree as ET
-except ImportError:
- import xml.etree.ElementTree as ET
-
-
-class GetPhyInfo(object):
-
- def __init__(self):
- pass
-
- def _get_range(self, temp):
- topo = {}
- phy_core_flag = True
- for sub in temp.split(','):
- r_list = []
- _start = sub.split('-')[0]
- _end = sub.split('-')[1]
- r_list.extend(range(int(_start), int(_end) + 1))
- if phy_core_flag:
- topo['phy_cores'] = r_list
- else:
- topo['virt_cores'] = r_list
- phy_core_flag = False
- return topo
-
- def _get_numa_num(self):
- flag, num = commands.getstatusoutput('lscpu | grep "NUMA node(s):"')
- try:
- num = num.split(':')[1]
- except:
- print('get numa %s value failed.' % (num))
- return num
-
- def get_numa_core(self):
- numa = {}
- num = self._get_numa_num()
- for numa_id in range(0, int(num)):
- flag, temp = commands.getstatusoutput(
- 'lscpu | grep "NUMA node%s"' %
- (str(numa_id)))
- try:
- temp = temp.split(':')[1].split()[0]
- except:
- print('get numa %s range %s failed.' % (str(numa_id), range))
- topo = self._get_range(temp)
- numa['node' + str(numa_id)] = topo
- return str(numa)
-
- def get_nic_numa(self, nic):
- result = {}
- try:
- flag, id = commands.getstatusoutput(
- 'cat /sys/class/net/%s/device/numa_node' %
- (nic))
- except:
- print('get nic numa id failed.')
- return id
-
- def _get_main_pid(self, xml_file):
- try:
- tree = ET.ElementTree(file=xml_file)
- root = tree.getroot()
- _main_pid = root.attrib['pid']
- except:
- print('[ERROR]Parse xml file failed, could not get qemu main pid')
- return _main_pid
-
- def _get_qemu_threads(self, xml_file):
- # import pdb
- # pdb.set_trace()
- _qemu_threads = []
- try:
- tree = ET.ElementTree(file=xml_file)
- root = tree.getroot()
- for element in tree.iterfind('vcpus/vcpu'):
- _qemu_threads.append(element.attrib['pid'])
- except:
- print('[ERROR]Parse xml file failed, could not get qemu threads.')
-
- return _qemu_threads
-
- def _get_mem_numa(self, xml_file):
- try:
- _mem_numa = None
- tree = ET.ElementTree(file=xml_file)
- root = tree.getroot()
- for element in tree.iterfind('domain/numatune/memory'):
- _mem_numa = element.attrib['nodeset']
- finally:
- return _mem_numa
-
- def _get_vhost_threads(self, xml_file):
- _vhost = []
- _main_pid = self._get_main_pid(xml_file)
-
- # get vhost info
- proc_name = 'vhost-' + _main_pid
- flag, temp = commands.getstatusoutput(
- 'ps -ef | grep %s | grep -v grep' %
- (proc_name))
- for line in temp.split('\n'):
- try:
- vhost = line.split()[1]
- _vhost.append(vhost)
- except:
- print('get vhost %s proc id failed' % (line))
-
- return _vhost
-
- def get_vm_info(self, vm_name):
- vm = {}
- src_path = '/var/run/libvirt/qemu/'
- xml_file = src_path + vm_name + '.xml'
-
- # get vm main pid from file
- _main_pid = self._get_main_pid(xml_file)
- # get vm vcpu thread from the libvirt file
- _qemu_threads = self._get_qemu_threads(xml_file)
- # get vm bind mem numa id
- _mem_numa = self._get_mem_numa(xml_file)
- # get vhost thread
- _vhosts = self._get_vhost_threads(xml_file)
-
- vm['main_pid'] = _main_pid
- vm['qemu_thread'] = _qemu_threads
- vm['mem_numa'] = _mem_numa
- vm['vhost_thread'] = _vhosts
- return vm
-
- def _get_proc_by_irq(self, irq):
- try:
- flag, info = commands.getstatusoutput(
- 'ps -ef | grep irq/%s | grep -v grep ' % (irq))
- proc_id = info.split('\n')[0].split()[1]
- except:
- print("[ERROR]grep process id failed.")
- return proc_id
-
- def get_nic_interrupt_proc(self, nic):
- _phy_nic_thread = []
- flag, info = commands.getstatusoutput(
- 'cat /proc/interrupts | grep %s' % (nic))
- for line in info.split('\n'):
- try:
- irq_num = line.split(':')[0].split()[0]
- proc_id = self._get_proc_by_irq(irq_num)
- _phy_nic_thread.append([irq_num, proc_id])
- except:
- print("[ERROR]get irq num failed.")
- return _phy_nic_thread
-
- def get_libvirt_vms(self):
- vm_list = []
- flag, info = commands.getstatusoutput('virsh list')
- list = info.split('\n')
- if list[-1] == '':
- list.pop()
- del list[0]
- del list[0]
-
- for line in list:
- try:
- vm_temp = line.split()[1]
- vm_list.append(vm_temp)
- except:
- print("Get vm name failed from %s" % (line))
- return vm_list
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py
deleted file mode 100644
index 4579c506..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py
+++ /dev/null
@@ -1,69 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import commands
-import re
-
-
-# import pdb
-# pdb.set_trace()
-
-class Optimize(object):
-
- def __init__(self):
- pass
-
- def bind_cpu(self, cpu_range, thread):
- flag, num = commands.getstatusoutput(
- 'taskset -pc %s %s' %
- (cpu_range, thread))
- return flag
-
- def catch_thread_info(self):
- thread_info = {
- 'fwd_vhost': None,
- 'src_recv_irq': None,
- 'dst_send_irq': None}
- # top -H get the usage info
- flag, threads_usages = commands.getstatusoutput(
- 'top -bH -n1 -c -w 2000')
- line_array = threads_usages.split('\n')
- # get highest vhost line
- for line in line_array:
- if re.search('vhost-', line) and self._check_thread_usage(line):
- thread_info['fwd_vhost'] = line.split()[0]
- break
- # get highest irq thread as src_recv_irq thread
- for line in line_array:
- if re.search('irq/', line) and self._check_thread_usage(line):
- thread_info['src_recv_irq'] = line.split()[0]
- line_array.remove(line)
- break
- # get the second highest irq thread as dst_send_irq
- for line in line_array:
- if re.search('irq/', line) and self._check_thread_usage(line):
- thread_info['dst_send_irq'] = line.split()[0]
- break
- # check the data valid
-
- for key in thread_info.keys():
- if thread_info[key] is None:
- return False, str(thread_info)
- return True, str(thread_info)
-
- def _check_thread_usage(self, line):
- try:
- usage = line.split()[8]
- if float(usage) >= 3.0:
- return True
- else:
- print("[ERROR]The highest thread %s is less than 0.05" % usage)
- return False
- except:
- print("[ERROR]The thread usage get failed.")
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py
deleted file mode 100644
index 316cbab8..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py
+++ /dev/null
@@ -1,20 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from vstf.common.utils import check_call, call, check_output
-
-
-def affctl_load(policy):
- cmd = "affctl load %s" % policy
- return check_call(cmd, shell=True)
-
-
-def affctl_list():
- cmd = "affctl list"
- return check_output(cmd, shell=True)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py
deleted file mode 100644
index 3f4a3728..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py
+++ /dev/null
@@ -1,59 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import vstf.common.utils as utils
-
-__all__ = ["autoneg_on", "autoneg_off", "autoneg_query"]
-
-_para_map = {
- "Autonegotiate": ("-A", "-a", "autoneg"),
- "RX": ("-A", "-a", "rx"),
- "TX": ("-A", "-a", "tx"),
-}
-
-
-def autoneg_on(iface, nspace=None):
- return _set(nspace, iface, Autonegotiate="on", RX="on", TX="on")
-
-
-def autoneg_off(iface, nspace=None):
- return _set(nspace, iface, Autonegotiate="off", RX="off", TX="off")
-
-
-def autoneg_query(iface, nspace=None):
- return _query(nspace, iface, "-a")
-
-
-def _set(nspace, iface, **kwargs):
- cmds = {}
- for item, value in kwargs.items():
- opt, _, key = _para_map[item]
- cmds.setdefault(opt, [])
- cmds[opt].append(key)
- cmds[opt].append(value)
-
- for key, value in cmds.items():
- cmd = _namespace(nspace)
- cmd += ["ethtool", key, iface] + value
- utils.call(cmd)
-
- return True
-
-
-def _query(nspace, iface, item):
- cmd = _namespace(nspace)
- cmd += ["ethtool", item, iface]
- return utils.check_output(cmd)
-
-
-def _namespace(nspace):
- result = ""
- if nspace:
- result = "ip netns exec %(namespace)s " % {"namespace": nspace}
- return result.split()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py
deleted file mode 100644
index 8eca165c..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py
+++ /dev/null
@@ -1,165 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import signal
-import os
-import time
-import logging
-
-import vstf.common.decorator as deco
-import vstf.agent.perf.utils as utils
-from vstf.common.utils import kill_by_name
-
-LOG = logging.getLogger(__name__)
-
-
-class Iperf(object):
-
- def __init__(self):
- self._send_processes = []
- self._receive_processes = []
- self._typemap = {
- "tcp_bw": "",
- "udp_bw": " -u ",
- }
-
- @deco.check("protocol", choices=['tcp_bw', 'udp_bw'])
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- @deco.check("time", defaults=600)
- @deco.check("size", defaults=64)
- @deco.check("threads", defaults=1)
- def send_start(self, **kwargs):
-
- cmd = self.format_send_start(**kwargs)
- LOG.debug("cmd:%s", cmd)
-
- process = subprocess.Popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(1)
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start iperf send success"
- self._send_processes.append(process)
- else:
- print ret
- error_str = "start iperf send failed, %s", (str(kwargs))
-
- return ret, error_str
-
- @deco.namespace()
- def format_send_start(self, **kwargs):
- cmd = "iperf %(type)s -c %(dst_ip)s -i 1 -l %(pkt_size)s -t %(time)s -P %(threads)s "
- context = {
- 'type': self._typemap[kwargs['protocol']],
- 'dst_ip': kwargs['dst'][0]['ip'],
- 'time': kwargs['time'],
- 'pkt_size': kwargs['size'],
- 'threads': kwargs['threads'],
- }
- cmd = cmd % context
- return cmd
-
- def send_stop(self):
- results = []
- for process in self._send_processes:
- poll = process.poll()
- if poll is None:
- process.kill()
- ret = 0
- read = "process is stopped by killed"
- results.append((ret, read))
-
- self._send_processes = []
- return results
-
- @deco.namespace()
- def format_receive_start(self, **kwargs):
- cmd = 'iperf %s -s ' % (self._typemap[kwargs['protocol']])
- return cmd
-
- @deco.check("protocol", choices=['tcp_bw', 'udp_bw'])
- @deco.check("namespace", defaults=None)
- def receive_start(self, **kwargs):
- cmd = self.format_receive_start(**kwargs)
- LOG.debug("cmd:%s", cmd)
-
- process = subprocess.Popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(1)
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start iperf receive success"
- self._receive_processes.append(process)
- else:
- print ret
- error_str = "start iperf receive failed, %s" % (str(kwargs))
- return ret, error_str
-
- def receive_stop(self):
- ret = 0
- for process in self._receive_processes:
- process.kill()
- ret = process.wait()
- self._receive_processes = []
- return ret
-
- def receive_kill(self):
- ret = 0
- receive_pids = utils.get_pid_by_name('iperf')
- for pid in receive_pids:
- os.kill(pid, signal.SIGKILL)
- time.sleep(0.5)
- error_str = "stop iperf receive success"
- LOG.debug(error_str)
- return ret, error_str
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name('iperf')
- self._send_processes = []
- self._receive_processes = []
- return True
-
-
-def unit_test():
- perf = Iperf()
- pro = 'udp_bw'
- print perf.receive_start(namespace='receive', protocol=pro)
-
- send = {
- "namespace": "send",
- "protocol": "udp_bw",
- "dst": [
- {"ip": "192.168.1.102"}
- ],
- "size": 64,
- "time": 5,
- }
- print perf.send_start(**send)
- time.sleep(10)
- print perf.send_stop()
- print perf.receive_stop()
-
-
-if __name__ == "__main__":
- from vstf.common.log import setup_logging
-
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf-iperf.log",
- clevel=logging.DEBUG)
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py
deleted file mode 100644
index bd9cc97f..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py
+++ /dev/null
@@ -1,178 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import time
-import subprocess
-import vstf.common.decorator as deco
-from vstf.common.utils import kill_by_name, my_popen
-
-import logging
-
-LOG = logging.getLogger(__name__)
-
-
-class Netmap(object):
-
- def __init__(self):
- self._send_processes = []
- self._receive_processes = []
-
- @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw')
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- @deco.check("src")
- @deco.check("size", defaults=64)
- @deco.check("threads", defaults=1)
- @deco.check("ratep", defaults=0)
- def send_start(self, **kwargs):
- cmd = self.format_send_start(**kwargs)
- LOG.info("cmd:%s", cmd)
-
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self._send_processes.append(process)
- time.sleep(0.5)
-
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start netmap send success"
- else:
- error_str = "start netmap send failed, %s" % (str(kwargs))
- process.wait()
- self._send_processes.remove(process)
-
- return ret, error_str
-
- def send_stop(self, **kwargs):
- LOG.info("send_stop")
- results = []
- ret = 0
- for process in self._send_processes:
- process.kill()
- process.wait()
- error_str = "stop netmap send success"
- results.append((ret, error_str))
- self._send_processes = []
- return results
-
- def format_send_start(self, **kwargs):
- cmd = "pkt-gen -i %(src_iface)s -f tx -l %(pkt_size)s -p %(threads)s -D %(dst_mac)s -R %(ratep)s"
- context = {
- 'src_iface': kwargs['src'][0]['iface'],
- 'dst_mac': kwargs['dst'][0]['mac'],
- 'pkt_size': kwargs['size'],
- 'threads': kwargs['threads'],
- 'ratep': kwargs['ratep']
- }
- cmd = cmd % context
- return cmd
-
- @deco.namespace()
- def format_receive_start(self, **kwargs):
- cmd = "pkt-gen -i %(iface)s -f rx"
- context = {
- 'iface': kwargs['dst'][0]['iface']
- }
- cmd = cmd % context
- return cmd
-
- @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw')
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- def receive_start(self, **kwargs):
-
- cmd = self.format_receive_start(**kwargs)
- LOG.info("cmd:%s", cmd)
-
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self._receive_processes.append(process)
- time.sleep(0.5)
-
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start netmap receive success"
- else:
- error_str = "start netmap receive failed, %s" % (str(kwargs))
- process.wait()
- self._receive_processes.remove(process)
-
- return ret, error_str
-
- def receive_stop(self, **kwargs):
- LOG.info("receive_stop")
- ret = 0
- for process in self._receive_processes:
- process.kill()
- process.wait()
- self._receive_processes = []
- error_str = "stop netmap receive success"
- self._receive_processes = []
- return ret, error_str
-
- def clean(self):
- self.send_stop()
- self.receive_stop()
- return True
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name('pkt-gen')
- self._send_processes = []
- self._receive_processes = []
- return True
-
-
-def unit_test():
- perf = Netmap()
- receive = {
- "protocol": "udp_bw",
- # "namespace": "receive",
- "dst": [
- {"iface": "p57p2"}
- ],
- }
- ret = perf.receive_start(**receive)
- LOG.info("*********receive_start***********")
- LOG.info("ret")
- send = {
- # "namespace": "send",
- "protocol": "udp_bw",
- "src": [
- {"iface": "eth4", "mac": "90:e2:ba:20:1f:d8"}
- ],
- "dst": [
- {"mac": "90:e2:ba:20:1f:d9"}
- ],
- "size": 64,
- "threads": 1,
- "ratep": 0
- }
- print perf.send_start(**send)
- print perf._send_processes
- time.sleep(10)
-
- print perf.send_stop()
- print perf.receive_stop()
-
-
-if __name__ == "__main__":
- from vstf.common.log import setup_logging
-
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf/vstf-netmap.log",
- clevel=logging.INFO)
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py
deleted file mode 100644
index 9aaaf58f..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py
+++ /dev/null
@@ -1,109 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-from vstf.common.utils import IPCommandHelper
-from vstf.agent.perf import ethtool
-from vstf.common.utils import check_call, check_output, ns_cmd, my_popen, my_sleep
-
-LOG = logging.getLogger(__name__)
-
-
-class Netns(object):
-
- def __init__(self):
- super(Netns, self).__init__()
- self.netns_add_str = "ip netns add %s"
- self.netns_del_str = " ip netns del %s"
- self.netns_add_device_str = " ip link set %s netns %s"
- self.set_link_up_str = "ip link set dev %s up"
- self.set_link_addr_str = "ip addr replace %s dev %s"
- self.netns_remove_device_str = "ip netns exec %s ip link set %s netns 1"
- # self.set_link_addr_str = "ifconfig %s %s up"
- self.ns_devices = {}
-
- def clean_all_namespace(self):
- out = check_output("ip netns list", shell=True)
- for ns in out.splitlines():
- self.remove_namespace(ns)
- return True
-
- def create_namespace(self, name):
- if name in (None, 'None', 'none'):
- return True
- cmd = self.netns_add_str % name
- check_call(cmd, shell=True)
- return True
-
- def remove_namespace(self, ns):
- if ns in (None, 'None', 'none'):
- return True
- ip_helper = IPCommandHelper(ns)
- for dev in ip_helper.device_mac_map:
- cmd = self.netns_remove_device_str % (ns, dev)
- check_call(cmd, shell=True)
- self.activate_device(None, dev)
- cmd = self.netns_del_str % ns
- check_call(cmd, shell=True)
- return True
-
- def add_device(self, ns, device):
- if ns is None:
- return True
- cmd = self.netns_add_device_str % (device, ns)
- check_call(cmd, shell=True)
- return True
-
- def config_ip(self, ns, device, ip):
- self.activate_device(ns, device)
- cmd = self.set_link_addr_str % (ip, device)
- cmd = ns_cmd(ns, cmd)
- check_call(cmd, shell=True)
- return True
-
- def activate_device(self, ns, device):
- cmd = self.set_link_up_str % device
- cmd = ns_cmd(ns, cmd)
- check_call(cmd, shell=True)
- return True
-
-
-class NetnsManager(object):
-
- def __init__(self):
- super(NetnsManager, self).__init__()
- self._netns = Netns()
-
- def config_dev(self, netdev):
- ns, device, ip = netdev["namespace"], netdev["iface"], netdev[
- 'ip_setting'] if "ip_setting" in netdev else netdev['ip']
- self._netns.create_namespace(ns)
- self._netns.add_device(ns, device)
- self._netns.config_ip(ns, device, ip)
- my_sleep(1)
- ethtool.autoneg_off(device, ns)
- return True
-
- def recover_dev(self, netdev):
- ns = netdev["namespace"]
- return self._netns.remove_namespace(ns)
-
- def clean_all_namespace(self):
- return self._netns.clean_all_namespace()
-
- @staticmethod
- def ping(ns, ip):
- cmd = "ping -w2 -c1 %s" % ip
- cmd = ns_cmd(ns, cmd)
- child = my_popen(cmd, shell=True)
- return 0 == child.wait()
-
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.DEBUG)
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py
deleted file mode 100644
index dac7d649..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py
+++ /dev/null
@@ -1,191 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import time
-import subprocess
-import vstf.common.constants as cst
-import vstf.common.decorator as deco
-from vstf.common import perfmark as mark
-from vstf.common.utils import kill_by_name, my_popen
-
-import logging
-
-LOG = logging.getLogger(__name__)
-
-
-class Netperf(object):
-
- def __init__(self):
- self._send_processes = []
- self._islat = False
- self._typemap = {
- "tcp_lat": "TCP_STREAM",
- "tcp_bw": "TCP_STREAM",
- "udp_lat": "UDP_STREAM",
- "udp_bw": "UDP_STREAM",
- }
-
- @deco.check("protocol", choices=cst.PROTOCOLS)
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- @deco.check("time", defaults=0)
- @deco.check("size", defaults=64)
- @deco.check("threads", defaults=1)
- def send_start(self, **kwargs):
- threads = kwargs.pop('threads')
- kwargs['buf'] = cst.SOCKET_BUF
- if kwargs['protocol'] in ['tcp_lat', 'udp_lat']:
- self._islat = True
- else:
- kwargs['time'] = 0
-
- cmd = self.format_send_start(**kwargs)
- LOG.info("cmd:%s", cmd)
-
- for _ in range(threads):
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self._send_processes.append(process)
- time.sleep(0.5)
- for process in self._send_processes:
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start netperf send success"
- else:
- error_str = "start netperf send failed, %s" % (str(kwargs))
- process.wait()
- self._send_processes.remove(process)
-
- return ret, error_str
-
- def send_stop(self, **kwargs):
- LOG.info("send_stop")
- results = []
- ret = 0
- for process in self._send_processes:
- poll = process.poll()
- if poll is None:
- if not self._islat:
- process.kill()
- read = "process is stopped by killed"
- else:
- ret = process.wait()
- read = process.stdout.read()
- read = self._parse_data(read)
- results.append((ret, read))
- self._send_processes = []
- self._islat = False
- return results
-
- @staticmethod
- def _parse_data(data):
- buf = data.splitlines()
- data = buf[2].strip().split(',')
- result = {
- mark.minLatency: float(data[0]),
- mark.avgLatency: float(data[1]),
- mark.maxLatency: float(data[2])
- }
- return result
-
- @deco.namespace()
- def format_send_start(self, **kwargs):
- # cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s -- -m %(pkt_size)s "
- cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s " \
- "-- -m %(pkt_size)s -s %(buf)s -S %(buf)s -o MIN_LATENCY,MEAN_LATENCY,MAX_LATENCY"
- context = {
- 'dst_ip': kwargs['dst'][0]['ip'],
- 'type': self._typemap[kwargs['protocol']],
- 'time': kwargs['time'],
- 'pkt_size': kwargs['size'],
- 'buf': kwargs['buf'],
- }
- cmd = cmd % context
- return cmd
-
- @deco.namespace()
- def format_receive_start(self, **kwargs):
- cmd = 'netserver'
- return cmd
-
- @deco.check("namespace")
- def receive_start(self, **kwargs):
-
- cmd = self.format_receive_start(**kwargs)
- LOG.info("cmd:%s", cmd)
-
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(0.5)
- ret = process.poll()
- if ret:
- error_str = "start netserver failed, %s" % (str(kwargs))
- else:
- ret = 0
- error_str = "start netserver success"
-
- return ret, error_str
-
- def receive_stop(self, **kwargs):
- LOG.info("receive_stop")
- ret = 0
- kill_by_name('netserver')
- time.sleep(0.5)
- error_str = "stop netserver success"
- return ret, error_str
-
- def clean(self):
- self.send_stop()
- self.receive_stop()
- return True
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name('netserver')
- kill_by_name('netperf')
- self._send_processes = []
- self._receive_processes = []
- return True
-
-
-def unit_test():
- perf = Netperf()
- ret = perf.receive_start(namespace='receive')
- print "*********receive_start***********"
- print ret
- send = {
- "namespace": "send",
- "protocol": "udp_lat",
- "dst": [
- {"ip": "192.168.1.102"}
- ],
- "size": 64,
- "threads": 1,
- "time": 10,
- }
- print perf.send_start(**send)
- print perf._send_processes
- time.sleep(10)
- print perf.send_stop()
- print perf.receive_stop()
-
-
-if __name__ == "__main__":
- from vstf.common.log import setup_logging
-
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf/vstf-netperf.log",
- clevel=logging.DEBUG)
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py
deleted file mode 100644
index 9aff0a0c..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py
+++ /dev/null
@@ -1,162 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import time
-import logging
-import vstf.agent.perf.utils as utils
-import vstf.common.decorator as deco
-from vstf.common.utils import my_popen
-
-LOG = logging.getLogger(__name__)
-
-
-class Pktgen(object):
-
- def __init__(self):
- utils.modprobe_pktgen()
- self._send_processes = []
-
- def _psetpg(self, dev):
- self._dev = dev
-
- def _vsetpg(self, key, value=''):
- with open(self._dev, 'w') as f:
- txt = "%(key)s %(value)s\n" % {'key': key, 'value': value}
- f.write(txt)
- LOG.info("write(%s) to %s", txt.strip(), self._dev)
-
- def _start(self):
- cmd = 'echo start > /proc/net/pktgen/pgctrl'
- process = my_popen(
- cmd,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- LOG.info('running pid:%s', process.pid)
- time.sleep(0.5)
- ret = process.poll()
- if ret is None:
- ret = 0
- self._send_processes.append(process)
- error_str = "start pktgen send success"
- else:
- error_str = "start pktgen send failed, stdout:%s,stderr:%s" % (
- process.stdout.read(), process.stderr.read())
- LOG.info(error_str)
- return ret, error_str
-
- def _rem_device_all(self):
- cpu_num = utils.get_cpu_num()
- for thread in range(0, cpu_num - 1):
- self._psetpg("/proc/net/pktgen/kpktgend_%s" % thread)
- self._vsetpg('rem_device_all')
- return True
-
- @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw')
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- @deco.check("src")
- @deco.check("size", defaults=64)
- @deco.check("threads", defaults=utils.get_default_threads())
- @deco.check("clone_skb", defaults=1)
- @deco.check("count", defaults=0)
- @deco.check("ratep", defaults=0)
- def send_start(self, **kwargs):
- # ensure that all sends is exit
- self.send_stop()
-
- interface_num = len(kwargs['src'])
- interfaces = []
- for i in range(interface_num):
- device = kwargs['src'][i]['iface']
- interfaces.append(device)
- utils.iface_up(device)
-
- self._rem_device_all()
-
- threads = kwargs['threads']
- for i in range(interface_num):
- dev_min = i * threads
- dev_max = (i + 1) * threads
- device = interfaces[i]
- for dev_id in range(dev_min, dev_max):
- queue_id = dev_id % threads
- self._psetpg("/proc/net/pktgen/kpktgend_%s" % dev_id)
- self._vsetpg('add_device', "%s@%s" % (device, queue_id))
- self._psetpg("/proc/net/pktgen/%s@%s" % (device, queue_id))
- self._vsetpg('pkt_size', kwargs['size'])
- self._vsetpg('clone_skb', kwargs['clone_skb'])
- self._vsetpg('dst_mac', kwargs['dst'][i]['mac'])
- self._vsetpg('src_mac', kwargs['src'][i]['mac'])
- self._vsetpg('count', kwargs['count'])
- if kwargs['ratep']:
- self._vsetpg('ratep', kwargs['ratep'])
- return self._start()
-
- def send_stop(self, **kwargs):
- results = []
- ret = 0
- for process in self._send_processes:
- process.kill()
- process.wait()
- LOG.info("process.kill(pktgen:%s)", process.pid)
- results.append((ret, process.stdout.read()))
- self._send_processes = []
- return results
-
- def receive_start(self, **kwargs):
- ret = 0
- error_str = "%s pktgen neednt receive start" % (self.__class__)
- LOG.debug(error_str)
- return ret, error_str
-
- def receive_stop(self, **kwargs):
- ret = 0
- error_str = "pktgen neednt receive stop"
- LOG.debug(error_str)
- return ret, error_str
-
- def clean(self):
- self.send_stop()
- return True
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- return self.clean()
-
-
-def unit_test():
- perf = Pktgen()
- print perf.receive_start()
- send = {
- "src": [
- {"iface": 'eth4', "mac": "90:e2:ba:20:1f:d8"}
- ],
- "dst": [
- {"mac": '90:e2:ba:20:1f:d9'}
- ],
- "size": 64,
- "threads": 1,
- 'ratep': 0
- }
- print perf.send_start(**send)
- time.sleep(30)
- print perf.send_stop()
- print perf.receive_stop()
-
-
-if __name__ == "__main__":
- from vstf.common.log import setup_logging
-
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf/vstf-pktgen.log",
- clevel=logging.DEBUG)
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py
deleted file mode 100644
index 25272d89..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py
+++ /dev/null
@@ -1,177 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import time
-import logging
-import vstf.common.decorator as deco
-from vstf.common import perfmark as mark
-from vstf.common.utils import kill_by_name, my_popen
-
-LOG = logging.getLogger(__name__)
-
-
-class Qperf(object):
-
- def __init__(self):
- self._send_processes = []
- self._receive_processes = []
-
- @deco.check("protocol", choices=['tcp_lat', 'udp_lat'])
- @deco.check("namespace", defaults=None)
- @deco.check("dst")
- @deco.check("time", defaults=10)
- @deco.check("size", defaults=64)
- def send_start(self, **kwargs):
- cmd = self.format_send_start(**kwargs)
- LOG.info("cmd:%s", cmd)
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(0.5)
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start qperf send success"
- self._send_processes.append(process)
- else:
- print ret
- error_str = "start qperf send failed, %s" % (str(kwargs))
- process.wait()
-
- return ret, error_str
-
- @deco.namespace()
- def format_send_start(self, **kwargs):
- cmd = "qperf %(dst_ip)s -t %(time)s -m %(pkt_size)s -vu %(type)s "
- context = {
- 'dst_ip': kwargs['dst'][0]['ip'],
- 'type': kwargs['protocol'],
- 'time': kwargs['time'],
- 'pkt_size': kwargs['size'],
- }
- cmd = cmd % context
- return cmd
-
- def send_stop(self, **kwargs):
- results = []
- for process in self._send_processes:
- process.wait()
- read = process.stdout.read()
- read = self._parse_data(read)
- ret = 0
- results.append((ret, read))
- self._send_processes = []
- return results
-
- @deco.namespace()
- def format_receive_start(self, **kwargs):
- cmd = 'qperf'
- return cmd
-
- def receive_start(self, **kwargs):
- cmd = self.format_receive_start(**kwargs)
- LOG.info("cmd:%s", cmd)
-
- process = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(0.5)
- ret = process.poll()
- if ret is None:
- ret = 0
- error_str = "start qperf receive success"
- self._receive_processes.append(process)
- else:
- print ret
- error_str = "start qperf receive failed, %s" % (str(kwargs))
- process.wait()
- raise Exception(error_str)
- return ret, error_str
-
- def receive_stop(self, **kwargs):
- ret = 0
- for process in self._receive_processes:
- process.kill()
- process.wait()
- self._receive_processes = []
- error_str = "stop qperf receive success"
- return ret, error_str
-
- def receive_kill(self):
- kill_by_name('qperf')
- self._receive_processes = []
- return True
-
- def clean(self):
- for process in self._receive_processes:
- process.kill()
- process.wait()
- LOG.info("process.kill(qperf daemon:%s)", process.pid)
- for process in self._send_processes:
- LOG.info("process.wait(qperf client:%s)", process.pid)
- process.wait()
- self._receive_processes = []
- self._send_processes = []
- return True
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name('qperf')
- self._send_processes = []
- self._receive_processes = []
- return True
-
- def _parse_data(self, data):
- LOG.info(data)
- latency = 0
- if data:
- buf = data.splitlines()
- if "latency" in buf[1]:
- data = buf[1].strip().split()
- if data[3] == "us":
- latency = float(data[2]) / 1000
- else:
- latency = float(data[2])
- result = {
- mark.minLatency: latency,
- mark.avgLatency: latency,
- mark.maxLatency: latency
- }
- return result
-
-
-def unit_test():
- perf = Qperf()
- perf.receive_start(namespace='receive')
-
- send = {
- "namespace": "send",
- "protocol": "udp_lat",
- "dst": [
- {"ip": "192.168.1.102"}
- ],
- "size": 64,
- }
- print perf.send_start(**send)
- time.sleep(10)
- print perf.send_stop()
- print perf.receive_stop()
-
-
-if __name__ == "__main__":
- from vstf.common.log import setup_logging
-
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf/vstf-qperf.log",
- clevel=logging.DEBUG)
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py
deleted file mode 100644
index 72d0082d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py
+++ /dev/null
@@ -1,88 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import logging
-import time
-import os
-from signal import SIGINT
-
-from vstf.common.utils import check_output, my_popen, kill_by_name
-from vstf.agent.env.basic import collect
-
-LOG = logging.getLogger(__name__)
-
-
-class Sar(object):
-
- def __init__(self):
- self.sar_cmd_str = "sar -u %(interval)s"
- self.child_process = {}
-
- def start(self, interval=2):
- cmd = self.sar_cmd_str % {'interval': interval}
- child = my_popen(
- cmd.split(),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time.sleep(1)
- if child.poll() is not None:
- print child.poll()
- raise Exception("start vnstat error, vnstat is not running")
- self.child_process[child.pid] = child
- return child.pid
-
- def stop(self, pid):
- assert pid in self.child_process
- os.kill(pid, SIGINT)
- process = self.child_process.pop(pid)
- out = process.stdout.read()
- process.wait()
- data = {'raw_data': out, 'tool': 'sar', 'type': 'cpu'}
- cpu_info = collect.Collect().collect_host_info()[1]
- cpu_num = cpu_info['CPU INFO']['CPU(s)']
- cpu_mhz = cpu_info['CPU INFO']['CPU MHz']
- data.update({'cpu_num': float(cpu_num), 'cpu_mhz': float(cpu_mhz)})
- return data
-
- def process(self, raw):
- lines = raw.splitlines()
- # print lines
- head = lines[2].split()[3:]
- average = lines[-1].split()[2:]
- data = {}
- for h, d in zip(head, average):
- data[h.strip('%')] = float(d)
- cpu_num = check_output(
- 'cat /proc/cpuinfo | grep processor | wc -l',
- shell=True).strip()
- data.update({'cpu_num': int(cpu_num)})
- return data
-
- def clean(self):
- for _, process in self.child_process.items():
- process.kill()
- process.wait()
- self.child_process = {}
- return True
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name("sar")
- self.child_process = {}
- return True
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.DEBUG)
- q = Sar()
- pid = q.start()
- time.sleep(10)
- raw = q.stop(pid)
- print raw
- print q.process(raw['raw_data'])
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py
deleted file mode 100644
index f9ca46cd..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py
+++ /dev/null
@@ -1,48 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-import subprocess
-from vstf.common.utils import check_call, check_output
-
-LOG = logging.getLogger(__name__)
-
-
-def get_pid_by_name(process_name):
- out = check_output(['ps', '-A'])
- pids = []
- for line in out.splitlines():
- values = line.split()
- pid, name = values[0], values[3]
- if process_name == name:
- pids.append(int(pid))
- return pids
-
-
-def get_cpu_num():
- cpu_num = check_output(
- 'cat /proc/cpuinfo | grep processor | wc -l',
- shell=True).strip()
- cpu_num = int(cpu_num)
- return cpu_num
-
-
-def get_default_threads():
- cpu_num = get_cpu_num()
- return 2 if cpu_num > 3 * 3 else 1
-
-
-def modprobe_pktgen():
- check_call('modprobe pktgen', shell=True)
- return True
-
-
-def iface_up(device):
- check_call("ifconfig %s up" % device, shell=True)
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py
deleted file mode 100644
index 49e4f0c1..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py
+++ /dev/null
@@ -1,113 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import subprocess
-import time
-import re
-from signal import SIGINT
-import os
-import logging
-from vstf.common.utils import check_call, my_popen, kill_by_name
-
-LOG = logging.getLogger(__name__)
-
-
-class VnStat(object):
-
- def __init__(self):
- self.netns_exec_str = "ip netns exec %s "
- self.vnstat_cmd_str = "vnstat -l -i %s"
- self.child_process = {}
-
- def run_vnstat(self, device, namespace=None):
- cmd = self.vnstat_cmd_str
- if namespace:
- cmd1 = (self.netns_exec_str + "ifconfig %s") % (namespace, device)
- check_call(cmd1, shell=True)
- cmd = self.netns_exec_str + cmd
- cmd = cmd % (namespace, device)
- else:
- cmd = cmd % device
- check_call("which vnstat", shell=True)
- child = my_popen(cmd.split(), stdout=subprocess.PIPE)
- self.child_process[child.pid] = child
- return child.pid
-
- def kill_vnstat(self, pid, namespace=None):
- assert pid in self.child_process
- os.kill(pid, SIGINT)
- process = self.child_process.pop(pid)
- out = process.stdout.read()
- process.wait()
- LOG.info("os.kill(pid = %s)", pid)
- data = {'tool': 'vnstat', 'type': 'nic', 'raw_data': out}
- return data
-
- def clean(self):
- for _, process in self.child_process.items():
- process.kill()
- process.wait()
- LOG.info("process.kill(vnstat:%s)", process.pid)
- self.child_process = {}
- return True
-
- def process(self, raw):
- buf = raw.splitlines()
- buf = buf[9:]
- buf = ' '.join(buf)
- m = {}
-
- digits = re.compile(r"\d+\.?\d*")
- units = re.compile(
- "(?:gib|mib|kib|kbit/s|gbits/s|mbit/s|p/s)",
- re.IGNORECASE | re.MULTILINE)
- units_arr = units.findall(buf)
-
- LOG.debug(units_arr)
-
- digits_arr = digits.findall(buf)
-
- for i in range(len(digits_arr)):
- digits_arr[i] = round(float(digits_arr[i]), 2)
-
- m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9]
- m['time'] = digits_arr[-1]
- digits_arr = digits_arr[:8] + digits_arr[10:-1]
- index = 0
- for unit in units_arr:
- unit = unit.lower()
- if unit == 'gib':
- digits_arr[index] *= 1024
- elif unit == 'kib':
- digits_arr[index] /= 1024
- elif unit == 'gbit/s':
- digits_arr[index] *= 1000
- elif unit == 'kbit/s':
- digits_arr[index] /= 1000
- else:
- pass
- index += 1
-
- for i in range(len(digits_arr)):
- digits_arr[i] = round(digits_arr[i], 2)
-
- m['rxmB'], m['txmB'] = digits_arr[0:2]
- m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4]
- m['rxmB/s'], m['txmB/s'] = digits_arr[4:6]
- m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8]
- m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10]
- m['rxpck/s'], m['txpck/s'] = digits_arr[10:12]
- m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14]
- return m
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- kill_by_name("vnstat")
- self.child_process = {}
- return True
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py
deleted file mode 100644
index 939b12ef..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py
+++ /dev/null
@@ -1,111 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-__doc__ = """
-operation: [start, stop, restart]
-action: [send, receive]
-tool: [pktgen, netperf, qperf, iperf, netmap]
-params:
- protocol: [tcp_lat, udp_lat, tcp_bw, udp_bw]
- namespace: None
- src:[
- { "iface":"eth0", "ip":"xxx.xxx.xxx.xxx", "mac":"FF:FF:FF:FF:FF:FF"}
- ]
- dst:[
- { "iface":"eth0", "ip":"xxx.xxx.xxx.xxx", "mac":"FF:FF:FF:FF:FF:FF"}
- ]
- size: 64
- threads: 1
- ratep: 100000 (pps)
- time: 100 (s)
-"""
-
-import sys
-import logging
-import vstf.common.constants as cst
-import vstf.common.decorator as deco
-import vstf.agent.perf.pktgen as vstf_pktgen
-import vstf.agent.perf.netmap as vstf_netmap
-import vstf.agent.perf.qperf as vstf_qperf
-import vstf.agent.perf.iperf as vstf_iperf
-import vstf.agent.perf.netperf as vstf_netperf
-
-LOG = logging.getLogger(__name__)
-
-
-class Vstfperf(object):
-
- def __init__(self):
- for tool in cst.TOOLS:
- obj_name = 'vstf_' + tool
- obj = getattr(sys.modules[__name__], obj_name)
- cls_name = tool.title()
- cls = getattr(obj, tool.title())
- self.__dict__.update({tool: cls()})
-
- @deco.check("operation", choices=cst.OPERATIONS)
- @deco.check("action", choices=cst.ACTIONS)
- @deco.check("tool", choices=cst.TOOLS)
- @deco.check("params", defaults={})
- def run(self, **kwargs):
- print "_run in"
- operation = kwargs.pop("operation")
- tool = kwargs.pop("tool")
- instance = getattr(self, tool)
- action = kwargs.pop("action")
- func_name = "%s_%s" % (action, operation)
- func = getattr(instance, func_name)
- LOG.info(kwargs['params'])
- LOG.info(func)
- ret = func(**kwargs['params'])
- return ret
-
- def force_clean(self):
- LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
- for tool in cst.TOOLS:
- instance = getattr(self, tool)
- instance.force_clean()
- return True
-
-
-def unit_test():
- from vstf.common.log import setup_logging
- setup_logging(
- level=logging.DEBUG,
- log_file="/var/log/vstf/vstf-vstfperf.log",
- clevel=logging.INFO)
-
- perf = Vstfperf()
- start = {
- "operation": "start",
- "action": "send",
- "tool": "netperf",
- "params": {
- "namespace": "vnet_name1",
- "protocol": "udp_lat",
- "dst": [
- {"ip": "192.168.1.102"}
- ],
- "size": 64,
- "threads": 1,
- "time": 100,
- },
- }
- perf.run(**start)
-
- stop = {
- "operation": "stop",
- "action": "send",
- "tool": "netperf",
- }
- perf.run(**stop)
-
-
-if __name__ == '__main__':
- unit_test()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py b/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py
deleted file mode 100644
index 9ba1e126..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py
+++ /dev/null
@@ -1,139 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-import logging
-import time
-from vstf.agent.env.basic.image_manager import ImageManager
-from vstf.agent.env.basic.source_manager import SourceCodeManager
-from vstf.agent.env.basic import commandline
-from vstf.agent.env.basic.device_manager import DeviceManager
-from vstf.agent.env.basic import collect as coll
-from vstf.agent.perf import netns, vnstat, vstfperf, sar, ethtool, affctl
-from vstf.agent.env import builder
-from vstf.agent.equalizer.get_info import GetPhyInfo
-from vstf.agent.equalizer.optimize import Optimize
-from vstf.agent.env.driver_plugins.manager import DriverPluginManager
-
-LOG = logging.getLogger(__name__)
-
-
-class ENV(object):
-
- def __init__(self):
- super(ENV, self).__init__()
- self.builder = builder.PluginManager()
-
- def build_env(self, cfg_intent):
- return self.builder.build(cfg_intent)
-
- def clean_env(self):
- return self.builder.clean()
-
- @staticmethod
- def create_images(cfg):
- return ImageManager(cfg).create_all()
-
- @staticmethod
- def clean_images(cfg):
- return ImageManager(cfg).clean_all()
-
-
-class Drivers(object):
-
- def __init__(self):
- super(Drivers, self).__init__()
- self.dr_mgr = DriverPluginManager()
-
- def install_drivers(self, drivers):
- LOG.info("install drivers:%s", drivers)
- self.dr_mgr.clean()
- ret = self.dr_mgr.load(drivers)
- return ret
-
- def clean_drivers(self):
- return self.dr_mgr.clean()
-
- def autoneg_on(self, iface, nspace):
- return ethtool.autoneg_on(iface, nspace)
-
- def autoneg_off(self, iface, nspace):
- return ethtool.autoneg_off(iface, nspace)
-
- def autoneg_query(self, iface, nspace):
- return ethtool.autoneg_query(iface, nspace)
-
-
-class Cpu(object):
-
- def affctl_load(self, policy):
- return affctl.affctl_load(policy)
-
- def affctl_list(self):
- return affctl.affctl_list()
-
-
-class Perf(object):
-
- def __init__(self):
- super(Perf, self).__init__()
- self._vnstat = vnstat.VnStat()
- self._vstfperf = vstfperf.Vstfperf()
- self._sar = sar.Sar()
-
- def run_vnstat(self, device, namespace=None):
- return self._vnstat.run_vnstat(device, namespace)
-
- def kill_vnstat(self, pid, namespace=None):
- return self._vnstat.kill_vnstat(pid, namespace)
-
- def perf_run(self, **kwargs):
- return self._vstfperf.run(**kwargs)
-
- def run_cpuwatch(self, interval=2):
- return self._sar.start(interval)
-
- def kill_cpuwatch(self, pid):
- return self._sar.stop(pid)
-
- def force_clean(self):
- self._vstfperf.force_clean()
- self._sar.force_clean()
- self._vnstat.force_clean()
- return True
-
-
-class EqualizerOps(GetPhyInfo, Optimize):
-
- def __init__(self):
- super(EqualizerOps, self).__init__()
-
-
-class BaseAgent(coll.Collect,
- ENV,
- Cpu,
- Drivers,
- DeviceManager,
- commandline.CommandLine,
- netns.NetnsManager,
- SourceCodeManager
- ):
-
- def __init__(self):
- super(BaseAgent, self).__init__()
-
-
-class softAgent(BaseAgent, Perf, EqualizerOps):
-
- def __init__(self):
- super(softAgent, self).__init__()
-
-
-if __name__ == '__main__':
- softAgent()
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py
deleted file mode 100644
index 83b8d15d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py
deleted file mode 100644
index ff2af1f8..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py
+++ /dev/null
@@ -1,334 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-import Tkinter
-
-
-def build_cmd(*args):
- cmd = ''
- for arg in args:
- cmd = cmd + str(arg) + ' '
- #import pdb
- # pdb.set_trace()
- return cmd
-
-
-class stcPython():
-
- def __init__(self):
- self.tclsh = Tkinter.Tcl()
- self.stcpkg = '/home/Spirent_TestCenter_4.46/Spirent_TestCenter_Application_Linux'
- self.tclsh.eval(
- "set auto_path [ linsert $auto_path 0 %s ]" %
- (self.stcpkg))
- self.tclsh.eval("package require SpirentTestCenter")
-
- def build_cmd(self, *args):
- cmd = ''
- for arg in args:
- cmd = cmd + str(arg) + ' '
- return cmd
-
- # [ stc base interface ]
- def stc_init(self, *args):
- cmd = build_cmd('stc::init', *args)
- return self.tclsh.eval(cmd)
- # stc connect
-
- def stc_connect(self, *args):
- cmd = build_cmd('stc::connect', *args)
- return self.tclsh.eval(cmd)
- # stc disconnect
-
- def stc_disconnect(self, *args):
- cmd = build_cmd('stc::disconnect', *args)
- return self.tclsh.eval(cmd)
- # stc create
-
- def stc_create(self, *args):
- cmd = build_cmd('stc::create', *args)
- return self.tclsh.eval(cmd)
- # stc delete
-
- def stc_delete(self, *args):
- cmd = build_cmd('stc::delete', *args)
- return self.tclsh.eval(cmd)
- # stc config
-
- def stc_config(self, *args):
- cmd = build_cmd('stc::config', *args)
- return self.tclsh.eval(cmd)
- # stc get
-
- def stc_get(self, *args):
- cmd = build_cmd('stc::get', *args)
- return self.tclsh.eval(cmd)
- # stc apply
-
- def stc_apply(self, *args):
- cmd = build_cmd('stc::apply', *args)
- return self.tclsh.eval(cmd)
- # stc perform
-
- def stc_perform(self, *args):
- cmd = build_cmd('stc::perform', *args)
- return self.tclsh.eval(cmd)
- # stc reserve
-
- def stc_reserve(self, *args):
- cmd = build_cmd('stc::reserve', *args)
- return self.tclsh.eval(cmd)
- # stc release
-
- def stc_release(self, *args):
- cmd = build_cmd('stc::release', *args)
- return self.tclsh.eval(cmd)
- # stc subscribe
-
- def stc_subscribe(self, *args):
- cmd = build_cmd('stc::subscribe', *args)
- return self.tclsh.eval(cmd)
- # stc unsubscribe
-
- def stc_unsubscribe(self, *args):
- cmd = build_cmd('stc::unsubscribe', *args)
- return self.tclsh.eval(cmd)
- # stc wait until sequencer complete
-
- def stc_waituntilcomplete(self, *args):
- cmd = build_cmd('stc::waituntilcomplete', *args)
- return self.tclsh.eval(cmd)
- # stc help
-
- def stc_help(self, *args):
- cmd = build_cmd('stc::help', *args)
- return self.tclsh.eval(cmd)
-
- # [ stc expand interface ]
- # get one dict-key's value
- # return value
- def stc_get_value(self, stc_dict, stc_key):
- cmd = stc_dict + ' -' + stc_key
- return self.stc_get(cmd)
- # create project
- # return: project_name
-
- def stc_create_project(self):
- return self.stc_create('project')
- # create port under project
- # return: port name
-
- def stc_create_port(self, project_name):
- cmd = 'port -under ' + project_name
- return self.stc_create(cmd)
- # config port location
- # return: None
-
- def stc_config_port_location(self, port_name, chassisAddress, slot, port):
- #import pdb
- # pdb.set_trace()
- cmd = port_name + ' -location //' + chassisAddress + \
- '/' + slot + '/' + port + ' -UseDefaultHost False'
- return self.stc_config(cmd)
- # create streamblock under port
- # return: streamblock name
-
- def stc_create_streamblock(
- self,
- port_name,
- vlan_tag,
- ExpectedRxPort,
- srcMac,
- dstMac,
- sourceAddr,
- destAddr):
- #import pdb
- # pdb.set_trace()
- if vlan_tag is None or vlan_tag == 'None':
- frameStruc = '"EthernetII IPv4 Udp"'
- if ExpectedRxPort == '':
- return self.stc_create(
- 'streamBlock -under ',
- port_name,
- '-frameConfig ',
- frameStruc,
- '-frame "EthernetII.srcMac',
- srcMac,
- 'EthernetII.dstMac',
- dstMac,
- 'IPv4.1.sourceAddr',
- sourceAddr,
- 'IPv4.1.destAddr',
- destAddr,
- '"')
- else:
- return self.stc_create(
- 'streamBlock -under ',
- port_name,
- '-ExpectedRxPort',
- ExpectedRxPort,
- '-frameConfig ',
- frameStruc,
- '-frame "EthernetII.srcMac',
- srcMac,
- 'EthernetII.dstMac',
- dstMac,
- 'IPv4.1.sourceAddr',
- sourceAddr,
- 'IPv4.1.destAddr',
- destAddr,
- '"')
- else:
- frameStruc = '"EthernetII Vlan IPv4 Udp"'
- if ExpectedRxPort == '':
- return self.stc_create(
- 'streamBlock -under ',
- port_name,
- '-frameConfig ' +
- frameStruc,
- '-frame "EthernetII.srcMac',
- srcMac,
- 'EthernetII.dstMac',
- dstMac,
- 'Vlan.1.id',
- vlan_tag,
- 'IPv4.1.sourceAddr',
- sourceAddr,
- 'IPv4.1.destAddr',
- destAddr,
- '"')
- else:
- return self.stc_create(
- 'streamBlock -under ',
- port_name,
- '-ExpectedRxPort',
- ExpectedRxPort,
- '-frameConfig ' +
- frameStruc,
- '-frame "EthernetII.srcMac',
- srcMac,
- 'EthernetII.dstMac',
- dstMac,
- 'Vlan.1.id',
- vlan_tag,
- 'IPv4.1.sourceAddr',
- sourceAddr,
- 'IPv4.1.destAddr',
- destAddr,
- '"')
- # config streamblock with part arguments
- # argument list use args dictionary
-
- def stc_config_streamblock(self, streamblock_name, args_dict):
- cmd = ''
- for key in args_dict.keys():
- temp_cmd = '-' + key + ' ' + str(args_dict[key])
- cmd = cmd + temp_cmd
- return self.stc_config(streamblock_name, cmd)
- # get generator name from port name
- # return: generator name
-
- def stc_get_generator(self, port_name):
- cmd = port_name + ' -children-generator'
- return self.stc_get(cmd)
- # config generator with part arguments
- # argument list use args dictionary
- # return none
-
- def stc_config_generator(self, generator_name, args_dict):
- cmd = ''
- for key in args_dict.keys():
- temp_cmd = '-' + key + ' ' + str(args_dict[key])
- cmd = cmd + temp_cmd
- return self.stc_config(generator_name, cmd)
- # attach port
- # return: port's parent project info
-
- def stc_attach_ports(self, portList):
- cmd = 'AttachPorts -portList {'
- for port in portList:
- cmd = cmd + ' ' + port
- cmd = cmd + '} -autoConnect TRUE'
- return self.stc_perform(cmd)
- # config src mac and dst mac
- # return: none
-
- def stc_config_ethII(self, ethII, src_mac, dst_mac):
- cmd = ethII + ' -srcMac ' + src_mac + ' -dstMac ' + dst_mac
- return self.stc_config(cmd)
- # config src ip and dst ip
- # return: none
-
- def stc_config_ethIII(self, ethIII, src_ip, dst_ip):
- cmd = ethIII + ' -sourceAddr ' + src_ip + ' -destAddr ' + dst_ip
- return self.stc_config(cmd)
- # start streamblock
- # return: none
-
- def stc_streamblock_start(self, streamblock_list):
- cmd = 'StreamBlockStart -StreamBlockList {'
- for streamblock in streamblock_list:
- cmd = cmd + ' ' + streamblock
- cmd = cmd + ' } -ExecuteSynchronous TRUE'
- return self.stc_perform(cmd)
- # stop streamblock
-
- def stc_streamblock_stop(self, streamblock_list):
- cmd = 'StreamBlockStop -StreamBlockList {'
- for streamblock in streamblock_list:
- cmd = cmd + ' ' + streamblock
- cmd = cmd + ' } -ExecuteSynchronous TRUE'
- return self.stc_perform(cmd)
- # start generator
- # return: none
-
- def stc_generator_start(self, generator_List):
- cmd = 'GeneratorStart -generatorList {'
- for generator in generator_List:
- cmd = cmd + ' ' + generator
- cmd = cmd + ' }'
- return self.stc_perform(cmd)
- # stop generator
- # return: none
-
- def stc_generator_stop(self, generator_List):
- cmd = 'GeneratorStop -generatorList {'
- for generator in generator_List:
- cmd = cmd + ' ' + generator
- cmd = cmd + ' }'
- return self.stc_perform(cmd)
- # create rfc2544 throughput test
-
- def stc_setup_rfc2544_throughput(self):
- pass
- # create rfc2544 frameloss test
-
- def stc_setup_rfc2544_frameloss(self):
- pass
- # create rfc2544 latency test
-
- def stc_setup_rfc2544_latency(self):
- pass
- # start Sequence start
-
- def stc_sequence_start(self):
- return self.stc_perform('SequencerStart')
- # output rfc2544 throughput result
-
- def stc_get_rfc2544_throughput_result(self):
- pass
- # output rfc2544 frameloss result
-
- def stc_get_rfc2544_frameloss_result(self):
- pass
- # output rfc2544 latency result
-
- def stc_get_rfc2544_latency_result(self):
- pass
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py
deleted file mode 100644
index 0936d39d..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py
+++ /dev/null
@@ -1,386 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-import time
-from spirent import stcPython
-
-
-class Spirent_Tools(object):
- baseAPI = stcPython()
-
- def __init__(self):
- """This class provide API of Spirent
-
- """
- super(Spirent_Tools, self).__init__()
-
- def send_packet(self, flow):
- try:
- #import pdb
- # pdb.set_trace()
- flow = eval(flow)
- # stc init action
- self.baseAPI.stc_perform(' ResetConfig -config system1')
- self.baseAPI.stc_init()
- # create project
- project = self.baseAPI.stc_create_project()
- # create port
- port_handle = self.baseAPI.stc_create_port(project)
- # config port
- slot = flow['send_port'].split('/')[0]
- port = flow['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- port_handle, flow['tester_ip'], slot, port)
- # create streamblock
- streamblock_handle = self.baseAPI.stc_create_streamblock(
- port_name=port_handle,
- ExpectedRxPort='',
- vlan_tag=flow['vlan'],
- srcMac=flow['src_mac'],
- dstMac=flow['dst_mac'],
- sourceAddr=flow['src_ip'],
- destAddr=flow['dst_ip']
- )
- # attach port
- port_list = [port_handle]
- self.baseAPI.stc_attach_ports(port_list)
- # start streamblock
- streamblock_list = [streamblock_handle]
- flag = self.baseAPI.stc_streamblock_start(streamblock_list)
- return str(streamblock_list).strip('[]')
- except:
- print("[ERROR]create stream block and send packet failed.")
- return False
-
- def mac_learning(self, flowA, flowB):
- try:
- #import pdb
- # pdb.set_trace()
- flowA = eval(flowA)
- flowB = eval(flowB)
- port_list = []
- streamblock_list = []
- # stc init action
- self.baseAPI.stc_perform(' ResetConfig -config system1')
- self.baseAPI.stc_init()
- # create project
- project = self.baseAPI.stc_create_project()
- # create port and config port
- for flow in [flowA, flowB]:
- flow['port_handle'] = self.baseAPI.stc_create_port(project)
- tmp_test_ip = flow['tester_ip']
- tmp_slot = flow['send_port'].split('/')[0]
- tmp_port = flow['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- flow['port_handle'], tmp_test_ip, tmp_slot, tmp_port)
- # create streamblock
- flow['streamblock'] = self.baseAPI.stc_create_streamblock(
- port_name=flow['port_handle'],
- ExpectedRxPort='',
- vlan_tag=flow['vlan'],
- srcMac=flow['src_mac'],
- dstMac=flow['dst_mac'],
- sourceAddr=flow['src_ip'],
- destAddr=flow['dst_ip'])
- # create port and stream block list
- port_list.append(flow['port_handle'])
- streamblock_list.append(flow['streamblock'])
-
- # attach port
- self.baseAPI.stc_attach_ports(port_list)
- # start streamblock
- flag = self.baseAPI.stc_streamblock_start(streamblock_list)
- # mac learning
- time.sleep(2)
- # stop stream block
- self.baseAPI.stc_streamblock_stop(streamblock_list)
- # delete streamblock and release port
- for flow in [flowA, flowB]:
- tmp_test_ip = flow['tester_ip']
- tmp_slot = flow['send_port'].split('/')[0]
- tmp_port = flow['send_port'].split('/')[1]
- self.baseAPI.stc_delete(flow['streamblock'])
- self.baseAPI.stc_release(
- '%s/%s/%s' %
- (tmp_test_ip, tmp_slot, tmp_port))
- # delete project
- self.baseAPI.stc_delete('project1')
- ret = self.baseAPI.stc_perform('ResetConfig -config system1')
- return True
- except:
- print("[ERROR]mac learning failed")
- return False
-
- def stop_flow(self, streamblock_list, flow):
- flow = eval(flow)
- streamblock_list = streamblock_list.strip('\'').split(',')
- # stop streamblock list
- try:
- ret = self.baseAPI.stc_streamblock_stop(streamblock_list)
- except:
- print("[ERROR]Stop the streamblock list failed.")
- return False
- # delete streamblock
- try:
- for streamblock in streamblock_list:
- ret = self.baseAPI.stc_delete(streamblock)
- except:
- print("[ERROR]delete stream block.")
- return False
- # release port
- try:
- slot = flow['send_port'].split('/')[0]
- port = flow['send_port'].split('/')[1]
- ret = self.baseAPI.stc_release(
- '%s/%s/%s' %
- (flow['tester_ip'], slot, port))
- except:
- print("[ERROR]Release port failed")
- return False
- # delete project
- try:
- ret = self.baseAPI.stc_delete('project1')
- ret = self.baseAPI.stc_perform('ResetConfig -config system1')
- return True
- except:
- print("[ERROR]Delete project1 failed.")
- return False
-
- def run_rfc2544_throughput(self, forward_init_flows, reverse_init_flows):
- #import pdb
- # pdb.set_trace()
- # rebuild the flows
- forward_init_flows = eval(forward_init_flows)
- reverse_init_flows = eval(reverse_init_flows)
- # stc init action
- self.baseAPI.stc_perform(' ResetConfig -config system1')
- self.baseAPI.stc_init()
- # create project
- project = self.baseAPI.stc_create_project()
- # create sequencer
- seq_handle = self.baseAPI.stc_create('Sequencer -under %s' % (project))
- # create port handle
- forward_port_handle = self.baseAPI.stc_create_port(project)
- reverse_port_handle = self.baseAPI.stc_create_port(project)
- # create forward flow streamblock
- for key in forward_init_flows.keys():
- forward_init_flows[key]['port_handle'] = forward_port_handle
- tmp_test_ip = forward_init_flows[key]['tester_ip']
- tmp_slot = forward_init_flows[key]['send_port'].split('/')[0]
- tmp_port = forward_init_flows[key]['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- forward_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port)
- # create streamblock
- forward_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock(
- port_name=forward_init_flows[key]['port_handle'],
- vlan_tag=forward_init_flows[key]['vlan'],
- ExpectedRxPort=reverse_port_handle,
- srcMac=forward_init_flows[key]['src_mac'],
- dstMac=forward_init_flows[key]['dst_mac'],
- sourceAddr=forward_init_flows[key]['src_ip'],
- destAddr=forward_init_flows[key]['dst_ip'])
- # create reverse flow streamblock
- for key in reverse_init_flows.keys():
- reverse_init_flows[key]['port_handle'] = reverse_port_handle
- tmp_test_ip = reverse_init_flows[key]['tester_ip']
- tmp_slot = reverse_init_flows[key]['send_port'].split('/')[0]
- tmp_port = reverse_init_flows[key]['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- reverse_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port)
- # create streamblock
- reverse_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock(
- port_name=reverse_init_flows[key]['port_handle'],
- vlan_tag=reverse_init_flows[key]['vlan'],
- ExpectedRxPort=forward_port_handle,
- srcMac=reverse_init_flows[key]['src_mac'],
- dstMac=reverse_init_flows[key]['dst_mac'],
- sourceAddr=reverse_init_flows[key]['src_ip'],
- destAddr=reverse_init_flows[key]['dst_ip'])
- # Create the RFC 2544 throughput test
- throughput_config = self.baseAPI.stc_create(
- 'Rfc2544ThroughputConfig -under ',
- project,
- '-AcceptableFrameLoss 0.01',
- '-NumOfTrials 1',
- '-DurationSeconds 60',
- '-SearchMode BINARY',
- '-RateLowerLimit 1',
- '-RateUpperLimit 100',
- '-RateInitial 10',
- '-UseExistingStreamBlocks True',
- '-EnableLearning False',
- '-FrameSizeIterationMode CUSTOM',
- '-CustomFrameSizeList "70 128 256 512 1024 1280 1518"',
- '-LatencyType LIFO',
- '-EnableJitterMeasurement TRUE')
- #import pdb
- # pdb.set_trace()
- # list streamblocks
- streamblock_list = '" '
- for key in forward_init_flows.keys():
- streamblock_list = streamblock_list + \
- forward_init_flows[key]['streamblock'] + ' '
- for key in reverse_init_flows.keys():
- streamblock_list = streamblock_list + \
- reverse_init_flows[key]['streamblock'] + ' '
- streamblock_list = streamblock_list + '"'
-
- throughput_sbProfile = self.baseAPI.stc_create(
- 'Rfc2544StreamBlockProfile -under ' +
- throughput_config +
- ' -Active TRUE -LocalActive TRUE')
- self.baseAPI.stc_config(
- throughput_sbProfile,
- '-StreamBlockList ' +
- streamblock_list)
- self.baseAPI.stc_perform(
- 'ExpandBenchmarkConfigCommand',
- '-config ',
- throughput_config)
-
- # attach the port before testing
- port_list = [forward_port_handle, reverse_port_handle]
- self.baseAPI.stc_attach_ports(port_list)
-
- # stc apply and begin to sequence test
- self.baseAPI.stc_apply()
- self.baseAPI.stc_perform("SequencerStart")
-
- # wait until complete
- self.baseAPI.stc_waituntilcomplete()
-
- # get result db
- resultsdb = self.baseAPI.stc_get(
- "system1.project.TestResultSetting",
- "-CurrentResultFileName")
- results_dict = self.baseAPI.stc_perform(
- 'QueryResult',
- '-DatabaseConnectionString',
- resultsdb,
- '-ResultPath RFC2544ThroughputTestResultDetailedSummaryView')
- # print results_dict
- return True, results_dict
-
- def run_rfc2544_frameloss(self, forward_init_flows, reverse_init_flows):
- #import pdb
- # pdb.set_trace()
- # rebuild the flows
- forward_init_flows = eval(forward_init_flows)
- reverse_init_flows = eval(reverse_init_flows)
- # stc init action
- self.baseAPI.stc_perform(' ResetConfig -config system1')
- self.baseAPI.stc_init()
- # create project
- project = self.baseAPI.stc_create_project()
- # create sequencer
- seq_handle = self.baseAPI.stc_create('Sequencer -under %s' % (project))
- # create port handle
- forward_port_handle = self.baseAPI.stc_create_port(project)
- reverse_port_handle = self.baseAPI.stc_create_port(project)
- # create forward flow streamblock
- for key in forward_init_flows.keys():
- forward_init_flows[key]['port_handle'] = forward_port_handle
- tmp_test_ip = forward_init_flows[key]['tester_ip']
- tmp_slot = forward_init_flows[key]['send_port'].split('/')[0]
- tmp_port = forward_init_flows[key]['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- forward_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port)
- # create streamblock
- forward_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock(
- port_name=forward_init_flows[key]['port_handle'],
- vlan_tag=forward_init_flows[key]['vlan'],
- ExpectedRxPort=reverse_port_handle,
- srcMac=forward_init_flows[key]['src_mac'],
- dstMac=forward_init_flows[key]['dst_mac'],
- sourceAddr=forward_init_flows[key]['src_ip'],
- destAddr=forward_init_flows[key]['dst_ip'])
- # create reverse flow streamblock
- for key in reverse_init_flows.keys():
- reverse_init_flows[key]['port_handle'] = reverse_port_handle
- tmp_test_ip = reverse_init_flows[key]['tester_ip']
- tmp_slot = reverse_init_flows[key]['send_port'].split('/')[0]
- tmp_port = reverse_init_flows[key]['send_port'].split('/')[1]
- self.baseAPI.stc_config_port_location(
- reverse_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port)
- # create streamblock
- reverse_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock(
- port_name=reverse_init_flows[key]['port_handle'],
- vlan_tag=reverse_init_flows[key]['vlan'],
- ExpectedRxPort=forward_port_handle,
- srcMac=reverse_init_flows[key]['src_mac'],
- dstMac=reverse_init_flows[key]['dst_mac'],
- sourceAddr=reverse_init_flows[key]['src_ip'],
- destAddr=reverse_init_flows[key]['dst_ip'])
- # Create the RFC 2544 frameloss test
- frameloss_config = self.baseAPI.stc_create(
- 'Rfc2544FrameLossConfig -under ',
- project,
- '-NumOfTrials 1 ',
- '-DurationSeconds 60 ',
- '-LoadUnits PERCENT_LINE_RATE ',
- '-LoadType CUSTOM '
- '-CustomLoadList 100 '
- '-UseExistingStreamBlocks True ',
- '-EnableLearning False ',
- '-FrameSizeIterationMode CUSTOM ',
- '-CustomFrameSizeList "70 128 256 512 1024 1280 1518"',
- '-LatencyType LIFO',
- '-EnableJitterMeasurement TRUE')
- #import pdb
- # pdb.set_trace()
- # list streamblocks
- streamblock_list = '" '
- for key in forward_init_flows.keys():
- streamblock_list = streamblock_list + \
- forward_init_flows[key]['streamblock'] + ' '
- for key in reverse_init_flows.keys():
- streamblock_list = streamblock_list + \
- reverse_init_flows[key]['streamblock'] + ' '
- streamblock_list = streamblock_list + '"'
-
- frameloss_sbProfile = self.baseAPI.stc_create(
- 'Rfc2544StreamBlockProfile -under ' +
- frameloss_config +
- ' -Active TRUE -LocalActive TRUE')
- self.baseAPI.stc_config(
- frameloss_sbProfile,
- '-StreamBlockList ' +
- streamblock_list)
- self.baseAPI.stc_perform(
- 'ExpandBenchmarkConfigCommand',
- '-config ',
- frameloss_config)
-
- # attach the port before testing
- port_list = [forward_port_handle, reverse_port_handle]
- self.baseAPI.stc_attach_ports(port_list)
-
- # stc apply and begin to sequence test
- self.baseAPI.stc_apply()
- self.baseAPI.stc_perform("SequencerStart")
-
- # wait until complete
- self.baseAPI.stc_waituntilcomplete()
-
- # get result db
- resultsdb = self.baseAPI.stc_get(
- "system1.project.TestResultSetting",
- "-CurrentResultFileName")
- results_dict = self.baseAPI.stc_perform(
- 'QueryResult',
- '-DatabaseConnectionString',
- resultsdb,
- '-ResultPath RFC2544FrameLossTestResultDetailedSummaryView')
- #import pdb
- # pdb.set_trace()
- return True, results_dict
-
- def run_rfc2544_latency(self, forward_init_flows, reverse_init_flows):
- pass
diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py
deleted file mode 100644
index 46583dfe..00000000
--- a/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py
+++ /dev/null
@@ -1,17 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-from vstf.agent.spirent.tools import Spirent_Tools as Spirent
-
-
-class agentSpirent(Spirent):
-
- def __init__(self):
- super(agentSpirent, self).__init__()