Support Network Capacity Testing 45/16945/4
authorrexlee8776 <limingjiang@huawei.com>
Fri, 15 Jul 2016 06:54:41 +0000 (14:54 +0800)
committerliang gao <jean.gaoliang@huawei.com>
Thu, 11 Aug 2016 15:31:03 +0000 (15:31 +0000)
two metrics:Number of Connection, Number of Frame

JIRA:YARDSTICK-283

Change-Id: I71f1de25667437bbeac7c06749ff8fb38f41a791
Signed-off-by: kubi <jean.gaoliang@huawei.com>
Signed-off-by: rexlee8776 <limingjiang@huawei.com>
samples/networkcapacity.yaml [new file with mode: 0644]
tests/unit/benchmark/scenarios/networking/test_networkcapacity.py [new file with mode: 0644]
yardstick/benchmark/scenarios/networking/networkcapacity.bash [new file with mode: 0644]
yardstick/benchmark/scenarios/networking/networkcapacity.py [new file with mode: 0644]

diff --git a/samples/networkcapacity.yaml b/samples/networkcapacity.yaml
new file mode 100644 (file)
index 0000000..7c62cc2
--- /dev/null
@@ -0,0 +1,21 @@
+---
+# Sample benchmark task config file
+# Measure compute capacity and scale.
+# Including number of cores, number of threads, available memory size and
+# cache size.
+
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NetworkCapacity
+  host: node1.LF
+
+  runner:
+    type: Iteration
+    iterations: 1
+
+context:
+  type: Node
+  name: LF
+  file: etc/yardstick/nodes/compass_sclab_virtual/pod.yaml
diff --git a/tests/unit/benchmark/scenarios/networking/test_networkcapacity.py b/tests/unit/benchmark/scenarios/networking/test_networkcapacity.py
new file mode 100644 (file)
index 0000000..e3a0964
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/env python\r
+\r
+##############################################################################\r
+# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
+\r
+# Unittest for yardstick.benchmark.scenarios.networking.networkcapacity.NetworkCapacity\r
+\r
+import mock\r
+import unittest\r
+import os\r
+import json\r
+\r
+from yardstick.benchmark.scenarios.networking import networkcapacity\r
+\r
+SAMPLE_OUTPUT = '{"Number of connections":"308","Number of frames received": "166503"}'\r
+\r
+@mock.patch('yardstick.benchmark.scenarios.networking.networkcapacity.ssh')\r
+class NetworkCapacityTestCase(unittest.TestCase):\r
+\r
+    def setUp(self):\r
+        self.ctx = {\r
+                'host': {\r
+                    'ip': '172.16.0.137',\r
+                    'user': 'cirros',\r
+                    'password': "root"\r
+                },\r
+        }\r
+\r
+        self.result = {}\r
+\r
+    def test_capacity_successful_setup(self, mock_ssh):\r
+        c = networkcapacity.NetworkCapacity({}, self.ctx)\r
+        mock_ssh.SSH().execute.return_value = (0, '', '')\r
+        c.setup()\r
+        self.assertIsNotNone(c.client)\r
+        self.assertTrue(c.setup_done)\r
+\r
+    def test_capacity_successful(self, mock_ssh):\r
+        c = networkcapacity.NetworkCapacity({}, self.ctx)\r
+\r
+        mock_ssh.SSH().execute.return_value = (0, SAMPLE_OUTPUT, '')\r
+        c.run(self.result)\r
+        expected_result = json.loads(SAMPLE_OUTPUT)\r
+        self.assertEqual(self.result, expected_result)\r
+\r
+    def test_capacity_unsuccessful_script_error(self, mock_ssh):\r
+        c = networkcapacity.NetworkCapacity({}, self.ctx)\r
+\r
+        mock_ssh.SSH().execute.return_value = (1, '', 'FOOBAR')\r
+        self.assertRaises(RuntimeError, c.run, self.result)\r
diff --git a/yardstick/benchmark/scenarios/networking/networkcapacity.bash b/yardstick/benchmark/scenarios/networking/networkcapacity.bash
new file mode 100644 (file)
index 0000000..a18f97e
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+##############################################################################
+# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
+#
+# 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
+##############################################################################
+
+# Measure compute capacity and scale of a host
+
+set -e
+OUTPUT_FILE=/tmp/netperf-out.log
+
+# run capacity test
+run_capacity()
+{
+    netstat -s > $OUTPUT_FILE
+}
+
+# write the result to stdout in json format
+output_json()
+{
+    CONNECTIONS=$(awk '/active/{print $1}' $OUTPUT_FILE)
+    FRAMES=$(awk '/total\ packets\ received/{print $1}' $OUTPUT_FILE)
+    echo -e "{ \
+        \"Number of connections\":\"$CONNECTIONS\", \
+        \"Number of frames received\": \"$FRAMES\" \
+    }"
+}
+
+main()
+{
+    run_capacity
+
+    output_json
+}
+
+main
diff --git a/yardstick/benchmark/scenarios/networking/networkcapacity.py b/yardstick/benchmark/scenarios/networking/networkcapacity.py
new file mode 100644 (file)
index 0000000..57d3b50
--- /dev/null
@@ -0,0 +1,69 @@
+##############################################################################\r
+# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are made available under the terms of the Apache License, Version 2.0\r
+# which accompanies this distribution, and is available at\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+##############################################################################\r
+import pkg_resources\r
+import logging\r
+import json\r
+\r
+import yardstick.ssh as ssh\r
+from yardstick.benchmark.scenarios import base\r
+\r
+LOG = logging.getLogger(__name__)\r
+\r
+\r
+class NetworkCapacity(base.Scenario):\r
+    """Measure Network capacity and scale.\r
+\r
+    This scenario reads network status including number of connections,\r
+    number of frames sent/received.\r
+    """\r
+    __scenario_type__ = "NetworkCapacity"\r
+    TARGET_SCRIPT = "networkcapacity.bash"\r
+\r
+    def __init__(self, scenario_cfg, context_cfg):\r
+        self.scenario_cfg = scenario_cfg\r
+        self.context_cfg = context_cfg\r
+        self.setup_done = False\r
+\r
+    def setup(self):\r
+        """scenario setup"""\r
+        self.target_script = pkg_resources.resource_filename(\r
+            "yardstick.benchmark.scenarios.networking",\r
+            NetworkCapacity.TARGET_SCRIPT)\r
+\r
+        host = self.context_cfg['host']\r
+        if host is None:\r
+            raise RuntimeError('No right node.please check the configuration')\r
+        host_user = host.get('user', 'ubuntu')\r
+        host_ip = host.get('ip', None)\r
+        host_pwd = host.get('password', None)\r
+\r
+        LOG.debug("user:%s, host:%s", host_user, host_ip)\r
+        self.client = ssh.SSH(host_user, host_ip, password=host_pwd)\r
+        self.client.wait(timeout=600)\r
+\r
+        # copy script to host\r
+        self.client.run("cat > ~/networkcapacity.sh",\r
+                        stdin=open(self.target_script, 'rb'))\r
+\r
+        self.setup_done = True\r
+\r
+    def run(self, result):\r
+        """execute the benchmark"""\r
+\r
+        if not self.setup_done:\r
+            self.setup()\r
+\r
+        cmd = "sudo bash networkcapacity.sh"\r
+\r
+        LOG.debug("Executing command: %s", cmd)\r
+        status, stdout, stderr = self.client.execute(cmd)\r
+        if status:\r
+            raise RuntimeError(stderr)\r
+\r
+        result.update(json.loads(stdout))\r