diff options
-rw-r--r-- | docker/Dockerfile.aarch64.patch | 2 | ||||
-rwxr-xr-x | nsb_setup.sh | 2 | ||||
-rw-r--r-- | samples/vnf_samples/nsut/prox/tc_prox_baremetal_lw_aftr-4.yaml | 2 | ||||
-rw-r--r-- | samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml | 18 | ||||
-rw-r--r-- | tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py | 58 | ||||
-rw-r--r-- | tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py | 53 | ||||
-rw-r--r-- | yardstick/common/exceptions.py | 4 | ||||
-rw-r--r-- | yardstick/network_services/traffic_profile/ixia_rfc2544.py | 27 | ||||
-rw-r--r-- | yardstick/network_services/vnf_generic/vnf/sample_vnf.py | 18 | ||||
-rw-r--r-- | yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py | 2 | ||||
-rw-r--r-- | yardstick/orchestrator/heat.py | 9 | ||||
-rw-r--r-- | yardstick/tests/unit/orchestrator/test_heat.py | 12 |
12 files changed, 104 insertions, 103 deletions
diff --git a/docker/Dockerfile.aarch64.patch b/docker/Dockerfile.aarch64.patch index ca933514a..24e3952fb 100644 --- a/docker/Dockerfile.aarch64.patch +++ b/docker/Dockerfile.aarch64.patch @@ -39,7 +39,7 @@ index 2ee5b4c..23e5ea5 100644 +RUN apt-get update && apt-get install -y git python-setuptools python-pip && apt-get -y autoremove && \ + apt-get install -y libssl-dev && apt-get -y install libffi-dev && apt-get clean RUN easy_install -U setuptools==30.0.0 - RUN pip install appdirs==1.4.0 pyopenssl==17.5.0 + RUN pip install appdirs==1.4.0 pyopenssl==17.5.0 python-openstackclient==3.11.0 @@ -43,8 +44,8 @@ RUN echo "daemon off;" >> /etc/nginx/nginx.conf diff --git a/nsb_setup.sh b/nsb_setup.sh index 4a8e4db93..50fc017d1 100755 --- a/nsb_setup.sh +++ b/nsb_setup.sh @@ -63,7 +63,7 @@ for i in "${pkg[@]}"; do fi done -pip install ansible==2.3.2 shade==1.17.0 docker-py==1.10.6 +pip install ansible==2.4.2 shade==1.22.2 docker-py==1.10.6 ANSIBLE_SCRIPTS="ansible" diff --git a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_lw_aftr-4.yaml b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_lw_aftr-4.yaml index 37af37dcc..c190910c9 100644 --- a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_lw_aftr-4.yaml +++ b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_lw_aftr-4.yaml @@ -50,5 +50,5 @@ context: type: Node name: yardstick nfvi_type: baremetal - file: /etc/yardstick/nodes/prox-baremetal-4.yml + file: prox-baremetal-4.yaml diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml index 2799a7ee9..2e096a126 100644 --- a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml +++ b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml @@ -13,6 +13,10 @@ # limitations under the License. --- +{% set provider = provider or none %} +{% set physical_networks = physical_networks or ['physnet1', 'physnet2'] %} +{% set segmentation_id = segmentation_id or none %} + schema: yardstick:task:0.1 scenarios: - type: NSPerf @@ -68,10 +72,24 @@ context: xe0: cidr: '10.0.2.0/24' gateway_ip: 'null' + {% if provider %} + provider: {{ provider }} + physical_network: {{ physical_networks[0] }} + {% if segmentation_id %} + segmentation_id: {{ segmentation_id }} + {% endif %} + {% endif %} port_security_enabled: False enable_dhcp: 'false' xe1: cidr: '10.0.3.0/24' gateway_ip: 'null' + {% if provider %} + provider: {{ provider }} + physical_network: {{ physical_networks[1] }} + {% if segmentation_id %} + segmentation_id: {{ segmentation_id }} + {% endif %} + {% endif %} port_security_enabled: False enable_dhcp: 'false' diff --git a/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py b/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py index 616921e33..f13945abf 100644 --- a/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py +++ b/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py @@ -179,9 +179,7 @@ class TestIXIARFC2544Profile(unittest.TestCase): "dst_mac_0": "00:00:00:00:00:03", "dst_mac_1": "00:00:00:00:00:04", "dst_mac_2": "00:00:00:00:00:04"} - result = r_f_c2544_profile._get_ixia_traffic_profile( - self.PROFILE, mac, xfile="tmp", - static_traffic=STATIC_TRAFFIC) + result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac) self.assertIsNotNone(result) def test_get_ixia_traffic_profile(self): @@ -225,7 +223,6 @@ class TestIXIARFC2544Profile(unittest.TestCase): "proto": "udp", "srcip4": "152.16.40.20", "ttl": 32, - "count": "1" }, "outer_l4": { "dstport": "2001", @@ -260,7 +257,6 @@ class TestIXIARFC2544Profile(unittest.TestCase): "proto": "udp", "srcip4": "152.16.40.20", "ttl": 32, - "count": "1" }, "outer_l3v6": { "count": 1024, @@ -269,7 +265,6 @@ class TestIXIARFC2544Profile(unittest.TestCase): "proto": "udp", "srcip4": "152.16.40.20", "ttl": 32, - "count": "1" }, "outer_l4": { "dstport": "1234", @@ -289,12 +284,11 @@ class TestIXIARFC2544Profile(unittest.TestCase): "dst_mac_0": "00:00:00:00:00:03", "dst_mac_1": "00:00:00:00:00:04", "dst_mac_2": "00:00:00:00:00:04"} - result = r_f_c2544_profile._get_ixia_traffic_profile( - self.PROFILE, mac, xfile="tmp", static_traffic=STATIC_TRAFFIC) + result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac) self.assertIsNotNone(result) @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open") - def test_get_ixia_traffic_profile_v6(self, mock_open): + def test_get_ixia_traffic_profile_v6(self, *args): traffic_generator = mock.Mock(autospec=TrexProfile) traffic_generator.my_ports = [0, 1] traffic_generator.uplink_ports = [-1] @@ -435,8 +429,7 @@ class TestIXIARFC2544Profile(unittest.TestCase): 'outer_l4': {'dstport': '2001', 'srcport': '1234'}}}, 'schema': 'isb:traffic_profile:0.1'} - result = r_f_c2544_profile._get_ixia_traffic_profile( - profile_data, mac, static_traffic=STATIC_TRAFFIC) + result = r_f_c2544_profile._get_ixia_traffic_profile(profile_data, mac) self.assertIsNotNone(result) def test__get_ixia_traffic_profile_default_args(self): @@ -459,8 +452,7 @@ class TestIXIARFC2544Profile(unittest.TestCase): ixia_obj = mock.MagicMock() r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) r_f_c2544_profile.rate = 100 - result = r_f_c2544_profile._ixia_traffic_generate(traffic_generator, - traffic, ixia_obj) + result = r_f_c2544_profile._ixia_traffic_generate(traffic, ixia_obj) self.assertIsNone(result) def test_execute(self): @@ -511,13 +503,6 @@ class TestIXIARFC2544Profile(unittest.TestCase): self.assertEqual(r_f_c2544_profile.ports, ports_expected) def test_get_drop_percentage(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client = \ - mock.Mock(return_value=True) r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) r_f_c2544_profile.params = self.PROFILE ixia_obj = mock.MagicMock() @@ -541,17 +526,11 @@ class TestIXIARFC2544Profile(unittest.TestCase): "out_packets": 1000} tol_min = 100.0 tolerance = 0.0 - self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage( - traffic_generator, samples, - tol_min, tolerance, ixia_obj)) + self.assertIsNotNone( + r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, + ixia_obj)) def test_get_drop_percentage_update(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.uplink_ports = [0] - traffic_generator.downlink_ports = [1] - traffic_generator.client = \ - mock.Mock(return_value=True) r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) r_f_c2544_profile.params = self.PROFILE ixia_obj = mock.MagicMock() @@ -575,17 +554,11 @@ class TestIXIARFC2544Profile(unittest.TestCase): "out_packets": 1002} tol_min = 0.0 tolerance = 1.0 - self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage( - traffic_generator, samples, - tol_min, tolerance, ixia_obj)) + self.assertIsNotNone( + r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, + ixia_obj)) def test_get_drop_percentage_div_zero(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.uplink_ports = [0] - traffic_generator.downlink_ports = [1] - traffic_generator.client = \ - mock.Mock(return_value=True) r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) r_f_c2544_profile.params = self.PROFILE ixia_obj = mock.MagicMock() @@ -610,9 +583,9 @@ class TestIXIARFC2544Profile(unittest.TestCase): tol_min = 0.0 tolerance = 0.0 r_f_c2544_profile.tmp_throughput = 0 - self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage( - traffic_generator, samples, - tol_min, tolerance, ixia_obj)) + self.assertIsNotNone( + r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, + ixia_obj)) def test_get_multiplier(self): r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) @@ -638,8 +611,7 @@ class TestIXIARFC2544Profile(unittest.TestCase): r_f_c2544_profile._ixia_traffic_generate = mock.Mock() self.assertEqual( None, - r_f_c2544_profile.start_ixia_latency(traffic_generator, - ixia_obj)) + r_f_c2544_profile.start_ixia_latency(traffic_generator, ixia_obj)) if __name__ == '__main__': diff --git a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py index af941c04f..25633384e 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py @@ -624,37 +624,34 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase): self.assertIsInstance(dpdk_vnf_setup_env_helper.setup_vnf_environment(), ResourceProfile) - def test__setup_dpdk_early_success(self): - vnfd_helper = VnfdHelper(self.VNFD_0) + def test__setup_dpdk(self): ssh_helper = mock.Mock() - ssh_helper.execute.return_value = 0, 'output', '' - ssh_helper.join_bin_path.return_value = 'joined_path' - ssh_helper.provision_tool.return_value = 'provision string' - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper._setup_hugepages = mock.Mock() - - self.assertIsNone(dpdk_setup_helper._setup_dpdk()) - self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 2) - - @mock.patch('yardstick.ssh.SSH') - def test__setup_dpdk_short(self, _): - def execute_side(cmd): - if 'joined_path' in cmd: - return 0, 'output', '' - return 1, 'bad output', 'error output' + ssh_helper.execute = mock.Mock() + ssh_helper.execute.return_value = (0, 0, 0) + dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY) + with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \ + mock_setup_hp: + dpdk_setup_helper._setup_dpdk() + mock_setup_hp.assert_called_once() + ssh_helper.execute.assert_has_calls([ + mock.call('sudo modprobe uio && sudo modprobe igb_uio'), + mock.call('lsmod | grep -i igb_uio') + ]) - vnfd_helper = VnfdHelper(self.VNFD_0) + def test__setup_dpdk_igb_uio_not_loaded(self): ssh_helper = mock.Mock() - ssh_helper.execute.side_effect = execute_side - ssh_helper.join_bin_path.return_value = 'joined_path' - ssh_helper.provision_tool.return_value = 'provision string' - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper._setup_hugepages = mock.Mock() - - self.assertIsNone(dpdk_setup_helper._setup_dpdk()) - self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 3) + ssh_helper.execute = mock.Mock() + ssh_helper.execute.side_effect = [(0, 0, 0), (1, 0, 0)] + dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY) + with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \ + mock_setup_hp: + with self.assertRaises(y_exceptions.DPDKSetupDriverError): + dpdk_setup_helper._setup_dpdk() + mock_setup_hp.assert_called_once() + ssh_helper.execute.assert_has_calls([ + mock.call('sudo modprobe uio && sudo modprobe igb_uio'), + mock.call('lsmod | grep -i igb_uio') + ]) @mock.patch('yardstick.ssh.SSH') def test__setup_resources(self, _): diff --git a/yardstick/common/exceptions.py b/yardstick/common/exceptions.py index e38dd246c..a86d863db 100644 --- a/yardstick/common/exceptions.py +++ b/yardstick/common/exceptions.py @@ -63,3 +63,7 @@ class HeatTemplateError(YardstickException): """Error in Heat during the stack deployment""" message = ('Error in Heat during the creation of the OpenStack stack ' '"%(stack_name)"') + + +class DPDKSetupDriverError(YardstickException): + message = '"igb_uio" driver is not loaded' diff --git a/yardstick/network_services/traffic_profile/ixia_rfc2544.py b/yardstick/network_services/traffic_profile/ixia_rfc2544.py index 7881131a7..3ab157dc7 100644 --- a/yardstick/network_services/traffic_profile/ixia_rfc2544.py +++ b/yardstick/network_services/traffic_profile/ixia_rfc2544.py @@ -26,7 +26,7 @@ class IXIARFC2544Profile(TrexProfile): UPLINK = 'uplink' DOWNLINK = 'downlink' - def _get_ixia_traffic_profile(self, profile_data, mac=None, xfile=None, static_traffic=None): + def _get_ixia_traffic_profile(self, profile_data, mac=None): if mac is None: mac = {} @@ -74,12 +74,12 @@ class IXIARFC2544Profile(TrexProfile): }, 'outer_l4': value['outer_l4'], } - except Exception: + except KeyError: continue return result - def _ixia_traffic_generate(self, traffic_generator, traffic, ixia_obj): + def _ixia_traffic_generate(self, traffic, ixia_obj): for key, value in traffic.items(): if key.startswith((self.UPLINK, self.DOWNLINK)): value["iload"] = str(self.rate) @@ -106,7 +106,7 @@ class IXIARFC2544Profile(TrexProfile): self.ports = [port for port in port_generator()] - def execute_traffic(self, traffic_generator, ixia_obj, mac=None, xfile=None): + def execute_traffic(self, traffic_generator, ixia_obj, mac=None): if mac is None: mac = {} if self.first_run: @@ -114,28 +114,27 @@ class IXIARFC2544Profile(TrexProfile): self.pg_id = 0 self.update_traffic_profile(traffic_generator) traffic = \ - self._get_ixia_traffic_profile(self.full_profile, mac, xfile) + self._get_ixia_traffic_profile(self.full_profile, mac) self.max_rate = self.rate self.min_rate = 0 self.get_multiplier() - self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj) + self._ixia_traffic_generate(traffic, ixia_obj) def get_multiplier(self): self.rate = round((self.max_rate + self.min_rate) / 2.0, 2) multiplier = round(self.rate / self.pps, 2) return str(multiplier) - def start_ixia_latency(self, traffic_generator, ixia_obj, - mac=None, xfile=None): + def start_ixia_latency(self, traffic_generator, ixia_obj, mac=None): if mac is None: mac = {} self.update_traffic_profile(traffic_generator) traffic = \ - self._get_ixia_traffic_profile(self.full_profile, mac, xfile) - self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj) + self._get_ixia_traffic_profile(self.full_profile, mac) + self._ixia_traffic_generate(traffic, ixia_obj) - def get_drop_percentage(self, traffic_generator, samples, tol_min, - tolerance, ixia_obj, mac=None, xfile=None): + def get_drop_percentage(self, samples, tol_min, tolerance, ixia_obj, + mac=None): if mac is None: mac = {} status = 'Running' @@ -179,6 +178,6 @@ class IXIARFC2544Profile(TrexProfile): samples['DropPercentage'] = drop_percent return status, samples self.get_multiplier() - traffic = self._get_ixia_traffic_profile(self.full_profile, mac, xfile) - self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj) + traffic = self._get_ixia_traffic_profile(self.full_profile, mac) + self._ixia_traffic_generate(traffic, ixia_obj) return status, samples diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py index fbaaa0ca8..d57d7e601 100644 --- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py +++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py @@ -250,20 +250,12 @@ class DpdkVnfSetupEnvHelper(SetupEnvHelper): self.ssh_helper.execute("sudo killall %s" % self.APP_NAME) def _setup_dpdk(self): - """ setup dpdk environment needed for vnf to run """ - + """Setup DPDK environment needed for VNF to run""" self._setup_hugepages() - self.ssh_helper.execute("sudo modprobe uio && sudo modprobe igb_uio") - - exit_status = self.ssh_helper.execute("lsmod | grep -i igb_uio")[0] - if exit_status == 0: - return - - dpdk = self.ssh_helper.join_bin_path(DPDK_VERSION) - dpdk_setup = self.ssh_helper.provision_tool(tool_file="nsb_setup.sh") - exit_status = self.ssh_helper.execute("which {} >/dev/null 2>&1".format(dpdk))[0] - if exit_status != 0: - self.ssh_helper.execute("bash %s dpdk >/dev/null 2>&1" % dpdk_setup) + self.ssh_helper.execute('sudo modprobe uio && sudo modprobe igb_uio') + exit_status = self.ssh_helper.execute('lsmod | grep -i igb_uio')[0] + if exit_status: + raise y_exceptions.DPDKSetupDriverError() def get_collectd_options(self): options = self.scenario_helper.all_options.get("collectd", {}) diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py index 630c8b9c0..12510db96 100644 --- a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py +++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py @@ -149,7 +149,7 @@ class IxiaResourceHelper(ClientResourceHelper): self.client.ix_stop_traffic() samples = self.generate_samples(traffic_profile.ports) self._queue.put(samples) - status, samples = traffic_profile.get_drop_percentage(self, samples, min_tol, + status, samples = traffic_profile.get_drop_percentage(samples, min_tol, max_tol, self.client, mac) current = samples['CurrentDropPercentage'] diff --git a/yardstick/orchestrator/heat.py b/yardstick/orchestrator/heat.py index 754482e4f..558b5d2a6 100644 --- a/yardstick/orchestrator/heat.py +++ b/yardstick/orchestrator/heat.py @@ -74,7 +74,14 @@ class HeatStack(object): if self.uuid is None: return - ret = self._cloud.delete_stack(self.uuid, wait=wait) + try: + ret = self._cloud.delete_stack(self.uuid, wait=wait) + except TypeError: + # NOTE(ralonsoh): this exception catch solves a bug in Shade, which + # tries to retrieve and read the stack status when it's already + # deleted. + ret = True + _DEPLOYED_STACKS.pop(self.uuid) self._stack = None return ret diff --git a/yardstick/tests/unit/orchestrator/test_heat.py b/yardstick/tests/unit/orchestrator/test_heat.py index f53c9b78c..e0a353812 100644 --- a/yardstick/tests/unit/orchestrator/test_heat.py +++ b/yardstick/tests/unit/orchestrator/test_heat.py @@ -89,6 +89,18 @@ class HeatStackTestCase(unittest.TestCase): self.assertFalse(heat._DEPLOYED_STACKS) self.mock_stack_delete.assert_called_once_with(id, wait=True) + def test_delete_bug_in_shade(self): + id = uuidutils.generate_uuid() + self.heatstack._stack = FakeStack( + outputs=mock.Mock(), status=mock.Mock(), id=id) + heat._DEPLOYED_STACKS[id] = self.heatstack._stack + self.mock_stack_delete.side_effect = TypeError() + + ret = self.heatstack.delete(wait=True) + self.assertTrue(ret) + self.assertFalse(heat._DEPLOYED_STACKS) + self.mock_stack_delete.assert_called_once_with(id, wait=True) + class HeatTemplateTestCase(unittest.TestCase): |