blob: 2178d0c7a1beec06d7beb7adbb3d3caf716576f3 [file] [log] [blame]
koder aka kdanilov962ee5f2016-12-19 02:40:08 +02001from typing import Any, Dict, Optional
koder aka kdanilov108ac362017-01-19 20:17:16 +02002
3from .common_types import IStorable
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03004
koder aka kdanilov7f59d562016-12-26 01:34:23 +02005
6ConfigBlock = Dict[str, Any]
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +03007
8
koder aka kdanilov22d134e2016-11-08 11:33:19 +02009class Config(IStorable):
koder aka kdanilov3d2bc4f2016-11-12 18:31:18 +020010 def __init__(self, dct: ConfigBlock) -> None:
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020011 # make mypy happy, set fake dict
12 self.__dict__['_dct'] = {}
13 self.run_uuid = None # type: str
14 self.storage_url = None # type: str
15 self.comment = None # type: str
16 self.keep_vm = None # type: bool
17 self.dont_discover_nodes = None # type: bool
18 self.build_id = None # type: str
19 self.build_description = None # type: str
20 self.build_type = None # type: str
21 self.default_test_local_folder = None # type: str
22 self.settings_dir = None # type: str
23 self.connect_timeout = None # type: int
24 self.no_tests = False # type: bool
25 self.debug_agents = False # type: bool
26
27 # None, disabled, enabled, metadata, ignore_errors
28 self.discovery = None # type: Optional[str]
29
koder aka kdanilov7f59d562016-12-26 01:34:23 +020030 self.logging = None # type: 'Config'
31 self.ceph = None # type: 'Config'
32 self.openstack = None # type: 'Config'
33 self.fuel = None # type: 'Config'
34 self.test = None # type: 'Config'
35 self.sensors = None # type: 'Config'
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020036
37 self._dct.clear()
38 self._dct.update(dct)
39
koder aka kdanilov7f59d562016-12-26 01:34:23 +020040 @classmethod
41 def fromraw(cls, data: Dict[str, Any]) -> 'Config':
42 return cls(data)
43
44 def raw(self) -> Dict[str, Any]:
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020045 return self._dct
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030046
koder aka kdanilov3d2bc4f2016-11-12 18:31:18 +020047 def get(self, path: str, default: Any = None) -> Any:
koder aka kdanilov22d134e2016-11-08 11:33:19 +020048 curr = self
koder aka kdanilov22d134e2016-11-08 11:33:19 +020049 while path:
50 if '/' in path:
51 name, path = path.split('/', 1)
52 else:
53 name = path
54 path = ""
55
56 try:
57 curr = getattr(curr, name)
58 except AttributeError:
59 return default
60
61 return curr
62
63 def __getattr__(self, name: str) -> Any:
64 try:
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020065 val = self._dct[name]
koder aka kdanilov22d134e2016-11-08 11:33:19 +020066 except KeyError:
67 raise AttributeError(name)
68
69 if isinstance(val, dict):
70 val = self.__class__(val)
71
72 return val
73
74 def __setattr__(self, name: str, val: Any):
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020075 self._dct[name] = val
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030076
koder aka kdanilov3d2bc4f2016-11-12 18:31:18 +020077 def __contains__(self, name: str) -> bool:
78 return self.get(name) is not None