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']
61 mock_ssh.SSH.from_node().run.assert_called_with(
63 "sudo iptables -A INPUT -p udp --dport 1000:%s -j DROP"
66 def test_pktgen_unsuccessful_iptables_setup(self, mock_ssh):
69 'options': {'packetsize': 60, 'number_of_ports': 10},
72 p = pktgen.Pktgen(args, self.ctx)
73 p.server = mock_ssh.SSH.from_node()
74 p.number_of_ports = args['options']['number_of_ports']
76 mock_ssh.SSH.from_node().run.side_effect = y_exc.SSHError
77 self.assertRaises(y_exc.SSHError, p._iptables_setup)
79 def test_pktgen_successful_iptables_get_result(self, mock_ssh):
82 'options': {'packetsize': 60, 'number_of_ports': 10},
85 p = pktgen.Pktgen(args, self.ctx)
86 p.server = mock_ssh.SSH.from_node()
87 p.number_of_ports = args['options']['number_of_ports']
89 mock_ssh.SSH.from_node().execute.return_value = (0, '150000', '')
90 result = p._iptables_get_result()
91 expected_result = 150000
92 self.assertEqual(result, expected_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}}'"
97 % 1010, raise_on_error=True)
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.side_effect = y_exc.SSHError
111 self.assertRaises(y_exc.SSHError, 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.side_effect = y_exc.SSHError
196 self.assertRaises(y_exc.SSHError, 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.side_effect = y_exc.SSHError
219 self.assertRaises(y_exc.SSHError, 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.side_effect = y_exc.SSHError
242 self.assertRaises(y_exc.SSHError, 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 self.assertEqual(p._get_available_queue_number(), 4)
255 mock_ssh.SSH.from_node().execute.assert_called_with(
256 "sudo ethtool -l eth0 | grep Combined | head -1 |"
257 "awk '{printf $2}'", raise_on_error=True)
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.side_effect = y_exc.SSHError
268 self.assertRaises(y_exc.SSHError, 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 self.assertEqual(p._get_usable_queue_number(), 1)
281 mock_ssh.SSH.from_node().execute.assert_called_with(
282 "sudo ethtool -l eth0 | grep Combined | tail -1 |"
283 "awk '{printf $2}'", raise_on_error=True)
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.side_effect = y_exc.SSHError
294 self.assertRaises(y_exc.SSHError, 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().run.side_effect = y_exc.SSHError
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(y_exc.SSHError, 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().run.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().run.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.side_effect = y_exc.SSHError
383 self.assertRaises(y_exc.SSHError, 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.side_effect = y_exc.SSHError
395 self.assertRaises(y_exc.SSHError, 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().run.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().run.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.side_effect = y_exc.SSHError
437 self.assertRaises(y_exc.SSHError, 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.side_effect = y_exc.SSHError
449 self.assertRaises(y_exc.SSHError, 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 result = p._is_irqbalance_disabled()
461 self.assertFalse(result)
463 mock_ssh.SSH.from_node().execute.assert_called_with(
464 "grep ENABLED /etc/default/irqbalance", raise_on_error=True)
466 def test_pktgen_unsuccessful_is_irqbalance_disabled(self, mock_ssh):
468 'options': {'packetsize': 60},
470 p = pktgen.Pktgen(args, self.ctx)
471 p.server = mock_ssh.SSH.from_node()
473 mock_ssh.SSH.from_node().execute.side_effect = y_exc.SSHError
475 self.assertRaises(y_exc.SSHError, p._is_irqbalance_disabled)
477 def test_pktgen_disable_irqbalance(self, mock_ssh):
479 'options': {'packetsize': 60},
481 p = pktgen.Pktgen(args, self.ctx)
482 p.server = mock_ssh.SSH.from_node()
483 p.client = mock_ssh.SSH.from_node()
485 mock_ssh.SSH.from_node().run.return_value = (0, '', '')
487 p._disable_irqbalance()
489 mock_ssh.SSH.from_node().run.assert_called_with(
490 "sudo service irqbalance disable")
492 def test_pktgen_unsuccessful_disable_irqbalance(self, mock_ssh):
494 'options': {'packetsize': 60},
496 p = pktgen.Pktgen(args, self.ctx)
497 p.server = mock_ssh.SSH.from_node()
498 p.client = mock_ssh.SSH.from_node()
500 mock_ssh.SSH.from_node().run.side_effect = y_exc.SSHError
502 self.assertRaises(y_exc.SSHError, p._disable_irqbalance)
504 def test_pktgen_multiqueue_setup_ovs(self, mock_ssh):
506 'options': {'packetsize': 60, 'multiqueue': True},
508 p = pktgen.Pktgen(args, self.ctx)
509 p.server = mock_ssh.SSH.from_node()
510 p.client = mock_ssh.SSH.from_node()
512 mock_ssh.SSH.from_node().execute.return_value = (0, '4', '')
514 p._is_irqbalance_disabled = mock.Mock(return_value=False)
515 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
516 p._get_usable_queue_number = mock.Mock(return_value=1)
517 p._get_available_queue_number = mock.Mock(return_value=4)
521 self.assertEqual(p.queue_number, 4)
523 def test_pktgen_multiqueue_setup_ovs_1q(self, mock_ssh):
525 'options': {'packetsize': 60, 'multiqueue': True},
527 p = pktgen.Pktgen(args, self.ctx)
528 p.server = mock_ssh.SSH.from_node()
529 p.client = mock_ssh.SSH.from_node()
531 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
533 p._is_irqbalance_disabled = mock.Mock(return_value=False)
534 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
535 p._get_usable_queue_number = mock.Mock(return_value=1)
536 p._get_available_queue_number = mock.Mock(return_value=1)
540 self.assertEqual(p.queue_number, 1)
542 def test_pktgen_multiqueue_setup_sriov(self, mock_ssh):
544 'options': {'packetsize': 60, 'multiqueue': True},
546 p = pktgen.Pktgen(args, self.ctx)
547 p.server = mock_ssh.SSH.from_node()
548 p.client = mock_ssh.SSH.from_node()
550 mock_ssh.SSH.from_node().execute.return_value = (0, '2', '')
552 p._is_irqbalance_disabled = mock.Mock(return_value=False)
553 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
557 self.assertEqual(p.queue_number, 2)
559 def test_pktgen_multiqueue_setup_sriov_1q(self, mock_ssh):
561 'options': {'packetsize': 60, 'multiqueue': True},
563 p = pktgen.Pktgen(args, self.ctx)
564 p.server = mock_ssh.SSH.from_node()
565 p.client = mock_ssh.SSH.from_node()
567 mock_ssh.SSH.from_node().execute.return_value = (0, '1', '')
569 p._is_irqbalance_disabled = mock.Mock(return_value=False)
570 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
574 self.assertEqual(p.queue_number, 1)
576 def test_pktgen_run_with_setup_done(self, mock_ssh):
580 'number_of_ports': 10,
586 p = pktgen.Pktgen(args, self.ctx)
587 p.server = mock_ssh.SSH.from_node()
588 p.client = mock_ssh.SSH.from_node()
591 p.multiqueue_setup_done = True
593 mock_iptables_result = mock.Mock()
594 mock_iptables_result.return_value = 149300
595 p._iptables_get_result = mock_iptables_result
597 sample_output = '{"packets_per_second": 9753, "errors": 0, \
598 "packets_sent": 149300, "flows": 110, "ppm": 0}'
599 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
602 expected_result = jsonutils.loads(sample_output)
603 expected_result["packets_received"] = 149300
604 expected_result["packetsize"] = 60
605 self.assertEqual(result, expected_result)
607 def test_pktgen_run_with_ovs_multiqueque(self, mock_ssh):
611 'number_of_ports': 10,
618 p = pktgen.Pktgen(args, self.ctx)
620 p.server = mock_ssh.SSH.from_node()
621 p.client = mock_ssh.SSH.from_node()
623 p._get_vnic_driver_name = mock.Mock(return_value="virtio_net")
624 p._get_usable_queue_number = mock.Mock(return_value=1)
625 p._get_available_queue_number = mock.Mock(return_value=4)
626 p._enable_ovs_multiqueue = mock.Mock(return_value=4)
627 p._setup_irqmapping_ovs = mock.Mock()
628 p._iptables_get_result = mock.Mock(return_value=149300)
630 sample_output = '{"packets_per_second": 9753, "errors": 0, \
631 "packets_sent": 149300, "flows": 110, "ppm": 0}'
632 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
635 expected_result = jsonutils.loads(sample_output)
636 expected_result["packets_received"] = 149300
637 expected_result["packetsize"] = 60
638 self.assertEqual(result, expected_result)
640 def test_pktgen_run_with_sriov_multiqueque(self, mock_ssh):
644 'number_of_ports': 10,
651 p = pktgen.Pktgen(args, self.ctx)
653 p.server = mock_ssh.SSH.from_node()
654 p.client = mock_ssh.SSH.from_node()
656 p._get_vnic_driver_name = mock.Mock(return_value="ixgbevf")
657 p._get_sriov_queue_number = mock.Mock(return_value=2)
658 p._setup_irqmapping_sriov = mock.Mock()
659 p._iptables_get_result = mock.Mock(return_value=149300)
661 sample_output = '{"packets_per_second": 9753, "errors": 0, \
662 "packets_sent": 149300, "flows": 110, "ppm": 0}'
663 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
666 expected_result = jsonutils.loads(sample_output)
667 expected_result["packets_received"] = 149300
668 expected_result["packetsize"] = 60
669 self.assertEqual(result, expected_result)