1 # Copyright (c) 2016-2017 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 from copy import deepcopy
22 from yardstick import tests
23 from yardstick.common import exceptions
24 from yardstick.common import utils
25 from yardstick.network_services.collector.subscriber import Collector
26 from yardstick.network_services.traffic_profile import base
27 from yardstick.network_services.vnf_generic import vnfdgen
28 from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen
29 from yardstick.network_services.vnf_generic.vnf.base import GenericVNF
32 stl_patch = mock.patch.dict(sys.modules, tests.STL_MOCKS)
36 from yardstick.benchmark.scenarios.networking import vnf_generic
38 # pylint: disable=unused-argument
39 # disable this for now because I keep forgetting mock patch arg ordering
42 COMPLETE_TREX_VNFD = {
43 'vnfd:vnfd-catalog': {
52 'tx_throughput_pc_linerate',
53 'rx_throughput_pc_linerate',
69 'description': 'TRex stateless traffic generator for RFC2544',
70 'id': 'TrexTrafficGen',
75 'vdu-id': 'trexgen-baremetal',
78 'short-name': 'trexgen',
79 'class-name': 'TrexTrafficGen',
82 'description': 'TRex stateless traffic generator for RFC2544',
83 'external-interface': [
86 'virtual-interface': {
87 'bandwidth': '10 Gbps',
89 'dst_mac': '00:01:02:03:04:05',
90 'local_ip': '1.1.1.2',
91 'local_mac': '00:01:02:03:05:05',
92 'type': 'PCI-PASSTHROUGH',
93 'netmask': "255.255.255.0",
95 'vpci': '0000:00:10.2',
97 'vnfd-connection-point-ref': 'xe0',
101 'virtual-interface': {
102 'bandwidth': '10 Gbps',
104 'dst_mac': '00:01:02:03:04:06',
105 'local_ip': '2.1.1.2',
106 'local_mac': '00:01:02:03:05:06',
107 'type': 'PCI-PASSTHROUGH',
108 'netmask': "255.255.255.0",
110 'vpci': '0000:00:10.1',
112 'vnfd-connection-point-ref': 'xe1',
115 'id': 'trexgen-baremetal',
116 'name': 'trexgen-baremetal',
125 28: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP \
126 group default qlen 1000
127 link/ether 90:e2:ba:a7:6a:c8 brd ff:ff:ff:ff:ff:ff
128 inet 1.1.1.1/8 brd 1.255.255.255 scope global eth1
129 inet6 fe80::92e2:baff:fea7:6ac8/64 scope link
130 valid_lft forever preferred_lft forever
131 29: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP \
132 group default qlen 1000
133 link/ether 90:e2:ba:a7:6a:c9 brd ff:ff:ff:ff:ff:ff
134 inet 2.1.1.1/8 brd 2.255.255.255 scope global eth5
135 inet6 fe80::92e2:baff:fea7:6ac9/64 scope link tentative
136 valid_lft forever preferred_lft forever
140 lrwxrwxrwx 1 root root 0 sie 10 14:16 eth1 -> \
141 ../../devices/pci0000:80/0000:80:02.2/0000:84:00.1/net/eth1
142 lrwxrwxrwx 1 root root 0 sie 3 10:37 eth2 -> \
143 ../../devices/pci0000:00/0000:00:01.1/0000:84:00.2/net/eth5
147 "schema": "isb:traffic_profile:0.1",
149 "description": "Fixed traffic profile to run UDP traffic",
151 "traffic_type": "FixedTraffic",
152 "frame_rate": 100, # pps
159 class TestNetworkServiceTestCase(unittest.TestCase):
163 'name': 'trafficgen_1.yardstick',
165 'role': 'TrafficGen',
170 'netmask': '255.255.255.0',
171 'local_ip': '152.16.100.20',
172 'local_mac': '00:00:00:00:00:01',
174 'vpci': '0000:07:00.0',
178 'netmask': '255.255.255.0',
179 'local_ip': '152.16.40.20',
180 'local_mac': '00:00:00:00:00:02',
182 'vpci': '0000:07:00.1',
189 'name': 'vnf.yardstick',
191 'host': '10.223.197.164',
197 'netmask': '255.255.255.0',
198 'local_ip': '152.16.100.19',
199 'local_mac': '00:00:00:00:00:03',
201 'vpci': '0000:07:00.0',
205 'netmask': '255.255.255.0',
206 'local_ip': '152.16.40.19',
207 'local_mac': '00:00:00:00:00:04',
209 'vpci': '0000:07:00.1',
215 'netmask': '255.255.255.0',
216 'gateway': '152.16.100.20',
217 'network': '152.16.100.20',
221 'netmask': '255.255.255.0',
222 'gateway': '152.16.40.20',
223 'network': '152.16.40.20',
230 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
231 'network': '0064:ff9b:0:0:0:0:9810:6414',
236 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
237 'network': '0064:ff9b:0:0:0:0:9810:2814',
246 'vnf__1': self.vnf__1,
250 'vld_id': GenericVNF.UPLINK,
252 GenericVNF.DOWNLINK: {
253 'vld_id': GenericVNF.DOWNLINK,
259 'vnfd-connection-point-ref': [
261 'vnfd-connection-point-ref': 'xe0',
262 'member-vnf-index-ref': '1',
263 'vnfd-id-ref': 'trexgen'
266 'vnfd-connection-point-ref': 'xe0',
267 'member-vnf-index-ref': '2',
268 'vnfd-id-ref': 'trexgen'
272 'id': GenericVNF.UPLINK,
273 'name': 'tg__1 to vnf__1 link 1'
277 'vnfd-connection-point-ref': [
279 'vnfd-connection-point-ref': 'xe1',
280 'member-vnf-index-ref': '1',
281 'vnfd-id-ref': 'trexgen'
284 'vnfd-connection-point-ref': 'xe1',
285 'member-vnf-index-ref': '2',
286 'vnfd-id-ref': 'trexgen'
290 'id': GenericVNF.DOWNLINK,
291 'name': 'vnf__1 to tg__1 link 2'
295 'id': 'trex-tg-topology',
296 'short-name': 'trex-tg-topology',
297 'name': 'trex-tg-topology',
298 'description': 'trex-tg-topology',
299 'constituent-vnfd': [
301 'member-vnf-index': '1',
302 'VNF model': 'tg_trex_tpl.yaml',
303 'vnfd-id-ref': 'tg__1',
306 'member-vnf-index': '2',
307 'VNF model': 'tg_trex_tpl.yaml',
308 'vnfd-id-ref': 'vnf__1',
311 'vld': [self.vld0, self.vld1],
314 self.scenario_cfg = {
316 "topology": self._get_file_abspath("vpe_vnf_topology.yaml"),
317 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7',
318 'tc': 'tc_ipv4_1Mflow_64B_packetsize',
319 'traffic_profile': 'ipv4_throughput_vpe.yaml',
320 'extra_args': {'arg1': 'value1', 'arg2': 'value2'},
324 'allowed_drop_rate': '0.8 - 1',
328 'simulated_users': {'uplink': [1, 2]},
329 'page_object': {'uplink': [1, 2]},
330 'framesize': {'64B': 100}
333 'object': 'NetworkServiceTestCase',
335 'output_filename': 'yardstick.out',
341 'flow': 'ipv4_1flow_Packets_vpe.yaml',
342 'imix': 'imix_voice.yaml'
345 'tg__2': 'trafficgen_2.yardstick',
346 'tg__1': 'trafficgen_1.yardstick',
347 'vnf__1': 'vnf.yardstick',
351 self.s = vnf_generic.NetworkServiceTestCase(self.scenario_cfg,
354 def _get_file_abspath(self, filename):
355 curr_path = os.path.dirname(os.path.abspath(__file__))
356 file_path = os.path.join(curr_path, filename)
359 def test___init__(self):
360 self.assertIsNotNone(self.topology)
362 def test__get_ip_flow_range_string(self):
363 result = '152.16.100.2-152.16.100.254'
364 self.assertEqual(result, self.s._get_ip_flow_range(
365 '152.16.100.2-152.16.100.254'))
367 def test__get_ip_flow_range_no_nodes(self):
368 self.assertEqual('0.0.0.0', self.s._get_ip_flow_range({}))
370 def test__get_ip_flow_range_no_node_data(self):
371 node_data = {'tg__0': 'xe0'}
372 self.s.context_cfg['nodes']['tg__0'] = {}
373 result = self.s._get_ip_flow_range(node_data)
374 self.assertEqual('0.0.0.2-0.0.0.254', result)
376 def test__et_ip_flow_range_ipv4(self):
377 node_data = {'tg__0': 'xe0'}
378 self.s.context_cfg['nodes']['tg__0'] = {
380 'xe0': {'local_ip': '192.168.1.15',
381 'netmask': '255.255.255.128'}
384 result = self.s._get_ip_flow_range(node_data)
385 self.assertEqual('192.168.1.2-192.168.1.126', result)
387 def test__get_ip_flow_range_ipv4_mask_30(self):
388 node_data = {'tg__0': 'xe0'}
389 self.s.context_cfg['nodes']['tg__0'] = {
391 'xe0': {'local_ip': '192.168.1.15', 'netmask': 30}
394 result = self.s._get_ip_flow_range(node_data)
395 self.assertEqual('192.168.1.15', result)
397 def test__get_ip_flow_range_ipv6(self):
398 node_data = {'tg__0': 'xe0'}
399 self.s.context_cfg['nodes']['tg__0'] = {
401 'xe0': {'local_ip': '2001::11', 'netmask': 64}
404 result = self.s._get_ip_flow_range(node_data)
405 self.assertEqual('2001::2-2001::ffff:ffff:ffff:fffe', result)
407 def test___get_traffic_flow(self):
408 self.scenario_cfg["traffic_options"]["flow"] = \
409 self._get_file_abspath("ipv4_1flow_Packets_vpe.yaml")
410 self.scenario_cfg['options'] = {
422 'public_ip': ['1.1.1.1'],
425 expected_flow = {'flow': {'dst_ip_0': '152.16.40.2-152.16.40.254',
426 'public_ip_0': '1.1.1.1',
427 'src_ip_0': '152.16.100.2-152.16.100.254'}}
428 self.assertEqual(expected_flow, self.s._get_traffic_flow())
430 def test___get_traffic_flow_error(self):
431 self.scenario_cfg["traffic_options"]["flow"] = \
432 "ipv4_1flow_Packets_vpe.yaml1"
433 self.assertEqual({'flow': {}}, self.s._get_traffic_flow())
435 def test_get_vnf_imp(self):
436 vnfd = COMPLETE_TREX_VNFD['vnfd:vnfd-catalog']['vnfd'][0]['class-name']
437 with mock.patch.dict(sys.modules, tests.STL_MOCKS):
438 self.assertIsNotNone(self.s.get_vnf_impl(vnfd))
440 with self.assertRaises(exceptions.IncorrectConfig) as raised:
441 self.s.get_vnf_impl('NonExistentClass')
443 exc_str = str(raised.exception)
445 self.assertIn('No implementation', exc_str)
446 self.assertIn('found in', exc_str)
448 def test_load_vnf_models_invalid(self):
449 self.context_cfg["nodes"]['tg__1']['VNF model'] = \
450 self._get_file_abspath("tg_trex_tpl.yaml")
451 self.context_cfg["nodes"]['vnf__1']['VNF model'] = \
452 self._get_file_abspath("tg_trex_tpl.yaml")
454 vnf = mock.Mock(autospec=GenericVNF)
455 self.s.get_vnf_impl = mock.Mock(return_value=vnf)
457 self.assertIsNotNone(
458 self.s.load_vnf_models(self.scenario_cfg, self.context_cfg))
460 def test_load_vnf_models_no_model(self):
461 vnf = mock.Mock(autospec=GenericVNF)
462 self.s.get_vnf_impl = mock.Mock(return_value=vnf)
464 self.assertIsNotNone(
465 self.s.load_vnf_models(self.scenario_cfg, self.context_cfg))
467 def test_map_topology_to_infrastructure(self):
468 self.s.map_topology_to_infrastructure()
470 nodes = self.context_cfg["nodes"]
471 self.assertEqual('../../vnf_descriptors/tg_rfc2544_tpl.yaml',
472 nodes['tg__1']['VNF model'])
473 self.assertEqual('../../vnf_descriptors/vpe_vnf.yaml',
474 nodes['vnf__1']['VNF model'])
476 def test_map_topology_to_infrastructure_insufficient_nodes(self):
477 cfg = deepcopy(self.context_cfg)
478 del cfg['nodes']['vnf__1']
480 cfg_patch = mock.patch.object(self.s, 'context_cfg', cfg)
482 with self.assertRaises(exceptions.IncorrectConfig):
483 self.s.map_topology_to_infrastructure()
485 def test_map_topology_to_infrastructure_config_invalid(self):
486 ssh_mock = mock.Mock()
487 ssh_mock.execute.return_value = 0, SYS_CLASS_NET + IP_ADDR_SHOW, ""
489 cfg = deepcopy(self.s.context_cfg)
491 # delete all, we don't know which will come first
492 del cfg['nodes']['vnf__1']['interfaces']['xe0']['local_mac']
493 del cfg['nodes']['vnf__1']['interfaces']['xe1']['local_mac']
494 del cfg['nodes']['tg__1']['interfaces']['xe0']['local_mac']
495 del cfg['nodes']['tg__1']['interfaces']['xe1']['local_mac']
497 config_patch = mock.patch.object(self.s, 'context_cfg', cfg)
499 with self.assertRaises(exceptions.IncorrectConfig):
500 self.s.map_topology_to_infrastructure()
502 def test__resolve_topology_invalid_config(self):
503 with mock.patch("yardstick.ssh.SSH") as ssh:
504 ssh_mock = mock.Mock(autospec=ssh.SSH)
506 mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, ""))
507 ssh.from_node.return_value = ssh_mock
509 # purge an important key from the data structure
510 for interface in self.tg__1['interfaces'].values():
511 del interface['local_mac']
513 with self.assertRaises(exceptions.IncorrectConfig) as raised:
514 self.s._resolve_topology()
516 self.assertIn('not found', str(raised.exception))
519 for index, interface in enumerate(self.tg__1['interfaces'].values()):
520 interface['local_mac'] = '00:00:00:00:00:{:2x}'.format(index)
522 # make a connection point ref with 3 points
523 self.s.topology["vld"][0]['vnfd-connection-point-ref'].append(
524 self.s.topology["vld"][0]['vnfd-connection-point-ref'][0])
526 with self.assertRaises(exceptions.IncorrectConfig) as raised:
527 self.s._resolve_topology()
529 self.assertIn('wrong endpoint count', str(raised.exception))
531 # make a connection point ref with 1 point
532 self.s.topology["vld"][0]['vnfd-connection-point-ref'] = \
533 self.s.topology["vld"][0]['vnfd-connection-point-ref'][:1]
535 with self.assertRaises(exceptions.IncorrectConfig) as raised:
536 self.s._resolve_topology()
538 self.assertIn('wrong endpoint count', str(raised.exception))
541 tgen = mock.Mock(autospec=GenericTrafficGen)
542 tgen.traffic_finished = True
543 verified_dict = {"verified": True}
544 tgen.verify_traffic = lambda x: verified_dict
545 tgen.name = "tgen__1"
546 vnf = mock.Mock(autospec=GenericVNF)
547 vnf.runs_traffic = False
548 self.s.vnfs = [tgen, vnf]
549 self.s.traffic_profile = mock.Mock()
550 self.s.collector = mock.Mock(autospec=Collector)
551 self.s.collector.get_kpi = \
552 mock.Mock(return_value={tgen.name: verified_dict})
555 self.assertDictEqual(result, {tgen.name: verified_dict})
557 def test_setup(self):
558 with mock.patch("yardstick.ssh.SSH") as ssh:
559 ssh_mock = mock.Mock(autospec=ssh.SSH)
561 mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, ""))
562 ssh.from_node.return_value = ssh_mock
564 tgen = mock.Mock(autospec=GenericTrafficGen)
565 tgen.traffic_finished = True
566 verified_dict = {"verified": True}
567 tgen.verify_traffic = lambda x: verified_dict
568 tgen.terminate = mock.Mock(return_value=True)
569 tgen.name = "tgen__1"
570 vnf = mock.Mock(autospec=GenericVNF)
571 vnf.runs_traffic = False
572 vnf.terminate = mock.Mock(return_value=True)
573 self.s.vnfs = [tgen, vnf]
574 self.s.traffic_profile = mock.Mock()
575 self.s.collector = mock.Mock(autospec=Collector)
576 self.s.collector.get_kpi = \
577 mock.Mock(return_value={tgen.name: verified_dict})
578 self.s.map_topology_to_infrastructure = mock.Mock(return_value=0)
579 self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs)
580 self.s._fill_traffic_profile = \
581 mock.Mock(return_value=TRAFFIC_PROFILE)
582 self.assertIsNone(self.s.setup())
584 def test_setup_exception(self):
585 with mock.patch("yardstick.ssh.SSH") as ssh:
586 ssh_mock = mock.Mock(autospec=ssh.SSH)
588 mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, ""))
589 ssh.from_node.return_value = ssh_mock
591 tgen = mock.Mock(autospec=GenericTrafficGen)
592 tgen.traffic_finished = True
593 verified_dict = {"verified": True}
594 tgen.verify_traffic = lambda x: verified_dict
595 tgen.terminate = mock.Mock(return_value=True)
596 tgen.name = "tgen__1"
597 vnf = mock.Mock(autospec=GenericVNF)
598 vnf.runs_traffic = False
599 vnf.instantiate.side_effect = RuntimeError(
600 "error during instantiate")
601 vnf.terminate = mock.Mock(return_value=True)
602 self.s.vnfs = [tgen, vnf]
603 self.s.traffic_profile = mock.Mock()
604 self.s.collector = mock.Mock(autospec=Collector)
605 self.s.collector.get_kpi = \
606 mock.Mock(return_value={tgen.name: verified_dict})
607 self.s.map_topology_to_infrastructure = mock.Mock(return_value=0)
608 self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs)
609 self.s._fill_traffic_profile = \
610 mock.Mock(return_value=TRAFFIC_PROFILE)
611 with self.assertRaises(RuntimeError):
614 def test__get_traffic_profile(self):
615 self.scenario_cfg["traffic_profile"] = \
616 self._get_file_abspath("ipv4_throughput_vpe.yaml")
617 self.assertIsNotNone(self.s._get_traffic_profile())
619 def test__get_traffic_profile_exception(self):
620 with mock.patch.dict(self.scenario_cfg, {'traffic_profile': ''}):
621 with self.assertRaises(IOError):
622 self.s._get_traffic_profile()
624 def test__key_list_to_dict(self):
625 result = self.s._key_list_to_dict("uplink", {"uplink": [1, 2]})
626 self.assertEqual({"uplink_0": 1, "uplink_1": 2}, result)
628 def test__get_simulated_users(self):
629 result = self.s._get_simulated_users()
630 self.assertEqual({'simulated_users': {'uplink_0': 1, 'uplink_1': 2}},
633 def test__get_page_object(self):
634 result = self.s._get_page_object()
635 self.assertEqual({'page_object': {'uplink_0': 1, 'uplink_1': 2}},
638 def test___get_traffic_imix_exception(self):
639 with mock.patch.dict(self.scenario_cfg["traffic_options"], {'imix': ''}):
640 self.assertEqual({'imix': {'64B': 100}},
641 self.s._get_traffic_imix())
643 @mock.patch.object(base.TrafficProfile, 'get')
644 @mock.patch.object(vnfdgen, 'generate_vnfd')
645 def test__fill_traffic_profile(self, mock_generate, mock_tprofile_get):
646 fake_tprofile = mock.Mock()
647 fake_vnfd = mock.MagicMock()
648 with mock.patch.object(self.s, '_get_traffic_profile',
649 return_value=fake_tprofile) as mock_get_tp:
650 mock_generate.return_value = fake_vnfd
651 self.s._fill_traffic_profile()
652 mock_get_tp.assert_called_once()
653 mock_generate.assert_called_once_with(
656 'extra_args': {'arg1': 'value1', 'arg2': 'value2'},
657 'flow': {'flow': {}},
658 'imix': {'imix': {'64B': 100}},
662 'simulated_users': {'uplink_0': 1, 'uplink_1': 2}},
664 'page_object': {'uplink_0': 1, 'uplink_1': 2}},}
666 mock_tprofile_get.assert_called_once_with(fake_vnfd)
668 @mock.patch.object(base.TrafficProfile, 'get')
669 @mock.patch.object(vnfdgen, 'generate_vnfd')
670 def test__fill_traffic_profile2(self, mock_generate, mock_tprofile_get):
671 fake_tprofile = mock.Mock()
673 with mock.patch.object(self.s, '_get_traffic_profile',
674 return_value=fake_tprofile) as mock_get_tp:
675 mock_generate.return_value = fake_vnfd
677 self.s.scenario_cfg["options"] = {"traffic_config": {"duration": 99899}}
678 self.s._fill_traffic_profile()
679 mock_get_tp.assert_called_once()
680 self.assertIn("traffic_profile", fake_vnfd)
681 self.assertIn("duration", fake_vnfd["traffic_profile"])
682 self.assertEqual(99899, fake_vnfd["traffic_profile"]["duration"])
684 @mock.patch.object(utils, 'open_relative_file')
685 def test__get_topology(self, mock_open_path):
686 self.s.scenario_cfg['topology'] = 'fake_topology'
687 self.s.scenario_cfg['task_path'] = 'fake_path'
688 mock_open_path.side_effect = mock.mock_open(read_data='fake_data')
689 self.assertEqual('fake_data', self.s._get_topology())
690 mock_open_path.assert_called_once_with('fake_topology', 'fake_path')
692 @mock.patch.object(vnfdgen, 'generate_vnfd')
693 def test__render_topology(self, mock_generate):
694 fake_topology = 'fake_topology'
695 mock_generate.return_value = {'nsd:nsd-catalog': {'nsd': ['fake_nsd']}}
696 with mock.patch.object(self.s, '_get_topology',
697 return_value=fake_topology) as mock_get_topology:
698 self.s._render_topology()
699 mock_get_topology.assert_called_once()
701 mock_generate.assert_called_once_with(
703 {'extra_args': {'arg1': 'value1', 'arg2': 'value2'}}
705 self.assertEqual(self.s.topology, 'fake_nsd')
707 def test_teardown(self):
708 vnf = mock.Mock(autospec=GenericVNF)
709 vnf.terminate = mock.Mock(return_value=True)
712 self.s.traffic_profile = mock.Mock()
713 self.s.collector = mock.Mock(autospec=Collector)
714 self.s.collector.stop = \
715 mock.Mock(return_value=True)
716 self.assertIsNone(self.s.teardown())
718 def test_teardown_exception(self):
719 vnf = mock.Mock(autospec=GenericVNF)
720 vnf.terminate = mock.Mock(
721 side_effect=RuntimeError("error duing terminate"))
724 self.s.traffic_profile = mock.Mock()
725 self.s.collector = mock.Mock(autospec=Collector)
726 self.s.collector.stop = \
727 mock.Mock(return_value=True)
728 with self.assertRaises(RuntimeError):
732 class TestNetworkServiceRFC2544TestCase(TestNetworkServiceTestCase):
735 super(TestNetworkServiceRFC2544TestCase, self).setUp()
736 self.s = vnf_generic.NetworkServiceRFC2544(self.scenario_cfg,
740 tgen = mock.Mock(autospec=GenericTrafficGen)
741 tgen.traffic_finished = True
742 verified_dict = {"verified": True}
743 tgen.verify_traffic = lambda x: verified_dict
744 tgen.name = "tgen__1"
745 tgen.wait_on_trafic.return_value = 'COMPLETE'
746 vnf = mock.Mock(autospec=GenericVNF)
747 vnf.runs_traffic = False
748 self.s.vnfs = [tgen, vnf]
749 self.s.traffic_profile = mock.Mock()
750 self.s._fill_traffic_profile = mock.Mock()
751 self.s.collector = mock.Mock(autospec=Collector)
752 self.s.collector.get_kpi = mock.Mock(
753 return_value={tgen.name: verified_dict})
756 self.s._fill_traffic_profile.assert_called_once()
757 result.push.assert_called_once()
759 def test_setup(self):
760 with mock.patch("yardstick.ssh.SSH") as ssh:
761 ssh_mock = mock.Mock(autospec=ssh.SSH)
763 mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, ""))
764 ssh.from_node.return_value = ssh_mock
766 tgen = mock.Mock(autospec=GenericTrafficGen)
767 tgen.traffic_finished = True
768 verified_dict = {"verified": True}
769 tgen.verify_traffic = lambda x: verified_dict
770 tgen.terminate = mock.Mock(return_value=True)
771 tgen.name = "tgen__1"
772 tgen.run_traffic.return_value = 'tg_id'
773 vnf = mock.Mock(autospec=GenericVNF)
774 vnf.runs_traffic = False
775 vnf.terminate = mock.Mock(return_value=True)
776 self.s.vnfs = [tgen, vnf]
777 self.s.traffic_profile = mock.Mock()
778 self.s.collector = mock.Mock(autospec=Collector)
779 self.s.collector.get_kpi = \
780 mock.Mock(return_value={tgen.name: verified_dict})
781 self.s.map_topology_to_infrastructure = mock.Mock(return_value=0)
782 self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs)
785 def test_setup_exception(self):
786 with mock.patch("yardstick.ssh.SSH") as ssh:
787 ssh_mock = mock.Mock(autospec=ssh.SSH)
789 mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, ""))
790 ssh.from_node.return_value = ssh_mock
792 tgen = mock.Mock(autospec=GenericTrafficGen)
793 tgen.traffic_finished = True
794 verified_dict = {"verified": True}
795 tgen.verify_traffic = lambda x: verified_dict
796 tgen.terminate = mock.Mock(return_value=True)
797 tgen.name = "tgen__1"
798 vnf = mock.Mock(autospec=GenericVNF)
799 vnf.runs_traffic = False
800 vnf.instantiate.side_effect = RuntimeError(
801 "error during instantiate")
802 vnf.terminate = mock.Mock(return_value=True)
803 self.s.vnfs = [tgen, vnf]
804 self.s.traffic_profile = mock.Mock()
805 self.s.collector = mock.Mock(autospec=Collector)
806 self.s.collector.get_kpi = \
807 mock.Mock(return_value={tgen.name: verified_dict})
808 self.s.map_topology_to_infrastructure = mock.Mock(return_value=0)
809 self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs)
810 self.s._fill_traffic_profile = \
811 mock.Mock(return_value=TRAFFIC_PROFILE)
812 with self.assertRaises(RuntimeError):