blob: d336807ea603debb80500452cd9bdbdd9919715d [file] [log] [blame]
koder aka kdanilovf90de852017-01-20 18:12:27 +02001import abc
kdanylov aka koder13e58452018-07-15 02:51:51 +03002from typing import Dict, Any, Tuple, cast, Union, NamedTuple
koder aka kdanilovf90de852017-01-20 18:12:27 +02003from collections import OrderedDict
4
kdanylov aka koder026e5f22017-05-15 01:04:39 +03005from cephlib.istorage import Storable
koder aka kdanilovf90de852017-01-20 18:12:27 +02006
7
kdanylov aka koder13e58452018-07-15 02:51:51 +03008Var = NamedTuple('Var', [('name', str)])
9
10
koder aka kdanilovf90de852017-01-20 18:12:27 +020011class JobParams(metaclass=abc.ABCMeta):
12 """Class contains all job parameters, which significantly affects job results.
13 Like block size or operation type, but not file name or file size.
14 Can be used as key in dictionary
15 """
16
17 def __init__(self, **params: Dict[str, Any]) -> None:
18 self.params = params
19
kdanylov aka koder150b2192017-04-01 16:53:01 +030020 @property
21 @abc.abstractmethod
koder aka kdanilovf90de852017-01-20 18:12:27 +020022 def summary(self) -> str:
23 """Test short summary, used mostly for file names and short image description"""
24 pass
25
kdanylov aka koder150b2192017-04-01 16:53:01 +030026 @property
27 @abc.abstractmethod
koder aka kdanilovf90de852017-01-20 18:12:27 +020028 def long_summary(self) -> str:
29 """Readable long summary for management and deployment engineers"""
30 pass
31
koder aka kdanilova732a602017-02-01 20:29:56 +020032 @abc.abstractmethod
33 def copy(self, **updated) -> 'JobParams':
34 pass
35
koder aka kdanilovf90de852017-01-20 18:12:27 +020036 def __getitem__(self, name: str) -> Any:
37 return self.params[name]
38
39 def __setitem__(self, name: str, val: Any) -> None:
40 self.params[name] = val
41
42 def __hash__(self) -> int:
koder aka kdanilova732a602017-02-01 20:29:56 +020043 return hash(self.char_tpl)
koder aka kdanilovf90de852017-01-20 18:12:27 +020044
koder aka kdanilova732a602017-02-01 20:29:56 +020045 def __eq__(self, o: object) -> bool:
46 if not isinstance(o, self.__class__):
kdanylov aka koder13e58452018-07-15 02:51:51 +030047 raise TypeError(f"Can't compare {self.__class__.__qualname__!r} to {type(o).__qualname__!r}")
koder aka kdanilova732a602017-02-01 20:29:56 +020048 return sorted(self.params.items()) == sorted(cast(JobParams, o).params.items())
49
50 def __lt__(self, o: object) -> bool:
51 if not isinstance(o, self.__class__):
kdanylov aka koder13e58452018-07-15 02:51:51 +030052 raise TypeError(f"Can't compare {self.__class__.__qualname__!r} to {type(o).__qualname__!r}")
koder aka kdanilova732a602017-02-01 20:29:56 +020053 return self.char_tpl < cast(JobParams, o).char_tpl
54
kdanylov aka koder150b2192017-04-01 16:53:01 +030055 @property
56 @abc.abstractmethod
koder aka kdanilova732a602017-02-01 20:29:56 +020057 def char_tpl(self) -> Tuple[Union[str, int, float, bool], ...]:
58 pass
koder aka kdanilovf90de852017-01-20 18:12:27 +020059
60
61class JobConfig(Storable, metaclass=abc.ABCMeta):
62 """Job config class"""
63
64 def __init__(self, idx: int) -> None:
65 # job id, used in storage to distinct jobs with same summary
66 self.idx = idx
67
68 # time interval, in seconds, when test was running on all nodes
kdanylov aka koder13e58452018-07-15 02:51:51 +030069 self.reliable_info_range: Tuple[int, int] = None # type: ignore
kdanylov aka koder45183182017-04-30 23:55:40 +030070
koder aka kdanilovf90de852017-01-20 18:12:27 +020071 # all job parameters, both from suite file and config file
kdanylov aka koder13e58452018-07-15 02:51:51 +030072 self.vals: Dict[str, Any] = OrderedDict()
koder aka kdanilovf90de852017-01-20 18:12:27 +020073
74 @property
kdanylov aka koder45183182017-04-30 23:55:40 +030075 def reliable_info_range_s(self) -> Tuple[int, int]:
76 return (self.reliable_info_range[0] // 1000, self.reliable_info_range[1] // 1000)
77
78 @property
koder aka kdanilovf90de852017-01-20 18:12:27 +020079 def storage_id(self) -> str:
80 """unique string, used as key in storage"""
kdanylov aka koder13e58452018-07-15 02:51:51 +030081 return f"{self.summary}_{self.idx}"
koder aka kdanilovf90de852017-01-20 18:12:27 +020082
kdanylov aka koder150b2192017-04-01 16:53:01 +030083 @property
84 @abc.abstractmethod
koder aka kdanilovf90de852017-01-20 18:12:27 +020085 def params(self) -> JobParams:
86 """Should return a copy"""
87 pass
koder aka kdanilova732a602017-02-01 20:29:56 +020088
89 @property
90 def summary(self) -> str:
91 return self.params.summary