Improve IXIA IxNetwork library and traffic profile (1)
[yardstick.git] / yardstick / tests / unit / network_services / libs / ixia_libs / test_IxNet.py
1 # Copyright (c) 2016-2017 Intel Corporation
2 #
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
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import mock
16 import IxNetwork
17 import unittest
18
19 from yardstick.network_services.libs.ixia_libs.IxNet import IxNet
20
21
22 UPLINK = 'uplink'
23 DOWNLINK = 'downlink'
24
25
26 class TestIxNextgen(unittest.TestCase):
27
28     def setUp(self):
29         self.ixnet = mock.Mock()
30         self.ixnet.execute = mock.Mock()
31
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)
39
40     def test___init__ixnet(self):
41         ixnet_gen = IxNet.IxNextgen(self.ixnet)
42         self.assertIsNotNone(ixnet_gen.ixnet)
43
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',
50                                         'port': 'port_fake',
51                                         'version': 12345}
52             ixnet_gen.connect(mock.ANY)
53
54         self.ixnet.connect.assert_called_once_with(
55             'machine_fake', '-port', 'port_fake', '-version', '12345')
56         mock_config.assert_called_once()
57
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={
61             'port': 'port_fake',
62             'version': '12345'})
63         self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
64         self.ixnet.connect.assert_not_called()
65
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',
70             'version': '12345'})
71         self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
72         self.ixnet.connect.assert_not_called()
73
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',
78             'port': 'port_fake'})
79         self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
80         self.ixnet.connect.assert_not_called()
81
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()
87
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')
92
93     def test_assign_ports_2_ports(self):
94         self.ixnet.getAttribute.side_effect = ['up', 'down']
95
96         config = {
97             'chassis': '1.1.1.1',
98             'cards': ['1', '2'],
99             'ports': ['2', '2'],
100         }
101
102         ixnet_gen = IxNet.IxNextgen(self.ixnet)
103         ixnet_gen._cfg = config
104
105         self.assertIsNone(ixnet_gen.assign_ports())
106
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)
110
111     @mock.patch.object(IxNet, 'log')
112     def test_assign_ports_port_down(self, mock_log):
113         self.ixnet.getAttribute.return_value = 'down'
114
115         config = {
116             'chassis': '1.1.1.1',
117             'cards': ['1', '2'],
118             'ports': ['3', '4'],
119         }
120         ixnet_gen = IxNet.IxNextgen(self.ixnet)
121         ixnet_gen._cfg = config
122         ixnet_gen.assign_ports()
123         mock_log.warning.assert_called()
124
125     def test_assign_ports_no_config(self):
126         ixnet_gen = IxNet.IxNextgen(self.ixnet)
127         ixnet_gen._cfg = {}
128
129         self.assertRaises(KeyError, ixnet_gen.assign_ports)
130
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']
136
137         ixnet_gen._create_traffic_item()
138
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')
147
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',
159                       ['2/protocols']),
160             mock.call('endp2', '-sources', ['2/protocols'], '-destinations',
161                       ['1/protocols'])])
162
163     def test__append_protocol_to_stack(self):
164         ixnet_gen = IxNet.IxNextgen(self.ixnet)
165         self.ixnet.getRoot.return_value = 'my_root'
166
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"')
171
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'],
176                                                ['cfg_element']]
177         with mock.patch.object(ixnet_gen, '_append_procotol_to_stack') as \
178                 mock_append_proto:
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',
185                       'splitRateEvenly'),
186             mock.call('cfg_element/frameRateDistribution',
187                       '-streamDistribution', 'splitRateEvenly')])
188
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)
196
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()
201
202     def test_ix_update_frame(self):
203         static_traffic_params = {
204             UPLINK: {
205                 "id": 1,
206                 "bidir": "False",
207                 "duration": 60,
208                 "iload": "100",
209                 "outer_l2": {
210                     "dstmac": "00:00:00:00:00:03",
211                     "framesPerSecond": True,
212                     "framesize": {
213                         "64B": "100",
214                         "1KB": "0",
215                     },
216                     "srcmac": "00:00:00:00:00:01"
217                 },
218                 "outer_l3": {
219                     "dscp": 0,
220                     "dstip4": "152.16.40.20",
221                     "proto": "udp",
222                     "srcip4": "152.16.100.20",
223                     "ttl": 32
224                 },
225                 "outer_l3v4": {
226                     "dscp": 0,
227                     "dstip4": "152.16.40.20",
228                     "proto": "udp",
229                     "srcip4": "152.16.100.20",
230                     "ttl": 32
231                 },
232                 "outer_l3v6": {
233                     "count": 1024,
234                     "dscp": 0,
235                     "dstip4": "152.16.100.20",
236                     "proto": "udp",
237                     "srcip4": "152.16.40.20",
238                     "ttl": 32
239                 },
240                 "outer_l4": {
241                     "dstport": "2001",
242                     "srcport": "1234"
243                 },
244                 "traffic_type": "continuous"
245             },
246             DOWNLINK: {
247                 "id": 2,
248                 "bidir": "False",
249                 "duration": 60,
250                 "iload": "100",
251                 "outer_l2": {
252                     "dstmac": "00:00:00:00:00:04",
253                     "framesPerSecond": False,
254                     "framesize": {"64B": "100"},
255                     "srcmac": "00:00:00:00:00:01"
256                 },
257                 "outer_l3": {
258                     "count": 1024,
259                     "dscp": 0,
260                     "dstip4": "152.16.100.20",
261                     "proto": "udp",
262                     "srcip4": "152.16.40.20",
263                     "ttl": 32
264                 },
265                 "outer_l3v4": {
266                     "count": 1024,
267                     "dscp": 0,
268                     "dstip4": "152.16.100.20",
269                     "proto": "udp",
270                     "srcip4": "152.16.40.20",
271                     "ttl": 32
272                 },
273                 "outer_l3v6": {
274                     "count": 1024,
275                     "dscp": 0,
276                     "dstip4": "152.16.100.20",
277                     "proto": "udp",
278                     "srcip4": "152.16.40.20",
279                     "ttl": 32
280                 },
281                 "outer_l4": {
282                     "dstport": "1234",
283                     "srcport": "2001"
284                 },
285                 "traffic_type": "continuous"
286             }
287         }
288
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 = [
293             [1],
294             [1],
295             [1],
296             [
297                 "ethernet.header.destinationAddress",
298                 "ethernet.header.sourceAddress",
299             ],
300         ]
301
302         ixnet_gen = IxNet.IxNextgen(self.ixnet)
303
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)
308
309     # NOTE(ralonsoh): to be updated in next patchset
310     def test_update_ether_multi_attribute(self):
311         pass
312
313     # NOTE(ralonsoh): to be updated in next patchset
314     def test_update_ether_multi_attributes(self):
315         pass
316
317     # NOTE(ralonsoh): to be updated in next patchset
318     def test_update_ether(self):
319         pass
320
321     # NOTE(ralonsoh): to be updated in next patchset
322     def test_ix_update_udp(self):
323         ixnet_gen = IxNet.IxNextgen(self.ixnet)
324
325         result = ixnet_gen.ix_update_udp({})
326         self.assertIsNone(result)
327
328     # NOTE(ralonsoh): to be updated in next patchset
329     def test_ix_update_tcp(self):
330         ixnet_gen = IxNet.IxNextgen(self.ixnet)
331
332         result = ixnet_gen.ix_update_tcp({})
333         self.assertIsNone(result)
334
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'
339
340         ixnet_gen = IxNet.IxNextgen(self.ixnet)
341
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)
346
347     # NOTE(ralonsoh): to be updated in next patchset
348     def test_ix_stop_traffic(self):
349         self.ixnet.getList.return_value = [0]
350
351         ixnet_gen = IxNet.IxNextgen(self.ixnet)
352
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()
357
358     # NOTE(ralonsoh): to be updated in next patchset
359     def test_build_stats_map(self):
360         pass
361
362     # NOTE(ralonsoh): to be updated in next patchset
363     def test_get_statistics(self):
364         self.ixnet.execute.return_value = ""
365
366         ixnet_gen = IxNet.IxNextgen(self.ixnet)
367
368         result = ixnet_gen.get_statistics()
369         self.assertIsNotNone(result)
370         self.assertEqual(self.ixnet.execute.call_count, 12)
371
372     # NOTE(ralonsoh): to be updated in next patchset
373     def test_add_ip_header_v4(self):
374         static_traffic_params = {
375             "uplink_0": {
376                 "id": 1,
377                 "bidir": "False",
378                 "duration": 60,
379                 "iload": "100",
380                 "outer_l2": {
381                     "dstmac": "00:00:00:00:00:03",
382                     "framesPerSecond": True,
383                     "framesize": {"64B": "100"},
384                     "srcmac": "00:00:00:00:00:01"
385                 },
386                 "outer_l3": {
387                     "dscp": 0,
388                     "dstip4": "152.16.40.20",
389                     "proto": "udp",
390                     "srcip4": "152.16.100.20",
391                     "count": 1024,
392                     "ttl": 32
393                 },
394                 "outer_l3v4": {
395                     "dscp": 0,
396                     "dstip4": "152.16.40.20",
397                     "proto": "udp",
398                     "srcip4": "152.16.100.20",
399                     "ttl": 32
400                 },
401                 "outer_l3v6": {
402                     "count": 1024,
403                     "dscp": 0,
404                     "dstip4": "152.16.100.20",
405                     "proto": "udp",
406                     "srcip4": "152.16.40.20",
407                     "ttl": 32
408                 },
409                 "outer_l4": {
410                     "dstport": "2001",
411                     "srcport": "1234"
412                 },
413                 "traffic_type": "continuous"
414             },
415             "downlink_0": {
416                 "id": 2,
417                 "bidir": "False",
418                 "duration": 60,
419                 "iload": "100",
420                 "outer_l2": {
421                     "dstmac": "00:00:00:00:00:04",
422                     "framesPerSecond": True,
423                     "framesize": {"64B": "100"},
424                     "srcmac": "00:00:00:00:00:01"
425                 },
426                 "outer_l3": {
427                     "count": 1024,
428                     "dscp": 0,
429                     "dstip4": "152.16.100.20",
430                     "proto": "udp",
431                     "srcip4": "152.16.40.20",
432                     "ttl": 32
433                 },
434                 "outer_l3v4": {
435                     "count": 1024,
436                     "dscp": 0,
437                     "dstip4": "152.16.100.20",
438                     "proto": "udp",
439                     "srcip4": "152.16.40.20",
440                     "ttl": 32
441                 },
442                 "outer_l3v6": {
443                     "count": 1024,
444                     "dscp": 0,
445                     "dstip4": "152.16.100.20",
446                     "proto": "udp",
447                     "srcip4": "152.16.40.20",
448                     "ttl": 32
449                 },
450                 "outer_l4": {
451                     "dstport": "1234",
452                     "srcport": "2001"
453                 },
454                 "traffic_type": "continuous"
455             }
456         }
457
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"]]
462
463         ixnet_gen = IxNet.IxNextgen(self.ixnet)
464
465         result = ixnet_gen.add_ip_header(static_traffic_params,
466                                          IxNet.IP_VERSION_4)
467         self.assertIsNone(result)
468         self.ixnet.setMultiAttribute.assert_called()
469         self.ixnet.commit.assert_called_once()
470
471     def test_add_ip_header_v4_nothing_to_do(self):
472         static_traffic_params = {
473             "uplink_0": {
474                 "id": 1,
475                 "bidir": "False",
476                 "duration": 60,
477                 "iload": "100",
478                 "outer_l2": {
479                     "dstmac": "00:00:00:00:00:03",
480                     "framesPerSecond": True,
481                     "framesize": {"64B": "100"},
482                     "srcmac": "00:00:00:00:00:01"
483                 },
484                 "outer_l3": {
485                     "dscp": 0,
486                     "dstip4": "152.16.40.20",
487                     "proto": "udp",
488                     "srcip4": "152.16.100.20",
489                     "count": 1024,
490                     "ttl": 32
491                 },
492                 "outer_l3v4": {
493                     "dscp": 0,
494                     "dstip4": "152.16.40.20",
495                     "proto": "udp",
496                     "srcip4": "152.16.100.20",
497                     "ttl": 32
498                 },
499                 "outer_l3v6": {
500                     "count": 1024,
501                     "dscp": 0,
502                     "dstip4": "152.16.100.20",
503                     "proto": "udp",
504                     "srcip4": "152.16.40.20",
505                     "ttl": 32
506                 },
507                 "outer_l4": {
508                     "dstport": "2001",
509                     "srcport": "1234"
510                 },
511                 "traffic_type": "continuous"
512             },
513             "downlink_0": {
514                 "id": 2,
515                 "bidir": "False",
516                 "duration": 60,
517                 "iload": "100",
518                 "outer_l2": {
519                     "dstmac": "00:00:00:00:00:04",
520                     "framesPerSecond": True,
521                     "framesize": {"64B": "100"},
522                     "srcmac": "00:00:00:00:00:01"
523                 },
524                 "outer_l3": {
525                     "count": 1024,
526                     "dscp": 0,
527                     "dstip4": "152.16.100.20",
528                     "proto": "udp",
529                     "srcip4": "152.16.40.20",
530                     "ttl": 32
531                 },
532                 "outer_l3v4": {
533                     "count": 1024,
534                     "dscp": 0,
535                     "dstip4": "152.16.100.20",
536                     "proto": "udp",
537                     "srcip4": "152.16.40.20",
538                     "ttl": 32
539                 },
540                 "outer_l3v6": {
541                     "count": 1024,
542                     "dscp": 0,
543                     "dstip4": "152.16.100.20",
544                     "proto": "udp",
545                     "srcip4": "152.16.40.20",
546                     "ttl": 32
547                 },
548                 "outer_l4": {
549                     "dstport": "1234",
550                     "srcport": "2001"
551                 },
552                 "traffic_type": "continuous"
553             }
554         }
555
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"]]
560
561         ixnet_gen = IxNet.IxNextgen(self.ixnet)
562
563         result = ixnet_gen.add_ip_header(static_traffic_params,
564                                          IxNet.IP_VERSION_4)
565         self.assertIsNone(result)
566         self.ixnet.setMultiAttribute.assert_called()
567         self.ixnet.commit.assert_called_once()
568
569     def test_add_ip_header_v6(self):
570         static_traffic_profile = {
571             "uplink_0": {
572                 "id": 1,
573                 "bidir": "False",
574                 "duration": 60,
575                 "iload": "100",
576                 "outer_l2": {
577                     "dstmac": "00:00:00:00:00:03",
578                     "framesPerSecond": True,
579                     "framesize": {"64B": "100"},
580                     "srcmac": "00:00:00:00:00:01"
581                 },
582                 "outer_l3": {
583                     "count": 1024,
584                     "dscp": 0,
585                     "dstip4": "152.16.40.20",
586                     "proto": "udp",
587                     "srcip4": "152.16.100.20",
588                     "ttl": 32
589                 },
590                 "outer_l3v6": {
591                     "count": 1024,
592                     "dscp": 0,
593                     "dstip4": "152.16.100.20",
594                     "proto": "udp",
595                     "srcip4": "152.16.40.20",
596                     "ttl": 32
597                 },
598                 "outer_l4": {
599                     "dstport": "2001",
600                     "srcport": "1234"
601                 },
602                 "traffic_type": "continuous"
603             },
604             "downlink_0": {
605                 "id": 2,
606                 "bidir": "False",
607                 "duration": 60,
608                 "iload": "100",
609                 "outer_l2": {
610                     "dstmac": "00:00:00:00:00:04",
611                     "framesPerSecond": True,
612                     "framesize": {"64B": "100"},
613                     "srcmac": "00:00:00:00:00:01"
614                 },
615                 "outer_l3": {
616                     "count": 1024,
617                     "dscp": 0,
618                     "dstip4": "152.16.100.20",
619                     "proto": "udp",
620                     "srcip4": "152.16.40.20",
621                     "ttl": 32
622                 },
623                 "outer_l3v6": {
624                     "count": 1024,
625                     "dscp": 0,
626                     "dstip4": "152.16.100.20",
627                     "proto": "udp",
628                     "srcip4": "152.16.40.20",
629                     "ttl": 32
630                 },
631                 "outer_l4": {
632                     "dstport": "1234",
633                     "srcport": "2001"
634                 },
635                 "traffic_type": "continuous"
636             }
637         }
638
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]
643
644         ixnet_gen = IxNet.IxNextgen(self.ixnet)
645
646         result = ixnet_gen.add_ip_header(static_traffic_profile,
647                                          IxNet.IP_VERSION_6)
648         self.assertIsNone(result)
649         self.ixnet.setMultiAttribute.assert_called()
650         self.ixnet.commit.assert_called_once()
651
652     def test_add_ip_header_v6_nothing_to_do(self):
653         static_traffic_params = {
654             "uplink_0": {
655                 "id": 1,
656                 "bidir": "False",
657                 "duration": 60,
658                 "iload": "100",
659                 "outer_l2": {
660                     "dstmac": "00:00:00:00:00:03",
661                     "framesPerSecond": True,
662                     "framesize": {"64B": "100"},
663                     "srcmac": "00:00:00:00:00:01"
664                 },
665                 "outer_l3": {
666                     "dscp": 0,
667                     "dstip4": "152.16.40.20",
668                     "proto": "udp",
669                     "srcip4": "152.16.100.20",
670                     "count": 1024,
671                     "ttl": 32
672                 },
673                 "outer_l3v6": {
674                     "dscp": 0,
675                     "dstip4": "152.16.40.20",
676                     "proto": "udp",
677                     "srcip4": "152.16.100.20",
678                     "ttl": 32
679                 },
680                 "outer_l4": {
681                     "dstport": "2001",
682                     "srcport": "1234"
683                 },
684                 "traffic_type": "continuous"
685             },
686             "downlink_0": {
687                 "id": 2,
688                 "bidir": "False",
689                 "duration": 60,
690                 "iload": "100",
691                 "outer_l2": {
692                     "dstmac": "00:00:00:00:00:04",
693                     "framesPerSecond": True,
694                     "framesize": {"64B": "100"},
695                     "srcmac": "00:00:00:00:00:01"
696                 },
697                 "outer_l3": {
698                     "count": 1024,
699                     "dscp": 0,
700                     "dstip4": "152.16.100.20",
701                     "proto": "udp",
702                     "srcip4": "152.16.40.20",
703                     "ttl": 32
704                 },
705                 "outer_l3v6": {
706                     "count": 1024,
707                     "dscp": 0,
708                     "dstip4": "152.16.100.20",
709                     "proto": "udp",
710                     "srcip4": "152.16.40.20",
711                     "ttl": 32
712                 },
713                 "outer_l4": {
714                     "dstport": "1234",
715                     "srcport": "2001"
716                 },
717                 "traffic_type": "continuous"
718             }
719         }
720
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]
725
726         ixnet_gen = IxNet.IxNextgen(self.ixnet)
727
728         result = ixnet_gen.add_ip_header(static_traffic_params,
729                                          IxNet.IP_VERSION_6)
730         self.assertIsNone(result)
731         self.ixnet.setMultiAttribute.assert_not_called()
732
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())
739
740     def test_get_config(self):
741         tg_cfg = {
742             "vdu": [
743                 {
744                     "external-interface": [
745                         {
746                             "virtual-interface": {
747                                 "vpci": "0000:07:00.1",
748                             },
749                         },
750                         {
751                             "virtual-interface": {
752                                 "vpci": "0001:08:01.2",
753                             },
754                         },
755                     ],
756                 },
757             ],
758             "mgmt-interface": {
759                 "ip": "test1",
760                 "tg-config": {
761                     "dut_result_dir": "test2",
762                     "version": "test3",
763                     "ixchassis": "test4",
764                     "tcl_port": "test5",
765                 },
766             }
767         }
768
769         expected = {
770             'machine': 'test1',
771             'port': 'test5',
772             'chassis': 'test4',
773             'cards': ['0000', '0001'],
774             'ports': ['07', '08'],
775             'output_dir': 'test2',
776             'version': 'test3',
777             'bidir': True,
778         }
779
780         result = IxNet.IxNextgen.get_config(tg_cfg)
781         self.assertEqual(result, expected)
782
783     def test_ix_update_ether(self):
784         static_traffic_params = {
785             "uplink_0": {
786                 "id": 1,
787                 "bidir": "False",
788                 "duration": 60,
789                 "iload": "100",
790                 "outer_l2": {
791                     "dstmac": "00:00:00:00:00:03",
792                     "framesPerSecond": True,
793                     "framesize": 64,
794                     "srcmac": "00:00:00:00:00:01"
795                 },
796                 "outer_l3": {
797                     "dscp": 0,
798                     "dstip4": "152.16.40.20",
799                     "proto": "udp",
800                     "srcip4": "152.16.100.20",
801                     "ttl": 32
802                 },
803                 "outer_l3v4": {
804                     "dscp": 0,
805                     "dstip4": "152.16.40.20",
806                     "proto": "udp",
807                     "srcip4": "152.16.100.20",
808                     "ttl": 32
809                 },
810                 "outer_l3v6": {
811                     "count": 1024,
812                     "dscp": 0,
813                     "dstip4": "152.16.100.20",
814                     "proto": "udp",
815                     "srcip4": "152.16.40.20",
816                     "ttl": 32
817                 },
818                 "outer_l4": {
819                     "dstport": "2001",
820                     "srcport": "1234"
821                 },
822                 "traffic_type": "continuous"
823             },
824             "downlink_0": {
825                 "id": 2,
826                 "bidir": "False",
827                 "duration": 60,
828                 "iload": "100",
829                 "outer_l2": {
830                     "dstmac": "00:00:00:00:00:04",
831                     "framesPerSecond": True,
832                     "framesize": 64,
833                     "srcmac": "00:00:00:00:00:01"
834                 },
835                 "outer_l3": {
836                     "count": 1024,
837                     "dscp": 0,
838                     "dstip4": "152.16.100.20",
839                     "proto": "udp",
840                     "srcip4": "152.16.40.20",
841                     "ttl": 32
842                 },
843                 "outer_l3v4": {
844                     "count": 1024,
845                     "dscp": 0,
846                     "dstip4": "152.16.100.20",
847                     "proto": "udp",
848                     "srcip4": "152.16.40.20",
849                     "ttl": 32
850                 },
851                 "outer_l3v6": {
852                     "count": 1024,
853                     "dscp": 0,
854                     "dstip4": "152.16.100.20",
855                     "proto": "udp",
856                     "srcip4": "152.16.40.20",
857                     "ttl": 32
858                 },
859                 "outer_l4": {
860                     "dstport": "1234",
861                     "srcport": "2001"
862                 },
863                 "traffic_type": "continuous"
864             }
865         }
866
867         self.ixnet.setMultiAttribute.return_value = [1]
868         self.ixnet.commit.return_value = [1]
869         self.ixnet.getList.side_effect = [
870             [1],
871             [1],
872             [1],
873             [
874                 "ethernet.header.destinationAddress",
875                 "ethernet.header.sourceAddress",
876             ],
877         ]
878
879         ixnet_gen = IxNet.IxNextgen(self.ixnet)
880
881         result = ixnet_gen.ix_update_ether(static_traffic_params)
882         self.assertIsNone(result)
883         self.ixnet.setMultiAttribute.assert_called()
884
885     def test_ix_update_ether_nothing_to_do(self):
886         static_traffic_params = {
887             "uplink_0": {
888                 "id": 1,
889                 "bidir": "False",
890                 "duration": 60,
891                 "iload": "100",
892                 "outer_l3": {
893                     "dscp": 0,
894                     "dstip4": "152.16.40.20",
895                     "proto": "udp",
896                     "srcip4": "152.16.100.20",
897                     "ttl": 32
898                 },
899                 "outer_l3v4": {
900                     "dscp": 0,
901                     "dstip4": "152.16.40.20",
902                     "proto": "udp",
903                     "srcip4": "152.16.100.20",
904                     "ttl": 32
905                 },
906                 "outer_l3v6": {
907                     "count": 1024,
908                     "dscp": 0,
909                     "dstip4": "152.16.100.20",
910                     "proto": "udp",
911                     "srcip4": "152.16.40.20",
912                     "ttl": 32
913                 },
914                 "outer_l4": {
915                     "dstport": "2001",
916                     "srcport": "1234"
917                 },
918                 "traffic_type": "continuous"
919             },
920             "downlink_0": {
921                 "id": 2,
922                 "bidir": "False",
923                 "duration": 60,
924                 "iload": "100",
925                 "outer_l3": {
926                     "count": 1024,
927                     "dscp": 0,
928                     "dstip4": "152.16.100.20",
929                     "proto": "udp",
930                     "srcip4": "152.16.40.20",
931                     "ttl": 32
932                 },
933                 "outer_l3v4": {
934                     "count": 1024,
935                     "dscp": 0,
936                     "dstip4": "152.16.100.20",
937                     "proto": "udp",
938                     "srcip4": "152.16.40.20",
939                     "ttl": 32
940                 },
941                 "outer_l3v6": {
942                     "count": 1024,
943                     "dscp": 0,
944                     "dstip4": "152.16.100.20",
945                     "proto": "udp",
946                     "srcip4": "152.16.40.20",
947                     "ttl": 32
948                 },
949                 "outer_l4": {
950                     "dstport": "1234",
951                     "srcport": "2001"
952                 },
953                 "traffic_type": "continuous"
954             }
955         }
956
957         self.ixnet.setMultiAttribute.return_value = [1]
958         self.ixnet.commit.return_value = [1]
959         self.ixnet.getList.side_effect = [
960             [1],
961             [1],
962             [1],
963             [
964                 "ethernet.header.destinationAddress",
965                 "ethernet.header.sourceAddress",
966             ],
967         ]
968
969         ixnet_gen = IxNet.IxNextgen(self.ixnet)
970
971         result = ixnet_gen.ix_update_ether(static_traffic_params)
972         self.assertIsNone(result)
973         self.ixnet.setMultiAttribute.assert_not_called()