blob: 1090d6c0b4c6ba82d6fe94e5daf6621e0686991e [file] [log] [blame]
kdanylov aka koder150b2192017-04-01 16:53:01 +03001from typing import Any, Dict, Optional, Set
koder aka kdanilov108ac362017-01-19 20:17:16 +02002
kdanylov aka koderb0833332017-05-13 20:39:17 +03003from cephlib.storage 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'] = {}
kdanylov aka koder938f75f2018-06-27 01:52:44 +030013 self.run_uuid: str = None
14 self.storage_url: str = None
15 self.comment: str = None
16 self.keep_vm: bool = None
17 self.dont_discover_nodes: bool = None
18 self.build_id: str = None
19 self.build_description: str = None
20 self.build_type: str = None
21 self.default_test_local_folder: str = None
22 self.settings_dir: str = None
23 self.connect_timeout: int = None
24 self.no_tests: bool = False
25 self.debug_agents: bool = False
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020026
27 # None, disabled, enabled, metadata, ignore_errors
kdanylov aka koder938f75f2018-06-27 01:52:44 +030028 self.discover: Optional[str] = None
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020029
kdanylov aka koder938f75f2018-06-27 01:52:44 +030030 self.logging: 'Config' = None
31 self.ceph: 'Config' = None
32 self.openstack: 'Config' = None
33 self.fuel: 'Config' = None
34 self.test: 'Config' = None
35 self.sensors: 'Config' = None
36 self.discover: Set[str] = None
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020037
38 self._dct.clear()
39 self._dct.update(dct)
40
koder aka kdanilov7f59d562016-12-26 01:34:23 +020041 @classmethod
42 def fromraw(cls, data: Dict[str, Any]) -> 'Config':
43 return cls(data)
44
45 def raw(self) -> Dict[str, Any]:
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020046 return self._dct
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030047
koder aka kdanilov3d2bc4f2016-11-12 18:31:18 +020048 def get(self, path: str, default: Any = None) -> Any:
koder aka kdanilov22d134e2016-11-08 11:33:19 +020049 curr = self
koder aka kdanilov22d134e2016-11-08 11:33:19 +020050 while path:
51 if '/' in path:
52 name, path = path.split('/', 1)
53 else:
54 name = path
55 path = ""
56
57 try:
58 curr = getattr(curr, name)
59 except AttributeError:
60 return default
61
62 return curr
63
64 def __getattr__(self, name: str) -> Any:
65 try:
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020066 val = self._dct[name]
koder aka kdanilov22d134e2016-11-08 11:33:19 +020067 except KeyError:
68 raise AttributeError(name)
69
70 if isinstance(val, dict):
71 val = self.__class__(val)
72
73 return val
74
75 def __setattr__(self, name: str, val: Any):
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020076 self._dct[name] = val
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030077
koder aka kdanilov3d2bc4f2016-11-12 18:31:18 +020078 def __contains__(self, name: str) -> bool:
79 return self.get(name) is not None