VNF characterizaion scale_out test, untested 33/38233/5
authorRoss Brattain <ross.b.brattain@intel.com>
Wed, 26 Jul 2017 23:25:08 +0000 (16:25 -0700)
committerRoss Brattain <ross.b.brattain@intel.com>
Thu, 10 Aug 2017 02:08:09 +0000 (19:08 -0700)
The purpose of this test is to increase the
number of VNFs being tested while monitoring
aggregate performance scaling.

requires https://gerrit.opnfv.org/gerrit/#/c/37993

Change-Id: I0015ef0326859512c7b9ab4c57ef9b5a710ca852
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
testsuites/posca/testcase_cfg/posca_factor_vnf_scale_out.yaml [new file with mode: 0644]
testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py [new file with mode: 0644]

diff --git a/testsuites/posca/testcase_cfg/posca_factor_vnf_scale_out.yaml b/testsuites/posca/testcase_cfg/posca_factor_vnf_scale_out.yaml
new file mode 100644 (file)
index 0000000..84bde99
--- /dev/null
@@ -0,0 +1,18 @@
+##############################################################################
+# Copyright (c) 2017 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
+##############################################################################
+
+test_config:
+  num_vnfs: [1, 40]
+runner_config:
+  dashboard: "y"
+  dashboard_ip:
+  stack_create: yardstick
+  yardstick_test_ip:
+  yardstick_test_dir: "samples/vnf_samples/nsut/acl"
+  yardstick_testcase: "tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize_scale_out.yaml"
diff --git a/testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py b/testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py
new file mode 100644 (file)
index 0000000..2241d02
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2017 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
+##############################################################################
+"""This file realize the function of run systembandwidth script.
+for example this contain two part first run_script,
+second is algorithm, this part is about how to judge the bottlenecks.
+This test is using yardstick as a tool to begin test."""
+
+import os
+import time
+import utils.logger as log
+import utils.infra_setup.runner.yardstick as Runner
+from utils.parser import Parser as conf_parser
+import testsuites.posca.testcase_dashboard.system_bandwidth as DashBoard
+# --------------------------------------------------
+# logging configuration
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+
+
+def env_pre(con_dic):
+    Runner.Create_Incluxdb(con_dic['runner_config'])
+
+
+def config_to_result(test_config, test_result):
+    testdata = {}
+    test_result["throughput"] = float(test_result["throughput"])
+    test_result.update(test_config)
+    testdata["data_body"] = test_result
+    testdata["testcase"] = testcase
+    return testdata
+
+
+def do_test(test_config, con_dic):
+    test_case = con_dic['runner_config']['yardstick_testcase']
+    test_dict = {
+        "action": "runTestCase",
+        "args": {
+            "opts": {
+                "task-args": test_config
+            },
+            "testcase": test_case
+        }
+    }
+    Task_id = Runner.Send_Data(test_dict, con_dic['runner_config'])
+    time.sleep(con_dic['test_config']['test_time'])
+    Data_Reply = Runner.Get_Reply(con_dic['runner_config'], Task_id)
+    try:
+        test_date =\
+            Data_Reply[con_dic['runner_config']['yardstick_testcase']][0]
+    except IndexError:
+        test_date = do_test(test_config, con_dic)
+
+    save_data = config_to_result(test_config, test_date)
+    if con_dic['runner_config']['dashboard'] == 'y':
+        DashBoard.dashboard_send_data(con_dic['runner_config'], save_data)
+
+    return save_data["data_body"]
+
+
+def run(con_dic):
+    # can we specify these ranges from command line?
+    low, high = con_dic['test_config']['num_vnfs']
+    data = {
+        "num_vnfs": range(low, high)
+    }
+    con_dic["result_file"] = os.path.dirname(
+        os.path.abspath(__file__)) + "/test_case/result"
+    pre_role_result = 1
+    data_return = {}
+    data_max = {}
+    data_return["throughput"] = 1
+
+    if con_dic["runner_config"]["yardstick_test_ip"] is None:
+        con_dic["runner_config"]["yardstick_test_ip"] =\
+            conf_parser.ip_parser("yardstick_test_ip")
+
+    env_pre(con_dic)
+
+    if con_dic["runner_config"]["dashboard"] == 'y':
+        if con_dic["runner_config"]["dashboard_ip"] is None:
+            con_dic["runner_config"]["dashboard_ip"] =\
+                conf_parser.ip_parser("dashboard")
+        LOG.info("Create Dashboard data")
+        DashBoard.dashboard_system_bandwidth(con_dic["runner_config"])
+
+    bandwidth_tmp = 1
+    # vcpus and mem are scaled together
+    for num_vnfs in data["scale_up_values"]:
+        data_max["throughput"] = 1
+        test_config = {
+            "num_vnfs": num_vnfs,
+            "test_time": con_dic['test_config']['test_time']
+        }
+        data_reply = do_test(test_config, con_dic)
+        conf_parser.result_to_file(data_reply, con_dic["out_file"])
+        # TODO: figure out which KPI to use
+        bandwidth = data_reply["throughput"]
+        if data_max["throughput"] < bandwidth:
+            data_max = data_reply
+        if abs(bandwidth_tmp - bandwidth) / float(bandwidth_tmp) < 0.025:
+            LOG.info("this group of data has reached top output")
+            break
+        else:
+            pre_reply = data_reply
+            bandwidth_tmp = bandwidth
+        cur_role_result = float(pre_reply["throughput"])
+        if (abs(pre_role_result - cur_role_result) /
+                float(pre_role_result) < 0.025):
+            LOG.info("The performance increases slowly")
+        if data_return["throughput"] < data_max["throughput"]:
+            data_return = data_max
+        pre_role_result = cur_role_result
+    LOG.info("Find bottlenecks of this config")
+    LOG.info("The max data is %d", data_return["throughput"])
+    return data_return