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