Пример #1
0
    def test_leading_zero(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': '02'}}

        selector = 'request.body.parsed.dict.key'

        self.assertEqual(context, is_numeric(context, selector=selector))
Пример #2
0
    def test_set(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'value'}}

        context_exp = get_default_context({})
        context_exp['request']['body']['parsed'] = {
            'dict': {
                'key': 'anothervalue'
            }
        }

        selector = 'request.body.parsed.dict.key'
        set_to = 'anothervalue'

        self.assertEqual(context_exp,
                         set_value(context, selector=selector, set_to=set_to))
Пример #3
0
    def test_string(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'a'}}

        selector = 'request.body.parsed.dict.key'

        self.assertRaises(ValueError, is_numeric, context, selector=selector)
Пример #4
0
def get_config_context():
    return get_default_context({
        'config': {
            'internal': {
                'vardb_path': app.config['juggler']['vardb_path']
            }
        }
    })
Пример #5
0
    def test_load(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = 'parsed'
        search_path = str(Path('resources').resolve())
        file_name = 'template.yaml'

        expected = {'expand': 'parsed', 'key': 'value', 'list': ['test']}
        expanded = load_yaml_tpl(search_path, file_name, context)
        self.assertDictEqual(expected, expanded)
Пример #6
0
    def test_match(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'StartEnd'}}

        selector = 'request.body.parsed.dict.key'
        start = 'Start'

        self.assertEqual(context,
                         starts_with(context, selector=selector, start=start))
Пример #7
0
    def test_match(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'AString'}}

        selector = 'request.body.parsed.dict.key'
        pattern = '.Str.*'

        self.assertEqual(
            context, matches_regex(context, selector=selector,
                                   pattern=pattern))
Пример #8
0
    def test_ordered(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = 'parsed'
        search_path = str(Path('resources').resolve())
        file_name = 'template.yaml'

        expected = OrderedDict([('key', 'value'), ('list', ['test']),
                                ('expand', 'parsed')])
        expanded = load_yaml_tpl(search_path, file_name, context)
        self.assertEqual(expected, expanded)
Пример #9
0
def transform() -> dict:
    ctx = get_default_context({})
    ctx['response']['body']['raw'] = request.json['text']

    split = request.json['transformer'].split('.')
    mod = importlib.import_module('.'.join(split[:len(split) - 1]))
    fun = getattr(mod, split[len(split) - 1:len(split)][0])
    ctx = fun(ctx)

    yaml.add_representer(OrderedDict, lambda self, data: self.represent_mapping('tag:yaml.org,2002:map', data.items()))
    return jsonify({'text': yaml.dump(ctx['response']['body']['parsed'], default_flow_style=False)})
Пример #10
0
    def test_no_match(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'AString'}}

        selector = 'request.body.parsed.dict.key'
        pattern = 'Foo.*'

        self.assertRaises(AssertionError,
                          matches_regex,
                          context,
                          selector=selector,
                          pattern=pattern)
Пример #11
0
    def test_no_match(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'StartEnd'}}

        selector = 'request.body.parsed.dict.key'
        start = 'End'

        self.assertRaises(AssertionError,
                          starts_with,
                          context,
                          selector=selector,
                          start=start)
Пример #12
0
def translate_file(file: Path, action: str) -> OrderedDict:
    ctx = get_default_context({})
    with file.open() as f:
        ctx['response']['body']['raw'] = f.read()

    split = action.split('.')
    mod = importlib.import_module('.'.join(split[:len(split) - 1]))

    fun = getattr(mod, split[len(split) - 1:len(split)][0])
    ctx = fun(ctx)

    return ctx['response']['body']['parsed']
Пример #13
0
    def test_equal(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 'value'}}

        selector = 'request.body.parsed.dict.key'
        compare_to = 'value'

        self.assertEqual(
            context,
            compare(context,
                    selector=selector,
                    comparator='==',
                    compare_to=compare_to))
Пример #14
0
    def test_smaller(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 1}}

        selector = 'request.body.parsed.dict.key'
        compare_to = 2

        self.assertEqual(
            context,
            compare(context,
                    selector=selector,
                    comparator='<',
                    compare_to=compare_to))
Пример #15
0
    def test_greater(self):
        context = get_default_context({})
        context['request']['body']['parsed'] = {'dict': {'key': 2}}

        selector = 'request.body.parsed.dict.key'
        compare_to = 1

        self.assertRaises(AssertionError,
                          compare,
                          context,
                          selector=selector,
                          comparator='<',
                          compare_to=compare_to)
Пример #16
0
    def test_no_header(self):
        eventstore.insert = self.insert

        context = get_default_context({})
        context['environment']['recipe'] = {'workflow': []}
        context['environment']['tasks'] = []
        context['environment']['config'] = {'internal': {'db_path': ''}}

        listener_process = Process(group=None,
                                   target=listener,
                                   args=[context],
                                   kwargs={'port': 8080})
        listener_process.start()

        sleep(1)
        r = requests.get('http://localhost:8080')
        listener_process.terminate()
        self.assertEqual('', r.text)
Пример #17
0
def run_gaukl(config_file_path: str) -> None:
    path = Path(config_file_path)
    config = load_yaml_tpl(str(path.parent), str(path.name), None)

    for sub_path in ['recipes_path', 'rulesets_path', 'responses_path']:
        if not Path(config['paths'][sub_path]).is_absolute():
            config['paths'][sub_path] = str(
                path.parent.joinpath(config['paths'][sub_path]).resolve())

    recipes = path.parent.joinpath(
        config['paths']['recipes_path']).glob('*.yaml')

    logging.basicConfig(level=config['internal']['logging']['log_level'],
                        format=config['internal']['logging']['log_format'])
    logger = logging.getLogger('gaukl.global')

    listener_processes = {}
    recipe_names = []

    for recipe in recipes:
        listener_process = mp.Process(group=None,
                                      target=run_recipe,
                                      args=[config, recipe.name])
        listener_process.start()
        logger.info(f'Loading recipe {recipe.name}')
        recipe_names.append(recipe.name)
        listener_processes[recipe.name] = listener_process.pid

    # Register with juggler
    if config['internal']['juggler']['enabled']:
        requests.put(
            f'http://{config["internal"]["juggler"]["path"]}/api/services',
            json={
                'host': '',
                'port': config['internal']['api']['server.socket_port']
            })

    # Start internal REST API
    logger.info('Starting API')
    api.run(get_default_context({'config': config}), recipe_names,
            listener_processes)
Пример #18
0
def run_recipe(config: dict, recipe_file_name: str) -> None:
    """Loads the recipe with which gaukl is started. This is the entry point for everything.
    Starts the listener as defined in the recipe as well as the internal API.
    Also constructs the environment which defines relevant extensions etc. as defined in the config.
    """
    recipe = load_yaml_tpl(config['paths']['recipes_path'], recipe_file_name,
                           None)

    config['active_recipe'] = recipe_file_name

    logging.basicConfig(level=config['internal']['logging']['log_level'],
                        format=config['internal']['logging']['log_format'])
    logger = logging.getLogger('gaukl.global')

    # Import all tasks, functions and listeners
    [[importlib.import_module(ext) for ext in config[entry]]
     for entry in ['extensions', 'listeners']]

    # Build all workflows
    build = lambda tasks: {
        reg.shortname or reg.__module__ + '.' + reg.__name__: reg
        for reg in tasks
    }
    task_map = build(_tasks)
    listener = build(_listener)

    context = get_default_context({
        'tasks': task_map,
        'recipe': recipe,
        'config': config,
        'environ': os.environ
    })

    # Clear the databases
    eventstore.purge(context)
    kvstore.purge(context)

    # Start the listener
    call = get_callable(recipe['listen'], listener)
    logger.info(f'Started listener for recipe {recipe}')
    call['function'](context, **call['options'])
Пример #19
0
 def test_unparse(self):
     context = get_default_context({})
     context['response']['body']['parsed'] = {'key': 'value'}
     self.assertEqual(
         '<?xml version="1.0" encoding="utf-8"?>\n<key>value</key>',
         response_to_xml(context)['response']['body']['raw'])
Пример #20
0
 def test_parse(self):
     context = get_default_context({})
     context['request']['body']['raw'] = '<key>value</key>'
     self.assertEqual(
         {'key': 'value'},
         request_from_xml(context)['request']['body']['parsed'])
Пример #21
0

@app.route('/api/events', methods=['GET'])
def get_events():
    service = request.args.get('services')
    try:
        r = requests.get('http://' + service + '/api/events?event=' +
                         request.args.get('event')).json()
    except Exception:
        r = None
    return jsonify({'service': service, 'response': r})


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "config_file_path",
        help="Path to the config file, ex. ./examples/config.yaml")
    args = parser.parse_args()

    config = load_yaml_path(Path(args.config_file_path))

    kvstore.purge(
        get_default_context(
            {'config': {
                'internal': {
                    'vardb_path': config['vardb_path']
                }
            }}))
    gaukl.juggler.api.run(config)
Пример #22
0
 def test_unparse(self):
     context = get_default_context({})
     context['response']['body']['parsed'] = {'key': 'value'}
     self.assertEqual('{"key": "value"}',
                      response_to_json(context)['response']['body']['raw'])
Пример #23
0
 def test_parse(self):
     context = get_default_context({})
     context['request']['body']['raw'] = '{"key": "value"}'
     self.assertEqual(
         {'key': 'value'},
         request_from_json(context)['request']['body']['parsed'])