blob: 05585e1877c52b46ae37c7ab8d0f30f95ff7d78a [file] [log] [blame]
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +02001from typing import List, Callable, Any, Dict, Optional, Set
koder aka kdanilov22d134e2016-11-08 11:33:19 +02002from concurrent.futures import ThreadPoolExecutor
3
kdanylov aka koderb0833332017-05-13 20:39:17 +03004from cephlib.istorage import IStorage
kdanylov aka koder026e5f22017-05-15 01:04:39 +03005from cephlib.node import NodeInfo, IRPCNode
6from cephlib.ssh import ConnCreds
kdanylov aka koder84de1e42017-05-22 14:00:07 +03007from cephlib.storage_selectors import DevRolesConfig
koder aka kdanilov22d134e2016-11-08 11:33:19 +02008
koder aka kdanilov39e449e2016-12-17 15:15:26 +02009from .openstack_api import OSCreds, OSConnection
koder aka kdanilov22d134e2016-11-08 11:33:19 +020010from .config import Config
kdanylov aka koder026e5f22017-05-15 01:04:39 +030011from .result_classes import IWallyStorage
koder aka kdanilov22d134e2016-11-08 11:33:19 +020012
13
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030014class TestRun:
15 """Test run information"""
kdanylov aka koder026e5f22017-05-15 01:04:39 +030016 def __init__(self, config: Config, storage: IStorage, rstorage: IWallyStorage) -> None:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030017 # NodesInfo list
kdanylov aka koder13e58452018-07-15 02:51:51 +030018 self.nodes_info: Dict[str, NodeInfo] = {}
19
20 self.ceph_master_node: Optional[IRPCNode] = None
21 self.ceph_extra_args: Optional[str] = None
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030022
23 # Nodes list
kdanylov aka koder13e58452018-07-15 02:51:51 +030024 self.nodes: List[IRPCNode] = []
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030025
kdanylov aka koder13e58452018-07-15 02:51:51 +030026 self.build_meta: Dict[str,Any] = {}
27 self.clear_calls_stack: List[Callable[['TestRun'], None]] = []
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030028
29 # openstack credentials
kdanylov aka koder13e58452018-07-15 02:51:51 +030030 self.os_creds: Optional[OSCreds] = None # type: ignore
31 self.os_connection: Optional[OSConnection] = None # type: ignore
32 self.rpc_code: bytes = None # type: ignore
33 self.default_rpc_plugins: Dict[str, bytes] = None # type: ignore
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030034
koder aka kdanilov22d134e2016-11-08 11:33:19 +020035 self.storage = storage
kdanylov aka koderb0833332017-05-13 20:39:17 +030036 self.rstorage = rstorage
koder aka kdanilov22d134e2016-11-08 11:33:19 +020037 self.config = config
kdanylov aka koder13e58452018-07-15 02:51:51 +030038 self.sensors_run_on: Set[str] = set()
39 self.os_spawned_nodes_ids: List[int] = None # type: ignore
40 self.devs_locator: DevRolesConfig = []
koder aka kdanilov22d134e2016-11-08 11:33:19 +020041
42 def get_pool(self):
43 return ThreadPoolExecutor(self.config.get('worker_pool_sz', 32))
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030044
kdanylov aka kodercdfcdaf2017-04-29 10:03:39 +030045 def merge_node(self, creds: ConnCreds, roles: Set[str], **params) -> NodeInfo:
46 info = NodeInfo(creds, roles, params)
koder aka kdanilov108ac362017-01-19 20:17:16 +020047 nid = info.node_id
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020048
49 if nid in self.nodes_info:
50 self.nodes_info[nid].roles.update(info.roles)
kdanylov aka kodercdfcdaf2017-04-29 10:03:39 +030051 self.nodes_info[nid].params.update(info.params)
koder aka kdanilov962ee5f2016-12-19 02:40:08 +020052 return self.nodes_info[nid]
53 else:
54 self.nodes_info[nid] = info
55 return info