Upload the contribution of vstf as bottleneck network framework.
[bottlenecks.git] / vstf / vstf / controller / vstfadm.py
diff --git a/vstf/vstf/controller/vstfadm.py b/vstf/vstf/controller/vstfadm.py
new file mode 100755 (executable)
index 0000000..068ab2e
--- /dev/null
@@ -0,0 +1,270 @@
+import sys
+import logging
+import json
+from vstf.common.vstfcli import VstfParser
+from vstf.common import cliutil, constants, unix, message
+from vstf.common.log import setup_logging
+import vstf.common.constants as cst
+import pprint
+
+CONN = None
+
+
+def print_stdout(msg):
+    # out = json.dumps(message.get_body(message.decode(msg)), indent=2)
+    out = message.get_body(message.decode(msg))
+    pprint.pprint(out, indent=2)
+
+
+def call(msg):
+    """msg must be a dict"""
+    msg = message.add_context(msg, corr=message.gen_corrid())
+    CONN.send(message.encode(msg))
+    return message.decode(CONN.recv())
+
+
+def make_msg(method, **kwargs):
+    return {"method": method, "args": kwargs}
+
+
+@cliutil.arg("--host", dest="host", default="", action="store", help="list nic devices of specified host")
+def do_list_devs(args):
+    """List the host's all netdev."""
+    ret = call(make_msg("list_devs", host=args.host))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="which host to run src_install.")
+@cliutil.arg("--config_file", dest="config_file", action="store", default=None,
+             help="the git repo config.")
+def do_src_install(args):
+    """work agent to pull source code and compile.
+    use git as underlying mechanism, please make sure the host has access to git repo.
+    """
+    ret = call(make_msg("src_install", host=args.host, config_file=args.config_file))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="which host to build, must exists in your config file, use default[None] value to build all hosts.")
+@cliutil.arg("--model", dest="model", action="store", choices=('Tn', 'Ti', 'Tu', 'Tnv'),
+             help="which model to build, if specified, the according config file /etc/vstf/env/{model}.json must exist.")
+@cliutil.arg("--config_file", dest="config_file", action="store", default=None,
+             help="if specified, the config file will replace the default config file from /etc/vstf/env.")
+def do_apply_model(args):
+    """Apply model to the host."""
+    ret = call(make_msg("apply_model", host=args.host, model=args.model, config_file=args.config_file))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="to which host you wish to create images")
+@cliutil.arg("--config_file", dest="config_file", action="store", default=None,
+             help="configuration file for image creation.")
+def do_create_images(args):
+    """create images on host, images are configed by configuration file."""
+    ret = call(make_msg("create_images", host=args.host, config_file=args.config_file))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="to which host you wish to clean images")
+@cliutil.arg("--config_file", dest="config_file", action="store", default=None,
+             help="configuration file for images.")
+def do_clean_images(args):
+    """clean images on host, images are configed by configuration file."""
+    ret = call(make_msg("clean_images", host=args.host, config_file=args.config_file))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="which host to clean, must exists in your config file, use default[None] value to clean all hosts.")
+@cliutil.arg("--model", dest="model", action="store", choices=('Tn', 'Ti', 'Tu', 'Tnv'),
+             help="if specified, the according config file /etc/vstf/env/{model}.json must exist.")
+@cliutil.arg("--config_file", dest="config_file", action="store", default=None,
+             help="if specified, the config file will replace the default config file from /etc/vstf/env.")
+def do_disapply_model(args):
+    """Apply model to the host."""
+    ret = call(make_msg("disapply_model", host=args.host, model=args.model, config_file=args.config_file))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", help="collect host information about cpu/mem etc")
+def do_collect_host_info(args):
+    """Show the host's CPU/MEN info"""
+    ret = call(make_msg("collect_host_info", target=args.host))
+    print_stdout(ret)
+
+
+def do_show_tasks(args):
+    """List history performance test tasks. Can be used by report cmd to generate reports.
+    """
+    ret = call(make_msg("list_tasks"))
+    print_stdout(ret)
+
+
+@cliutil.arg("case", action="store", help="test case like Ti-1, Tn-1, Tnv-1, Tu-1, see case definition in documents")
+@cliutil.arg("tool", action="store", choices=cst.TOOLS, )
+@cliutil.arg("protocol", action="store", choices=cst.TPROTOCOLS, )
+@cliutil.arg("profile", action="store", choices=cst.PROFILES, )
+@cliutil.arg("type", action="store", choices=cst.TTYPES)
+@cliutil.arg("sizes", action="store", default="64", help='test size list "64 128"')
+@cliutil.arg("--affctl", action="store_true", help="when affctl is True, it will do affctl before testing")
+def do_perf_test(args):
+    """Runs a quick single software performance test without envbuild and generating reports.
+    Outputs the result to the stdout immediately."""
+    case_info = {
+        'case': args.case,
+        'tool': args.tool,
+        'protocol': args.protocol,
+        'profile': args.profile,
+        'type': args.type,
+        'sizes': map(lambda x: int(x), args.sizes.strip().split())
+    }
+    ret = call(make_msg("run_perf_cmd",
+                        case=case_info,
+                        rpath=cst.REPORT_DEFAULTS,
+                        affctl=args.affctl,
+                        build_on=False,
+                        save_on=False,
+                        report_on=False,
+                        mail_on=False
+                        ))
+    print_stdout(ret)
+
+
+@cliutil.arg("-rpath",
+             help="path of result",
+             default=cst.REPORT_DEFAULTS,
+             action="store")
+@cliutil.arg("--report_off",
+             help="when report_off is True, it will not generate the report",
+             action="store_true")
+@cliutil.arg("--mail_off",
+             help="when mail_off is True, it will not send mail",
+             action="store_true")
+@cliutil.arg("--affctl",
+             help="when affctl is True, it will do affctl before testing",
+             action="store_true")
+def do_batch_perf_test(args):
+    """run soft performance test cases defined in /etc/vstf/perf/sw_perf.batch-settings"""
+    ret = call(make_msg("run_perf_file",
+                        affctl=args.affctl,
+                        rpath=args.rpath,
+                        report_on=not args.report_off,
+                        mail_on=not args.mail_off
+                        ))
+    print_stdout(ret)
+
+
+@cliutil.arg('-rpath',
+             action='store',
+             default=cst.REPORT_DEFAULTS,
+             help=" the path name of test results  ")
+@cliutil.arg("--mail_off",
+             help="when mail_off is True, it will not send mail",
+             action="store_true")
+@cliutil.arg("--taskid",
+             help="report depend of a history task id",
+             default=-1,
+             action="store")
+def do_report(args):
+    """generate the report from the database"""
+    ret = call(make_msg("report",
+                        rpath=args.rpath,
+                        mail_off=args.mail_off,
+                        taskid=args.taskid
+                        ))
+    print_stdout(ret)
+
+
+@cliutil.arg("--conner",
+             dest="conner",
+             action="store",
+             help="tester")
+@cliutil.arg("--measurand",
+             dest="measurand",
+             action="store",
+             help="tested")
+@cliutil.arg("-m", "--model",
+             dest="model",
+             action="store",
+             help="Test scene name : Tnv")
+@cliutil.arg("-e", "--virtenv",
+             dest="virtenv",
+             action="store",
+             help="virt env_build number(s): [1-8]")
+@cliutil.arg("-q", "--queues",
+             dest="queues",
+             action="store",
+             help="VM nic queues.")
+@cliutil.arg("-f", "--flows",
+             dest="flows",
+             action="store",
+             help="Flow queue(s) : [1-8]")
+@cliutil.arg("-v", "--vlans",
+             dest="vlans",
+             action="store_true",
+             help="vlan setting : 100-150;200-250")
+@cliutil.arg("-d", "--direct",
+             dest="direct",
+             action="store",
+             choices=["single", "double"],
+             help="Flow Direction")
+@cliutil.arg("-b", "--bind",
+             dest="strategy",
+             action="store",
+             help="CPU bind strategy :  1 | 2 | 3 ")
+@cliutil.arg("--config_file",
+             dest="config_file",
+             default='/etc/vstf/spirent/optimize.ini',
+             action="store",
+             help="config file for optimize.")
+@cliutil.arg("--strategyfile",
+             dest="strategyfile",
+             default='/etc/vstf/spirent/strategy.ini',
+             action="store",
+             help="config file for strategy.")
+def do_spirent_test(args):
+    ret = call(make_msg("perf_test",
+                        plugin="spirent",
+                        conner=args.conner,
+                        measurand=args.measurand,
+                        virtenv=args.virtenv,
+                        queues=args.queues,
+                        direct=args.direct,
+                        flows=args.flows,
+                        strategy=args.strategy,
+                        model=args.model,
+                        vlans=args.vlans,
+                        configfile=args.config_file,
+                        strategyfile=args.strategyfile))
+    print_stdout(ret)
+
+
+@cliutil.arg("--host", dest="host", action="store", default=None,
+             help="which host to list affctl info")
+def do_affctl_list(args):
+    ret = call(make_msg("affctl_list", host=args.host))
+    print_stdout(ret)
+
+
+def main():
+    parser = VstfParser(prog="vstfadm", description="vstf administration")
+    parser.set_subcommand_parser(sys.modules[__name__], "functions")
+    args = parser.parse_args()
+    if args.func is None:
+        sys.exit(-1)
+    setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-adm.log", clevel=logging.INFO)
+    # connect to manage
+    global CONN
+    try:
+        CONN = unix.UdpClient()
+        CONN.connect(constants.sockaddr)
+    except Exception as e:
+        raise e
+
+    args.func(args)
+    # call functions of manage
+    sys.exit(CONN.close())