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.
19 from yardstick.network_services.libs.ixia_libs.IxNet import IxNet
26 class TestIxNextgen(unittest.TestCase):
29 self.ixnet = mock.Mock()
30 self.ixnet.execute = mock.Mock()
32 def test___init__(self):
33 ixnet_gen = IxNet.IxNextgen()
34 self.assertIsNone(ixnet_gen.ixnet)
35 self.assertTrue(isinstance(ixnet_gen._objRefs, dict))
36 self.assertIsNone(ixnet_gen._cfg)
37 self.assertIsNone(ixnet_gen._params)
38 self.assertIsNone(ixnet_gen._bidir)
40 def test___init__ixnet(self):
41 ixnet_gen = IxNet.IxNextgen(self.ixnet)
42 self.assertIsNotNone(ixnet_gen.ixnet)
44 @mock.patch.object(IxNetwork, 'IxNet')
45 def test_connect(self, mock_ixnet):
46 mock_ixnet.return_value = self.ixnet
47 ixnet_gen = IxNet.IxNextgen()
48 with mock.patch.object(ixnet_gen, 'get_config') as mock_config:
49 mock_config.return_value = {'machine': 'machine_fake',
52 ixnet_gen.connect(mock.ANY)
54 self.ixnet.connect.assert_called_once_with(
55 'machine_fake', '-port', 'port_fake', '-version', '12345')
56 mock_config.assert_called_once()
58 def test_connect_invalid_config_no_machine(self):
59 ixnet_gen = IxNet.IxNextgen(self.ixnet)
60 ixnet_gen.get_config = mock.Mock(return_value={
63 self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
64 self.ixnet.connect.assert_not_called()
66 def test_connect_invalid_config_no_port(self):
67 ixnet_gen = IxNet.IxNextgen(self.ixnet)
68 ixnet_gen.get_config = mock.Mock(return_value={
69 'machine': 'machine_fake',
71 self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
72 self.ixnet.connect.assert_not_called()
74 def test_connect_invalid_config_no_version(self):
75 ixnet_gen = IxNet.IxNextgen(self.ixnet)
76 ixnet_gen.get_config = mock.Mock(return_value={
77 'machine': 'machine_fake',
79 self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
80 self.ixnet.connect.assert_not_called()
82 def test_connect_no_config(self):
83 ixnet_gen = IxNet.IxNextgen(self.ixnet)
84 ixnet_gen.get_config = mock.Mock(return_value={})
85 self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
86 self.ixnet.connect.assert_not_called()
88 def test_clear_config(self):
89 ixnet_gen = IxNet.IxNextgen(self.ixnet)
90 ixnet_gen.clear_config()
91 self.ixnet.execute.assert_called_once_with('newConfig')
93 def test_assign_ports_2_ports(self):
94 self.ixnet.getAttribute.side_effect = ['up', 'down']
102 ixnet_gen = IxNet.IxNextgen(self.ixnet)
103 ixnet_gen._cfg = config
105 self.assertIsNone(ixnet_gen.assign_ports())
107 self.assertEqual(self.ixnet.execute.call_count, 2)
108 self.assertEqual(self.ixnet.commit.call_count, 4)
109 self.assertEqual(self.ixnet.getAttribute.call_count, 2)
111 @mock.patch.object(IxNet, 'log')
112 def test_assign_ports_port_down(self, mock_log):
113 self.ixnet.getAttribute.return_value = 'down'
116 'chassis': '1.1.1.1',
120 ixnet_gen = IxNet.IxNextgen(self.ixnet)
121 ixnet_gen._cfg = config
122 ixnet_gen.assign_ports()
123 mock_log.warning.assert_called()
125 def test_assign_ports_no_config(self):
126 ixnet_gen = IxNet.IxNextgen(self.ixnet)
129 self.assertRaises(KeyError, ixnet_gen.assign_ports)
131 def test__create_traffic_item(self):
132 ixnet_gen = IxNet.IxNextgen(self.ixnet)
133 self.ixnet.getRoot.return_value = 'rootyrootroot'
134 self.ixnet.add.return_value = 'my_new_traffic_item'
135 self.ixnet.remapIds.return_value = ['my_traffic_item_id']
137 ixnet_gen._create_traffic_item()
139 self.ixnet.add.assert_called_once_with(
140 'rootyrootroot/traffic', 'trafficItem')
141 self.ixnet.setMultiAttribute.assert_called_once_with(
142 'my_new_traffic_item', '-name', 'RFC2544', '-trafficType', 'raw')
143 self.assertEqual(2, self.ixnet.commit.call_count)
144 self.ixnet.remapIds.assert_called_once_with('my_new_traffic_item')
145 self.ixnet.setAttribute('my_traffic_item_id/tracking',
146 '-trackBy', 'trafficGroupId0')
148 def test__create_flow_groups(self):
149 ixnet_gen = IxNet.IxNextgen(self.ixnet)
150 self.ixnet.getRoot.return_value = 'rootyrootroot'
151 ixnet_gen.ixnet.getList.side_effect = [['traffic_item'], ['1', '2']]
152 ixnet_gen.ixnet.add.side_effect = ['endp1', 'endp2']
153 ixnet_gen._create_flow_groups()
154 ixnet_gen.ixnet.add.assert_has_calls([
155 mock.call('traffic_item', 'endpointSet'),
156 mock.call('traffic_item', 'endpointSet')])
157 ixnet_gen.ixnet.setMultiAttribute.asser_has_calls([
158 mock.call('endp1', '-sources', ['1/protocols'], '-destinations',
160 mock.call('endp2', '-sources', ['2/protocols'], '-destinations',
163 def test__append_protocol_to_stack(self):
164 ixnet_gen = IxNet.IxNextgen(self.ixnet)
165 self.ixnet.getRoot.return_value = 'my_root'
167 ixnet_gen._append_procotol_to_stack('my_protocol', 'prev_element')
168 self.ixnet.execute.assert_called_with(
169 'append', 'prev_element',
170 'my_root/traffic/protocolTemplate:"my_protocol"')
172 def test__setup_config_elements(self):
173 ixnet_gen = IxNet.IxNextgen(self.ixnet)
174 ixnet_gen.ixnet.getRoot.return_value = 'root_element'
175 ixnet_gen.ixnet.getList.side_effect = [['traffic_item'],
177 with mock.patch.object(ixnet_gen, '_append_procotol_to_stack') as \
179 ixnet_gen._setup_config_elements()
180 mock_append_proto.assert_has_calls([
181 mock.call(IxNet.PROTO_UDP, 'cfg_element/stack:"ethernet-1"'),
182 mock.call(IxNet.PROTO_IPV4, 'cfg_element/stack:"ethernet-1"')])
183 ixnet_gen.ixnet.setAttribute.assert_has_calls([
184 mock.call('cfg_element/frameRateDistribution', '-portDistribution',
186 mock.call('cfg_element/frameRateDistribution',
187 '-streamDistribution', 'splitRateEvenly')])
189 @mock.patch.object(IxNet.IxNextgen, '_create_traffic_item')
190 @mock.patch.object(IxNet.IxNextgen, '_create_flow_groups')
191 @mock.patch.object(IxNet.IxNextgen, '_setup_config_elements')
192 def test_create_traffic_model(self, mock__setup_config_elements,
193 mock__create_flow_groups,
194 mock__create_traffic_item):
195 ixnet_gen = IxNet.IxNextgen(self.ixnet)
197 ixnet_gen.create_traffic_model()
198 mock__create_traffic_item.assert_called_once()
199 mock__create_flow_groups.assert_called_once()
200 mock__setup_config_elements.assert_called_once()
202 def test_ix_update_frame(self):
203 static_traffic_params = {
210 "dstmac": "00:00:00:00:00:03",
211 "framesPerSecond": True,
216 "srcmac": "00:00:00:00:00:01"
220 "dstip4": "152.16.40.20",
222 "srcip4": "152.16.100.20",
227 "dstip4": "152.16.40.20",
229 "srcip4": "152.16.100.20",
235 "dstip4": "152.16.100.20",
237 "srcip4": "152.16.40.20",
244 "traffic_type": "continuous"
252 "dstmac": "00:00:00:00:00:04",
253 "framesPerSecond": False,
254 "framesize": {"64B": "100"},
255 "srcmac": "00:00:00:00:00:01"
260 "dstip4": "152.16.100.20",
262 "srcip4": "152.16.40.20",
268 "dstip4": "152.16.100.20",
270 "srcip4": "152.16.40.20",
276 "dstip4": "152.16.100.20",
278 "srcip4": "152.16.40.20",
285 "traffic_type": "continuous"
289 self.ixnet.remapIds.return_value = ["0"]
290 self.ixnet.setMultiAttribute.return_value = [1]
291 self.ixnet.commit.return_value = [1]
292 self.ixnet.getList.side_effect = [
297 "ethernet.header.destinationAddress",
298 "ethernet.header.sourceAddress",
302 ixnet_gen = IxNet.IxNextgen(self.ixnet)
304 result = ixnet_gen.ix_update_frame(static_traffic_params)
305 self.assertIsNone(result)
306 self.assertEqual(self.ixnet.setMultiAttribute.call_count, 7)
307 self.assertEqual(self.ixnet.commit.call_count, 2)
309 # NOTE(ralonsoh): to be updated in next patchset
310 def test_update_ether_multi_attribute(self):
313 # NOTE(ralonsoh): to be updated in next patchset
314 def test_update_ether_multi_attributes(self):
317 # NOTE(ralonsoh): to be updated in next patchset
318 def test_update_ether(self):
321 # NOTE(ralonsoh): to be updated in next patchset
322 def test_ix_update_udp(self):
323 ixnet_gen = IxNet.IxNextgen(self.ixnet)
325 result = ixnet_gen.ix_update_udp({})
326 self.assertIsNone(result)
328 # NOTE(ralonsoh): to be updated in next patchset
329 def test_ix_update_tcp(self):
330 ixnet_gen = IxNet.IxNextgen(self.ixnet)
332 result = ixnet_gen.ix_update_tcp({})
333 self.assertIsNone(result)
335 # NOTE(ralonsoh): to be updated in next patchset
336 def test_ix_start_traffic(self):
337 self.ixnet.getList.return_value = [0]
338 self.ixnet.getAttribute.return_value = 'down'
340 ixnet_gen = IxNet.IxNextgen(self.ixnet)
342 result = ixnet_gen.ix_start_traffic()
343 self.assertIsNone(result)
344 self.ixnet.getList.assert_called_once()
345 self.assertEqual(self.ixnet.execute.call_count, 3)
347 # NOTE(ralonsoh): to be updated in next patchset
348 def test_ix_stop_traffic(self):
349 self.ixnet.getList.return_value = [0]
351 ixnet_gen = IxNet.IxNextgen(self.ixnet)
353 result = ixnet_gen.ix_stop_traffic()
354 self.assertIsNone(result)
355 self.ixnet.getList.assert_called_once()
356 self.ixnet.execute.assert_called_once()
358 # NOTE(ralonsoh): to be updated in next patchset
359 def test_build_stats_map(self):
362 # NOTE(ralonsoh): to be updated in next patchset
363 def test_get_statistics(self):
364 self.ixnet.execute.return_value = ""
366 ixnet_gen = IxNet.IxNextgen(self.ixnet)
368 result = ixnet_gen.get_statistics()
369 self.assertIsNotNone(result)
370 self.assertEqual(self.ixnet.execute.call_count, 12)
372 # NOTE(ralonsoh): to be updated in next patchset
373 def test_add_ip_header_v4(self):
374 static_traffic_params = {
381 "dstmac": "00:00:00:00:00:03",
382 "framesPerSecond": True,
383 "framesize": {"64B": "100"},
384 "srcmac": "00:00:00:00:00:01"
388 "dstip4": "152.16.40.20",
390 "srcip4": "152.16.100.20",
396 "dstip4": "152.16.40.20",
398 "srcip4": "152.16.100.20",
404 "dstip4": "152.16.100.20",
406 "srcip4": "152.16.40.20",
413 "traffic_type": "continuous"
421 "dstmac": "00:00:00:00:00:04",
422 "framesPerSecond": True,
423 "framesize": {"64B": "100"},
424 "srcmac": "00:00:00:00:00:01"
429 "dstip4": "152.16.100.20",
431 "srcip4": "152.16.40.20",
437 "dstip4": "152.16.100.20",
439 "srcip4": "152.16.40.20",
445 "dstip4": "152.16.100.20",
447 "srcip4": "152.16.40.20",
454 "traffic_type": "continuous"
458 self.ixnet.remapIds.return_value = ["0"]
459 self.ixnet.setMultiAttribute.return_value = [1]
460 self.ixnet.commit.return_value = [1]
461 self.ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]]
463 ixnet_gen = IxNet.IxNextgen(self.ixnet)
465 result = ixnet_gen.add_ip_header(static_traffic_params,
467 self.assertIsNone(result)
468 self.ixnet.setMultiAttribute.assert_called()
469 self.ixnet.commit.assert_called_once()
471 def test_add_ip_header_v4_nothing_to_do(self):
472 static_traffic_params = {
479 "dstmac": "00:00:00:00:00:03",
480 "framesPerSecond": True,
481 "framesize": {"64B": "100"},
482 "srcmac": "00:00:00:00:00:01"
486 "dstip4": "152.16.40.20",
488 "srcip4": "152.16.100.20",
494 "dstip4": "152.16.40.20",
496 "srcip4": "152.16.100.20",
502 "dstip4": "152.16.100.20",
504 "srcip4": "152.16.40.20",
511 "traffic_type": "continuous"
519 "dstmac": "00:00:00:00:00:04",
520 "framesPerSecond": True,
521 "framesize": {"64B": "100"},
522 "srcmac": "00:00:00:00:00:01"
527 "dstip4": "152.16.100.20",
529 "srcip4": "152.16.40.20",
535 "dstip4": "152.16.100.20",
537 "srcip4": "152.16.40.20",
543 "dstip4": "152.16.100.20",
545 "srcip4": "152.16.40.20",
552 "traffic_type": "continuous"
556 self.ixnet.remapIds.return_value = ["0"]
557 self.ixnet.setMultiAttribute.return_value = [1]
558 self.ixnet.commit.return_value = [1]
559 self.ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]]
561 ixnet_gen = IxNet.IxNextgen(self.ixnet)
563 result = ixnet_gen.add_ip_header(static_traffic_params,
565 self.assertIsNone(result)
566 self.ixnet.setMultiAttribute.assert_called()
567 self.ixnet.commit.assert_called_once()
569 def test_add_ip_header_v6(self):
570 static_traffic_profile = {
577 "dstmac": "00:00:00:00:00:03",
578 "framesPerSecond": True,
579 "framesize": {"64B": "100"},
580 "srcmac": "00:00:00:00:00:01"
585 "dstip4": "152.16.40.20",
587 "srcip4": "152.16.100.20",
593 "dstip4": "152.16.100.20",
595 "srcip4": "152.16.40.20",
602 "traffic_type": "continuous"
610 "dstmac": "00:00:00:00:00:04",
611 "framesPerSecond": True,
612 "framesize": {"64B": "100"},
613 "srcmac": "00:00:00:00:00:01"
618 "dstip4": "152.16.100.20",
620 "srcip4": "152.16.40.20",
626 "dstip4": "152.16.100.20",
628 "srcip4": "152.16.40.20",
635 "traffic_type": "continuous"
639 self.ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]]
640 self.ixnet.remapIds.return_value = ["0"]
641 self.ixnet.setMultiAttribute.return_value = [1]
642 self.ixnet.commit.return_value = [1]
644 ixnet_gen = IxNet.IxNextgen(self.ixnet)
646 result = ixnet_gen.add_ip_header(static_traffic_profile,
648 self.assertIsNone(result)
649 self.ixnet.setMultiAttribute.assert_called()
650 self.ixnet.commit.assert_called_once()
652 def test_add_ip_header_v6_nothing_to_do(self):
653 static_traffic_params = {
660 "dstmac": "00:00:00:00:00:03",
661 "framesPerSecond": True,
662 "framesize": {"64B": "100"},
663 "srcmac": "00:00:00:00:00:01"
667 "dstip4": "152.16.40.20",
669 "srcip4": "152.16.100.20",
675 "dstip4": "152.16.40.20",
677 "srcip4": "152.16.100.20",
684 "traffic_type": "continuous"
692 "dstmac": "00:00:00:00:00:04",
693 "framesPerSecond": True,
694 "framesize": {"64B": "100"},
695 "srcmac": "00:00:00:00:00:01"
700 "dstip4": "152.16.100.20",
702 "srcip4": "152.16.40.20",
708 "dstip4": "152.16.100.20",
710 "srcip4": "152.16.40.20",
717 "traffic_type": "continuous"
721 self.ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]]
722 self.ixnet.remapIds.return_value = ["0"]
723 self.ixnet.setMultiAttribute.return_value = [1]
724 self.ixnet.commit.return_value = [1]
726 ixnet_gen = IxNet.IxNextgen(self.ixnet)
728 result = ixnet_gen.add_ip_header(static_traffic_params,
730 self.assertIsNone(result)
731 self.ixnet.setMultiAttribute.assert_not_called()
733 def test_set_random_ip_multi_attributes_bad_ip_version(self):
734 bad_ip_version = object()
735 ixnet_gen = IxNet.IxNextgen(mock.Mock())
736 with self.assertRaises(ValueError):
737 ixnet_gen.set_random_ip_multi_attributes(
738 mock.Mock(), bad_ip_version, mock.Mock(), mock.Mock())
740 def test_get_config(self):
744 "external-interface": [
746 "virtual-interface": {
747 "vpci": "0000:07:00.1",
751 "virtual-interface": {
752 "vpci": "0001:08:01.2",
761 "dut_result_dir": "test2",
763 "ixchassis": "test4",
773 'cards': ['0000', '0001'],
774 'ports': ['07', '08'],
775 'output_dir': 'test2',
780 result = IxNet.IxNextgen.get_config(tg_cfg)
781 self.assertEqual(result, expected)
783 def test_ix_update_ether(self):
784 static_traffic_params = {
791 "dstmac": "00:00:00:00:00:03",
792 "framesPerSecond": True,
794 "srcmac": "00:00:00:00:00:01"
798 "dstip4": "152.16.40.20",
800 "srcip4": "152.16.100.20",
805 "dstip4": "152.16.40.20",
807 "srcip4": "152.16.100.20",
813 "dstip4": "152.16.100.20",
815 "srcip4": "152.16.40.20",
822 "traffic_type": "continuous"
830 "dstmac": "00:00:00:00:00:04",
831 "framesPerSecond": True,
833 "srcmac": "00:00:00:00:00:01"
838 "dstip4": "152.16.100.20",
840 "srcip4": "152.16.40.20",
846 "dstip4": "152.16.100.20",
848 "srcip4": "152.16.40.20",
854 "dstip4": "152.16.100.20",
856 "srcip4": "152.16.40.20",
863 "traffic_type": "continuous"
867 self.ixnet.setMultiAttribute.return_value = [1]
868 self.ixnet.commit.return_value = [1]
869 self.ixnet.getList.side_effect = [
874 "ethernet.header.destinationAddress",
875 "ethernet.header.sourceAddress",
879 ixnet_gen = IxNet.IxNextgen(self.ixnet)
881 result = ixnet_gen.ix_update_ether(static_traffic_params)
882 self.assertIsNone(result)
883 self.ixnet.setMultiAttribute.assert_called()
885 def test_ix_update_ether_nothing_to_do(self):
886 static_traffic_params = {
894 "dstip4": "152.16.40.20",
896 "srcip4": "152.16.100.20",
901 "dstip4": "152.16.40.20",
903 "srcip4": "152.16.100.20",
909 "dstip4": "152.16.100.20",
911 "srcip4": "152.16.40.20",
918 "traffic_type": "continuous"
928 "dstip4": "152.16.100.20",
930 "srcip4": "152.16.40.20",
936 "dstip4": "152.16.100.20",
938 "srcip4": "152.16.40.20",
944 "dstip4": "152.16.100.20",
946 "srcip4": "152.16.40.20",
953 "traffic_type": "continuous"
957 self.ixnet.setMultiAttribute.return_value = [1]
958 self.ixnet.commit.return_value = [1]
959 self.ixnet.getList.side_effect = [
964 "ethernet.header.destinationAddress",
965 "ethernet.header.sourceAddress",
969 ixnet_gen = IxNet.IxNextgen(self.ixnet)
971 result = ixnet_gen.ix_update_ether(static_traffic_params)
972 self.assertIsNone(result)
973 self.ixnet.setMultiAttribute.assert_not_called()