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