summaryrefslogtreecommitdiffstats
path: root/functest/utils/config.py
blob: c569856b1f1bcdb77995df5a6cb7c280b8b107a8 (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
#!/usr/bin/env python

# pylint: disable=missing-docstring

import os
import pkg_resources
import yaml

import six


class Config(object):
    def __init__(self):
        try:
            # pylint: disable=bad-continuation
            with open(pkg_resources.resource_filename(
                    'functest', 'ci/config_functest.yaml')) as yfile:
                self.functest_yaml = yaml.safe_load(yfile)
        except Exception as error:
            raise Exception('Parse config failed: {}'.format(str(error)))

    @staticmethod
    def _merge_dicts(dict1, dict2):
        for k in set(dict1.keys()).union(dict2.keys()):
            if k in dict1 and k in dict2:
                if isinstance(dict1[k], dict) and isinstance(dict2[k], dict):
                    yield (k, dict(Config._merge_dicts(dict1[k], dict2[k])))
                else:
                    yield (k, dict2[k])
            elif k in dict1:
                yield (k, dict1[k])
            else:
                yield (k, dict2[k])

    def patch_file(self, patch_file_path):
        with open(patch_file_path) as yfile:
            patch_file = yaml.safe_load(yfile)

        for key in patch_file:
            if key in os.environ.get('DEPLOY_SCENARIO', ""):
                self.functest_yaml = dict(Config._merge_dicts(
                    self.functest_yaml, patch_file[key]))

    def _parse(self, attr_now, left_parametes):
        for param_n, param_v in six.iteritems(left_parametes):
            attr_further = self._get_attr_further(attr_now, param_n)
            if attr_further:
                setattr(self, attr_further, param_v)
            if isinstance(param_v, dict):
                self._parse(attr_further, param_v)

    @staticmethod
    def _get_attr_further(attr_now, next):  # pylint: disable=redefined-builtin
        return attr_now if next == 'general' else (
            '{}_{}'.format(attr_now, next) if attr_now else next)

    def fill(self):
        try:
            self._parse(None, self.functest_yaml)
        except Exception as error:
            raise Exception('Parse config failed: {}'.format(str(error)))


CONF = Config()
CONF.patch_file(pkg_resources.resource_filename(
    'functest', 'ci/config_patch.yaml'))
if os.getenv("POD_ARCH", None) and os.getenv("POD_ARCH", None) in ['aarch64']:
    CONF.patch_file(pkg_resources.resource_filename(
        'functest', 'ci/config_aarch64_patch.yaml'))
CONF.fill()