netx/netx_api/collection_schemas.py
oliver b81e5869a6 Ship gated eye polish, fabric levels, and collection UI refresh.
Topology MCP adds pull/compact/bundle/suggest-hubs with a no-template skill path; API gains fabric level and NE collection policy; web list pages get paging and denser collect/network workflows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 16:13:05 +08:00

95 lines
2.4 KiB
Python

from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, Field
class CollectionTargetRef(BaseModel):
source: str = "managed" # managed | ume
id: str
class CollectionPolicyOut(BaseModel):
enabled: bool = False
interval_days: int = 1
interval_hours: int = 24
scope_mode: str = "all"
selected_targets: list[CollectionTargetRef] = Field(default_factory=list)
title: str = ""
commands: str = ""
history_keep: int = 3
updated_at: datetime | None = None
class CollectionPolicyUpdate(BaseModel):
enabled: bool | None = None
interval_days: int | None = Field(default=None, ge=1, le=365)
interval_hours: int | None = Field(default=None, ge=1, le=8760)
scope_mode: str | None = None
selected_targets: list[CollectionTargetRef] | None = None
title: str | None = None
commands: str | None = None
history_keep: int | None = Field(default=None, ge=0, le=200)
class CollectionJobCreate(BaseModel):
title: str = ""
commands: str = Field(min_length=1)
ne_ids: list[str] = Field(default_factory=list)
ume_ne_ids: list[str] = Field(default_factory=list)
class CollectionRunOut(BaseModel):
id: str
job_id: str
ne_id: str
ne_source: str = "managed"
ne_name: str
ne_ip: str
status: str
message: str
output_rel_path: str
has_output: bool
started_at: datetime | None
ended_at: datetime | None
class CollectionJobOut(BaseModel):
id: str
title: str
commands: str
trigger_mode: str = "manual"
status: str
ne_count: int
success_count: int
fail_count: int
output_count: int = 0
error_message: str
created_at: datetime
started_at: datetime | None
ended_at: datetime | None
last_run_at: datetime | None = None
class CollectionJobSummary(BaseModel):
id: str
title: str
status: str
trigger_mode: str = "manual"
ne_count: int
success_count: int
fail_count: int
created_at: datetime | None = None
started_at: datetime | None = None
ended_at: datetime | None = None
last_run_at: datetime | None = None
class CollectionDashboardOut(BaseModel):
job_count: int = 0
active_count: int = 0
running_job: CollectionJobSummary | None = None
last_job: CollectionJobSummary | None = None
next_due_at: datetime | None = None
policy: CollectionPolicyOut | None = None