from abc import ABC, abstractmethod from dataclasses import dataclass, field from typing import Any, Optional from frostfs_testlib.plugins import load_plugin from frostfs_testlib.storage.cluster import Cluster, ClusterNode from frostfs_testlib.storage.dataclasses.wallet import WalletInfo @dataclass class S3Credentials: access_key: str secret_key: str @dataclass class User: name: str attributes: dict[str, Any] = field(default_factory=dict) wallet: WalletInfo | None = None s3_credentials: S3Credentials | None = None class S3CredentialsProvider(ABC): def __init__(self, cluster: Cluster) -> None: self.cluster = cluster @abstractmethod def provide(self, user: User, cluster_node: ClusterNode, location_constraints: Optional[str] = None, **kwargs) -> S3Credentials: raise NotImplementedError("Directly called abstract class?") class GrpcCredentialsProvider(ABC): def __init__(self, cluster: Cluster) -> None: self.cluster = cluster @abstractmethod def provide(self, user: User, cluster_node: ClusterNode, **kwargs) -> WalletInfo: raise NotImplementedError("Directly called abstract class?") class CredentialsProvider(object): S3: S3CredentialsProvider GRPC: GrpcCredentialsProvider def __init__(self, cluster: Cluster) -> None: config = cluster.cluster_nodes[0].host.config s3_cls = load_plugin("frostfs.testlib.credentials_providers", config.s3_creds_plugin_name) self.S3 = s3_cls(cluster) grpc_cls = load_plugin("frostfs.testlib.credentials_providers", config.grpc_creds_plugin_name) self.GRPC = grpc_cls(cluster)