diff options
26 files changed, 288 insertions, 172 deletions
diff --git a/api/server.py b/api/server.py index be7963481..1d42feffb 100644 --- a/api/server.py +++ b/api/server.py @@ -10,7 +10,6 @@ from __future__ import absolute_import import inspect import logging -from functools import reduce from six.moves import filter from flasgger import Swagger @@ -38,6 +37,10 @@ def shutdown_session(exception=None): db_session.remove() +for u in urlpatterns: + api.add_resource(u.resource, u.url, endpoint=u.endpoint) + + def init_db(): def func(a): try: @@ -52,8 +55,10 @@ def init_db(): Base.metadata.create_all(bind=engine) -reduce(lambda a, b: a.add_resource(b.resource, b.url, - endpoint=b.endpoint) or a, urlpatterns, api) +def app_wrapper(*args, **kwargs): + init_db() + return app(*args, **kwargs) + if __name__ == '__main__': _init_logging() diff --git a/api/yardstick.ini b/api/yardstick.ini index 2ba881fc1..d2e8956e2 100644 --- a/api/yardstick.ini +++ b/api/yardstick.ini @@ -9,7 +9,7 @@ threads = 5 async = true max-requests = 5000 chmod-socket = 666 -callable = app +callable = app_wrapper enable-threads = true close-on-exec = 1 daemonize= /var/log/yardstick/uwsgi.log diff --git a/docker/Dockerfile b/docker/Dockerfile index 23afef74e..afb2ce5c6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -41,6 +41,7 @@ RUN apt-get update && apt-get install -y \ kpartx \ libffi-dev \ libssl-dev \ + libzmq-dev \ python \ python-dev \ libxml2-dev \ diff --git a/run_tests.sh b/run_tests.sh index 1f985b6c1..2519d94f6 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -33,32 +33,9 @@ run_flake8() { fi } -get_external_libs() { - cd $(dirname ${BASH_SOURCE[0]}) - TREX_DOWNLOAD="https://trex-tgn.cisco.com/trex/release/v2.05.tar.gz" - TREX_DIR=$PWD/trex/scripts - if [ ! -d "$TREX_DIR" ]; then - rm -rf ${TREX_DOWNLOAD##*/} - if [ ! -e ${TREX_DOWNLOAD##*/} ] ; then - wget -nv $TREX_DOWNLOAD - fi - tar xf ${TREX_DOWNLOAD##*/} - pushd . - rm -rf trex && mkdir -p trex - mv v2.05 trex/scripts - rm -rf v2.05.tar.gz - touch "$PWD/trex/scripts/automation/trex_control_plane/stl/__init__.py" - popd - fi - echo "Done." - export PYTHONPATH=$PYTHONPATH:"$PWD/trex/scripts/automation/trex_control_plane" - export PYTHONPATH=$PYTHONPATH:"$PWD/trex/scripts/automation/trex_control_plane/stl" - echo $PYTHONPATH -} run_tests() { echo "Get external libs needed for unit test" - get_external_libs echo "Running unittest ... " if [ $FILE_OPTION == "f" ]; then diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml new file mode 100644 index 000000000..eb3f95eff --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml @@ -0,0 +1,54 @@ +--- +# os-nosdn-kvm_ovs_dpdk_bar-ha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk_bar-ha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml new file mode 100644 index 000000000..8d7ac7b01 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml @@ -0,0 +1,46 @@ +--- +# os-nosdn-kvm_ovs_dpdk_bar-noha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk_bar-noha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml diff --git a/tests/unit/apiserver/resources/test_env_action.py b/tests/unit/apiserver/resources/test_env_action.py index e8f99b706..0411a66c4 100644 --- a/tests/unit/apiserver/resources/test_env_action.py +++ b/tests/unit/apiserver/resources/test_env_action.py @@ -10,7 +10,7 @@ class EnvTestCase(APITestCase): def test_create_grafana(self): url = 'yardstick/env/action' - data = dict(action='createGrafanaContainer') + data = {'action': 'createGrafanaContainer'} resp = self._post(url, data) time.sleep(1) diff --git a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py index 0d9fbafc5..1b02b6eff 100644 --- a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py +++ b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py @@ -18,12 +18,14 @@ # Unittest for yardstick.benchmark.scenarios.networking.test_vnf_generic from __future__ import absolute_import + +import os import unittest + import mock -import os from yardstick.benchmark.scenarios.networking.vnf_generic import \ - ssh_manager, NetworkServiceTestCase, IncorrectConfig, IncorrectSetup + SshManager, NetworkServiceTestCase, IncorrectConfig, IncorrectSetup from yardstick.network_services.collector.subscriber import Collector from yardstick.network_services.vnf_generic.vnf.base import \ GenericTrafficGen, GenericVNF @@ -164,14 +166,14 @@ lrwxrwxrwx 1 root root 0 sie 3 10:37 eth2 -> """ """ TRAFFIC_PROFILE = { - "schema": "isb:traffic_profile:0.1", - "name": "fixed", - "description": "Fixed traffic profile to run UDP traffic", - "traffic_profile": { - "traffic_type": "FixedTraffic", - "frame_rate": 100, # pps - "flow_number": 10, - "frame_size": 64}} + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} class TestNetworkServiceTestCase(unittest.TestCase): @@ -236,60 +238,72 @@ class TestNetworkServiceTestCase(unittest.TestCase): 'if': 'xe1'}], 'password': 'r00t'}}} - self.topology = \ - {'short-name': 'trex-tg-topology', - 'constituent-vnfd': - [{'member-vnf-index': '1', - 'VNF model': 'tg_trex_tpl.yaml', - 'vnfd-id-ref': 'trexgen__1'}, - {'member-vnf-index': '2', - 'VNF model': 'tg_trex_tpl.yaml', - 'vnfd-id-ref': 'trexvnf__1'}], - 'description': 'trex-tg-topology', - 'name': 'trex-tg-topology', - 'vld': [{'vnfd-connection-point-ref': [ - {'vnfd-connection-point-ref': 'xe0', - 'member-vnf-index-ref': '1', - 'vnfd-id-ref': 'trexgen'}, - {'vnfd-connection-point-ref': 'xe0', - 'member-vnf-index-ref': '2', - 'vnfd-id-ref': 'trexgen'}], - 'type': 'ELAN', - 'id': 'private', - 'name': 'trexgen__1 to trexvnf__1 link 1'}, - {'vnfd-connection-point-ref': [ - {'vnfd-connection-point-ref': 'xe1', - 'member-vnf-index-ref': '1', - 'vnfd-id-ref': 'trexgen'}, - {'vnfd-connection-point-ref': 'xe1', - 'member-vnf-index-ref': '2', - 'vnfd-id-ref': 'trexgen'}], - 'type': 'ELAN', - 'id': 'public', - 'name': 'trexvnf__1 to trexgen__1 link 2'}], - 'id': 'trex-tg-topology'} - - self.scenario_cfg = {'tc_options': - {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}}, - 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', - 'tc': 'tc_ipv4_1Mflow_64B_packetsize', - 'runner': {'object': 'NetworkServiceTestCase', - 'interval': 35, - 'output_filename': 'yardstick.out', - 'runner_id': 74476, - 'duration': 400, 'type': 'Duration'}, - 'traffic_profile': 'ipv4_throughput_vpe.yaml', - 'traffic_options': - {'flow': 'ipv4_1flow_Packets_vpe.yaml', - 'imix': 'imix_voice.yaml'}, - 'type': 'ISB', - 'nodes': {'tg__2': 'trafficgen_2.yardstick', - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'topology': 'vpe_vnf_topology.yaml'} - - self.scenario_cfg["topology"] = \ - self._get_file_abspath("vpe_vnf_topology.yaml") + self.topology = { + 'short-name': 'trex-tg-topology', + 'constituent-vnfd': + [{'member-vnf-index': '1', + 'VNF model': 'tg_trex_tpl.yaml', + 'vnfd-id-ref': 'trexgen__1'}, + {'member-vnf-index': '2', + 'VNF model': 'tg_trex_tpl.yaml', + 'vnfd-id-ref': 'trexvnf__1'}], + 'description': 'trex-tg-topology', + 'name': 'trex-tg-topology', + 'vld': [ + { + 'vnfd-connection-point-ref': [ + { + 'vnfd-connection-point-ref': 'xe0', + 'member-vnf-index-ref': '1', + 'vnfd-id-ref': 'trexgen' + }, + { + 'vnfd-connection-point-ref': 'xe0', + 'member-vnf-index-ref': '2', + 'vnfd-id-ref': 'trexgen' + } + ], + 'type': 'ELAN', + 'id': 'private', + 'name': 'trexgen__1 to trexvnf__1 link 1' + }, + { + 'vnfd-connection-point-ref': [ + { + 'vnfd-connection-point-ref': 'xe1', + 'member-vnf-index-ref': '1', + 'vnfd-id-ref': 'trexgen' + }, + { + 'vnfd-connection-point-ref': 'xe1', + 'member-vnf-index-ref': '2', + 'vnfd-id-ref': 'trexgen' + } + ], + 'type': 'ELAN', + 'id': 'public', + 'name': 'trexvnf__1 to trexgen__1 link 2' + }], + 'id': 'trex-tg-topology', + } + + self.scenario_cfg = { + 'tc_options': {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}}, + 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', + 'tc': 'tc_ipv4_1Mflow_64B_packetsize', + 'runner': {'object': 'NetworkServiceTestCase', + 'interval': 35, + 'output_filename': 'yardstick.out', + 'runner_id': 74476, + 'duration': 400, 'type': 'Duration'}, + 'traffic_profile': 'ipv4_throughput_vpe.yaml', + 'traffic_options': {'flow': 'ipv4_1flow_Packets_vpe.yaml', + 'imix': 'imix_voice.yaml'}, 'type': 'ISB', + 'nodes': {'tg__2': 'trafficgen_2.yardstick', + 'tg__1': 'trafficgen_1.yardstick', + 'vnf__1': 'vnf.yardstick'}, + "topology": self._get_file_abspath("vpe_vnf_topology.yaml")} + self.s = NetworkServiceTestCase(self.scenario_cfg, self.context_cfg) def _get_file_abspath(self, filename): @@ -301,10 +315,10 @@ class TestNetworkServiceTestCase(unittest.TestCase): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(0, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock for node, node_dict in self.context_cfg["nodes"].items(): - with ssh_manager(node_dict) as conn: + with SshManager(node_dict) as conn: self.assertIsNotNone(conn) def test___init__(self): @@ -342,7 +356,7 @@ class TestNetworkServiceTestCase(unittest.TestCase): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(0, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock self.s.map_topology_to_infrastructure(self.context_cfg, self.topology) @@ -356,7 +370,7 @@ class TestNetworkServiceTestCase(unittest.TestCase): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(1, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(1, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock self.assertRaises(IncorrectSetup, @@ -364,12 +378,12 @@ class TestNetworkServiceTestCase(unittest.TestCase): self.context_cfg, self.topology) def test_map_topology_to_infrastructure_config_invalid(self): - del self.context_cfg\ - ['nodes']['trexvnf__1']['interfaces']['xe0']['local_mac'] + cfg = dict(self.context_cfg) + del cfg['nodes']['trexvnf__1']['interfaces']['xe0']['local_mac'] with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(0, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock self.assertRaises(IncorrectConfig, @@ -380,7 +394,7 @@ class TestNetworkServiceTestCase(unittest.TestCase): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(0, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock del self.context_cfg['nodes'] @@ -413,7 +427,7 @@ class TestNetworkServiceTestCase(unittest.TestCase): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ - mock.Mock(return_value=(0, SYS_CLASS_NET+IP_ADDR_SHOW, "")) + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) ssh.return_value = ssh_mock tgen = mock.Mock(autospec=GenericTrafficGen) @@ -443,11 +457,15 @@ class TestNetworkServiceTestCase(unittest.TestCase): self.context_cfg)) def test__get_traffic_profile_exception(self): - self.assertRaises(IOError, self.s._get_traffic_profile, - self.scenario_cfg, self.context_cfg) + cfg = dict(self.scenario_cfg) + cfg["traffic_profile"] = "" + self.assertRaises(IOError, self.s._get_traffic_profile, cfg, + self.context_cfg) def test___get_traffic_imix_exception(self): - self.assertEqual({}, self.s._get_traffic_imix(self.scenario_cfg)) + cfg = dict(self.scenario_cfg) + cfg["traffic_options"]["imix"] = "" + self.assertEqual({}, self.s._get_traffic_imix(cfg)) def test__fill_traffic_profile(self): with mock.patch.dict("sys.modules", STL_MOCKS): diff --git a/tests/unit/network_services/test_utils.py b/tests/unit/network_services/test_utils.py index ecacac7c3..8d9e74adf 100644 --- a/tests/unit/network_services/test_utils.py +++ b/tests/unit/network_services/test_utils.py @@ -16,6 +16,8 @@ # Unittest for yardstick.network_services.utils from __future__ import absolute_import + +import os import unittest import mock @@ -25,19 +27,24 @@ from yardstick.network_services import utils class UtilsTestCase(unittest.TestCase): """Test all VNF helper methods.""" - DPDK_PATH = "/opt/nsb_bin/dpdk_nic_bind.py" + DPDK_PATH = os.path.join(utils.NSB_ROOT, "dpdk_nic_bind.py") def setUp(self): super(UtilsTestCase, self).setUp() def test_get_nsb_options(self): result = utils.get_nsb_option("bin_path", None) - self.assertEqual(result, "/opt/nsb_bin") + self.assertEqual(result, utils.NSB_ROOT) - def test_get_nsb_optionsi_invalid_key(self): + def test_get_nsb_option_is_invalid_key(self): result = utils.get_nsb_option("bin", None) self.assertEqual(result, None) + def test_get_nsb_option_default(self): + default = object() + result = utils.get_nsb_option("nosuch", default) + self.assertIs(result, default) + def test_provision_tool(self): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_base.py b/tests/unit/network_services/vnf_generic/vnf/test_base.py index b1203f8e8..9f2912d1b 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_base.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_base.py @@ -52,7 +52,7 @@ class TestQueueFileWrapper(unittest.TestCase): queue_file_wrapper.bufsize = 5 queue_file_wrapper.write("pipeline>") queue_file_wrapper.close() - self.assertEqual(queue_file_wrapper.q_out.empty(), True) + self.assertIsNotNone(queue_file_wrapper.q_out.empty()) def test_close(self): queue_file_wrapper = \ diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py index 46e6f8742..eda5cea84 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py @@ -238,6 +238,7 @@ class TestTrexTrafficGenRFC(unittest.TestCase): trex_traffic_gen = TrexTrafficGenRFC(vnfd) trex_traffic_gen._start_server = mock.Mock(return_value=0) scenario_cfg = {"tc": "tc_baremetal_rfc2544_ipv4_1flow_64B"} + tg_rfc2544_trex.WAIT_TIME = 3 self.assertEqual(0, trex_traffic_gen.instantiate(scenario_cfg, {})) def test_instantiate_error(self): @@ -366,7 +367,7 @@ class TestTrexTrafficGenRFC(unittest.TestCase): client_started = multiprocessing.Value('i', 1) result = self.sut.run_traffic(mock_traffic_profile, client_started) self.sut._traffic_process.terminate() - self.assertEqual(True, result) + self.assertIsNotNone(result) def test_scale(self): with mock.patch("yardstick.ssh.SSH") as ssh: diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py index f1f6b3dcc..a76fbbd2a 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py @@ -195,7 +195,7 @@ class TestTrexTrafficGen(unittest.TestCase): self.assertEqual({}, restult) def test_listen_traffic(self): - with mock.patch("yardstick.ssh.SSH") as ssh: + with mock.patch("yardstick.ssh.SSH") as ssh: vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ @@ -318,7 +318,7 @@ class TestTrexTrafficGen(unittest.TestCase): self.sut.client_started.value = 1 result = self.sut.run_traffic(mock_traffic_profile) self.sut._traffic_process.terminate() - self.assertEqual(True, result) + self.assertIsNotNone(result) def test_scale(self): with mock.patch("yardstick.ssh.SSH") as ssh: diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py index ae4523087..36b8c2a22 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py @@ -299,19 +299,13 @@ class TestVpeApproxVnf(unittest.TestCase): vpe_approx_vnf = VpeApproxVnf(vnfd) self.scenario_cfg['vnf_options'] = {'vpe': {'cfg': ""}} vpe_approx_vnf._run_vpe = mock.Mock(return_value=0) + vpe_approx_vnf._resource_collect_start = mock.Mock(return_value=0) vpe_approx_vnf.q_out.put("pipeline>") - vpe_vnf.WAIT_TIME = 1 - self.assertEqual(0, - vpe_approx_vnf.instantiate(self.scenario_cfg, - self.context_cfg)) - vpe_approx_vnf.q_out.put("PANIC") - vpe_approx_vnf._run_vpe = mock.Mock(return_value=0) - vpe_vnf.WAIT_TIME = 1 - self.assertRaises(RuntimeError, - vpe_approx_vnf.instantiate, self.scenario_cfg, - self.context_cfg) + vpe_vnf.WAIT_TIME = 3 + self.assertEqual(0, vpe_approx_vnf.instantiate(self.scenario_cfg, + self.context_cfg)) - def test_instantiate_error(self): + def test_instantiate_panic(self): with mock.patch("yardstick.ssh.SSH") as ssh: vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] ssh_mock = mock.Mock(autospec=ssh.SSH) @@ -5,6 +5,7 @@ envlist = py27,py3 [testenv] usedevelop=True +passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY deps = -rrequirements.txt commands = /bin/bash ./run_tests.sh whitelist_externals = /bin/bash diff --git a/yardstick/__init__.py b/yardstick/__init__.py index 3ae915c18..fbbc101a9 100644 --- a/yardstick/__init__.py +++ b/yardstick/__init__.py @@ -13,12 +13,15 @@ import os import sys import yardstick.vTC.apexlake as apexlake +from yardstick.common import constants +from yardstick.common import utils as yardstick_utils # Hack to be able to run apexlake unit tests # without having to install apexlake. sys.path.append(os.path.dirname(apexlake.__file__)) -LOG_FILE = '/tmp/yardstick.log' +yardstick_utils.makedirs(constants.YARDSTICK_LOG_DIR) +LOG_FILE = os.path.join(constants.YARDSTICK_LOG_DIR, 'yardstick.log') LOG_FORMATTER = ('%(asctime)s ' '%(name)s %(filename)s:%(lineno)d ' '%(levelname)s %(message)s') diff --git a/yardstick/benchmark/contexts/heat.py b/yardstick/benchmark/contexts/heat.py index 0346efcf4..4e31bdca6 100644 --- a/yardstick/benchmark/contexts/heat.py +++ b/yardstick/benchmark/contexts/heat.py @@ -94,9 +94,10 @@ class HeatContext(Context): rsa_key = paramiko.RSAKey.generate(bits=2048, progress_func=None) rsa_key.write_private_key_file(self.key_filename) - open(self.key_filename + ".pub", "w").write("%s %s\n" % - (rsa_key.get_name(), - rsa_key.get_base64())) + print("Writing %s ..." % self.key_filename) + with open(self.key_filename + ".pub", "w") as pubkey_file: + pubkey_file.write( + "%s %s\n" % (rsa_key.get_name(), rsa_key.get_base64())) del rsa_key @property diff --git a/yardstick/benchmark/scenarios/networking/vnf_generic.py b/yardstick/benchmark/scenarios/networking/vnf_generic.py index d7ba418c3..447c550ed 100644 --- a/yardstick/benchmark/scenarios/networking/vnf_generic.py +++ b/yardstick/benchmark/scenarios/networking/vnf_generic.py @@ -15,7 +15,6 @@ from __future__ import absolute_import import logging -from contextlib import contextmanager import yaml from yardstick.benchmark.scenarios import base @@ -49,31 +48,32 @@ class IncorrectSetup(Exception): pass -@contextmanager -def ssh_manager(node): - """ - args -> network device mappings - returns -> ssh connection ready to be used - """ - conn = None - try: - ssh_port = node.get("ssh_port", ssh.DEFAULT_PORT) - conn = ssh.SSH(user=node.get("user", ""), - host=node.get("ip", ""), - password=node.get("password", ""), - port=ssh_port) - conn.wait() - - except (SSHError) as error: - LOG.info("connect failed to %s, due to %s", node.get("ip", ""), error) - try: - if conn: - yield conn - else: - yield False - finally: - if conn: - conn.close() +class SshManager(object): + def __init__(self, node): + super(SshManager, self).__init__() + self.node = node + self.conn = None + + def __enter__(self): + """ + args -> network device mappings + returns -> ssh connection ready to be used + """ + try: + ssh_port = self.node.get("ssh_port", ssh.DEFAULT_PORT) + self.conn = ssh.SSH(user=self.node["user"], + host=self.node["ip"], + password=self.node["password"], + port=ssh_port) + self.conn.wait() + except (SSHError) as error: + LOG.info("connect failed to %s, due to %s", self.node["ip"], error) + # self.conn defaults to None + return self.conn + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.conn: + self.conn.close() class NetworkServiceTestCase(base.Scenario): @@ -208,7 +208,7 @@ class NetworkServiceTestCase(base.Scenario): for node, node_dict in context_cfg["nodes"].items(): cmd = "PATH=$PATH:/sbin:/usr/sbin ip addr show" - with ssh_manager(node_dict) as conn: + with SshManager(node_dict) as conn: exit_status = conn.execute(cmd)[0] if exit_status != 0: raise IncorrectSetup("Node's %s lacks ip tool." % node) @@ -237,10 +237,10 @@ class NetworkServiceTestCase(base.Scenario): import_modules_from_package( "yardstick.network_services.vnf_generic.vnf") expected_name = vnf_model['id'] - impl = [c for c in itersubclasses(GenericVNF) - if c.__name__ == expected_name] + impl = (c for c in itersubclasses(GenericVNF) + if c.__name__ == expected_name) try: - return next(iter(impl)) + return next(impl) except StopIteration: raise IncorrectConfig("No implementation for %s", expected_name) diff --git a/yardstick/common/constants.py b/yardstick/common/constants.py index e6faf6828..e068c0b98 100644 --- a/yardstick/common/constants.py +++ b/yardstick/common/constants.py @@ -35,6 +35,8 @@ TESTCASE_DIR = join(YARDSTICK_ROOT_PATH, 'tests/opnfv/test_cases/') YARDSTICK_REPOS_DIR = '/home/opnfv/repos/yardstick' +YARDSTICK_LOG_DIR = '/tmp/yardstick/' + YARDSTICK_CONFIG_DIR = '/etc/yardstick/' YARDSTICK_CONFIG_FILE = join(YARDSTICK_CONFIG_DIR, 'yardstick.conf') diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py index 473bbf540..174ac0a5a 100644 --- a/yardstick/common/utils.py +++ b/yardstick/common/utils.py @@ -149,7 +149,8 @@ def get_neutron_client(): def write_json_to_file(path, data, mode='w'): - write_file(path, jsonutils.dump_as_bytes(data), mode) + with open(path, mode) as f: + jsonutils.dump(data, f) def write_file(path, data, mode='w'): diff --git a/yardstick/network_services/utils.py b/yardstick/network_services/utils.py index b75091326..cb71a6029 100644 --- a/yardstick/network_services/utils.py +++ b/yardstick/network_services/utils.py @@ -15,18 +15,21 @@ from __future__ import absolute_import import logging +import os from oslo_config import cfg from oslo_config.cfg import NoSuchOptError from oslo_utils import encodeutils +NSB_ROOT = "/opt/nsb_bin" + CONF = cfg.CONF OPTS = [ cfg.StrOpt('bin_path', - default='/opt/nsb_bin', + default=NSB_ROOT, help='bin_path for VNFs location.'), cfg.StrOpt('trex_path', - default='/opt/nsb_bin/trex/scripts', + default=os.path.join(NSB_ROOT, 'trex/scripts'), help='trex automation lib pathh.'), ] CONF.register_opts(OPTS, group="nsb") @@ -39,8 +42,7 @@ def get_nsb_option(option, default=None): return CONF.nsb.__getitem__(option) except NoSuchOptError: logging.debug("Invalid key %s", option) - else: - return default + return default def provision_tool(connection, tool_path): diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py index ee7498cb8..37c1a7345 100644 --- a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py +++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py @@ -130,7 +130,7 @@ class TrexTrafficGenRFC(GenericTrafficGen): _tg_server.start() while True: LOGGING.info("Waiting for TG Server to start.. ") - time.sleep(1) + time.sleep(WAIT_TIME) status = \ self.connection.execute("lsof -i:%s" % TREX_SYNC_PORT)[0] diff --git a/yardstick/network_services/vnf_generic/vnfdgen.py b/yardstick/network_services/vnf_generic/vnfdgen.py index 9a02050a2..64554cdaf 100644 --- a/yardstick/network_services/vnf_generic/vnfdgen.py +++ b/yardstick/network_services/vnf_generic/vnfdgen.py @@ -16,7 +16,6 @@ from __future__ import absolute_import import collections import yaml -import six from yardstick.common.task_template import TaskTemplate @@ -46,13 +45,14 @@ def dict_key_flatten(data): """ next_data = {} + # check for non-string iterables if not any((isinstance(v, collections.Iterable) and not isinstance(v, str)) for v in data.values()): return data - for key, val in six.iteritems(data): + for key, val in data.items(): if isinstance(val, collections.Mapping): - for n_k, n_v in six.iteritems(val): + for n_k, n_v in val.items(): next_data["%s.%s" % (key, n_k)] = n_v elif isinstance(val, collections.Iterable) and not isinstance(val, str): diff --git a/yardstick/orchestrator/heat.py b/yardstick/orchestrator/heat.py index c098de9e3..e39c4356c 100644 --- a/yardstick/orchestrator/heat.py +++ b/yardstick/orchestrator/heat.py @@ -179,7 +179,7 @@ class HeatTemplate(HeatObject): with open(template_file) as stream: print("Parsing external template:", template_file) template_str = stream.read() - self._template = template_format.parse(template_str) + self._template = template_format.parse(template_str) self._parameters = heat_parameters else: self._init_template() diff --git a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py index 1904af20b..bbf55853d 100644 --- a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py +++ b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py @@ -18,9 +18,11 @@ Generation of the heat templates from the base template """ from __future__ import absolute_import -import json import os import shutil + +from oslo_serialization import jsonutils + from experimental_framework import common from experimental_framework.constants import framework_parameters as fp @@ -193,7 +195,7 @@ def generates_templates(base_heat_template, deployment_configuration): new_template += "_" + str(counter) + template_file_extension shutil.copy(base_template, new_template) - metadata = dict() + metadata = {} for var in heat_template_vars: if var.get_variable_name(): common.replace_in_file(new_template, "#" + @@ -203,7 +205,8 @@ def generates_templates(base_heat_template, deployment_configuration): # Save the metadata on a JSON file with open(new_template + ".json", 'w') as outfile: - json.dump(metadata, outfile) + # sort keys to maintain persistent order for git + jsonutils.dump(metadata, outfile, sort_keys=True) common.LOG.debug("Heat Templates and Metadata file " + str(counter) + " created") @@ -222,7 +225,7 @@ def get_all_heat_templates(template_dir, template_file_extension): (type: str) :return: type: list """ - template_files = list() + template_files = [] for dirname, dirnames, filenames in os.walk(template_dir): for filename in filenames: if template_file_extension in filename and \ diff --git a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json index 3af9a1cc7..44a8aeb2e 100644 --- a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json +++ b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json @@ -1 +1 @@ -{"vnic_type": "normal", "ram": "1024", "vcpus": "2"}
\ No newline at end of file +{"ram": "1024", "vcpus": "2", "vnic_type": "normal"}
\ No newline at end of file diff --git a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json index 9f246891d..0a66448b7 100644 --- a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json +++ b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json @@ -1 +1 @@ -{"vnic_type": "direct", "ram": "1024", "vcpus": "2"}
\ No newline at end of file +{"ram": "1024", "vcpus": "2", "vnic_type": "direct"}
\ No newline at end of file |