dashboard-nanobot/backend/providers/registry.py

48 lines
1.8 KiB
Python
Raw Normal View History

from dataclasses import dataclass, field
from typing import Dict, Optional
from providers.target import ProviderTarget
from providers.provision.base import ProvisionProvider
from providers.runtime.base import RuntimeProvider
from providers.workspace.base import WorkspaceProvider
@dataclass
class ProviderRegistry:
runtime: Dict[str, RuntimeProvider] = field(default_factory=dict)
workspace: Dict[str, WorkspaceProvider] = field(default_factory=dict)
provision: Dict[str, ProvisionProvider] = field(default_factory=dict)
def register_bundle(
self,
*,
key: str,
runtime_provider: RuntimeProvider,
workspace_provider: WorkspaceProvider,
provision_provider: ProvisionProvider,
) -> None:
self.runtime[key] = runtime_provider
self.workspace[key] = workspace_provider
self.provision[key] = provision_provider
def resolve_bundle_key(self, target: ProviderTarget) -> Optional[str]:
exact = target.key
if exact in self.runtime and exact in self.workspace and exact in self.provision:
return exact
for key in self.runtime.keys():
if key not in self.workspace or key not in self.provision:
continue
parts = str(key or "").split(":")
if len(parts) < 4:
continue
_, transport_kind, runtime_kind, core_adapter = parts[0], parts[1], parts[2], ":".join(parts[3:])
if (
str(transport_kind or "").strip().lower() == str(target.transport_kind or "").strip().lower()
and str(runtime_kind or "").strip().lower() == str(target.runtime_kind or "").strip().lower()
and str(core_adapter or "").strip().lower() == str(target.core_adapter or "").strip().lower()
):
return key
return None