from frostfs_testlib.load.interfaces.loader import Loader from frostfs_testlib.resources.load_params import ( LOAD_NODE_SSH_PASSWORD, LOAD_NODE_SSH_PRIVATE_KEY_PASSPHRASE, LOAD_NODE_SSH_PRIVATE_KEY_PATH, LOAD_NODE_SSH_USER, ) from frostfs_testlib.shell.interfaces import Shell, SshCredentials from frostfs_testlib.shell.ssh_shell import SSHShell from frostfs_testlib.storage.cluster import ClusterNode class RemoteLoader(Loader): def __init__(self, ssh_credentials: SshCredentials, ip: str) -> None: self.ssh_credentials = ssh_credentials self._ip = ip @property def ip(self): return self._ip def get_shell(self) -> Shell: ssh_client = SSHShell( host=self.ip, login=self.ssh_credentials.ssh_login, password=self.ssh_credentials.ssh_password, private_key_path=self.ssh_credentials.ssh_key_path, private_key_passphrase=self.ssh_credentials.ssh_key_passphrase, ) return ssh_client @classmethod def from_ip_list(cls, ip_list: list[str]) -> list[Loader]: loaders: list[Loader] = [] ssh_credentials = SshCredentials( LOAD_NODE_SSH_USER, LOAD_NODE_SSH_PASSWORD, LOAD_NODE_SSH_PRIVATE_KEY_PATH, LOAD_NODE_SSH_PRIVATE_KEY_PASSPHRASE, ) for ip in ip_list: loaders.append(RemoteLoader(ssh_credentials, ip)) return loaders class NodeLoader(Loader): """When ClusterNode is the loader for itself (for Local scenario only).""" def __init__(self, cluster_node: ClusterNode) -> None: self.cluster_node = cluster_node def get_shell(self) -> Shell: return self.cluster_node.host.get_shell() @property def ip(self): return self.cluster_node.host_ip