aboutsummaryrefslogtreecommitdiffstats
path: root/vagrant/tests/generic_simulator/generic_sim.py
blob: 4392b652427b749ce17cd1f5510d91df02d41dfc (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# Copyright 2018 Intel Corporation, Inc
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import logging

import web
from web import webapi
import yaml

urls = (
  '/(.*)','MockController'
)

def setup_logger(name, log_file, level=logging.DEBUG):
    print("Configuring the logger...")
    handler = logging.FileHandler(log_file)
    formatter = logging.Formatter('%(message)s')
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger


class MockResponse:
    def __init__(self, http_verb, status_code,
                 content_type="application/json", body="{}",
                 headers={}):
        self.http_verb = http_verb.lower()
        self.status_code = status_code
        self.content_type = content_type
        self.body = body
        self.headers = headers

def _parse_responses(parsed_responses):
    result = {}
    for path, responses in parsed_responses.iteritems():
        new_path = path
        if path.startswith("/"):
            new_path = path[1:]

        result[new_path] = []
        for http_verb, response in responses.iteritems():
            result[new_path].append(MockResponse(http_verb, **response))
    return result

def load_responses(filename):
    print("Loading responses from configuration file..")
    with open(filename) as yaml_file:
        responses_file = yaml.safe_load(yaml_file)
    responses_map = _parse_responses(responses_file)
    return responses_map


class MockController:

    def _do_action(self, action):
        logger.info('{}'.format(web.ctx.env.get('wsgi.input').read()))
        action = action.lower()
        url = web.ctx['fullpath']
        try:
            if url.startswith("/"):
                url = url[1:]
            response = [ r for r in responses_map[url] if r.http_verb == action][0]
            for header, value in response.headers.iteritems():
                web.header(header, value)
            web.header('Content-Type', response.content_type)
            print(response.body)
            return response.body
        except:
            webapi.NotFound()

    def DELETE(self, url):
        return self._do_action("delete")

    def HEAD(self, url):
        return self._do_action("head")

    def PUT(self, url):
        return self._do_action("put")

    def GET(self, url):
        return self._do_action("get")

    def POST(self, url):
        return self._do_action("post")

    def PATCH(self, url):
        return self._do_action("patch")


logger = setup_logger('mock_controller', '/tmp/generic_sim/output.log')
responses_map = load_responses('/etc/generic_sim/responses.yml')
app = web.application(urls, globals())
if __name__ == "__main__":
    app.run()