diff --git a/asab/web/tenant/providers/__init__.py b/asab/web/tenant/providers/__init__.py index 4ae35af29..80de297f0 100644 --- a/asab/web/tenant/providers/__init__.py +++ b/asab/web/tenant/providers/__init__.py @@ -1,9 +1,11 @@ from .static import StaticTenantProvider +from .system import SystemTenantProvider from .web import WebTenantProvider from .zookeeper import ZookeeperTenantProvider __all__ = [ "StaticTenantProvider", + "SystemTenantProvider", "WebTenantProvider", "ZookeeperTenantProvider" ] diff --git a/asab/web/tenant/providers/abc.py b/asab/web/tenant/providers/abc.py index 894b35e0f..edbe8607c 100644 --- a/asab/web/tenant/providers/abc.py +++ b/asab/web/tenant/providers/abc.py @@ -3,6 +3,10 @@ class TenantProviderABC(abc.ABC): + + Type = None + + def __init__(self, app, tenant_service, config): self.App = app self.TenantService = tenant_service diff --git a/asab/web/tenant/providers/static.py b/asab/web/tenant/providers/static.py index 69dd6e8a4..d37c2243e 100644 --- a/asab/web/tenant/providers/static.py +++ b/asab/web/tenant/providers/static.py @@ -9,6 +9,8 @@ class StaticTenantProvider(TenantProviderABC): + Type = "static" + def __init__(self, app, tenant_service, config): super().__init__(app, tenant_service, config) diff --git a/asab/web/tenant/providers/system.py b/asab/web/tenant/providers/system.py new file mode 100644 index 000000000..43819ace9 --- /dev/null +++ b/asab/web/tenant/providers/system.py @@ -0,0 +1,16 @@ +import typing +import logging + +from .static import StaticTenantProvider + +L = logging.getLogger(__name__) + + +class SystemTenantProvider(StaticTenantProvider): + + Type = "system" + + + def __init__(self, app, tenant_service, config): + super().__init__(app, tenant_service, config) + self.Tenants: typing.Set[str] = {"system"} diff --git a/asab/web/tenant/providers/web.py b/asab/web/tenant/providers/web.py index a8af63dee..7e68c441e 100644 --- a/asab/web/tenant/providers/web.py +++ b/asab/web/tenant/providers/web.py @@ -10,6 +10,10 @@ class WebTenantProvider(TenantProviderABC): + + Type = "web" + + def __init__(self, app, tenant_service, config): super().__init__(app, tenant_service, config) self.Tenants: typing.Set[str] = set() diff --git a/asab/web/tenant/providers/zookeeper.py b/asab/web/tenant/providers/zookeeper.py index 00cf8fd13..345362440 100644 --- a/asab/web/tenant/providers/zookeeper.py +++ b/asab/web/tenant/providers/zookeeper.py @@ -9,6 +9,10 @@ class ZookeeperTenantProvider(TenantProviderABC): + + Type = "zookeeper" + + def __init__(self, app, tenant_service, config): super().__init__(app, tenant_service, config) self.Tenants: typing.Set[str] = set() diff --git a/asab/web/tenant/service.py b/asab/web/tenant/service.py index 8bcb61b3e..478f8681b 100644 --- a/asab/web/tenant/service.py +++ b/asab/web/tenant/service.py @@ -68,6 +68,9 @@ def Tenants(self) -> typing.Set[str]: def _prepare_providers(self): + from .providers import SystemTenantProvider + self.Providers.append(SystemTenantProvider(self.App, self, Config["tenants"])) + if Config.get("tenants", "ids", fallback=None): from .providers import StaticTenantProvider self.Providers.append(StaticTenantProvider(self.App, self, Config["tenants"])) @@ -93,6 +96,22 @@ async def update_tenants(self): await asyncio.gather(*tasks) + async def get_provider(self, provider_type: str): + """ + Get a tenant provider by its type. + + Args: + provider_type: Type of the tenant provider to retrieve. + + Returns: + The tenant provider instance or None if not found. + """ + for provider in self.Providers: + if provider.Type == provider_type: + return provider + return None + + async def get_tenants(self) -> typing.Set[str]: """ Get the set of known tenant IDs.