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