summaryrefslogtreecommitdiffstats
path: root/vstf/vstf/agent/unittest
diff options
context:
space:
mode:
Diffstat (limited to 'vstf/vstf/agent/unittest')
-rwxr-xr-xvstf/vstf/agent/unittest/__init__.py14
-rwxr-xr-xvstf/vstf/agent/unittest/configuration.py28
-rwxr-xr-xvstf/vstf/agent/unittest/env/Readme13
-rwxr-xr-xvstf/vstf/agent/unittest/env/__init__.py14
-rwxr-xr-xvstf/vstf/agent/unittest/env/configuration/Ti.json58
-rwxr-xr-xvstf/vstf/agent/unittest/env/configuration/Tn-ovs.json36
-rwxr-xr-xvstf/vstf/agent/unittest/env/configuration/Tn.json37
-rwxr-xr-xvstf/vstf/agent/unittest/env/configuration/Tn1v.json85
-rwxr-xr-xvstf/vstf/agent/unittest/env/configuration/Tu.json71
-rwxr-xr-xvstf/vstf/agent/unittest/env/model.py24
-rwxr-xr-xvstf/vstf/agent/unittest/env/run_test.py33
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_bridge_plugin.py56
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_builder.py74
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_devicemanager.py38
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_drivermanager.py50
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_origin_driver.py44
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_sourcemanager.py53
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_vm9pfs.py71
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_vm_manager.py69
-rwxr-xr-xvstf/vstf/agent/unittest/env/test_vs_plugin_manager.py68
-rwxr-xr-xvstf/vstf/agent/unittest/perf/Readme7
-rwxr-xr-xvstf/vstf/agent/unittest/perf/__init__.py14
-rwxr-xr-xvstf/vstf/agent/unittest/perf/model.py46
-rwxr-xr-xvstf/vstf/agent/unittest/perf/run_test.py32
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_ethtool.py42
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_netns.py67
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_netperf.py105
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_pktgen.py90
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_qperf.py102
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_utils.py31
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_vnstat.py57
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_vstfperf.py98
-rwxr-xr-xvstf/vstf/agent/unittest/test_callback.py80
33 files changed, 1707 insertions, 0 deletions
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()