From 8f1101df131a4d3e03b377738507d88b745831c0 Mon Sep 17 00:00:00 2001 From: "Yiting.Li" Date: Tue, 22 Dec 2015 17:11:12 -0800 Subject: Upload the contribution of vstf as bottleneck network framework. End to End Performance test JIRA:BOTTLENECK-29 Change-Id: Ib2c553c8b60d6cda9e7a7b52b737c9139f706ebd Signed-off-by: Yiting.Li --- vstf/vstf/agent/unittest/__init__.py | 14 +++ vstf/vstf/agent/unittest/configuration.py | 28 ++++++ vstf/vstf/agent/unittest/env/Readme | 13 +++ vstf/vstf/agent/unittest/env/__init__.py | 14 +++ vstf/vstf/agent/unittest/env/configuration/Ti.json | 58 ++++++++++++ .../agent/unittest/env/configuration/Tn-ovs.json | 36 +++++++ vstf/vstf/agent/unittest/env/configuration/Tn.json | 37 ++++++++ .../agent/unittest/env/configuration/Tn1v.json | 85 +++++++++++++++++ vstf/vstf/agent/unittest/env/configuration/Tu.json | 71 ++++++++++++++ vstf/vstf/agent/unittest/env/model.py | 24 +++++ vstf/vstf/agent/unittest/env/run_test.py | 33 +++++++ vstf/vstf/agent/unittest/env/test_bridge_plugin.py | 56 +++++++++++ vstf/vstf/agent/unittest/env/test_builder.py | 74 +++++++++++++++ vstf/vstf/agent/unittest/env/test_devicemanager.py | 38 ++++++++ vstf/vstf/agent/unittest/env/test_drivermanager.py | 50 ++++++++++ vstf/vstf/agent/unittest/env/test_origin_driver.py | 44 +++++++++ vstf/vstf/agent/unittest/env/test_sourcemanager.py | 53 +++++++++++ vstf/vstf/agent/unittest/env/test_vm9pfs.py | 71 ++++++++++++++ vstf/vstf/agent/unittest/env/test_vm_manager.py | 69 ++++++++++++++ .../agent/unittest/env/test_vs_plugin_manager.py | 68 +++++++++++++ vstf/vstf/agent/unittest/perf/Readme | 7 ++ vstf/vstf/agent/unittest/perf/__init__.py | 14 +++ vstf/vstf/agent/unittest/perf/model.py | 46 +++++++++ vstf/vstf/agent/unittest/perf/run_test.py | 32 +++++++ vstf/vstf/agent/unittest/perf/test_ethtool.py | 42 +++++++++ vstf/vstf/agent/unittest/perf/test_netns.py | 67 +++++++++++++ vstf/vstf/agent/unittest/perf/test_netperf.py | 105 +++++++++++++++++++++ vstf/vstf/agent/unittest/perf/test_pktgen.py | 90 ++++++++++++++++++ vstf/vstf/agent/unittest/perf/test_qperf.py | 102 ++++++++++++++++++++ vstf/vstf/agent/unittest/perf/test_utils.py | 31 ++++++ vstf/vstf/agent/unittest/perf/test_vnstat.py | 57 +++++++++++ vstf/vstf/agent/unittest/perf/test_vstfperf.py | 98 +++++++++++++++++++ vstf/vstf/agent/unittest/test_callback.py | 80 ++++++++++++++++ 33 files changed, 1707 insertions(+) create mode 100755 vstf/vstf/agent/unittest/__init__.py create mode 100755 vstf/vstf/agent/unittest/configuration.py create mode 100755 vstf/vstf/agent/unittest/env/Readme create mode 100755 vstf/vstf/agent/unittest/env/__init__.py create mode 100755 vstf/vstf/agent/unittest/env/configuration/Ti.json create mode 100755 vstf/vstf/agent/unittest/env/configuration/Tn-ovs.json create mode 100755 vstf/vstf/agent/unittest/env/configuration/Tn.json create mode 100755 vstf/vstf/agent/unittest/env/configuration/Tn1v.json create mode 100755 vstf/vstf/agent/unittest/env/configuration/Tu.json create mode 100755 vstf/vstf/agent/unittest/env/model.py create mode 100755 vstf/vstf/agent/unittest/env/run_test.py create mode 100755 vstf/vstf/agent/unittest/env/test_bridge_plugin.py create mode 100755 vstf/vstf/agent/unittest/env/test_builder.py create mode 100755 vstf/vstf/agent/unittest/env/test_devicemanager.py create mode 100755 vstf/vstf/agent/unittest/env/test_drivermanager.py create mode 100755 vstf/vstf/agent/unittest/env/test_origin_driver.py create mode 100755 vstf/vstf/agent/unittest/env/test_sourcemanager.py create mode 100755 vstf/vstf/agent/unittest/env/test_vm9pfs.py create mode 100755 vstf/vstf/agent/unittest/env/test_vm_manager.py create mode 100755 vstf/vstf/agent/unittest/env/test_vs_plugin_manager.py create mode 100755 vstf/vstf/agent/unittest/perf/Readme create mode 100755 vstf/vstf/agent/unittest/perf/__init__.py create mode 100755 vstf/vstf/agent/unittest/perf/model.py create mode 100755 vstf/vstf/agent/unittest/perf/run_test.py create mode 100755 vstf/vstf/agent/unittest/perf/test_ethtool.py create mode 100755 vstf/vstf/agent/unittest/perf/test_netns.py create mode 100755 vstf/vstf/agent/unittest/perf/test_netperf.py create mode 100755 vstf/vstf/agent/unittest/perf/test_pktgen.py create mode 100755 vstf/vstf/agent/unittest/perf/test_qperf.py create mode 100755 vstf/vstf/agent/unittest/perf/test_utils.py create mode 100755 vstf/vstf/agent/unittest/perf/test_vnstat.py create mode 100755 vstf/vstf/agent/unittest/perf/test_vstfperf.py create mode 100755 vstf/vstf/agent/unittest/test_callback.py (limited to 'vstf/vstf/agent/unittest') diff --git a/vstf/vstf/agent/unittest/__init__.py b/vstf/vstf/agent/unittest/__init__.py new file mode 100755 index 00000000..89dcd4e2 --- /dev/null +++ b/vstf/vstf/agent/unittest/__init__.py @@ -0,0 +1,14 @@ +# Copyright Huawei Technologies Co., Ltd. 1998-2015. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. diff --git a/vstf/vstf/agent/unittest/configuration.py b/vstf/vstf/agent/unittest/configuration.py new file mode 100755 index 00000000..3f3b3665 --- /dev/null +++ b/vstf/vstf/agent/unittest/configuration.py @@ -0,0 +1,28 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" + +eth_for_test = [ + "eth4", + "p57p2" +] + +mac_of_eth = [ + "90:e2:ba:20:1f:d8", + '90:e2:ba:20:1f:d9' +] + +bdf_of_eth = [ + "04:00.0", + "04:00.1" +] + +source_repo = { + "vnx-bin":{ + "install": False, + "url": "root@192.168.188.10:/root/src/vnx-bin", + "repo_type": "git" + } +} \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/Readme b/vstf/vstf/agent/unittest/env/Readme new file mode 100755 index 00000000..eb2a78d5 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/Readme @@ -0,0 +1,13 @@ +To enable Env unittest, please make sure: + + 1. br0 exists on TargetHost and connects with 'management network'. + 2. a vm image exists on Target Host. + 3. change options in configuration files in the "configuration" directory. + 4. copy public key to git server, for example: + ssh-copy-id root@192.168.188.10 + note: + 192.168.188.10 is the server you config in "../configuration.py" + this is needed for source manager which use 'git' to pull down sources. + +run tests: + python run_test.py \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/__init__.py b/vstf/vstf/agent/unittest/env/__init__.py new file mode 100755 index 00000000..89dcd4e2 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/__init__.py @@ -0,0 +1,14 @@ +# Copyright Huawei Technologies Co., Ltd. 1998-2015. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. diff --git a/vstf/vstf/agent/unittest/env/configuration/Ti.json b/vstf/vstf/agent/unittest/env/configuration/Ti.json new file mode 100755 index 00000000..89236612 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/configuration/Ti.json @@ -0,0 +1,58 @@ +{ + "scenario": "ti", + "env-build": [ + { + "ip": "192.168.188.16", + "drivers": [ + "ixgbe", + "vhost_net" + ], + "vms": [ + { + "vm_cpu": 3, + "vm_name": "test1", + "vm_memory": 4194304, + "image_path": "/mnt/sdb/test1.qcow2", + "image_type": "qcow2", + "init_config": { + "amqp_server": "192.168.188.10", + "ctrl_ip_setting": "192.168.188.200/23", + "ctrl_gw": "192.168.188.1" + }, + "taps":[ + { + "tap_name": "tap_in", + "br_type": "ovs", + "br_name": "ovs1", + "tap_mac": "56:6f:44:a5:3f:a2", + "vlan_mode": "access", + "vlan_id": "100" + } + ], + "ctrl_mac": "16:6f:44:a5:3f:a2", + "ctrl_br": "br0" + } + ], + "bridges": [ + { + "type": "ovs", + "name": "ovs1", + "uplinks": [ + { + "bdf": "04:00.0", + "vlan_mode": "trunk", + "vlan_id": "100,200,300,400" + } + ], + "vtep":{}, + "fastlink":[ + { + "inport":"04: 00.0", + "outport":"tap_in" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/configuration/Tn-ovs.json b/vstf/vstf/agent/unittest/env/configuration/Tn-ovs.json new file mode 100755 index 00000000..73be1611 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/configuration/Tn-ovs.json @@ -0,0 +1,36 @@ +{ + "env-build": [ + { + "ip": "192.168.188.16", + "drivers": [ + "ixgbe" + ], + "bridges": [ + { + "type": "ovs", + "name": "ovs1", + "uplinks": [ + { + "bdf": "04:00.0", + "vlan_mode": "trunk", + "vlan_id": "1,100,200" + }, + { + "bdf": "04:00.1", + "vlan_mode": "trunk", + "vlan_id": "1,100,200" + } + ], + "vtep": {}, + "fastlink": [ + { + "inport": "04: 00.0", + "outport": "04: 00.1" + } + ] + } + ], + "vms": [] + } + ] +} diff --git a/vstf/vstf/agent/unittest/env/configuration/Tn.json b/vstf/vstf/agent/unittest/env/configuration/Tn.json new file mode 100755 index 00000000..04c160da --- /dev/null +++ b/vstf/vstf/agent/unittest/env/configuration/Tn.json @@ -0,0 +1,37 @@ +{ + "scenario": "tn", + "env-build": [ + { + "ip": "192.168.188.16", + "drivers": [ + "ixgbe" + ], + "vms": [], + "bridges": [ + { + "type": "ovs", + "name": "ovs1", + "uplinks": [ + { + "bdf": "04:00.0", + "vlan_mode": "trunk", + "vlan_id": "1,100,200" + }, + { + "bdf": "04:00.1", + "vlan_mode": "trunk", + "vlan_id": "1,100,200" + } + ], + "vtep": {}, + "fastlink": [ + { + "inport": "04:00.0", + "outport": "04:00.1" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/configuration/Tn1v.json b/vstf/vstf/agent/unittest/env/configuration/Tn1v.json new file mode 100755 index 00000000..5a25efda --- /dev/null +++ b/vstf/vstf/agent/unittest/env/configuration/Tn1v.json @@ -0,0 +1,85 @@ +{ + "scenario": "tnv", + "env-build": [ + { + "ip": "192.168.188.16", + "drivers": [ + "ixgbe", + "tap_vhost" + ], + "vms": [ + { + "vm_cpu": 3, + "vm_name": "test1", + "vm_memory": 4194304, + "image_path": "/mnt/sdb/test1.qcow2", + "image_type": "qcow2", + "init_config": { + "amqp_server": "192.168.188.10", + "ctrl_ip_setting": "192.168.188.200/23", + "tap_pktloop_config": "dpdk", + "ctrl_gw": "192.168.188.1" + }, + "taps": [ + { + "tap_name": "tap_in", + "br_type": "ovs", + "br_name": "ovs1", + "tap_mac": "56:6f:44:a5:3f:a2", + "vlan_mode": "access", + "vlan_id": "100" + }, + { + "tap_name": "tap_out", + "br_type": "ovs", + "br_name": "ovs22", + "tap_mac": "56:6f:44:a5:3f:a3", + "vlan_mode": "access", + "vlan_id": "200" + } + ], + "ctrl_mac": "16:6f:44:a5:3f:a2", + "ctrl_br": "br0" + } + ], + "bridges": [ + { + "type": "ovs", + "name": "ovs1", + "uplinks": [ + { + "bdf": "04: 00.0", + "vlan_mode": "trunk", + "vlan_id": "100" + } + ], + "vtep":{}, + "fastlink":[ + { + "inport":"04: 00.0", + "outport":"tap_in" + } + ] + }, + { + "type": "ovs", + "name": "ovs2", + "uplinks": [ + { + "bdf": "04: 00.1", + "vlan_mode": "trunk", + "vlan_id": "200" + } + ], + "vtep":{}, + "fastlink":[ + { + "inport":"04: 00.1", + "outport":"tap_out" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/configuration/Tu.json b/vstf/vstf/agent/unittest/env/configuration/Tu.json new file mode 100755 index 00000000..15a508c0 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/configuration/Tu.json @@ -0,0 +1,71 @@ +{ + "scenario": "tu", + "env-build": [ + { + "ip": "192.168.188.16", + "drivers": [ + "tap_vhost" + ], + "vms": [ + { + "vm_cpu": 3, + "vm_name": "test1", + "vm_memory": 4194304, + "image_path": "/mnt/sdb/test1.qcow2", + "image_type": "qcow2", + "init_config": { + "amqp_server": "192.168.188.10", + "ctrl_ip_setting": "192.168.188.200/23", + "ctrl_gw": "192.168.188.1" + }, + "taps": [ + { + "tap_name": "tap1", + "br_type": "ovs", + "br_name": "ovs1", + "tap_mac": "56:6f:44:a5:3f:a2", + "vlan_mode": "access", + "vlan_id": "100" + } + ] + }, + { + "vm_cpu": 3, + "vm_name": "test2", + "vm_memory": 4194304, + "image_path": "/mnt/sdb/test2.qcow2", + "image_type": "qcow2", + "init_config": { + "amqp_server": "192.168.188.10", + "ctrl_ip_setting": "192.168.188.201/23", + "ctrl_gw": "192.168.188.1" + }, + "taps": [ + { + "tap_name": "tap2", + "br_type": "ovs", + "br_name": "ovs1", + "tap_mac": "56:6f:44:a5:3f:a3", + "vlan_mode": "access", + "vlan_id": "100" + } + ] + } + ], + "bridges": [ + { + "type": "ovs", + "name": "ovs1", + "uplinks": [], + "vtep": {}, + "fastlink": [ + { + "inport": "tap1", + "outport": "tap2" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/model.py b/vstf/vstf/agent/unittest/env/model.py new file mode 100755 index 00000000..e3c2bca6 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/model.py @@ -0,0 +1,24 @@ +""" +Created on 2015-10-9 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest import configuration + + +class Test(unittest.TestCase): + def setUp(self): + self.eth_for_test = configuration.eth_for_test + self.mac_of_eth = configuration.mac_of_eth + self.source_repo = configuration.source_repo + self.bdf_of_eth = configuration.bdf_of_eth + + def tearDown(self): + pass + + +if __name__ == "__main__": + # import sys;sys.argv = ['', 'Test.testName'] + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/run_test.py b/vstf/vstf/agent/unittest/env/run_test.py new file mode 100755 index 00000000..0f630c7d --- /dev/null +++ b/vstf/vstf/agent/unittest/env/run_test.py @@ -0,0 +1,33 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest +import importlib + +test_order_list = [ + "vstf.agent.unittest.env.test_origin_driver", + "vstf.agent.unittest.env.test_bridge_plugin", + "vstf.agent.unittest.env.test_drivermanager", + "vstf.agent.unittest.env.test_devicemanager", + "vstf.agent.unittest.env.test_vs_plugin_manager", + "vstf.agent.unittest.env.test_builder", + "vstf.agent.unittest.env.test_sourcemanager", +] + + +def main(): + import logging + logging.getLogger(__name__) + logging.basicConfig(level=logging.INFO) + suite = unittest.TestSuite() + for mod_name in test_order_list: + mod = importlib.import_module(mod_name) + suit = unittest.TestLoader().loadTestsFromModule(mod) + suite.addTest(suit) + unittest.TextTestRunner().run(suite) + + +if __name__ == '__main__': + main() diff --git a/vstf/vstf/agent/unittest/env/test_bridge_plugin.py b/vstf/vstf/agent/unittest/env/test_bridge_plugin.py new file mode 100755 index 00000000..ac4eb268 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_bridge_plugin.py @@ -0,0 +1,56 @@ +""" +Created on 2015-10-12 + +@author: y00228926 +""" +import unittest + +from vstf.common.utils import check_call +from vstf.agent.unittest.env import model +from vstf.agent.env.vswitch_plugins import bridge_plugin +from vstf.agent.env.driver_plugins import manager + + +class Test(model.Test): + def setUp(self): + super(Test, self).setUp() + self.plugin = bridge_plugin.BridgePlugin() + self.dr_mgr = manager.DriverPluginManager() + self.br_cfg = { + "name": "br1", + "uplinks": [ + { + "bdf": self.bdf_of_eth[0], + }, + { + "bdf": self.bdf_of_eth[1], + } + ] + } + self.dr_mgr.clean() + self.dr_mgr.load(['ixgbe']) + + def tearDown(self): + super(Test, self).tearDown() + + def _check_br_exists(self, name): + try: + check_call('ifconfig %s' % name, shell=True) + except Exception, e: + return False + return True + + def test_create_br(self): + self.plugin.clean() + self.plugin.create_br(self.br_cfg) + self.assertTrue(self._check_br_exists(self.br_cfg['name'])) + self.plugin.clean() + self.assertFalse(self._check_br_exists(self.br_cfg['name'])) + + +if __name__ == "__main__": + import logging + + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_builder.py b/vstf/vstf/agent/unittest/env/test_builder.py new file mode 100755 index 00000000..fd2d4382 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_builder.py @@ -0,0 +1,74 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest +import os + +from vstf.controller.env_build.cfg_intent_parse import IntentParser +from vstf.agent.env import builder + + +class Test(unittest.TestCase): + def setUp(self): + self.mgr = builder.PluginManager() + self.dir = os.path.dirname(__file__) + + def tearDown(self): + self.mgr.clean() + + def __build(self, filepath, drivers=None): + parser = IntentParser(filepath) + cfg_intent = parser.parse_cfg_file() + host_cfg = cfg_intent['env-build'][0] + print filepath + print host_cfg + host_cfg["src-install"] = {} + if drivers: + host_cfg['drivers'] = drivers + return self.mgr.build(host_cfg) + + def test_build_tn_using_origin_driver(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tn.json'), drivers=['ixgbe']) + self.assertTrue(ret, "test_build_tn_using_origin_driver failed, ret = %s" % ret) + + def test_build_tn1v_using_origin_driver(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tn1v.json'), drivers=['ixgbe', 'vhost_net']) + self.assertTrue(ret, "test_build_tn1v_using_origin_driver failed, ret = %s" % ret) + + def test_build_ti_using_origin_driver(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Ti.json'), drivers=['ixgbe', 'vhost_net']) + self.assertTrue(ret, "test_build_ti_using_origin_driver failed, ret = %s" % ret) + + def test_build_tu_using_origin_driver(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tu.json'), drivers=['vhost_net']) + self.assertTrue(ret, "test_build_ti_using_origin_driver failed, ret = %s" % ret) + + @unittest.skip('can be tested by tn1v') + def test_build_tn(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tn.json')) + self.assertTrue(ret, "test_build_tn failed, ret = %s" % ret) + + @unittest.skip('can be tested by tn1v') + def test_build_tn1v(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tn1v.json')) + self.assertTrue(ret, "test_build_tn failed,ret = %s" % ret) + + @unittest.skip('can be tested by tn1v') + def test_build_ti(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Ti.json')) + self.assertTrue(ret, "test_build_tn failed, ret = %s" % ret) + + @unittest.skip('can be tested by tn1v') + def test_build_tu(self): + ret = self.__build(os.path.join(self.dir, 'configuration/Tu.json')) + self.assertTrue(ret, "test_build_tn failed, ret = %s" % ret) + + +if __name__ == "__main__": + import logging + + LOG = logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_devicemanager.py b/vstf/vstf/agent/unittest/env/test_devicemanager.py new file mode 100755 index 00000000..7e5bc3b1 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_devicemanager.py @@ -0,0 +1,38 @@ +""" +Created on 2015-9-25 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.env import model +from vstf.agent.env.basic.device_manager import DeviceManager + + +class Test(model.Test): + def setUp(self): + super(Test, self).setUp() + self.dm = DeviceManager() + self.device_list = self.dm.list_nic_devices() + self.device_detail = self.device_list[0] + + def tearDown(self): + super(Test, self).tearDown() + + def test_get_device_detail(self): + detail1 = self.dm.get_device_detail(self.device_detail['bdf']) + detail2 = self.dm.get_device_detail(self.device_detail['mac']) + detail3 = self.dm.get_device_detail(self.device_detail['device']) + self.assertTrue(detail1 == detail2 == detail3 == self.device_detail) + + def test_list_nic_devices(self): + import json + print json.dumps(self.device_list, indent=4) + + +if __name__ == "__main__": + import logging + + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_drivermanager.py b/vstf/vstf/agent/unittest/env/test_drivermanager.py new file mode 100755 index 00000000..df6ad5df --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_drivermanager.py @@ -0,0 +1,50 @@ +""" +Created on 2015-10-9 + +@author: y00228926 +""" +import unittest + +from vstf.common.utils import check_output +from vstf.agent.unittest.env import model +from vstf.agent.env.driver_plugins import manager + + +class Test(model.Test): + def setUp(self): + super(Test, self).setUp() + self.driver_mgr = manager.DriverPluginManager() + + def tearDown(self): + super(Test, self).tearDown() + + def _driver_exists(self, drivers=[]): + all_drivers = check_output("lsmod | awk '{print $1}'", shell=True).split() + for mod in drivers: + if mod not in all_drivers: + return False + return True + + def test_load(self): + self.driver_mgr.clean() + for _, drivers in self.driver_mgr.get_all_supported_drivers().items(): + self.assertFalse(self._driver_exists(drivers)) + + + self.driver_mgr.load(['ixgbe', 'vhost_net']) + self.assertTrue(self._driver_exists(['ixgbe', 'vhost_net'])) + + self.driver_mgr.clean() + self.assertFalse(self._driver_exists(['ixgbe', 'vhost_net'])) + + def test_load_unsuported_pair(self): + with self.assertRaises(Exception): + self.driver_mgr.load(['ixgbe', 'tap_vhost']) + + +if __name__ == "__main__": + import logging + + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_origin_driver.py b/vstf/vstf/agent/unittest/env/test_origin_driver.py new file mode 100755 index 00000000..8daa481f --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_origin_driver.py @@ -0,0 +1,44 @@ +""" +Created on 2015-10-9 + +@author: y00228926 +""" +import unittest + +from vstf.common.utils import check_output +from vstf.agent.unittest.env import model +from vstf.agent.env.driver_plugins import origin_driver + + +class Test(model.Test): + + def setUp(self): + super(Test, self).setUp() + self.driver_mgr = origin_driver.OriginDriverPlugin() + + def tearDown(self): + super(Test, self).tearDown() + + def _driver_exists(self, drivers=[]): + all_drivers = check_output("lsmod | awk '{print $1}'",shell = True).split() + for mod in drivers: + if mod not in all_drivers: + return False + return True + + def test_load(self): + self.driver_mgr.clean() + self.assertFalse(self._driver_exists(self.driver_mgr.get_supported_drivers())) + + self.driver_mgr.load(['ixgbe','vhost_net']) + self.assertTrue(self._driver_exists(['ixgbe','vhost_net'])) + + self.driver_mgr.clean() + self.assertFalse(self._driver_exists(self.driver_mgr.get_supported_drivers())) + + +if __name__ == "__main__": + import logging + logging.basicConfig(level = logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/test_sourcemanager.py b/vstf/vstf/agent/unittest/env/test_sourcemanager.py new file mode 100755 index 00000000..fda567d8 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_sourcemanager.py @@ -0,0 +1,53 @@ +""" +Created on 2015-10-9 + +@author: y00228926 +""" +import unittest +import shutil +import time +import os + +from vstf.agent.env.basic.source_manager import SourceCodeManager +from vstf.agent.unittest.env import model + + +class TestSourceManager(model.Test): + def setUp(self): + super(TestSourceManager, self).setUp() + self.sm = SourceCodeManager() + self.dest_path = '/tmp/test_source_manager' + os.mkdir(self.dest_path) + + def tearDown(self): + shutil.rmtree(self.dest_path, ignore_errors = True) + + def _time(self,func): + def _deco(*args): + start_time = time.time() + func(*args) + end_time = time.time() + return end_time - start_time + return _deco + + def test_download_source_code(self): + for key, item in self.source_repo.items(): + print self.source_repo + url = item['url'] + target = os.path.join(self.dest_path, key) + install = item['install'] + if install: + self.sm._git_pull(url, target) + self.assertTrue(os.path.isdir(target)) + my_download = self._time(self.sm._git_pull) + t = my_download(url, target) + self.assertTrue(t < 1.0) + else: + self.assertFalse(os.path.isdir(target)) + + +if __name__ == "__main__": + import logging + logging.basicConfig(level = logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/env/test_vm9pfs.py b/vstf/vstf/agent/unittest/env/test_vm9pfs.py new file mode 100755 index 00000000..4f520133 --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_vm9pfs.py @@ -0,0 +1,71 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.env import model +from vstf.agent.env.basic.vm9pfs import VMConfigBy9pfs +from vstf.agent.env.basic.vm_manager import VMControlOperation + + +class TestVM9pfs(model.Test): + def setUp(self): + super(TestVM9pfs, self).setUp() + self.vm_config = { + 'vm_name': 'vm1', + 'vm_cpu': 5, + 'image_path': "/mnt/sdb/ubuntu_salt_master.img", + 'child_dir': '/mnt/sdb/', + 'image_type': 'qcow2', + 'ctrl_br': 'br0', + 'ctrl_mac': '56:6f:44:a5:3f:a4', + "taps": [ + { + "tap_name": "tap_in", + "br_type": "bridge", + "br_name": "br0", + "tap_mac": "56:6f:44:a5:3f:a2", + }, + { + "tap_name": "tap_out", + "br_type": "bridge", + "br_name": "br0", + "tap_mac": "56:6f:44:a5:3f:a3", + } + ], + 'init_config': {} + } + self.init_config = { + 'amqp_server': '192.168.188.10', + 'ctrl_ip_setting': '192.168.188.200/23', + 'tap_pktloop_config': 'dpdk', + 'ctrl_gw': '192.168.188.1' + } + self.mgr = VMControlOperation() + self.mgr.clean_all_vms() + self.mgr.create_vm(self.vm_config) + self.mgr.wait_vm(self.vm_config["vm_name"]) + self.vm9pctrl = self.mgr.vm_9p_controllers[self.vm_config["vm_name"]] + + def tearDown(self): + self.mgr.clean_all_vms() + super(TestVM9pfs, self).tearDown() + + def test_init_config(self): + ret = self.vm9pctrl.config_ip(self.vm_config['ctrl_mac'], self.init_config['ctrl_ip_setting']) + self.assertTrue(ret) + ret = self.vm9pctrl.config_gw(self.init_config['ctrl_gw']) + self.assertTrue(ret) + ret = self.vm9pctrl.set_pktloop_dpdk([self.vm_config['taps'][0]['tap_mac'], self.vm_config['taps'][1]['tap_mac']]) + self.assertTrue(ret) + ret = self.vm9pctrl.config_amqp(self.init_config['ctrl_ip_setting'].split('/')[0], self.init_config['amqp_server']) + self.assertTrue(ret) + + +if __name__ == "__main__": + import logging + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_vm_manager.py b/vstf/vstf/agent/unittest/env/test_vm_manager.py new file mode 100755 index 00000000..3c3deacc --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_vm_manager.py @@ -0,0 +1,69 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.env import model +from vstf.agent.env.basic.vm9pfs import VMConfigBy9pfs +from vstf.agent.env.basic.vm_manager import VMControlOperation + + +class TestVM9pfs(model.Test): + def setUp(self): + super(TestVM9pfs, self).setUp() + self.vm_config = { + 'vm_name': 'vm1', + 'vm_cpu': 5, + 'image_path': "/mnt/sdb/ubuntu_salt_master.img", + 'child_dir': '/mnt/sdb/', + 'image_type': 'qcow2', + 'ctrl_br': 'br0', + 'ctrl_mac': '56:6f:44:a5:3f:a4', + "taps": [ + { + "tap_name": "tap_in", + "br_type": "bridge", + "br_name": "br0", + "tap_mac": "56:6f:44:a5:3f:a2", + }, + { + "tap_name": "tap_out", + "br_type": "bridge", + "br_name": "br0", + "tap_mac": "56:6f:44:a5:3f:a3", + } + ], + 'init_config': { + "amqp_passwd": "guest", + "amqp_user": "guest", + "amqp_server": "192.168.188.10", + "amqp_port": 5672, + 'ctrl_ip_setting': '192.168.188.200/23', + 'tap_pktloop_config': 'dpdk', + 'ctrl_gw': '192.168.188.1' + } + } + self.mgr = VMControlOperation() + self.mgr.clean_all_vms() + + def tearDown(self): + self.mgr.clean_all_vms() + super(TestVM9pfs, self).tearDown() + + def test_create_vm_bridge(self): + self.mgr.create_vm(self.vm_config) + self.mgr.wait_vm(self.vm_config["vm_name"]) + self.mgr.init_config_vm(self.vm_config["vm_name"]) + + def _replace_opts(self, cfg, br_type): + for tap_cfg in cfg["taps"]: + tap_cfg["br_type"] = br_type + + +if __name__ == "__main__": + import logging + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/env/test_vs_plugin_manager.py b/vstf/vstf/agent/unittest/env/test_vs_plugin_manager.py new file mode 100755 index 00000000..f78c3e7d --- /dev/null +++ b/vstf/vstf/agent/unittest/env/test_vs_plugin_manager.py @@ -0,0 +1,68 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.env import model +from vstf.agent.env.vswitch_plugins import manager +from vstf.common.utils import check_call + + +class TestVsPlugins(model.Test): + def setUp(self): + super(TestVsPlugins, self).setUp() + self.cfg = { + "type": "ovs", + "name": "ovs1", + "uplinks": [ + { + "bdf": self.bdf_of_eth[0], + "vlan_mode": "trunk", + "vlan_id": "100,200,300,400" + }, + { + "bdf": self.bdf_of_eth[1], + "vlan_mode": "trunk", + "vlan_id": "100,200,300,400" + } + ], + "vtep": {} + } + self.mgr = manager.VswitchPluginManager() + + def tearDown(self): + super(TestVsPlugins, self).tearDown() + + def _check_br_exists(self, name): + try: + check_call('ifconfig %s' % name, shell=True) + except Exception, e: + return False + return True + + def test_create_bridge(self): + self.cfg['name'] = 'br1' + self.br = self.mgr.get_vs_plugin('bridge') + self.br.clean() + self.br.init() + self.br.create_br(self.cfg) + self.assertTrue(self._check_br_exists('br1')) + self.br.clean() + self.assertFalse(self._check_br_exists('br1')) + + def test_clean(self): + self.mgr.clean() + + def test_get_supported_plugins(self): + ret = self.mgr.get_supported_plugins() + self.assertEqual(set(ret), {'bridge', 'ovs'}) + + +if __name__ == "__main__": + import logging + + logging.basicConfig(level=logging.INFO) + LOG = logging.getLogger(__name__) + unittest.main() diff --git a/vstf/vstf/agent/unittest/perf/Readme b/vstf/vstf/agent/unittest/perf/Readme new file mode 100755 index 00000000..3ebe6c49 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/Readme @@ -0,0 +1,7 @@ +To enable Perf unittest, please make sure: + + 1. you have setup a "Tn virtual network" on Target Host, so you can ping from one nic to the other nic. + 2. change options in "unittest/configuration.py". + +run tests: + python run_test.py \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/perf/__init__.py b/vstf/vstf/agent/unittest/perf/__init__.py new file mode 100755 index 00000000..89dcd4e2 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/__init__.py @@ -0,0 +1,14 @@ +# Copyright Huawei Technologies Co., Ltd. 1998-2015. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. diff --git a/vstf/vstf/agent/unittest/perf/model.py b/vstf/vstf/agent/unittest/perf/model.py new file mode 100755 index 00000000..6383ae0c --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/model.py @@ -0,0 +1,46 @@ +""" +Created on 2015-9-25 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest import configuration +from vstf.agent.perf import netns + + +class LocalModel(unittest.TestCase): + def _ping(self): + device_list, ns_list, ip_setting_list, ip_list = self.device_list, self.ns_list, self.ip_setting_list, self.ip_list + for ns, dev, ip_setting in zip(ns_list, device_list, ip_setting_list): + netdev = { + "namespace": ns, + "iface": dev, + 'ip_setting': ip_setting + } + self.mgr.config_dev(netdev) + ip_list_copy = ip_list[:] + ip_list_copy.reverse() + for ns, ip in zip(ns_list, ip_list_copy): + self.assertTrue(sself.mgr.ping(ns, ip), True) + self.mgr.clean_all_namespace() + + def setUp(self): + # make sure you have set up Tn loop on the "Target Host" + self.mgr = netns.NetnsManager() + self.mgr.clean_all_namespace() + self.device_list = configuration.eth_for_test + self.mac_list = configuration.mac_of_eth + self.ns_list = ['send', 'receive'] + self.ip_setting_list = ['192.168.1.1/24', '192.168.1.2/24'] + self.ip_list = ['192.168.1.1', '192.168.1.2'] + + def tearDown(self): + self.mgr.clean_all_namespace() + + +class Model(LocalModel): + def setUp(self): + # make sure you have set up Tn loop on the "Target Host" + super(Model, self).setUp() + self._ping() diff --git a/vstf/vstf/agent/unittest/perf/run_test.py b/vstf/vstf/agent/unittest/perf/run_test.py new file mode 100755 index 00000000..684ca183 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/run_test.py @@ -0,0 +1,32 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest +import importlib + +test_order_list = [ + "vstf.agent.unittest.perf.test_utils", + "vstf.agent.unittest.perf.test_netns", + "vstf.agent.unittest.perf.test_netperf", + "vstf.agent.unittest.perf.test_qperf", + "vstf.agent.unittest.perf.test_pktgen", + "vstf.agent.unittest.perf.test_vstfperf", +] + + +def main(): + import logging + logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + suite = unittest.TestSuite() + for mod_name in test_order_list: + mod = importlib.import_module(mod_name) + suit = unittest.TestLoader().loadTestsFromModule(mod) + suite.addTest(suit) + unittest.TextTestRunner().run(suite) + + +if __name__ == '__main__': + main() diff --git a/vstf/vstf/agent/unittest/perf/test_ethtool.py b/vstf/vstf/agent/unittest/perf/test_ethtool.py new file mode 100755 index 00000000..48e0d7f6 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_ethtool.py @@ -0,0 +1,42 @@ +#!/usr/bin/python +# -*- coding: utf8 -*- +# author: wly +# date: 2015/11/13 +# see license for license details + +import unittest +import logging +from vstf.agent.perf import ethtool +from vstf.agent.unittest import configuration +from vstf.common.log import setup_logging + + +LOG = logging.getLogger(__name__) + + +class Testethtool(unittest.TestCase): + def setUp(self): + LOG.info("start Testethtool unit test.") + self._devices = configuration.eth_for_test + super(Testethtool, self).setUp() + + def teardown(self): + LOG.info("stop Testethtool unit test.") + +# @unittest.skip('for now') + def test_autoneg_on(self): + for dev in self._devices: + self.assertTrue(ethtool.autoneg_on(dev), True) + + def test_autoneg_off(self): + for dev in self._devices: + self.assertTrue(ethtool.autoneg_off(dev), True) + + def test_autoneg_query(self): + for dev in self._devices: + result = ethtool.autoneg_query(dev) + LOG.info(result) + +if __name__ == "__main__": + setup_logging(level=logging.INFO, log_file="/var/log/vstf/vstf-unit-test.log", clevel=logging.INFO) + unittest.main() diff --git a/vstf/vstf/agent/unittest/perf/test_netns.py b/vstf/vstf/agent/unittest/perf/test_netns.py new file mode 100755 index 00000000..912358bd --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_netns.py @@ -0,0 +1,67 @@ +""" +Created on 2015-9-23 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.perf import model +from vstf.agent.perf import netns + + +class TestNetnsManager(model.Model): + def setUp(self): + super(TestNetnsManager, self).setUp() + self.ns = netns.Netns() + + def tearDown(self): + super(TestNetnsManager, self).tearDown() + + def testNetns(self): + device_list,ns_list,ip_setting_list,ip_list = self.device_list,self.ns_list,self.ip_setting_list,self.ip_list + net = self.ns + for ns in ns_list: + self.assertTrue(net.create_namespace(ns),'create_namespace failed') + for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list): + self.assertTrue(net.add_device(ns, dev),'add_device failed') + self.assertTrue(net.activate_device(ns,dev),'activate_device failed') + self.assertTrue(net.config_ip(ns,dev,ip_setting),'config_ip failed') + for ns in ns_list: + self.assertTrue(net.remove_namespace(ns),'remove_namespace failed') + + def testNetNsManager(self): + mgr = self.mgr + device_list,ns_list,ip_setting_list,ip_list = self.device_list,self.ns_list,self.ip_setting_list,self.ip_list + for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list): + netdev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + ret = mgr.config_dev(netdev) + self.assertTrue(ret,"config_dev failed, netdev=%s" % netdev) + + for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list): + netdev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + self.assertTrue(mgr.recover_dev(netdev),"recover_dev failed, netdev=%s" % netdev) + + for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list): + netdev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + self.assertTrue(mgr.config_dev(netdev),"config_dev failed, netdev=%s" % netdev) + self.assertTrue(mgr.clean_all_namespace(),'remove_namespace failed') + + +if __name__ == "__main__": + import logging + LOG = logging.getLogger(__name__) + logging.basicConfig(level = logging.DEBUG) + #import sys;sys.argv = ['', 'Test.testName'] + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/perf/test_netperf.py b/vstf/vstf/agent/unittest/perf/test_netperf.py new file mode 100755 index 00000000..b5f8cb2a --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_netperf.py @@ -0,0 +1,105 @@ +''' +Created on 2015-9-24 + +@author: y00228926 +''' +import unittest +import time +import subprocess + +from vstf.agent.unittest.perf import model +from vstf.agent.perf import netperf +from vstf.agent.perf.utils import get_pid_by_name + + +class TestNetperf(model.Model): + ''' + please make sure 'Tn' network on 'Target Host' is created. + ''' + def setUp(self): + super(TestNetperf, self).setUp() + subprocess.call("killall netperf", shell = True) + subprocess.call("killall netserver",shell = True) + for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list): + netdev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + self.mgr.config_dev(netdev) + self.send_cfg = { + "namespace": "send", + "protocol": "udp_bw", + "dst":[ + {"ip": "192.168.1.2"} + ], + "size": 64, + "threads": 1, + "time": 10, + } + + def tearDown(self): + super(TestNetperf, self).tearDown() + + def test_netperf_start_success(self): + perf = netperf.Netperf() + ret = perf.receive_start(namespace='receive') + exp = (0, 'start netserver success') + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + ret = perf.send_start(**self.send_cfg) + exp = (0,"start netperf send success") + self.assertEqual(ret, exp, "failed to start netperf") + + time.sleep(3) + + ret = perf.send_stop() + exp = [(0, "process is stopped by killed")] + self.assertEqual(ret, exp, "send_stop failed, ret = %s" % str(ret)) + + ret = perf.receive_stop() + exp = (0, "stop netserver success") + self.assertEqual(ret, exp, "receive_stop failedf, ret = %s" % str(ret)) + + def test_netperf_start_success_mutil_threads(self): + perf = netperf.Netperf() + ret = perf.receive_start(namespace='receive') + exp = (0, 'start netserver success') + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + self.send_cfg.update({"threads":3}) + exp = (0,"start netperf send success") + ret = perf.send_start(**self.send_cfg) + self.assertEqual(ret, exp, "failed to start netperf") + + time.sleep(3) + + rets = perf.send_stop() + exp = [(0, 'process is stopped by killed'), (0, 'process is stopped by killed'), (0, 'process is stopped by killed')] + self.assertEqual(rets, exp, "send_stop failed, rets = %s" % str(rets)) + + rets = perf.receive_stop() + self.assertEqual(rets, (0, "stop netserver success"), "receive_stop failedf, rets = %s" % str(rets)) + + def test_clean(self): + perf = netperf.Netperf() + ret = perf.receive_start(namespace='receive') + exp = (0, 'start netserver success') + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + self.send_cfg.update({"threads":3}) + exp = (0,"start netperf send success") + ret = perf.send_start(**self.send_cfg) + self.assertEqual(ret, exp, "failed to start netperf") + perf.clean() + ret = get_pid_by_name('netperf') + self.assertEqual(ret, [], "failed to clean netperf") + ret = get_pid_by_name('netserver') + self.assertEqual(ret, [], "failed to clean netserver") + +if __name__ == "__main__": + import logging + logging.getLogger(__name__) + logging.basicConfig(level = logging.DEBUG) + #import sys;sys.argv = ['', 'Test.testName'] + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/perf/test_pktgen.py b/vstf/vstf/agent/unittest/perf/test_pktgen.py new file mode 100755 index 00000000..5e6cdf76 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_pktgen.py @@ -0,0 +1,90 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest +import time + +from vstf.agent.unittest.perf import model +from vstf.agent.perf import pktgen + + +class TestPktgen(model.Model): + def setUp(self): + super(TestPktgen, self).setUp() + + def tearDown(self): + super(TestPktgen, self).tearDown() + + def test_single_thread(self): + perf = pktgen.Pktgen() + print perf.receive_start() + send = { + "src": [ + {"iface": self.device_list[0], "mac": self.mac_list[0]} + ], + "dst": [ + {"mac": self.mac_list[1]} + ], + "size": 64, + "threads": 1, + 'ratep': 0 + } + ret = perf.send_start(**send) + self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret)) + time.sleep(5) + ret = perf.send_stop() + self.assertEqual([(0, '')], ret, "send_start failed, ret=%s" % ret) + ret = perf.receive_stop() + self.assertEqual((0, 'pktgen neednt receive stop'), ret, "send_stop failed, ret=%s" % str(ret)) + + def test_single_thread_bidirectional(self): + perf = pktgen.Pktgen() + print perf.receive_start() + send = { + "src": [ + {"iface": self.device_list[0], "mac": self.mac_list[0]}, + {"iface": self.device_list[1], "mac": self.mac_list[1]} + ], + "dst": [ + {"mac": self.mac_list[1]}, + {"mac": self.mac_list[0]} + ], + "size": 64, + "threads": 1, + 'ratep': 0 + } + ret = perf.send_start(**send) + self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret)) + time.sleep(5) + ret = perf.send_stop() + self.assertEqual([(0, '')], ret, "send_start failed, ret=%s" % ret) + ret = perf.receive_stop() + self.assertEqual((0, 'pktgen neednt receive stop'), ret, "send_stop failed, ret=%s" % str(ret)) + + def test_clean(self): + perf = pktgen.Pktgen() + print perf.receive_start() + send = { + "src": [ + {"iface": self.device_list[0], "mac": self.mac_list[0]} + ], + "dst": [ + {"mac": self.mac_list[1]} + ], + "size": 64, + "threads": 1, + 'ratep': 0 + } + ret = perf.send_start(**send) + self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret)) + perf.clean() + + +if __name__ == "__main__": + import logging + + logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + unittest.main() diff --git a/vstf/vstf/agent/unittest/perf/test_qperf.py b/vstf/vstf/agent/unittest/perf/test_qperf.py new file mode 100755 index 00000000..ec9a290d --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_qperf.py @@ -0,0 +1,102 @@ +''' +Created on 2015-9-24 + +@author: y00228926 +''' +import unittest +import subprocess +import time + +from vstf.agent.unittest.perf import model +from vstf.agent.perf import qperf +from vstf.agent.perf.utils import get_pid_by_name + + +class testQperf(model.Model): + def setUp(self): + super(testQperf, self).setUp() + subprocess.call("killall qperf", shell = True) + for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list): + netdev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + self.mgr.config_dev(netdev) + self.send_cfg = { + "namespace": self.ns_list[0], + "time":1, + "protocol": "udp_lat", + "dst":[ + {"ip": self.ip_list[1]} + ], + "size": 64, + } + + def tearDown(self): + super(testQperf, self).tearDown() + + def test_qperf_quick(self): + perf = qperf.Qperf() + ret = perf.receive_start(namespace=self.ns_list[1]) + exp = (0, "start qperf receive success") + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + ret = perf.send_start(**self.send_cfg) + exp = (0,"start qperf send success") + self.assertEqual(ret, exp, "send_start failed") + + time.sleep(3) + + ret = perf.send_stop() + for r in ret: + self.assertEqual(r[0], 0, "send_stop failed, ret = %s" % str(ret)) + for key in ('MaximumLatency', 'AverageLatency', 'MinimumLatency'): + self.assertIn(key, r[1], "send_stop failed, ret = %s" % str(ret)) + + ret = perf.receive_stop() + exp = (0, "stop qperf receive success") + self.assertEqual(ret, exp, "receive_stop failed, ret = %s" % str(ret)) + + def test_qperf_quick_3s(self): + perf = qperf.Qperf() + self.send_cfg.update({"time":3}) + ret = perf.receive_start(namespace='receive') + exp = (0, 'start qperf receive success') + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + self.send_cfg.update({"threads":3}) + exp = (0,"start qperf send success") + ret = perf.send_start(**self.send_cfg) + self.assertEqual(ret, exp, "send_start failed %s" % str(ret)) + + ret = perf.send_stop() + for r in ret: + self.assertEqual(r[0], 0, "send_stop failed, ret = %s" % str(ret)) + for key in ('MaximumLatency', 'AverageLatency', 'MinimumLatency'): + self.assertIn(key, r[1], "send_stop failed, ret = %s" % str(ret)) + + ret = perf.receive_stop() + self.assertEqual(ret, (0, 'stop qperf receive success'), "receive_stop failedf, ret = %s" % str(ret)) + + def test_clean(self): + perf = qperf.Qperf() + self.send_cfg.update({"time":10}) + ret = perf.receive_start(namespace=self.ns_list[1]) + exp = (0, "start qperf receive success") + self.assertEqual(ret, exp, "receive_start failed %s" % str(ret)) + + ret = perf.send_start(**self.send_cfg) + exp = (0,"start qperf send success") + self.assertEqual(ret, exp, "send_start failed") + + perf.clean() + ret = get_pid_by_name('qperf') + self.assertEqual(ret, [], "clean qperf failed") + + +if __name__ == "__main__": + import logging + logging.getLogger(__name__) + logging.basicConfig(level = logging.DEBUG) + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/perf/test_utils.py b/vstf/vstf/agent/unittest/perf/test_utils.py new file mode 100755 index 00000000..83410c54 --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_utils.py @@ -0,0 +1,31 @@ +""" +Created on 2015-9-24 + +@author: y00228926 +""" +import unittest +from vstf.common import utils + + +class TestUtils(unittest.TestCase): + def setUp(self): + pass + + def tearDown(self): + pass + + def test_ns_cmd(self): + cmd = "ls" + ns = "xx" + exp_cmd = "ip netns exec xx ls" + ret = utils.ns_cmd(ns, cmd) + self.assertEqual(ret, exp_cmd, "ns_cmd failed to add ns header prefix:%s != %s" % (ret, exp_cmd)) + + +if __name__ == "__main__": + import logging + + logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + # import sys;sys.argv = ['', 'Test.testName'] + unittest.main() diff --git a/vstf/vstf/agent/unittest/perf/test_vnstat.py b/vstf/vstf/agent/unittest/perf/test_vnstat.py new file mode 100755 index 00000000..f7c31f5b --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_vnstat.py @@ -0,0 +1,57 @@ +""" +Created on 2015-9-23 + +@author: y00228926 +""" +import unittest +import time + +from vstf.agent.perf.utils import get_pid_by_name +from vstf.agent.unittest.perf import model +from vstf.agent.perf import vnstat + + +class TestVnstat(model.LocalModel): + def setUp(self): + super(TestVnstat, self).setUp() + self.vnstat = vnstat.VnStat() + self.namespace = self.ns_list[0] + self.device = self.device_list[0] + self.ip_setting = self.ip_setting_list[0] + netdev = { + "namespace": self.namespace, + "iface": self.device, + 'ip_setting': self.ip_setting + } + self.mgr.config_dev(netdev) + + def tearDown(self): + super(TestVnstat, self).tearDown() + + def test_run_vnstat(self): + logging.basicConfig(level=logging.DEBUG) + pid = self.vnstat.run_vnstat(self.device, self.namespace) + time.sleep(12) + raw = self.vnstat.kill_vnstat(pid, self.namespace) + print raw['raw_data'] + data = self.vnstat.process(raw['raw_data']) + self.assertTrue(type(data) is dict) + for key in ('rxmB/s', 'txmB', 'rxpck', 'txpck', \ + 'rxpck_min/s', 'txmB_max/s', 'txpck_max/s', \ + 'txmB/s', 'rxmB', 'rxmB_max/s', 'rxpck/s', 'rxmB_min/s', \ + 'time', 'rxpck_max/s', 'txpck_min/s', 'txpck/s', 'txmB_min/s'): + self.assertTrue(key in data) + + def test_clean(self): + self.vnstat.run_vnstat(self.device, self.namespace) + self.vnstat.clean() + self.assertTrue(get_pid_by_name('vnstat') == []) + + +if __name__ == "__main__": + import logging + + LOG = logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + # import sys;sys.argv = ['', 'Test.testName'] + unittest.main() diff --git a/vstf/vstf/agent/unittest/perf/test_vstfperf.py b/vstf/vstf/agent/unittest/perf/test_vstfperf.py new file mode 100755 index 00000000..30d7c7fd --- /dev/null +++ b/vstf/vstf/agent/unittest/perf/test_vstfperf.py @@ -0,0 +1,98 @@ +""" +Created on 2015-9-28 + +@author: y00228926 +""" +import unittest + +from vstf.agent.perf.vstfperf import Vstfperf +from vstf.agent.unittest.perf import model + + +class Test(model.Model): + def setUp(self): + super(Test, self).setUp() + + for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list): + net_dev = { + "namespace":ns, + "iface":dev, + 'ip_setting':ip_setting + } + self.mgr.config_dev(net_dev) + + self.start = { + "operation": "start", + "action": "send", + "tool": "netperf", + "params":{ + "namespace": self.ns_list[0], + "protocol": "tcp_lat", + "dst":[ + {"ip": self.ip_list[1]} + ], + "size": 64, + "threads": 1, + "time": 1, + }, + } + self.stop = { + "operation": "stop", + "action": "send", + "tool": "netperf", + "params":{ + "namespace": self.ns_list[1], + }, + } + + def tearDown(self): + super(Test, self).tearDown() + + def testNetperf(self): + perf = Vstfperf() + self.start['tool'] = 'netperf' + self.stop['tool'] = 'netperf' + self.start['action'] = 'receive' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[1] + self.start['params']['protocol'] = 'udp_bw' + perf.run(**self.start) + self.start['action'] = 'send' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[0] + perf.run(**self.start) + self.stop['action'] = 'send' + self.stop['operation'] = 'stop' + self.stop['params']['namespace'] = self.ns_list[0] + perf.run(**self.stop) + self.stop['action'] = 'receive' + self.stop['operation'] = 'stop' + self.stop['params']['namespace'] = self.ns_list[1] + perf.run(**self.stop) + + def testQperf(self): + perf = Vstfperf() + self.start['tool'] = 'qperf' + self.stop['tool'] = 'qperf' + self.start['action'] = 'receive' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[1] + perf.run(**self.start) + self.start['action'] = 'send' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[0] + perf.run(**self.start) + self.stop['action'] = 'send' + self.stop['operation'] = 'stop' + self.stop['params']['namespace'] = self.ns_list[0] + perf.run(**self.stop) + self.stop['action'] = 'receive' + self.stop['operation'] = 'stop' + self.stop['params']['namespace'] = self.ns_list[1] + perf.run(**self.stop) + + +if __name__ == "__main__": + import logging + logging.basicConfig(level = logging.DEBUG) + unittest.main() \ No newline at end of file diff --git a/vstf/vstf/agent/unittest/test_callback.py b/vstf/vstf/agent/unittest/test_callback.py new file mode 100755 index 00000000..35336d9c --- /dev/null +++ b/vstf/vstf/agent/unittest/test_callback.py @@ -0,0 +1,80 @@ +""" +Created on 2015-9-28 + +@author: y00228926 +""" +import unittest + +from vstf.agent.unittest.perf import model +from vstf.agent import softagent + + +class TestCallback(model.Model): + def setUp(self): + super(TestCallback, self).setUp() + self.agent = softagent.softAgent() + for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list): + netdev = { + "namespace": ns, + "iface": dev, + 'ip_setting': ip_setting + } + self.mgr.config_dev(netdev) + + self.start = { + "operation": "start", + "action": "send", + "tool": "netperf", + "params": { + "namespace": self.ns_list[0], + "protocol": "tcp_lat", + "dst": [ + {"ip": self.ip_list[1]} + ], + "size": 64, + "threads": 1, + "time": 1, + }, + } + self.stop = { + "operation": "stop", + "action": "send", + "tool": "netperf", + "params": { + "namespace": self.ns_list[1], + }, + } + + def tearDown(self): + super(TestCallback, self).tearDown() + + def test_clean(self): + agent = self.agent + agent.perf_clean() + self.start['tool'] = 'netperf' + self.stop['tool'] = 'netperf' + self.start['action'] = 'receive' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[1] + self.start['params']['protocol'] = 'udp_bw' + agent.perf_run(**self.start) + self.start['action'] = 'send' + self.start['operation'] = 'start' + self.start['params']['namespace'] = self.ns_list[0] + agent.perf_run(**self.start) + agent.perf_clean() + + +if __name__ == "__main__": + import logging + + logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + # import sys;sys.argv = ['', 'Test.testName'] + unittest.main() + +if __name__ == "__main__": + import logging + + logging.basicConfig(level=logging.DEBUG) + unittest.main() -- cgit 1.2.3-korg