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