1 ##############################################################################
2 # Copyright (c) 2015 Ericsson AB and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
13 from oslo_serialization import jsonutils
15 from yardstick.benchmark.scenarios.networking import pktgen
16 from yardstick.common import exceptions as y_exc
19 @mock.patch('yardstick.benchmark.scenarios.networking.pktgen.ssh')
20 class PktgenTestCase(unittest.TestCase):
27 'key_filename': 'mykey.key'
32 'key_filename': 'mykey.key',
33 'ipaddr': '172.16.0.138'
37 def test_pktgen_successful_setup(self, mock_ssh):
40 'options': {'packetsize': 60},
42 p = pktgen.Pktgen(args, self.ctx)
45 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
46 self.assertIsNotNone(p.server)
47 self.assertIsNotNone(p.client)
48 self.assertTrue(p.setup_done)
50 def test_pktgen_successful_iptables_setup(self, mock_ssh):
53 'options': {'packetsize': 60, 'number_of_ports': 10},
55 p = pktgen.Pktgen(args, self.ctx)
56 p.server = mock_ssh.SSH.from_node()
57 p.number_of_ports = args['options']['number_of_ports']
59 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
63 mock_ssh.SSH.from_node().execute.assert_called_with(
65 "sudo iptables -A INPUT -p udp --dport 1000:%s -j DROP"
68 def test_pktgen_unsuccessful_iptables_setup(self, mock_ssh):
71 'options': {'packetsize': 60, 'number_of_ports': 10},
74 p = pktgen.Pktgen(args, self.ctx)
75 p.server = mock_ssh.SSH.from_node()
76 p.number_of_ports = args['options']['number_of_ports']
78 mock_ssh.SSH.from_node().execute.return_value = (1, '', 'FOOBAR')
79 self.assertRaises(RuntimeError, p._iptables_setup)
81 def test_pktgen_successful_iptables_get_result(self, mock_ssh):
84 'options': {'packetsize': 60, 'number_of_ports': 10},
87 p = pktgen.Pktgen(args, self.ctx)
88 p.server = mock_ssh.SSH.from_node()
89 p.number_of_ports = args['options']['number_of_ports']
91 mock_ssh.SSH.from_node().execute.return_value = (0, '150000', '')
92 p._iptables_get_result()
94 mock_ssh.SSH.from_node().execute.assert_called_with(
95 "sudo iptables -L INPUT -vnx |"
96 "awk '/dpts:1000:%s/ {{printf \"%%s\", $1}}'"
99 def test_pktgen_unsuccessful_iptables_get_result(self, mock_ssh):
102 'options': {'packetsize': 60, 'number_of_ports': 10},
105 p = pktgen.Pktgen(args, self.ctx)
107 p.server = mock_ssh.SSH.from_node()
108 p.number_of_ports = args['options']['number_of_ports']
110 mock_ssh.SSH.from_node().execute.return_value = (1, '', 'FOOBAR')
111 self.assertRaises(RuntimeError, p._iptables_get_result)
113 def test_pktgen_successful_no_sla(self, mock_ssh):
116 'options': {'packetsize': 60, 'number_of_ports': 10},
120 p = pktgen.Pktgen(args, self.ctx)
122 p.server = mock_ssh.SSH.from_node()
123 p.client = mock_ssh.SSH.from_node()
125 p._iptables_get_result = mock.Mock(return_value=149300)
127 sample_output = '{"packets_per_second": 9753, "errors": 0, \
128 "packets_sent": 149776, "packetsize": 60, "flows": 110, "ppm": 3179}'
129 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
132 expected_result = jsonutils.loads(sample_output)
133 expected_result["packets_received"] = 149300
134 expected_result["packetsize"] = 60
135 self.assertEqual(result, expected_result)
137 def test_pktgen_successful_sla(self, mock_ssh):
140 'options': {'packetsize': 60, 'number_of_ports': 10},
141 'sla': {'max_ppm': 10000}
145 p = pktgen.Pktgen(args, self.ctx)
147 p.server = mock_ssh.SSH.from_node()
148 p.client = mock_ssh.SSH.from_node()
150 p._iptables_get_result = mock.Mock(return_value=149300)
152 sample_output = '{"packets_per_second": 9753, "errors": 0, \
153 "packets_sent": 149776, "packetsize": 60, "flows": 110, "ppm": 3179}'
154 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
157 expected_result = jsonutils.loads(sample_output)
158 expected_result["packets_received"] = 149300
159 expected_result["packetsize"] = 60
160 self.assertEqual(result, expected_result)
162 def test_pktgen_unsuccessful_sla(self, mock_ssh):
165 'options': {'packetsize': 60, 'number_of_ports': 10},
166 'sla': {'max_ppm': 1000}
170 p = pktgen.Pktgen(args, self.ctx)
172 p.server = mock_ssh.SSH.from_node()
173 p.client = mock_ssh.SSH.from_node()
175 p._iptables_get_result = mock.Mock(return_value=149300)
177 sample_output = '{"packets_per_second": 9753, "errors": 0, \
178 "packets_sent": 149776, "packetsize": 60, "flows": 110}'
179 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
180 self.assertRaises(y_exc.SLAValidationError, p.run, result)
182 def test_pktgen_unsuccessful_script_error(self, mock_ssh):
185 'options': {'packetsize': 60, 'number_of_ports': 10},
186 'sla': {'max_ppm': 1000}
190 p = pktgen.Pktgen(args, self.ctx)
192 p.server = mock_ssh.SSH.from_node()
193 p.client = mock_ssh.SSH.from_node()
195 mock_ssh.SSH.from_node().execute.return_value = (1, '', 'FOOBAR')
196 self.assertRaises(RuntimeError, p.run, result)
198 def test_pktgen_get_vnic_driver_name(self, mock_ssh):
200 'options': {'packetsize': 60},
202 p = pktgen.Pktgen(args, self.ctx)
203 p.server = mock_ssh.SSH.from_node()
205 mock_ssh.SSH.from_node().execute.return_value = (0, 'ixgbevf', '')
207 vnic_driver_name = p._get_vnic_driver_name()
208 self.assertEqual(vnic_driver_name, 'ixgbevf')
210 def test_pktgen_unsuccessful_get_vnic_driver_name(self, mock_ssh):
212 'options': {'packetsize': 60},
214 p = pktgen.Pktgen(args, self.ctx)
215 p.server = mock_ssh.SSH.from_node()
217 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
219 self.assertRaises(RuntimeError, p._get_vnic_driver_name)
221 def test_pktgen_get_sriov_queue_number(self, mock_ssh):
223 'options': {'packetsize': 60},
225 p = pktgen.Pktgen(args, self.ctx)
226 p.server = mock_ssh.SSH.from_node()
228 mock_ssh.SSH.from_node().execute.return_value = (0, '2', '')
230 p.queue_number = p._get_sriov_queue_number()
231 self.assertEqual(p.queue_number, 2)
233 def test_pktgen_unsuccessful_get_sriov_queue_number(self, mock_ssh):
235 'options': {'packetsize': 60},
237 p = pktgen.Pktgen(args, self.ctx)
238 p.server = mock_ssh.SSH.from_node()
240 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
242 self.assertRaises(RuntimeError, p._get_sriov_queue_number)
244 def test_pktgen_get_available_queue_number(self, mock_ssh):
246 'options': {'packetsize': 60},
248 p = pktgen.Pktgen(args, self.ctx)
249 p.server = mock_ssh.SSH.from_node()
251 mock_ssh.SSH.from_node().execute.return_value = (0, '4', '')
253 p._get_available_queue_number()
255 mock_ssh.SSH.from_node().execute.assert_called_with(
256 "sudo ethtool -l eth0 | grep Combined | head -1 |"
259 def test_pktgen_unsuccessful_get_available_queue_number(self, mock_ssh):
261 'options': {'packetsize': 60},
263 p = pktgen.Pktgen(args, self.ctx)
264 p.server = mock_ssh.SSH.from_node()
266 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
268 self.assertRaises(RuntimeError, p._get_available_queue_number)
270 def test_pktgen_get_usable_queue_number(self, mock_ssh):
272 'options': {'packetsize': 60},
274 p = pktgen.Pktgen(args, self.ctx)
275 p.server = mock_ssh.SSH.from_node()
277 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
279 p._get_usable_queue_number()
281 mock_ssh.SSH.from_node().execute.assert_called_with(
282 "sudo ethtool -l eth0 | grep Combined | tail -1 |"
285 def test_pktgen_unsuccessful_get_usable_queue_number(self, mock_ssh):
287 'options': {'packetsize': 60},
289 p = pktgen.Pktgen(args, self.ctx)
290 p.server = mock_ssh.SSH.from_node()
292 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
294 self.assertRaises(RuntimeError, p._get_usable_queue_number)
296 def test_pktgen_enable_ovs_multiqueue(self, mock_ssh):
298 'options': {'packetsize': 60},
300 p = pktgen.Pktgen(args, self.ctx)
301 p.server = mock_ssh.SSH.from_node()
302 p.client = mock_ssh.SSH.from_node()
304 mock_ssh.SSH.from_node().execute.return_value = (0, '4', '')
306 p._get_usable_queue_number = mock.Mock(return_value=1)
307 p._get_available_queue_number = mock.Mock(return_value=4)
309 p.queue_number = p._enable_ovs_multiqueue()
310 self.assertEqual(p.queue_number, 4)
312 def test_pktgen_enable_ovs_multiqueue_1q(self, mock_ssh):
314 'options': {'packetsize': 60},
316 p = pktgen.Pktgen(args, self.ctx)
317 p.server = mock_ssh.SSH.from_node()
318 p.client = mock_ssh.SSH.from_node()
320 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
322 p._get_usable_queue_number = mock.Mock(return_value=1)
323 p._get_available_queue_number = mock.Mock(return_value=1)
325 p.queue_number = p._enable_ovs_multiqueue()
326 self.assertEqual(p.queue_number, 1)
328 def test_pktgen_unsuccessful_enable_ovs_multiqueue(self, mock_ssh):
330 'options': {'packetsize': 60},
332 p = pktgen.Pktgen(args, self.ctx)
333 p.server = mock_ssh.SSH.from_node()
334 p.client = mock_ssh.SSH.from_node()
336 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
338 p._get_usable_queue_number = mock.Mock(return_value=1)
339 p._get_available_queue_number = mock.Mock(return_value=4)
341 self.assertRaises(RuntimeError, p._enable_ovs_multiqueue)
343 def test_pktgen_setup_irqmapping_ovs(self, mock_ssh):
345 'options': {'packetsize': 60},
347 p = pktgen.Pktgen(args, self.ctx)
348 p.server = mock_ssh.SSH.from_node()
349 p.client = mock_ssh.SSH.from_node()
351 mock_ssh.SSH.from_node().execute.return_value = (0, '10', '')
353 p._setup_irqmapping_ovs(4)
355 mock_ssh.SSH.from_node().execute.assert_called_with(
356 "echo 8 | sudo tee /proc/irq/10/smp_affinity")
358 def test_pktgen_setup_irqmapping_ovs_1q(self, mock_ssh):
360 'options': {'packetsize': 60},
362 p = pktgen.Pktgen(args, self.ctx)
363 p.server = mock_ssh.SSH.from_node()
364 p.client = mock_ssh.SSH.from_node()
366 mock_ssh.SSH.from_node().execute.return_value = (0, '10', '')
368 p._setup_irqmapping_ovs(1)
370 mock_ssh.SSH.from_node().execute.assert_called_with(
371 "echo 1 | sudo tee /proc/irq/10/smp_affinity")
373 def test_pktgen_unsuccessful_setup_irqmapping_ovs(self, mock_ssh):
375 'options': {'packetsize': 60},
377 p = pktgen.Pktgen(args, self.ctx)
378 p.server = mock_ssh.SSH.from_node()
379 p.client = mock_ssh.SSH.from_node()
381 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
383 self.assertRaises(RuntimeError, p._setup_irqmapping_ovs, 4)
385 def test_pktgen_unsuccessful_setup_irqmapping_ovs_1q(self, mock_ssh):
387 'options': {'packetsize': 60},
389 p = pktgen.Pktgen(args, self.ctx)
390 p.server = mock_ssh.SSH.from_node()
391 p.client = mock_ssh.SSH.from_node()
393 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
395 self.assertRaises(RuntimeError, p._setup_irqmapping_ovs, 1)
397 def test_pktgen_setup_irqmapping_sriov(self, mock_ssh):
399 'options': {'packetsize': 60},
401 p = pktgen.Pktgen(args, self.ctx)
402 p.server = mock_ssh.SSH.from_node()
403 p.client = mock_ssh.SSH.from_node()
405 mock_ssh.SSH.from_node().execute.return_value = (0, '10', '')
407 p._setup_irqmapping_sriov(2)
409 mock_ssh.SSH.from_node().execute.assert_called_with(
410 "echo 2 | sudo tee /proc/irq/10/smp_affinity")
412 def test_pktgen_setup_irqmapping_sriov_1q(self, mock_ssh):
414 'options': {'packetsize': 60},
416 p = pktgen.Pktgen(args, self.ctx)
417 p.server = mock_ssh.SSH.from_node()
418 p.client = mock_ssh.SSH.from_node()
420 mock_ssh.SSH.from_node().execute.return_value = (0, '10', '')
422 p._setup_irqmapping_sriov(1)
424 mock_ssh.SSH.from_node().execute.assert_called_with(
425 "echo 1 | sudo tee /proc/irq/10/smp_affinity")
427 def test_pktgen_unsuccessful_setup_irqmapping_sriov(self, mock_ssh):
429 'options': {'packetsize': 60},
431 p = pktgen.Pktgen(args, self.ctx)
432 p.server = mock_ssh.SSH.from_node()
433 p.client = mock_ssh.SSH.from_node()
435 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
437 self.assertRaises(RuntimeError, p._setup_irqmapping_sriov, 2)
439 def test_pktgen_unsuccessful_setup_irqmapping_sriov_1q(self, mock_ssh):
441 'options': {'packetsize': 60},
443 p = pktgen.Pktgen(args, self.ctx)
444 p.server = mock_ssh.SSH.from_node()
445 p.client = mock_ssh.SSH.from_node()
447 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
449 self.assertRaises(RuntimeError, p._setup_irqmapping_sriov, 1)
451 def test_pktgen_is_irqbalance_disabled(self, mock_ssh):
453 'options': {'packetsize': 60},
455 p = pktgen.Pktgen(args, self.ctx)
456 p.server = mock_ssh.SSH.from_node()
458 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
460 p._is_irqbalance_disabled()
462 mock_ssh.SSH.from_node().execute.assert_called_with(
463 "grep ENABLED /etc/default/irqbalance")
465 def test_pktgen_unsuccessful_is_irqbalance_disabled(self, mock_ssh):
467 'options': {'packetsize': 60},
469 p = pktgen.Pktgen(args, self.ctx)
470 p.server = mock_ssh.SSH.from_node()
472 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
474 self.assertRaises(RuntimeError, p._is_irqbalance_disabled)
476 def test_pktgen_disable_irqbalance(self, mock_ssh):
478 'options': {'packetsize': 60},
480 p = pktgen.Pktgen(args, self.ctx)
481 p.server = mock_ssh.SSH.from_node()
482 p.client = mock_ssh.SSH.from_node()
484 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
486 p._disable_irqbalance()
488 mock_ssh.SSH.from_node().execute.assert_called_with(
489 "sudo service irqbalance disable")
491 def test_pktgen_unsuccessful_disable_irqbalance(self, mock_ssh):
493 'options': {'packetsize': 60},
495 p = pktgen.Pktgen(args, self.ctx)
496 p.server = mock_ssh.SSH.from_node()
497 p.client = mock_ssh.SSH.from_node()
499 mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
501 self.assertRaises(RuntimeError, p._disable_irqbalance)
503 def test_pktgen_multiqueue_setup_ovs(self, mock_ssh):
505 'options': {'packetsize': 60, 'multiqueue': True},
507 p = pktgen.Pktgen(args, self.ctx)
508 p.server = mock_ssh.SSH.from_node()
509 p.client = mock_ssh.SSH.from_node()
511 mock_ssh.SSH.from_node().execute.return_value = (0, '4', '')
513 p._is_irqbalance_disabled = mock.Mock(return_value=False)
514 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
515 p._get_usable_queue_number = mock.Mock(return_value=1)
516 p._get_available_queue_number = mock.Mock(return_value=4)
520 self.assertEqual(p.queue_number, 4)
522 def test_pktgen_multiqueue_setup_ovs_1q(self, mock_ssh):
524 'options': {'packetsize': 60, 'multiqueue': True},
526 p = pktgen.Pktgen(args, self.ctx)
527 p.server = mock_ssh.SSH.from_node()
528 p.client = mock_ssh.SSH.from_node()
530 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
532 p._is_irqbalance_disabled = mock.Mock(return_value=False)
533 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
534 p._get_usable_queue_number = mock.Mock(return_value=1)
535 p._get_available_queue_number = mock.Mock(return_value=1)
539 self.assertEqual(p.queue_number, 1)
541 def test_pktgen_multiqueue_setup_sriov(self, mock_ssh):
543 'options': {'packetsize': 60, 'multiqueue': True},
545 p = pktgen.Pktgen(args, self.ctx)
546 p.server = mock_ssh.SSH.from_node()
547 p.client = mock_ssh.SSH.from_node()
549 mock_ssh.SSH.from_node().execute.return_value = (0, '2', '')
551 p._is_irqbalance_disabled = mock.Mock(return_value=False)
552 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
556 self.assertEqual(p.queue_number, 2)
558 def test_pktgen_multiqueue_setup_sriov_1q(self, mock_ssh):
560 'options': {'packetsize': 60, 'multiqueue': True},
562 p = pktgen.Pktgen(args, self.ctx)
563 p.server = mock_ssh.SSH.from_node()
564 p.client = mock_ssh.SSH.from_node()
566 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
568 p._is_irqbalance_disabled = mock.Mock(return_value=False)
569 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
573 self.assertEqual(p.queue_number, 1)
575 def test_pktgen_run_with_setup_done(self, mock_ssh):
579 'number_of_ports': 10,
585 p = pktgen.Pktgen(args, self.ctx)
586 p.server = mock_ssh.SSH.from_node()
587 p.client = mock_ssh.SSH.from_node()
590 p.multiqueue_setup_done = True
592 mock_iptables_result = mock.Mock()
593 mock_iptables_result.return_value = 149300
594 p._iptables_get_result = mock_iptables_result
596 sample_output = '{"packets_per_second": 9753, "errors": 0, \
597 "packets_sent": 149300, "flows": 110, "ppm": 0}'
598 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
601 expected_result = jsonutils.loads(sample_output)
602 expected_result["packets_received"] = 149300
603 expected_result["packetsize"] = 60
604 self.assertEqual(result, expected_result)
606 def test_pktgen_run_with_ovs_multiqueque(self, mock_ssh):
610 'number_of_ports': 10,
617 p = pktgen.Pktgen(args, self.ctx)
619 p.server = mock_ssh.SSH.from_node()
620 p.client = mock_ssh.SSH.from_node()
622 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
623 p._get_usable_queue_number = mock.Mock(return_value=1)
624 p._get_available_queue_number = mock.Mock(return_value=4)
625 p._enable_ovs_multiqueue = mock.Mock(return_value=4)
626 p._setup_irqmapping_ovs = mock.Mock()
627 p._iptables_get_result = mock.Mock(return_value=149300)
629 sample_output = '{"packets_per_second": 9753, "errors": 0, \
630 "packets_sent": 149300, "flows": 110, "ppm": 0}'
631 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
634 expected_result = jsonutils.loads(sample_output)
635 expected_result["packets_received"] = 149300
636 expected_result["packetsize"] = 60
637 self.assertEqual(result, expected_result)
639 def test_pktgen_run_with_sriov_multiqueque(self, mock_ssh):
643 'number_of_ports': 10,
650 p = pktgen.Pktgen(args, self.ctx)
652 p.server = mock_ssh.SSH.from_node()
653 p.client = mock_ssh.SSH.from_node()
655 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
656 p._get_sriov_queue_number = mock.Mock(return_value=2)
657 p._setup_irqmapping_sriov = mock.Mock()
658 p._iptables_get_result = mock.Mock(return_value=149300)
660 sample_output = '{"packets_per_second": 9753, "errors": 0, \
661 "packets_sent": 149300, "flows": 110, "ppm": 0}'
662 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
665 expected_result = jsonutils.loads(sample_output)
666 expected_result["packets_received"] = 149300
667 expected_result["packetsize"] = 60
668 self.assertEqual(result, expected_result)