summaryrefslogtreecommitdiffstats
path: root/test-scheduler/server/src/step/general_test_step.py
blob: 718982bcf0a593452a88adf61bf374d855758253 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
##############################################################################
# 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
##############################################################################

from src.step.test_step import TestStep
import os
import yaml
import re


class GeneralTestStep(TestStep):
    __step_type__ = "test"

    def __init__(self, id, name, service, action, args, context):
        super(GeneralTestStep, self).__init__(
            self.__step_type__, id, name, service, action, args, context)
        self._stepParse()
        self.action()

    def _contextTransform(self, argsDict):
        for (k, v) in argsDict.items():
            if isinstance(v, str):
                if re.match('^\(\(context\..*\)\)', v):
                    v = v[10:-2]
                    layers = v.split(".")
                    contextData = self._context
                    for layer in layers:
                        contextData = contextData[layer]
                    argsDict[k] = contextData
            elif isinstance(v, dict):
                self._contextTransform(v)

    def _stepParse(self):
        self._args_temp = self._args
        self._args = {}

        # transform the service config
        envFilePath = os.path.join(
            self._getCurrentDir(), "..", "env",
            "service", self._serviceName + ".yaml")
        requestParam = {}
        with open(envFilePath, 'r') as f:
            conf = yaml.load(f)
            conf = conf[self._serviceName]
        for apiItem in conf["apis"]:
            if apiItem['name'] == self._serviceInterface:
                interfaceConf = apiItem
        if interfaceConf is None:
            return

        # transform the args config
        self._contextTransform(self._args_temp)

        interfaceUri = interfaceConf['baseuri'] +  \
            interfaceConf['template']['uri'][11:]
        interfaceUri = "http://%s:%s/%s" % (
            conf['ip'], conf['port'], interfaceUri)
        requestParam['uri'] = self._uriTransform(interfaceUri)

        requestParam['method'] = interfaceConf['method']
        if requestParam["method"] == "POST":
            requestParam['body'] = interfaceConf['template']['body']
            self._paramTransform(requestParam['body'], self._args_temp)
        self._args['http_request'] = requestParam

    def _uriTransform(self, uri):
        return re.sub("\(\(.*?\)\)", self._uriResReplace, uri)

    def _uriResReplace(self, match):
        matchTrim = match.group()[2:-2]
        return self._args_temp[matchTrim]

    def _paramTransform(self, argsTemplate, argsDict):
        for (k, v) in argsTemplate.items():
            if isinstance(v, str):
                if re.match('^\(\(.*\)\)', v):
                    argsTemplate[k] = argsDict[v[2:-2]]
            elif isinstance(v, dict):
                self._paramTransform(v, argsDict)

    def start(self):
        pass