Change naming and veriy test-scheduler function
[bottlenecks.git] / test-scheduler / server / src / test_parser.py
similarity index 97%
rename from testing-scheduler/server/src/test_parser.py
rename to test-scheduler/server/src/test_parser.py
index 7b47151..af0134a 100644 (file)
-#!/usr/bin/env python\r
-\r
-##############################################################################\r
-# Copyright (c) 2018 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
-import click\r
-import os\r
-import yaml\r
-import json\r
-import collections\r
-from src.step.step_manager import TestStepManager\r
-from src.conductor_processor.workflow import WorkflowFile\r
-from conductorclient.run_new_workflow import WorkflowMgr\r
-\r
-BASE_DIR = os.path.dirname(os.path.abspath(__file__))\r
-CONDUCTOR_SERVER_ADDR = "http://conductor_conductor-server_1:8080"\r
-STORE_TASK_PATH = "/tmp/generate_task.json"\r
-STORE_WF_PATH = "/tmp/generate_workflow.json"\r
-\r
-\r
-@click.command()\r
-@click.option("--filepath", help="file path of test case")\r
-def cmdParse(filepath):\r
-    parse(filepath)\r
-\r
-\r
-def parse(filepath):\r
-    filePrefix, fileName = os.path.split(filepath)\r
-    print '------------ start to parse the test case:' + \\r
-        '%s ----------------' % fileName\r
-    with open(filepath) as f:\r
-        yaml_file = yaml.load(f)\r
-        parseTestcase(yaml_file['schema'], fileName)\r
-\r
-    workflowId = runWorkFlow()\r
-    print '------------------- parse executes end -------------------------'\r
-\r
-    return workflowId\r
-\r
-\r
-def parseTestcase(schema, tcName='testcase0'):\r
-    if schema is None:\r
-        return parseLog(False, reason='schema not found.')\r
-    steps = schema['steps']\r
-    if steps is None:\r
-        return parseLog(False, reason='steps is invalid.')\r
-    flows = schema['flows']\r
-    if flows is None:\r
-        return parseLog(False, reasion='flows is invalid.')\r
-    # steps is a list, step is dict. no json here.\r
-    # steps = sorted(steps, sortById)\r
-\r
-    # load context\r
-    contextDict = {}\r
-    contextDir = os.path.join(BASE_DIR, "env", "context", "context.yaml")\r
-    with open(contextDir, "r") as f:\r
-        contextDict = yaml.load(f)\r
-    #\r
-    testStepMgr = TestStepManager(contextDict)\r
-\r
-    stepObjArr = []\r
-    for step in steps:\r
-        if 'args' not in step:\r
-            step['args'] = {}\r
-        # type and action can be extended, default couple is 'test' & 'start'.\r
-        if 'type' not in step:\r
-            step['type'] = 'test'\r
-            step['action'] = 'start'\r
-\r
-        stepObj = testStepMgr.getStepObj(\r
-            step['type'], step['id'], step['name'], step['service'],\r
-            step['action'], step['args'])\r
-        stepObjArr.append(stepObj)\r
-\r
-    # generate workflow by 'flow' and 'step'\r
-    tcName = os.path.splitext(tcName)[0]\r
-    wfFileObj = WorkflowFile(tcName)\r
-    workflowDict, taskMetaList = wfFileObj.generateMetaData(flows, stepObjArr)\r
-\r
-    with open(STORE_TASK_PATH, 'w') as f:\r
-        f.write(json.dumps({'task_group': taskMetaList}, indent=True))\r
-    with open(STORE_WF_PATH, 'w') as f:\r
-        f.write(json.dumps(workflowDict, indent=True))\r
-\r
-\r
-def parseWebTestcase(webTestcase):\r
-    print 'parseWebTestcase----------------------------'\r
-\r
-    stepList = webTestcase['stepList']\r
-    mainOrdersList = webTestcase['mainOrdersList']\r
-    subflowList = webTestcase['subflowList']\r
-\r
-    parseData = collections.OrderedDict()\r
-    parseData['schema'] = collections.OrderedDict()\r
-    parseData['schema']['steps'] = []\r
-    parseData['schema']['flows'] = []\r
-\r
-    parseStepList = parseData['schema']['steps']\r
-    parseFlowList = parseData['schema']['flows']\r
-    stepIndexDict = {}\r
-    # parse stepList\r
-    for index in range(len(stepList)):\r
-        stepItem = stepList[index]\r
-        parseStep = collections.OrderedDict()\r
-\r
-        parseStep['id'] = index + 1\r
-        parseStep['name'] = stepItem['name']\r
-        parseStep['service'] = collections.OrderedDict()\r
-        parseStep['service']['name'] = stepItem['service']\r
-        parseStep['service']['interface'] = stepItem['action']\r
-        parseStep['action'] = 'start'\r
-        parseStep['args'] = {}\r
-        for paramItem in stepItem['params']:\r
-            parseStep['args'][paramItem['key']] = transParamString(\r
-                paramItem['value'])\r
-\r
-        parseStepList.append(parseStep)\r
-        stepIndexDict[parseStep['name']] = parseStep['id']\r
-    # parse flows\r
-    # parse mainflow\r
-    print stepIndexDict\r
-    typeDict = {1: 'normal', 2: 'switch', 3: 'parallel'}\r
-    mainFlow = collections.OrderedDict()\r
-    mainFlow['name'] = 'main'\r
-    mainFlow['orders'] = []\r
-    mainFlow['orders'] = parseOrderList(\r
-        mainOrdersList, stepIndexDict, typeDict)\r
-    parseFlowList.append(mainFlow)\r
-\r
-    # parse subflow\r
-    for subflowItem in subflowList:\r
-        replaceSubflow = collections.OrderedDict()\r
-        replaceSubflow['name'] = subflowItem['name']\r
-        replaceSubflow['orders'] = parseOrderList(\r
-            subflowItem['orderList'], stepIndexDict, typeDict)\r
-        parseFlowList.append(replaceSubflow)\r
-\r
-    print 'END parseWebTestcase----------------------------'\r
-    return parseData\r
-\r
-\r
-# parse orderlist from web edition to server edition\r
-def parseOrderList(orderList, stepIndexDict, typeDict):\r
-    replaceList = []\r
-    for orderItem in orderList:\r
-        replaceOrder = collections.OrderedDict()\r
-        orderType = typeDict[orderItem['type']]\r
-        replaceOrder['type'] = orderType\r
-        if orderType == 'normal':\r
-            stepId = stepIndexDict[orderItem['step']]\r
-            replaceOrder['step'] = stepId\r
-        elif orderType == 'switch':\r
-            replaceOrder['value'] = orderItem['value']\r
-            replaceOrder['cases'] = collections.OrderedDict()\r
-            for caseItem in orderItem['cases']:\r
-                caseValue = caseItem['value']\r
-                caseOrderType = caseItem['orderType']\r
-                caseOrderValue = caseItem['orderValue']\r
-                if caseOrderType == "step":\r
-                    orderInCase = collections.OrderedDict()\r
-                    orderInCase['type'] = 'normal'\r
-                    orderInCase['step'] = stepIndexDict[caseOrderValue]\r
-                    replaceOrder['cases'][caseValue] = [orderInCase]\r
-                else:\r
-                    replaceOrder['cases'][caseValue] = caseOrderValue\r
-        else:\r
-            replaceOrder['parallel'] = collections.OrderedDict()\r
-            pIndex = 1\r
-            for branchItem in orderItem['branches']:\r
-                pKey = 'p' + str(pIndex)\r
-                branchOrderType = branchItem['orderType']\r
-                branchOrderValue = branchItem['orderValue']\r
-                if branchOrderType == "step":\r
-                    replaceBranchItem = collections.OrderedDict()\r
-                    replaceBranchItem['type'] = 'normal'\r
-                    replaceBranchItem['step'] = stepIndexDict[branchOrderValue]\r
-                    replaceOrder['parallel'][pKey] = [replaceBranchItem]\r
-                else:\r
-                    replaceOrder['parallel'][pKey] = branchOrderValue\r
-                pIndex += 1\r
-        replaceList.append(replaceOrder)\r
-    return replaceList\r
-\r
-\r
-def transParamString(val):\r
-    if type(val) != str:\r
-        return val\r
-    if '.' not in val:\r
-        if val.isdigit():\r
-            return int(val)\r
-    try:\r
-        f = float(val)\r
-        return f\r
-    except ValueError:\r
-        return val\r
-\r
-\r
-def getWebTestcase(originTcDict):\r
-    print "getWebTestcase----------------------------------"\r
-    webTcDict = {\r
-        "stepList": [],\r
-        "mainOrdersList": [],\r
-        "subflowList": []\r
-    }\r
-    stepList = webTcDict['stepList']\r
-    subflowList = webTcDict['subflowList']\r
-    if originTcDict is None:\r
-        return webTcDict\r
-    originContent = originTcDict['schema']\r
-    originSteps = originContent['steps']\r
-    stepIndexDict = {}\r
-    # transform steps to stepList\r
-    for stepItem in originSteps:\r
-        replaceStep = {}\r
-        replaceStep['name'] = stepItem['name']\r
-        replaceStep['service'] = stepItem['service']['name']\r
-        replaceStep['action'] = stepItem['service']['interface']\r
-        replaceStep['params'] = []\r
-        if 'args' in stepItem:\r
-            for (key, value) in stepItem['args'].items():\r
-                replaceParam = {}\r
-                replaceParam['key'] = key\r
-                replaceParam['value'] = value\r
-                replaceStep['params'].append(replaceParam)\r
-        stepList.append(replaceStep)\r
-        stepIndexDict[stepItem['id']] = stepItem['name']\r
-\r
-    # transform main flow\r
-    originFlows = originContent['flows']\r
-    originMainflow = {}\r
-    for flowIndex in range(len(originFlows)):\r
-        flowItem = originFlows[flowIndex]\r
-        if flowItem['name'] == 'main':\r
-            originMainflow = flowItem\r
-            originFlows.pop(flowIndex)\r
-            break\r
-    typeDict = {'normal': 1, 'switch': 2, 'parallel': 3}\r
-    webTcDict['mainOrdersList'] = getOrderList(\r
-        originMainflow['orders'], stepIndexDict, typeDict)\r
-\r
-    # transform subflows\r
-    for originSubflow in originFlows:\r
-        replaceSubflow = {}\r
-        replaceSubflow['name'] = originSubflow['name']\r
-        replaceSubflow['orderList'] = getOrderList(\r
-            originSubflow['orders'], stepIndexDict, typeDict)\r
-        subflowList.append(replaceSubflow)\r
-\r
-    # return web edition of testcase\r
-    print "END getWebTestcase----------------------------------"\r
-    return webTcDict\r
-\r
-\r
-def getOrderList(originOrderList, stepIndexDict, typeDict):\r
-    replaceOrderList = []\r
-    for orderItem in originOrderList:\r
-        replaceOrderItem = {}\r
-        orderType = orderItem['type']\r
-        replaceOrderItem['type'] = typeDict[orderType]\r
-        if orderType == 'normal':\r
-            stepName = stepIndexDict[orderItem['step']]\r
-            replaceOrderItem['step'] = stepName\r
-        elif orderType == 'switch':\r
-            replaceOrderItem['value'] = orderItem['value']\r
-            replaceOrderItem['cases'] = []\r
-            for (caseValue, ordersInCase) in orderItem['cases'].items():\r
-                replaceCase = {}\r
-                replaceCase['value'] = caseValue\r
-                if type(ordersInCase) == list:\r
-                    replaceCase['orderType'] = 'step'\r
-                    caseStepName = stepIndexDict[ordersInCase[0]['step']]\r
-                    replaceCase['orderValue'] = caseStepName\r
-                else:\r
-                    replaceCase['orderType'] = 'flow'\r
-                    replaceCase['orderValue'] = ordersInCase\r
-                replaceOrderItem['cases'].append(replaceCase)\r
-        else:\r
-            replaceOrderItem['branches'] = []\r
-            for paraIndex in orderItem['parallel']:\r
-                paraItem = orderItem['parallel'][paraIndex]\r
-                replaceBranch = {}\r
-                if type(paraItem) == list:\r
-                    replaceBranch['orderType'] = 'step'\r
-                    branchStepName = stepIndexDict[paraItem[0]['step']]\r
-                    replaceBranch['orderValue'] = branchStepName\r
-                else:\r
-                    replaceBranch['orderType'] = 'flow'\r
-                    replaceBranch['orderValue'] = paraItem\r
-                replaceOrderItem['branches'].append(replaceBranch)\r
-        replaceOrderList.append(replaceOrderItem)\r
-\r
-    return replaceOrderList\r
-\r
-\r
-def runWorkFlow():\r
-    wfMgr = WorkflowMgr(CONDUCTOR_SERVER_ADDR)\r
-    wfMgr.setTaskDefFromFile(STORE_TASK_PATH)\r
-    wfMgr.setWorkflowFromFile(STORE_WF_PATH)\r
-    inputParam = {'input': 'fake'}\r
-    workflowId = wfMgr.startWorkflow(inputParam)\r
-    return workflowId\r
-\r
-\r
-def parseLog(flag, **msg):\r
-    return {'result': flag, 'message': msg}\r
-\r
-\r
-if __name__ == "__main__":\r
-    cmdParse()\r
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2018 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
+##############################################################################
+
+import click
+import os
+import yaml
+import json
+import collections
+from src.step.step_manager import TestStepManager
+from src.conductor_processor.workflow import WorkflowFile
+from conductorclient.run_new_workflow import WorkflowMgr
+
+BASE_DIR = os.path.dirname(os.path.abspath(__file__))
+CONDUCTOR_SERVER_ADDR = "http://conductor_conductor-server_1:8080"
+STORE_TASK_PATH = "/tmp/generate_task.json"
+STORE_WF_PATH = "/tmp/generate_workflow.json"
+
+
+@click.command()
+@click.option("--filepath", help="file path of test case")
+def cmdParse(filepath):
+    parse(filepath)
+
+
+def parse(filepath):
+    filePrefix, fileName = os.path.split(filepath)
+    print '------------ start to parse the test case:' + \
+        '%s ----------------' % fileName
+    with open(filepath) as f:
+        yaml_file = yaml.load(f)
+        parseTestcase(yaml_file['schema'], fileName)
+
+    workflowId = runWorkFlow()
+    print '------------------- parse executes end -------------------------'
+
+    return workflowId
+
+
+def parseTestcase(schema, tcName='testcase0'):
+    if schema is None:
+        return parseLog(False, reason='schema not found.')
+    steps = schema['steps']
+    if steps is None:
+        return parseLog(False, reason='steps is invalid.')
+    flows = schema['flows']
+    if flows is None:
+        return parseLog(False, reasion='flows is invalid.')
+    # steps is a list, step is dict. no json here.
+    # steps = sorted(steps, sortById)
+
+    # load context
+    contextDict = {}
+    contextDir = os.path.join(BASE_DIR, "env", "context", "context.yaml")
+    with open(contextDir, "r") as f:
+        contextDict = yaml.load(f)
+    #
+    testStepMgr = TestStepManager(contextDict)
+
+    stepObjArr = []
+    for step in steps:
+        if 'args' not in step:
+            step['args'] = {}
+        # type and action can be extended, default couple is 'test' & 'start'.
+        if 'type' not in step:
+            step['type'] = 'test'
+            step['action'] = 'start'
+
+        stepObj = testStepMgr.getStepObj(
+            step['type'], step['id'], step['name'], step['service'],
+            step['action'], step['args'])
+        stepObjArr.append(stepObj)
+
+    # generate workflow by 'flow' and 'step'
+    tcName = os.path.splitext(tcName)[0]
+    wfFileObj = WorkflowFile(tcName)
+    workflowDict, taskMetaList = wfFileObj.generateMetaData(flows, stepObjArr)
+
+    with open(STORE_TASK_PATH, 'w') as f:
+        f.write(json.dumps({'task_group': taskMetaList}, indent=True))
+    with open(STORE_WF_PATH, 'w') as f:
+        f.write(json.dumps(workflowDict, indent=True))
+
+
+def parseWebTestcase(webTestcase):
+    print 'parseWebTestcase----------------------------'
+
+    stepList = webTestcase['stepList']
+    mainOrdersList = webTestcase['mainOrdersList']
+    subflowList = webTestcase['subflowList']
+
+    parseData = collections.OrderedDict()
+    parseData['schema'] = collections.OrderedDict()
+    parseData['schema']['steps'] = []
+    parseData['schema']['flows'] = []
+
+    parseStepList = parseData['schema']['steps']
+    parseFlowList = parseData['schema']['flows']
+    stepIndexDict = {}
+    # parse stepList
+    for index in range(len(stepList)):
+        stepItem = stepList[index]
+        parseStep = collections.OrderedDict()
+
+        parseStep['id'] = index + 1
+        parseStep['name'] = stepItem['name']
+        parseStep['service'] = collections.OrderedDict()
+        parseStep['service']['name'] = stepItem['service']
+        parseStep['service']['interface'] = stepItem['action']
+        parseStep['action'] = 'start'
+        parseStep['args'] = {}
+        for paramItem in stepItem['params']:
+            parseStep['args'][paramItem['key']] = transParamString(
+                paramItem['value'])
+
+        parseStepList.append(parseStep)
+        stepIndexDict[parseStep['name']] = parseStep['id']
+    # parse flows
+    # parse mainflow
+    print stepIndexDict
+    typeDict = {1: 'normal', 2: 'switch', 3: 'parallel'}
+    mainFlow = collections.OrderedDict()
+    mainFlow['name'] = 'main'
+    mainFlow['orders'] = []
+    mainFlow['orders'] = parseOrderList(
+        mainOrdersList, stepIndexDict, typeDict)
+    parseFlowList.append(mainFlow)
+
+    # parse subflow
+    for subflowItem in subflowList:
+        replaceSubflow = collections.OrderedDict()
+        replaceSubflow['name'] = subflowItem['name']
+        replaceSubflow['orders'] = parseOrderList(
+            subflowItem['orderList'], stepIndexDict, typeDict)
+        parseFlowList.append(replaceSubflow)
+
+    print 'END parseWebTestcase----------------------------'
+    return parseData
+
+
+# parse orderlist from web edition to server edition
+def parseOrderList(orderList, stepIndexDict, typeDict):
+    replaceList = []
+    for orderItem in orderList:
+        replaceOrder = collections.OrderedDict()
+        orderType = typeDict[orderItem['type']]
+        replaceOrder['type'] = orderType
+        if orderType == 'normal':
+            stepId = stepIndexDict[orderItem['step']]
+            replaceOrder['step'] = stepId
+        elif orderType == 'switch':
+            replaceOrder['value'] = orderItem['value']
+            replaceOrder['cases'] = collections.OrderedDict()
+            for caseItem in orderItem['cases']:
+                caseValue = caseItem['value']
+                caseOrderType = caseItem['orderType']
+                caseOrderValue = caseItem['orderValue']
+                if caseOrderType == "step":
+                    orderInCase = collections.OrderedDict()
+                    orderInCase['type'] = 'normal'
+                    orderInCase['step'] = stepIndexDict[caseOrderValue]
+                    replaceOrder['cases'][caseValue] = [orderInCase]
+                else:
+                    replaceOrder['cases'][caseValue] = caseOrderValue
+        else:
+            replaceOrder['parallel'] = collections.OrderedDict()
+            pIndex = 1
+            for branchItem in orderItem['branches']:
+                pKey = 'p' + str(pIndex)
+                branchOrderType = branchItem['orderType']
+                branchOrderValue = branchItem['orderValue']
+                if branchOrderType == "step":
+                    replaceBranchItem = collections.OrderedDict()
+                    replaceBranchItem['type'] = 'normal'
+                    replaceBranchItem['step'] = stepIndexDict[branchOrderValue]
+                    replaceOrder['parallel'][pKey] = [replaceBranchItem]
+                else:
+                    replaceOrder['parallel'][pKey] = branchOrderValue
+                pIndex += 1
+        replaceList.append(replaceOrder)
+    return replaceList
+
+
+def transParamString(val):
+    if type(val) != str:
+        return val
+    if '.' not in val:
+        if val.isdigit():
+            return int(val)
+    try:
+        f = float(val)
+        return f
+    except ValueError:
+        return val
+
+
+def getWebTestcase(originTcDict):
+    print "getWebTestcase----------------------------------"
+    webTcDict = {
+        "stepList": [],
+        "mainOrdersList": [],
+        "subflowList": []
+    }
+    stepList = webTcDict['stepList']
+    subflowList = webTcDict['subflowList']
+    if originTcDict is None:
+        return webTcDict
+    originContent = originTcDict['schema']
+    originSteps = originContent['steps']
+    stepIndexDict = {}
+    # transform steps to stepList
+    for stepItem in originSteps:
+        replaceStep = {}
+        replaceStep['name'] = stepItem['name']
+        replaceStep['service'] = stepItem['service']['name']
+        replaceStep['action'] = stepItem['service']['interface']
+        replaceStep['params'] = []
+        if 'args' in stepItem:
+            for (key, value) in stepItem['args'].items():
+                replaceParam = {}
+                replaceParam['key'] = key
+                replaceParam['value'] = value
+                replaceStep['params'].append(replaceParam)
+        stepList.append(replaceStep)
+        stepIndexDict[stepItem['id']] = stepItem['name']
+
+    # transform main flow
+    originFlows = originContent['flows']
+    originMainflow = {}
+    for flowIndex in range(len(originFlows)):
+        flowItem = originFlows[flowIndex]
+        if flowItem['name'] == 'main':
+            originMainflow = flowItem
+            originFlows.pop(flowIndex)
+            break
+    typeDict = {'normal': 1, 'switch': 2, 'parallel': 3}
+    webTcDict['mainOrdersList'] = getOrderList(
+        originMainflow['orders'], stepIndexDict, typeDict)
+
+    # transform subflows
+    for originSubflow in originFlows:
+        replaceSubflow = {}
+        replaceSubflow['name'] = originSubflow['name']
+        replaceSubflow['orderList'] = getOrderList(
+            originSubflow['orders'], stepIndexDict, typeDict)
+        subflowList.append(replaceSubflow)
+
+    # return web edition of testcase
+    print "END getWebTestcase----------------------------------"
+    return webTcDict
+
+
+def getOrderList(originOrderList, stepIndexDict, typeDict):
+    replaceOrderList = []
+    for orderItem in originOrderList:
+        replaceOrderItem = {}
+        orderType = orderItem['type']
+        replaceOrderItem['type'] = typeDict[orderType]
+        if orderType == 'normal':
+            stepName = stepIndexDict[orderItem['step']]
+            replaceOrderItem['step'] = stepName
+        elif orderType == 'switch':
+            replaceOrderItem['value'] = orderItem['value']
+            replaceOrderItem['cases'] = []
+            for (caseValue, ordersInCase) in orderItem['cases'].items():
+                replaceCase = {}
+                replaceCase['value'] = caseValue
+                if type(ordersInCase) == list:
+                    replaceCase['orderType'] = 'step'
+                    caseStepName = stepIndexDict[ordersInCase[0]['step']]
+                    replaceCase['orderValue'] = caseStepName
+                else:
+                    replaceCase['orderType'] = 'flow'
+                    replaceCase['orderValue'] = ordersInCase
+                replaceOrderItem['cases'].append(replaceCase)
+        else:
+            replaceOrderItem['branches'] = []
+            for paraIndex in orderItem['parallel']:
+                paraItem = orderItem['parallel'][paraIndex]
+                replaceBranch = {}
+                if type(paraItem) == list:
+                    replaceBranch['orderType'] = 'step'
+                    branchStepName = stepIndexDict[paraItem[0]['step']]
+                    replaceBranch['orderValue'] = branchStepName
+                else:
+                    replaceBranch['orderType'] = 'flow'
+                    replaceBranch['orderValue'] = paraItem
+                replaceOrderItem['branches'].append(replaceBranch)
+        replaceOrderList.append(replaceOrderItem)
+
+    return replaceOrderList
+
+
+def runWorkFlow():
+    wfMgr = WorkflowMgr(CONDUCTOR_SERVER_ADDR)
+    wfMgr.setTaskDefFromFile(STORE_TASK_PATH)
+    wfMgr.setWorkflowFromFile(STORE_WF_PATH)
+    inputParam = {'input': 'fake'}
+    workflowId = wfMgr.startWorkflow(inputParam)
+    return workflowId
+
+
+def parseLog(flag, **msg):
+    return {'result': flag, 'message': msg}
+
+
+if __name__ == "__main__":
+    cmdParse()