From 0cc36f61ffd83266f1065b30ad69a417a3e3f3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20Hru=C5=A1ka?= Date: Mon, 7 Jul 2025 15:05:38 +0200 Subject: [PATCH 1/2] system tenant provider; provider types --- asab/web/tenant/providers/__init__.py | 2 ++ asab/web/tenant/providers/abc.py | 4 ++++ asab/web/tenant/providers/static.py | 2 ++ asab/web/tenant/providers/system.py | 17 +++++++++++++++++ asab/web/tenant/providers/web.py | 4 ++++ asab/web/tenant/providers/zookeeper.py | 4 ++++ asab/web/tenant/service.py | 19 +++++++++++++++++++ 7 files changed, 52 insertions(+) create mode 100644 asab/web/tenant/providers/system.py 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..00fd89d9d --- /dev/null +++ b/asab/web/tenant/providers/system.py @@ -0,0 +1,17 @@ +import re +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. From f12da790612204de3ba3a099c564897e9fa71d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20Hru=C5=A1ka?= Date: Mon, 7 Jul 2025 15:22:22 +0200 Subject: [PATCH 2/2] flake8 --- asab/web/tenant/providers/system.py | 1 - 1 file changed, 1 deletion(-) diff --git a/asab/web/tenant/providers/system.py b/asab/web/tenant/providers/system.py index 00fd89d9d..43819ace9 100644 --- a/asab/web/tenant/providers/system.py +++ b/asab/web/tenant/providers/system.py @@ -1,4 +1,3 @@ -import re import typing import logging