Merge "Document for Euphrates test case results"
[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
16 import mock
17 import IxNetwork
18 import unittest
19
20 from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IxNextgen
21 from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_4
22 from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_6
23
24 UPLINK = "uplink"
25 DOWNLINK = "downlink"
26
27
28 class TestIxNextgen(unittest.TestCase):
29
30     def test___init__(self):
31         ixnet_gen = IxNextgen()
32         self.assertIsNone(ixnet_gen._bidir)
33
34     @mock.patch.object(IxNetwork, 'IxNet')
35     def test_connect(self, mock_ixnet):
36         ixnet_instance = mock.Mock()
37         mock_ixnet.return_value = ixnet_instance
38         ixnet_gen = IxNextgen()
39         with mock.patch.object(ixnet_gen, 'get_config') as mock_config:
40             mock_config.return_value = {'machine': 'machine_fake',
41                                         'port': 'port_fake',
42                                         'version': 12345}
43             ixnet_gen._connect(mock.ANY)
44
45         ixnet_instance.connect.assert_called_once_with(
46             'machine_fake', '-port', 'port_fake', '-version', '12345')
47         mock_config.assert_called_once()
48
49     def test_clear_ixia_config(self):
50         ixnet = mock.MagicMock()
51         ixnet.execute = mock.Mock()
52
53         ixnet_gen = IxNextgen(ixnet)
54
55         result = ixnet_gen.clear_ixia_config()
56         self.assertIsNone(result)
57         self.assertEqual(ixnet.execute.call_count, 1)
58
59     def test_load_ixia_profile(self):
60         ixnet = mock.MagicMock()
61         ixnet.execute = mock.Mock()
62
63         ixnet_gen = IxNextgen(ixnet)
64
65         result = ixnet_gen.load_ixia_profile({})
66         self.assertIsNone(result)
67         self.assertEqual(ixnet.execute.call_count, 1)
68
69     def test_load_ixia_config(self):
70         ixnet = mock.MagicMock()
71         ixnet.execute = mock.Mock()
72
73         ixnet_gen = IxNextgen(ixnet)
74
75         result = ixnet_gen.ix_load_config({})
76         self.assertIsNone(result)
77         self.assertEqual(ixnet.execute.call_count, 2)
78
79     @mock.patch('yardstick.network_services.libs.ixia_libs.IxNet.IxNet.log')
80     def test_ix_assign_ports(self, mock_logger):
81         ixnet = mock.MagicMock()
82         ixnet.getList.return_value = [0, 1]
83         ixnet.getAttribute.side_effect = ['up', 'down']
84
85         config = {
86             'chassis': '1.1.1.1',
87             'cards': ['1', '2'],
88             'ports': ['2', '2'],
89         }
90
91         ixnet_gen = IxNextgen(ixnet)
92         ixnet_gen._cfg = config
93
94         result = ixnet_gen.ix_assign_ports()
95         self.assertIsNone(result)
96         self.assertEqual(ixnet.execute.call_count, 1)
97         self.assertEqual(ixnet.commit.call_count, 1)
98         self.assertEqual(ixnet.getAttribute.call_count, 2)
99         self.assertEqual(mock_logger.error.call_count, 1)
100
101     def test_ix_update_frame(self):
102         static_traffic_params = {
103             UPLINK: {
104                 "id": 1,
105                 "bidir": "False",
106                 "duration": 60,
107                 "iload": "100",
108                 "outer_l2": {
109                     "dstmac": "00:00:00:00:00:03",
110                     "framesPerSecond": True,
111                     "framesize": {
112                         "64B": "100",
113                         "1KB": "0",
114                     },
115                     "srcmac": "00:00:00:00:00:01"
116                 },
117                 "outer_l3": {
118                     "dscp": 0,
119                     "dstip4": "152.16.40.20",
120                     "proto": "udp",
121                     "srcip4": "152.16.100.20",
122                     "ttl": 32
123                 },
124                 "outer_l3v4": {
125                     "dscp": 0,
126                     "dstip4": "152.16.40.20",
127                     "proto": "udp",
128                     "srcip4": "152.16.100.20",
129                     "ttl": 32
130                 },
131                 "outer_l3v6": {
132                     "count": 1024,
133                     "dscp": 0,
134                     "dstip4": "152.16.100.20",
135                     "proto": "udp",
136                     "srcip4": "152.16.40.20",
137                     "ttl": 32
138                 },
139                 "outer_l4": {
140                     "dstport": "2001",
141                     "srcport": "1234"
142                 },
143                 "traffic_type": "continuous"
144             },
145             DOWNLINK: {
146                 "id": 2,
147                 "bidir": "False",
148                 "duration": 60,
149                 "iload": "100",
150                 "outer_l2": {
151                     "dstmac": "00:00:00:00:00:04",
152                     "framesPerSecond": False,
153                     "framesize": {"64B": "100"},
154                     "srcmac": "00:00:00:00:00:01"
155                 },
156                 "outer_l3": {
157                     "count": 1024,
158                     "dscp": 0,
159                     "dstip4": "152.16.100.20",
160                     "proto": "udp",
161                     "srcip4": "152.16.40.20",
162                     "ttl": 32
163                 },
164                 "outer_l3v4": {
165                     "count": 1024,
166                     "dscp": 0,
167                     "dstip4": "152.16.100.20",
168                     "proto": "udp",
169                     "srcip4": "152.16.40.20",
170                     "ttl": 32
171                 },
172                 "outer_l3v6": {
173                     "count": 1024,
174                     "dscp": 0,
175                     "dstip4": "152.16.100.20",
176                     "proto": "udp",
177                     "srcip4": "152.16.40.20",
178                     "ttl": 32
179                 },
180                 "outer_l4": {
181                     "dstport": "1234",
182                     "srcport": "2001"
183                 },
184                 "traffic_type": "continuous"
185             }
186         }
187
188         ixnet = mock.MagicMock()
189         ixnet.remapIds.return_value = ["0"]
190         ixnet.setMultiAttribute.return_value = [1]
191         ixnet.commit.return_value = [1]
192         ixnet.getList.side_effect = [
193             [1],
194             [1],
195             [1],
196             [
197                 "ethernet.header.destinationAddress",
198                 "ethernet.header.sourceAddress",
199             ],
200         ]
201
202         ixnet_gen = IxNextgen(ixnet)
203
204         result = ixnet_gen.ix_update_frame(static_traffic_params)
205         self.assertIsNone(result)
206         self.assertEqual(ixnet.setMultiAttribute.call_count, 7)
207         self.assertEqual(ixnet.commit.call_count, 2)
208
209     def test_ix_update_udp(self):
210         ixnet = mock.MagicMock()
211
212         ixnet_gen = IxNextgen(ixnet)
213
214         result = ixnet_gen.ix_update_udp({})
215         self.assertIsNone(result)
216
217     def test_ix_update_tcp(self):
218         ixnet = mock.MagicMock()
219         ixnet_gen = IxNextgen(ixnet)
220
221         result = ixnet_gen.ix_update_tcp({})
222         self.assertIsNone(result)
223
224     def test_ix_start_traffic(self):
225         ixnet = mock.MagicMock()
226         ixnet.getList.return_value = [0]
227         ixnet.getAttribute.return_value = 'down'
228
229         ixnet_gen = IxNextgen(ixnet)
230
231         result = ixnet_gen.ix_start_traffic()
232         self.assertIsNone(result)
233         self.assertEqual(ixnet.getList.call_count, 1)
234         self.assertEqual(ixnet.execute.call_count, 3)
235
236     def test_ix_stop_traffic(self):
237         ixnet = mock.MagicMock()
238         ixnet.getList.return_value = [0]
239
240         ixnet_gen = IxNextgen(ixnet)
241
242         result = ixnet_gen.ix_stop_traffic()
243         self.assertIsNone(result)
244         self.assertEqual(ixnet.getList.call_count, 1)
245         self.assertEqual(ixnet.execute.call_count, 1)
246
247     def test_ix_get_statistics(self):
248         ixnet = mock.MagicMock()
249         ixnet.execute.return_value = ""
250         ixnet.getList.side_effect = [
251             [
252                 '::ixNet::OBJ-/statistics/view:"Traffic Item Statistics"',
253                 '::ixNet::OBJ-/statistics/view:"Port Statistics"',
254             ],
255             [
256                 '::ixNet::OBJ-/statistics/view:"Flow Statistics"',
257             ],
258         ]
259
260         ixnet_gen = IxNextgen(ixnet)
261
262         result = ixnet_gen.ix_get_statistics()
263         self.assertIsNotNone(result)
264         self.assertEqual(ixnet.getList.call_count, 1)
265         self.assertEqual(ixnet.execute.call_count, 20)
266
267     def test_find_view_obj_no_where(self):
268         views = ['here', 'there', 'everywhere']
269         result = IxNextgen.find_view_obj('no_where', views)
270         self.assertEqual(result, '')
271
272     def test_add_ip_header_v4(self):
273         static_traffic_params = {
274             "uplink_0": {
275                 "id": 1,
276                 "bidir": "False",
277                 "duration": 60,
278                 "iload": "100",
279                 "outer_l2": {
280                     "dstmac": "00:00:00:00:00:03",
281                     "framesPerSecond": True,
282                     "framesize": {"64B": "100"},
283                     "srcmac": "00:00:00:00:00:01"
284                 },
285                 "outer_l3": {
286                     "dscp": 0,
287                     "dstip4": "152.16.40.20",
288                     "proto": "udp",
289                     "srcip4": "152.16.100.20",
290                     "count": 1024,
291                     "ttl": 32
292                 },
293                 "outer_l3v4": {
294                     "dscp": 0,
295                     "dstip4": "152.16.40.20",
296                     "proto": "udp",
297                     "srcip4": "152.16.100.20",
298                     "ttl": 32
299                 },
300                 "outer_l3v6": {
301                     "count": 1024,
302                     "dscp": 0,
303                     "dstip4": "152.16.100.20",
304                     "proto": "udp",
305                     "srcip4": "152.16.40.20",
306                     "ttl": 32
307                 },
308                 "outer_l4": {
309                     "dstport": "2001",
310                     "srcport": "1234"
311                 },
312                 "traffic_type": "continuous"
313             },
314             "downlink_0": {
315                 "id": 2,
316                 "bidir": "False",
317                 "duration": 60,
318                 "iload": "100",
319                 "outer_l2": {
320                     "dstmac": "00:00:00:00:00:04",
321                     "framesPerSecond": True,
322                     "framesize": {"64B": "100"},
323                     "srcmac": "00:00:00:00:00:01"
324                 },
325                 "outer_l3": {
326                     "count": 1024,
327                     "dscp": 0,
328                     "dstip4": "152.16.100.20",
329                     "proto": "udp",
330                     "srcip4": "152.16.40.20",
331                     "ttl": 32
332                 },
333                 "outer_l3v4": {
334                     "count": 1024,
335                     "dscp": 0,
336                     "dstip4": "152.16.100.20",
337                     "proto": "udp",
338                     "srcip4": "152.16.40.20",
339                     "ttl": 32
340                 },
341                 "outer_l3v6": {
342                     "count": 1024,
343                     "dscp": 0,
344                     "dstip4": "152.16.100.20",
345                     "proto": "udp",
346                     "srcip4": "152.16.40.20",
347                     "ttl": 32
348                 },
349                 "outer_l4": {
350                     "dstport": "1234",
351                     "srcport": "2001"
352                 },
353                 "traffic_type": "continuous"
354             }
355         }
356
357         ixnet = mock.MagicMock()
358         ixnet.remapIds.return_value = ["0"]
359         ixnet.setMultiAttribute.return_value = [1]
360         ixnet.commit.return_value = [1]
361         ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]]
362
363         ixnet_gen = IxNextgen(ixnet)
364
365         result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
366         self.assertIsNone(result)
367         self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
368         self.assertEqual(ixnet.commit.call_count, 1)
369
370     def test_add_ip_header_v4_nothing_to_do(self):
371         static_traffic_params = {
372             "uplink_0": {
373                 "id": 1,
374                 "bidir": "False",
375                 "duration": 60,
376                 "iload": "100",
377                 "outer_l2": {
378                     "dstmac": "00:00:00:00:00:03",
379                     "framesPerSecond": True,
380                     "framesize": {"64B": "100"},
381                     "srcmac": "00:00:00:00:00:01"
382                 },
383                 "outer_l3": {
384                     "dscp": 0,
385                     "dstip4": "152.16.40.20",
386                     "proto": "udp",
387                     "srcip4": "152.16.100.20",
388                     "count": 1024,
389                     "ttl": 32
390                 },
391                 "outer_l3v4": {
392                     "dscp": 0,
393                     "dstip4": "152.16.40.20",
394                     "proto": "udp",
395                     "srcip4": "152.16.100.20",
396                     "ttl": 32
397                 },
398                 "outer_l3v6": {
399                     "count": 1024,
400                     "dscp": 0,
401                     "dstip4": "152.16.100.20",
402                     "proto": "udp",
403                     "srcip4": "152.16.40.20",
404                     "ttl": 32
405                 },
406                 "outer_l4": {
407                     "dstport": "2001",
408                     "srcport": "1234"
409                 },
410                 "traffic_type": "continuous"
411             },
412             "downlink_0": {
413                 "id": 2,
414                 "bidir": "False",
415                 "duration": 60,
416                 "iload": "100",
417                 "outer_l2": {
418                     "dstmac": "00:00:00:00:00:04",
419                     "framesPerSecond": True,
420                     "framesize": {"64B": "100"},
421                     "srcmac": "00:00:00:00:00:01"
422                 },
423                 "outer_l3": {
424                     "count": 1024,
425                     "dscp": 0,
426                     "dstip4": "152.16.100.20",
427                     "proto": "udp",
428                     "srcip4": "152.16.40.20",
429                     "ttl": 32
430                 },
431                 "outer_l3v4": {
432                     "count": 1024,
433                     "dscp": 0,
434                     "dstip4": "152.16.100.20",
435                     "proto": "udp",
436                     "srcip4": "152.16.40.20",
437                     "ttl": 32
438                 },
439                 "outer_l3v6": {
440                     "count": 1024,
441                     "dscp": 0,
442                     "dstip4": "152.16.100.20",
443                     "proto": "udp",
444                     "srcip4": "152.16.40.20",
445                     "ttl": 32
446                 },
447                 "outer_l4": {
448                     "dstport": "1234",
449                     "srcport": "2001"
450                 },
451                 "traffic_type": "continuous"
452             }
453         }
454
455         ixnet = mock.MagicMock()
456         ixnet.remapIds.return_value = ["0"]
457         ixnet.setMultiAttribute.return_value = [1]
458         ixnet.commit.return_value = [1]
459         ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]]
460
461         ixnet_gen = IxNextgen(ixnet)
462
463         result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
464         self.assertIsNone(result)
465         self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
466         self.assertEqual(ixnet.commit.call_count, 1)
467
468     def test_add_ip_header_v6(self):
469         static_traffic_profile = {
470             "uplink_0": {
471                 "id": 1,
472                 "bidir": "False",
473                 "duration": 60,
474                 "iload": "100",
475                 "outer_l2": {
476                     "dstmac": "00:00:00:00:00:03",
477                     "framesPerSecond": True,
478                     "framesize": {"64B": "100"},
479                     "srcmac": "00:00:00:00:00:01"
480                 },
481                 "outer_l3": {
482                     "count": 1024,
483                     "dscp": 0,
484                     "dstip4": "152.16.40.20",
485                     "proto": "udp",
486                     "srcip4": "152.16.100.20",
487                     "ttl": 32
488                 },
489                 "outer_l3v6": {
490                     "count": 1024,
491                     "dscp": 0,
492                     "dstip4": "152.16.100.20",
493                     "proto": "udp",
494                     "srcip4": "152.16.40.20",
495                     "ttl": 32
496                 },
497                 "outer_l4": {
498                     "dstport": "2001",
499                     "srcport": "1234"
500                 },
501                 "traffic_type": "continuous"
502             },
503             "downlink_0": {
504                 "id": 2,
505                 "bidir": "False",
506                 "duration": 60,
507                 "iload": "100",
508                 "outer_l2": {
509                     "dstmac": "00:00:00:00:00:04",
510                     "framesPerSecond": True,
511                     "framesize": {"64B": "100"},
512                     "srcmac": "00:00:00:00:00:01"
513                 },
514                 "outer_l3": {
515                     "count": 1024,
516                     "dscp": 0,
517                     "dstip4": "152.16.100.20",
518                     "proto": "udp",
519                     "srcip4": "152.16.40.20",
520                     "ttl": 32
521                 },
522                 "outer_l3v6": {
523                     "count": 1024,
524                     "dscp": 0,
525                     "dstip4": "152.16.100.20",
526                     "proto": "udp",
527                     "srcip4": "152.16.40.20",
528                     "ttl": 32
529                 },
530                 "outer_l4": {
531                     "dstport": "1234",
532                     "srcport": "2001"
533                 },
534                 "traffic_type": "continuous"
535             }
536         }
537
538         ixnet = mock.MagicMock()
539         ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]]
540         ixnet.remapIds.return_value = ["0"]
541         ixnet.setMultiAttribute.return_value = [1]
542         ixnet.commit.return_value = [1]
543
544         ixnet_gen = IxNextgen(ixnet)
545
546         result = ixnet_gen.add_ip_header(static_traffic_profile, IP_VERSION_6)
547         self.assertIsNone(result)
548         self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
549         self.assertEqual(ixnet.commit.call_count, 1)
550
551     def test_add_ip_header_v6_nothing_to_do(self):
552         static_traffic_params = {
553             "uplink_0": {
554                 "id": 1,
555                 "bidir": "False",
556                 "duration": 60,
557                 "iload": "100",
558                 "outer_l2": {
559                     "dstmac": "00:00:00:00:00:03",
560                     "framesPerSecond": True,
561                     "framesize": {"64B": "100"},
562                     "srcmac": "00:00:00:00:00:01"
563                 },
564                 "outer_l3": {
565                     "dscp": 0,
566                     "dstip4": "152.16.40.20",
567                     "proto": "udp",
568                     "srcip4": "152.16.100.20",
569                     "count": 1024,
570                     "ttl": 32
571                 },
572                 "outer_l3v6": {
573                     "dscp": 0,
574                     "dstip4": "152.16.40.20",
575                     "proto": "udp",
576                     "srcip4": "152.16.100.20",
577                     "ttl": 32
578                 },
579                 "outer_l4": {
580                     "dstport": "2001",
581                     "srcport": "1234"
582                 },
583                 "traffic_type": "continuous"
584             },
585             "downlink_0": {
586                 "id": 2,
587                 "bidir": "False",
588                 "duration": 60,
589                 "iload": "100",
590                 "outer_l2": {
591                     "dstmac": "00:00:00:00:00:04",
592                     "framesPerSecond": True,
593                     "framesize": {"64B": "100"},
594                     "srcmac": "00:00:00:00:00:01"
595                 },
596                 "outer_l3": {
597                     "count": 1024,
598                     "dscp": 0,
599                     "dstip4": "152.16.100.20",
600                     "proto": "udp",
601                     "srcip4": "152.16.40.20",
602                     "ttl": 32
603                 },
604                 "outer_l3v6": {
605                     "count": 1024,
606                     "dscp": 0,
607                     "dstip4": "152.16.100.20",
608                     "proto": "udp",
609                     "srcip4": "152.16.40.20",
610                     "ttl": 32
611                 },
612                 "outer_l4": {
613                     "dstport": "1234",
614                     "srcport": "2001"
615                 },
616                 "traffic_type": "continuous"
617             }
618         }
619
620         ixnet = mock.MagicMock()
621         ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]]
622         ixnet.remapIds.return_value = ["0"]
623         ixnet.setMultiAttribute.return_value = [1]
624         ixnet.commit.return_value = [1]
625
626         ixnet_gen = IxNextgen(ixnet)
627
628         result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_6)
629         self.assertIsNone(result)
630         self.assertEqual(ixnet.setMultiAttribute.call_count, 0)
631
632     def test_set_random_ip_multi_attributes_bad_ip_version(self):
633         bad_ip_version = object()
634         ixnet_gen = IxNextgen(mock.Mock())
635         with self.assertRaises(ValueError):
636             ixnet_gen.set_random_ip_multi_attributes(
637                 mock.Mock(), bad_ip_version, mock.Mock(), mock.Mock())
638
639     def test_get_config(self):
640         tg_cfg = {
641             "vdu": [
642                 {
643                     "external-interface": [
644                         {
645                             "virtual-interface": {
646                                 "vpci": "0000:07:00.1",
647                             },
648                         },
649                         {
650                             "virtual-interface": {
651                                 "vpci": "0001:08:01.2",
652                             },
653                         },
654                     ],
655                 },
656             ],
657             "mgmt-interface": {
658                 "ip": "test1",
659                 "tg-config": {
660                     "dut_result_dir": "test2",
661                     "version": "test3",
662                     "ixchassis": "test4",
663                     "tcl_port": "test5",
664                 },
665             }
666         }
667
668         expected = {
669             'machine': 'test1',
670             'port': 'test5',
671             'chassis': 'test4',
672             'cards': ['0000', '0001'],
673             'ports': ['07', '08'],
674             'output_dir': 'test2',
675             'version': 'test3',
676             'bidir': True,
677         }
678
679         result = IxNextgen.get_config(tg_cfg)
680         self.assertDictEqual(result, expected)
681
682     def test_ix_update_ether(self):
683         static_traffic_params = {
684             "uplink_0": {
685                 "id": 1,
686                 "bidir": "False",
687                 "duration": 60,
688                 "iload": "100",
689                 "outer_l2": {
690                     "dstmac": "00:00:00:00:00:03",
691                     "framesPerSecond": True,
692                     "framesize": 64,
693                     "srcmac": "00:00:00:00:00:01"
694                 },
695                 "outer_l3": {
696                     "dscp": 0,
697                     "dstip4": "152.16.40.20",
698                     "proto": "udp",
699                     "srcip4": "152.16.100.20",
700                     "ttl": 32
701                 },
702                 "outer_l3v4": {
703                     "dscp": 0,
704                     "dstip4": "152.16.40.20",
705                     "proto": "udp",
706                     "srcip4": "152.16.100.20",
707                     "ttl": 32
708                 },
709                 "outer_l3v6": {
710                     "count": 1024,
711                     "dscp": 0,
712                     "dstip4": "152.16.100.20",
713                     "proto": "udp",
714                     "srcip4": "152.16.40.20",
715                     "ttl": 32
716                 },
717                 "outer_l4": {
718                     "dstport": "2001",
719                     "srcport": "1234"
720                 },
721                 "traffic_type": "continuous"
722             },
723             "downlink_0": {
724                 "id": 2,
725                 "bidir": "False",
726                 "duration": 60,
727                 "iload": "100",
728                 "outer_l2": {
729                     "dstmac": "00:00:00:00:00:04",
730                     "framesPerSecond": True,
731                     "framesize": 64,
732                     "srcmac": "00:00:00:00:00:01"
733                 },
734                 "outer_l3": {
735                     "count": 1024,
736                     "dscp": 0,
737                     "dstip4": "152.16.100.20",
738                     "proto": "udp",
739                     "srcip4": "152.16.40.20",
740                     "ttl": 32
741                 },
742                 "outer_l3v4": {
743                     "count": 1024,
744                     "dscp": 0,
745                     "dstip4": "152.16.100.20",
746                     "proto": "udp",
747                     "srcip4": "152.16.40.20",
748                     "ttl": 32
749                 },
750                 "outer_l3v6": {
751                     "count": 1024,
752                     "dscp": 0,
753                     "dstip4": "152.16.100.20",
754                     "proto": "udp",
755                     "srcip4": "152.16.40.20",
756                     "ttl": 32
757                 },
758                 "outer_l4": {
759                     "dstport": "1234",
760                     "srcport": "2001"
761                 },
762                 "traffic_type": "continuous"
763             }
764         }
765
766         ixnet = mock.MagicMock()
767         ixnet.setMultiAttribute.return_value = [1]
768         ixnet.commit.return_value = [1]
769         ixnet.getList.side_effect = [
770             [1],
771             [1],
772             [1],
773             [
774                 "ethernet.header.destinationAddress",
775                 "ethernet.header.sourceAddress",
776             ],
777         ]
778
779         ixnet_gen = IxNextgen(ixnet)
780
781         result = ixnet_gen.ix_update_ether(static_traffic_params)
782         self.assertIsNone(result)
783         self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
784
785     def test_ix_update_ether_nothing_to_do(self):
786         static_traffic_params = {
787             "uplink_0": {
788                 "id": 1,
789                 "bidir": "False",
790                 "duration": 60,
791                 "iload": "100",
792                 "outer_l3": {
793                     "dscp": 0,
794                     "dstip4": "152.16.40.20",
795                     "proto": "udp",
796                     "srcip4": "152.16.100.20",
797                     "ttl": 32
798                 },
799                 "outer_l3v4": {
800                     "dscp": 0,
801                     "dstip4": "152.16.40.20",
802                     "proto": "udp",
803                     "srcip4": "152.16.100.20",
804                     "ttl": 32
805                 },
806                 "outer_l3v6": {
807                     "count": 1024,
808                     "dscp": 0,
809                     "dstip4": "152.16.100.20",
810                     "proto": "udp",
811                     "srcip4": "152.16.40.20",
812                     "ttl": 32
813                 },
814                 "outer_l4": {
815                     "dstport": "2001",
816                     "srcport": "1234"
817                 },
818                 "traffic_type": "continuous"
819             },
820             "downlink_0": {
821                 "id": 2,
822                 "bidir": "False",
823                 "duration": 60,
824                 "iload": "100",
825                 "outer_l3": {
826                     "count": 1024,
827                     "dscp": 0,
828                     "dstip4": "152.16.100.20",
829                     "proto": "udp",
830                     "srcip4": "152.16.40.20",
831                     "ttl": 32
832                 },
833                 "outer_l3v4": {
834                     "count": 1024,
835                     "dscp": 0,
836                     "dstip4": "152.16.100.20",
837                     "proto": "udp",
838                     "srcip4": "152.16.40.20",
839                     "ttl": 32
840                 },
841                 "outer_l3v6": {
842                     "count": 1024,
843                     "dscp": 0,
844                     "dstip4": "152.16.100.20",
845                     "proto": "udp",
846                     "srcip4": "152.16.40.20",
847                     "ttl": 32
848                 },
849                 "outer_l4": {
850                     "dstport": "1234",
851                     "srcport": "2001"
852                 },
853                 "traffic_type": "continuous"
854             }
855         }
856
857         ixnet = mock.MagicMock()
858         ixnet.setMultiAttribute.return_value = [1]
859         ixnet.commit.return_value = [1]
860         ixnet.getList.side_effect = [
861             [1],
862             [1],
863             [1],
864             [
865                 "ethernet.header.destinationAddress",
866                 "ethernet.header.sourceAddress",
867             ],
868         ]
869
870         ixnet_gen = IxNextgen(ixnet)
871
872         result = ixnet_gen.ix_update_ether(static_traffic_params)
873         self.assertIsNone(result)
874         self.assertEqual(ixnet.setMultiAttribute.call_count, 0)