# plugins/docker/__init__.py from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from quart import Quart _app: "Quart | None" = None def setup(app: "Quart") -> None: global _app _app = app from .models import DockerContainer, DockerMetric # noqa: F401 — register with Base # Publish the per-host persist hook so the host agent can hand off the # `docker` array from each sample without importing our models (opportunistic # synergy — host_agent gates on has_capability and no-ops if we're disabled). # required_role=viewer: this is a trusted server-side data-plane write driven # by the authenticated agent ingest, not a user-facing privileged action. from steward.core.capabilities import register_capability from steward.models.users import UserRole from .ingest import persist_host_docker from .retention import run_docker_retention register_capability( "docker.persist_host_samples", persist_host_docker, label="Persist host Docker samples", description="Store per-host container state + metrics pushed by the host agent.", required_role=UserRole.viewer, ) # Roll up + prune Docker time-series, driven by the core cleanup task without # it importing our models. Same trusted server-side data-plane role as above. register_capability( "docker.run_retention", run_docker_retention, label="Run Docker retention", description="Roll up old docker_metrics to hourly + prune stale metrics/events.", required_role=UserRole.viewer, ) def get_scheduled_tasks() -> list: # Collection is now agent-driven (pushed to the host_agent ingest); the # central socket scrape was removed. No periodic task to register. return [] def get_blueprint(): from .routes import docker_bp return docker_bp def get_nav() -> list[dict]: # Surfaces in the sidebar's Infrastructure group (fleet-wide container view). return [{"label": "Docker", "href": "/plugins/docker/"}]