0c82d74a85ff3cc513bd500d9abfd2db023989d2
[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 UPLINK = "uplink"
30 DOWNLINK = "downlink"
31
32 class TestIxNextgen(unittest.TestCase):
33
34     def test___init__(self):
35         ixnet_gen = IxNextgen()
36         self.assertIsNone(ixnet_gen._bidir)
37
38     @mock.patch("yardstick.network_services.libs.ixia_libs.IxNet.IxNet.sys")
39     def test_connect(self, mock_sys):
40
41         ixnet_gen = IxNextgen()
42         ixnet_gen.get_config = mock.MagicMock()
43         ixnet_gen.get_ixnet = mock.MagicMock()
44
45         self.assertRaises(ImportError, ixnet_gen._connect, {"py_lib_path": "/tmp"})
46
47     def test_clear_ixia_config(self):
48         ixnet = mock.MagicMock()
49         ixnet.execute = mock.Mock()
50
51         ixnet_gen = IxNextgen(ixnet)
52
53         result = ixnet_gen.clear_ixia_config()
54         self.assertIsNone(result)
55         self.assertEqual(ixnet.execute.call_count, 1)
56
57     def test_load_ixia_profile(self):
58         ixnet = mock.MagicMock()
59         ixnet.execute = mock.Mock()
60
61         ixnet_gen = IxNextgen(ixnet)
62
63         result = ixnet_gen.load_ixia_profile({})
64         self.assertIsNone(result)
65         self.assertEqual(ixnet.execute.call_count, 1)
66
67     def test_load_ixia_config(self):
68         ixnet = mock.MagicMock()
69         ixnet.execute = mock.Mock()
70
71         ixnet_gen = IxNextgen(ixnet)
72
73         result = ixnet_gen.ix_load_config({})
74         self.assertIsNone(result)
75         self.assertEqual(ixnet.execute.call_count, 2)
76
77     @mock.patch('yardstick.network_services.libs.ixia_libs.IxNet.IxNet.log')
78     def test_ix_assign_ports(self, mock_logger):
79         ixnet = mock.MagicMock()
80         ixnet.getList.return_value = [0, 1]
81         ixnet.getAttribute.side_effect = ['up', 'down']
82
83         config = {
84             'chassis': '1.1.1.1',
85             'card1': '1',
86             'card2': '2',
87             'port1': '2',
88             'port2': '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         mock1 = mock.Mock()
636         mock2 = mock.Mock()
637         mock3 = mock.Mock()
638         with self.assertRaises(ValueError):
639             ixnet_gen.set_random_ip_multi_attributes(mock1, bad_ip_version, mock2, mock3)
640
641     def test_get_config(self):
642         tg_cfg = {
643             "vdu": [
644                 {
645                     "external-interface": [
646                         {
647                             "virtual-interface": {
648                                 "vpci": "0000:07:00.1",
649                             },
650                         },
651                         {
652                             "virtual-interface": {
653                                 "vpci": "0001:08:01.2",
654                             },
655                         },
656                     ],
657                 },
658             ],
659             "mgmt-interface": {
660                 "ip": "test1",
661                 "tg-config": {
662                     "dut_result_dir": "test2",
663                     "version": "test3",
664                     "ixchassis": "test4",
665                     "tcl_port": "test5",
666                     "py_lib_path": "test6",
667                 },
668             }
669         }
670
671         expected = {
672             'py_lib_path': 'test6',
673             'machine': 'test1',
674             'port': 'test5',
675             'chassis': 'test4',
676             'card1': '0000',
677             'port1': '07',
678             'card2': '0001',
679             'port2': '08',
680             'output_dir': 'test2',
681             'version': 'test3',
682             'bidir': True,
683         }
684
685         result = IxNextgen.get_config(tg_cfg)
686         self.assertDictEqual(result, expected)
687
688     def test_ix_update_ether(self):
689         static_traffic_params = {
690             "uplink_0": {
691                 "id": 1,
692                 "bidir": "False",
693                 "duration": 60,
694                 "iload": "100",
695                 "outer_l2": {
696                     "dstmac": "00:00:00:00:00:03",
697                     "framesPerSecond": True,
698                     "framesize": 64,
699                     "srcmac": "00:00:00:00:00:01"
700                 },
701                 "outer_l3": {
702                     "dscp": 0,
703                     "dstip4": "152.16.40.20",
704                     "proto": "udp",
705                     "srcip4": "152.16.100.20",
706                     "ttl": 32
707                 },
708                 "outer_l3v4": {
709                     "dscp": 0,
710                     "dstip4": "152.16.40.20",
711                     "proto": "udp",
712                     "srcip4": "152.16.100.20",
713                     "ttl": 32
714                 },
715                 "outer_l3v6": {
716                     "count": 1024,
717                     "dscp": 0,
718                     "dstip4": "152.16.100.20",
719                     "proto": "udp",
720                     "srcip4": "152.16.40.20",
721                     "ttl": 32
722                 },
723                 "outer_l4": {
724                     "dstport": "2001",
725                     "srcport": "1234"
726                 },
727                 "traffic_type": "continuous"
728             },
729             "downlink_0": {
730                 "id": 2,
731                 "bidir": "False",
732                 "duration": 60,
733                 "iload": "100",
734                 "outer_l2": {
735                     "dstmac": "00:00:00:00:00:04",
736                     "framesPerSecond": True,
737                     "framesize": 64,
738                     "srcmac": "00:00:00:00:00:01"
739                 },
740                 "outer_l3": {
741                     "count": 1024,
742                     "dscp": 0,
743                     "dstip4": "152.16.100.20",
744                     "proto": "udp",
745                     "srcip4": "152.16.40.20",
746                     "ttl": 32
747                 },
748                 "outer_l3v4": {
749                     "count": 1024,
750                     "dscp": 0,
751                     "dstip4": "152.16.100.20",
752                     "proto": "udp",
753                     "srcip4": "152.16.40.20",
754                     "ttl": 32
755                 },
756                 "outer_l3v6": {
757                     "count": 1024,
758                     "dscp": 0,
759                     "dstip4": "152.16.100.20",
760                     "proto": "udp",
761                     "srcip4": "152.16.40.20",
762                     "ttl": 32
763                 },
764                 "outer_l4": {
765                     "dstport": "1234",
766                     "srcport": "2001"
767                 },
768                 "traffic_type": "continuous"
769             }
770         }
771
772         ixnet = mock.MagicMock()
773         ixnet.setMultiAttribute.return_value = [1]
774         ixnet.commit.return_value = [1]
775         ixnet.getList.side_effect = [
776             [1],
777             [1],
778             [1],
779             [
780                 "ethernet.header.destinationAddress",
781                 "ethernet.header.sourceAddress",
782             ],
783         ]
784
785         ixnet_gen = IxNextgen(ixnet)
786
787         result = ixnet_gen.ix_update_ether(static_traffic_params)
788         self.assertIsNone(result)
789         self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
790
791     def test_ix_update_ether_nothing_to_do(self):
792         static_traffic_params = {
793             "uplink_0": {
794                 "id": 1,
795                 "bidir": "False",
796                 "duration": 60,
797                 "iload": "100",
798                 "outer_l3": {
799                     "dscp": 0,
800                     "dstip4": "152.16.40.20",
801                     "proto": "udp",
802                     "srcip4": "152.16.100.20",
803                     "ttl": 32
804                 },
805                 "outer_l3v4": {
806                     "dscp": 0,
807                     "dstip4": "152.16.40.20",
808                     "proto": "udp",
809                     "srcip4": "152.16.100.20",
810                     "ttl": 32
811                 },
812                 "outer_l3v6": {
813                     "count": 1024,
814                     "dscp": 0,
815                     "dstip4": "152.16.100.20",
816                     "proto": "udp",
817                     "srcip4": "152.16.40.20",
818                     "ttl": 32
819                 },
820                 "outer_l4": {
821                     "dstport": "2001",
822                     "srcport": "1234"
823                 },
824                 "traffic_type": "continuous"
825             },
826             "downlink_0": {
827                 "id": 2,
828                 "bidir": "False",
829                 "duration": 60,
830                 "iload": "100",
831                 "outer_l3": {
832                     "count": 1024,
833                     "dscp": 0,
834                     "dstip4": "152.16.100.20",
835                     "proto": "udp",
836                     "srcip4": "152.16.40.20",
837                     "ttl": 32
838                 },
839                 "outer_l3v4": {
840                     "count": 1024,
841                     "dscp": 0,
842                     "dstip4": "152.16.100.20",
843                     "proto": "udp",
844                     "srcip4": "152.16.40.20",
845                     "ttl": 32
846                 },
847                 "outer_l3v6": {
848                     "count": 1024,
849                     "dscp": 0,
850                     "dstip4": "152.16.100.20",
851                     "proto": "udp",
852                     "srcip4": "152.16.40.20",
853                     "ttl": 32
854                 },
855                 "outer_l4": {
856                     "dstport": "1234",
857                     "srcport": "2001"
858                 },
859                 "traffic_type": "continuous"
860             }
861         }
862
863         ixnet = mock.MagicMock()
864         ixnet.setMultiAttribute.return_value = [1]
865         ixnet.commit.return_value = [1]
866         ixnet.getList.side_effect = [
867             [1],
868             [1],
869             [1],
870             [
871                 "ethernet.header.destinationAddress",
872                 "ethernet.header.sourceAddress",
873             ],
874         ]
875
876         ixnet_gen = IxNextgen(ixnet)
877
878         result = ixnet_gen.ix_update_ether(static_traffic_params)
879         self.assertIsNone(result)
880         self.assertEqual(ixnet.setMultiAttribute.call_count, 0)