From 54c77207b0340c89eb3476bd42ba9f9980c8224d Mon Sep 17 00:00:00 2001
From: JingLu5 <lvjing5@huawei.com>
Date: Tue, 19 Jul 2016 12:15:20 +0800
Subject: Add Network Utilization Scenario

This scenario reads network interface utilization stats and data sent/receive
rate using "sar -n".

Change-Id: I9c69f03c017bc2f8a5d87a4de286af147e8a086a
Signed-off-by: JingLu5 <lvjing5@huawei.com>
---
 .../networking/netutilization_sample_output1.txt   |   9 +
 .../networking/netutilization_sample_output2.txt   |  13 ++
 .../scenarios/networking/test_netutilization.py    | 225 +++++++++++++++++++++
 3 files changed, 247 insertions(+)
 create mode 100644 tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt
 create mode 100644 tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt
 create mode 100644 tests/unit/benchmark/scenarios/networking/test_netutilization.py

(limited to 'tests')

diff --git a/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt
new file mode 100644
index 000000000..f90457cb3
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt
@@ -0,0 +1,9 @@
+Linux 3.19.0-25-generic (huawei-pod4) 	07/19/2016 	_x86_64_	(1 CPU)
+
+02:01:50 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
+02:01:51 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+02:01:51 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+
+Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
+Average:         eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
diff --git a/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt
new file mode 100644
index 000000000..417613ec1
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt
@@ -0,0 +1,13 @@
+Linux 3.19.0-25-generic (huawei-pod4) 	07/19/2016 	_x86_64_	(1 CPU)
+
+02:01:50 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
+02:01:51 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+02:01:51 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+
+02:01:52 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
+02:01:53 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+02:01:53 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+
+Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
+Average:         eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
+Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
diff --git a/tests/unit/benchmark/scenarios/networking/test_netutilization.py b/tests/unit/benchmark/scenarios/networking/test_netutilization.py
new file mode 100644
index 000000000..eb6626fea
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/networking/test_netutilization.py
@@ -0,0 +1,225 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2016 Huawei Technologies Co.,Ltd and other.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.networking.netutilization.NetUtilization
+
+import mock
+import unittest
+import os
+
+from yardstick.benchmark.scenarios.networking import netutilization
+
+
+@mock.patch('yardstick.benchmark.scenarios.networking.netutilization.ssh')
+class NetUtilizationTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.ctx = {
+            'host': {
+                'ip': '172.16.0.137',
+                'user': 'cirros',
+                'key_filename': "mykey.key"
+            }
+        }
+
+        self.result = {}
+
+    def test_setup_success(self, mock_ssh):
+        options = {
+            "interval": 1,
+            "count": 1
+        }
+        args = {'options': options}
+
+        n = netutilization.NetUtilization(args, self.ctx)
+        mock_ssh.SSH().execute.return_value = (0, '', '')
+
+        n.setup()
+        self.assertIsNotNone(n.client)
+        self.assertTrue(n.setup_done)
+
+    def test_execute_command_success(self, mock_ssh):
+        options = {
+            "interval": 1,
+            "count": 1
+        }
+        args = {'options': options}
+
+        n = netutilization.NetUtilization(args, self.ctx)
+        mock_ssh.SSH().execute.return_value = (0, '', '')
+        n.setup()
+
+        expected_result = 'abcdefg'
+        mock_ssh.SSH().execute.return_value = (0, expected_result, '')
+        result = n._execute_command("foo")
+        self.assertEqual(result, expected_result)
+
+    def test_execute_command_failed(self, mock_ssh):
+        options = {
+            "interval": 1,
+            "count": 1
+        }
+        args = {'options': options}
+
+        n = netutilization.NetUtilization(args, self.ctx)
+        mock_ssh.SSH().execute.return_value = (0, '', '')
+        n.setup()
+
+        mock_ssh.SSH().execute.return_value = (127, '', 'abcdefg')
+        self.assertRaises(RuntimeError, n._execute_command,
+                          "failed")
+
+    def test_get_network_utilization_success(self, mock_ssh):
+        options = {
+            "interval": 1,
+            "count": 1
+        }
+        args = {'options': options}
+
+        n = netutilization.NetUtilization(args, self.ctx)
+        mock_ssh.SSH().execute.return_value = (0, '', '')
+        n.setup()
+
+        mpstat_output = self._read_file("netutilization_sample_output1.txt")
+        mock_ssh.SSH().execute.return_value = (0, mpstat_output, '')
+        result = n._get_network_utilization()
+
+        expected_result = \
+            {"network_utilization_maximun": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}},
+             "network_utilization_average": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}},
+             "network_utilization_minimum": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}}}
+
+        self.assertDictEqual(result, expected_result)
+
+    def test_get_network_utilization_2_success(self, mock_ssh):
+        options = {
+            "interval": 1,
+            "count": 2
+        }
+        args = {'options': options}
+
+        n = netutilization.NetUtilization(args, self.ctx)
+        mock_ssh.SSH().execute.return_value = (0, '', '')
+        n.setup()
+
+        mpstat_output = self._read_file("netutilization_sample_output2.txt")
+        mock_ssh.SSH().execute.return_value = (0, mpstat_output, '')
+        result = n._get_network_utilization()
+
+        expected_result = \
+            {"network_utilization_maximun": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}},
+             "network_utilization_average": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}},
+             "network_utilization_minimum": {
+                "lo": {"rxcmp/s": "0.00",
+                       "%ifutil": "0.00",
+                       "txcmp/s": "0.00",
+                       "txkB/s": "0.00",
+                       "rxkB/s": "0.00",
+                       "rxpck/s": "0.00",
+                       "txpck/s": "0.00",
+                       "rxmcst/s": "0.00"},
+                "eth0": {"rxcmp/s": "0.00",
+                         "%ifutil": "0.00",
+                         "txcmp/s": "0.00",
+                         "txkB/s": "0.00",
+                         "rxkB/s": "0.00",
+                         "rxpck/s": "0.00",
+                         "txpck/s": "0.00",
+                         "rxmcst/s": "0.00"}}}
+
+        self.assertDictEqual(result, expected_result)
+
+    def _read_file(self, filename):
+        curr_path = os.path.dirname(os.path.abspath(__file__))
+        output = os.path.join(curr_path, filename)
+        with open(output) as f:
+            sample_output = f.read()
+        return sample_output
-- 
cgit