Add period and cross-task interface compare for port traffic wall.

Compare by interface target_id with optional mapped baseline (same window or time-shifted), keep chart samples on target_row_id, and unify UI wording to interface.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-07-31 22:53:26 +08:00
parent 0d85b87be7
commit 653baa1b9f
16 changed files with 1185 additions and 129 deletions

View file

@ -63,6 +63,7 @@ class PortTrafficTaskOut(BaseModel):
class PortTrafficTargetOut(BaseModel):
id: str
task_id: str
series_id: str = ""
source: str
target_id: str
ne_name: str
@ -77,10 +78,34 @@ class PortTrafficTargetOut(BaseModel):
created_at: datetime | None = None
class PortTrafficSeriesOut(BaseModel):
id: str
task_id: str
title: str
status: str
active_target: PortTrafficTargetOut | None = None
retired_target_count: int = 0
created_at: datetime | None = None
class PortTrafficTargetsPut(BaseModel):
targets: list[PortTrafficTargetIn]
class PortTrafficReplacePortRequest(BaseModel):
"""Replace the active interface under a logical series (keeps history)."""
source: Literal["managed", "ume"]
target_id: str
ne_name: str = ""
ne_ip: str = ""
vendor: str = ""
ifname: str
if_description: str = ""
bw_bps: int = 0
series_title: str | None = Field(default=None, max_length=256)
class DiscoverPortsRequest(BaseModel):
source: Literal["managed", "ume"]
id: str
@ -116,6 +141,7 @@ class PortTrafficSamplePoint(BaseModel):
out_util_pct: float
bw_bps: int
rate_period_sec: int = 0
ts_raw: datetime | None = None # baseline original time when aligned
class PortTrafficSamplesOut(BaseModel):
@ -123,6 +149,22 @@ class PortTrafficSamplesOut(BaseModel):
points: list[PortTrafficSamplePoint] = Field(default_factory=list)
class PortTrafficCompareMeta(BaseModel):
target_id: str
baseline: str = "off"
offset_hours: float = 0
range_hours: float = 24
current_target: PortTrafficTargetOut | None = None
baseline_target: PortTrafficTargetOut | None = None
baseline_target_id: str = ""
class PortTrafficCompareOut(BaseModel):
meta: PortTrafficCompareMeta
current: list[PortTrafficSamplePoint] = Field(default_factory=list)
baseline: list[PortTrafficSamplePoint] = Field(default_factory=list)
class PortTrafficDashboardOut(BaseModel):
task_count: int = 0
running_task_count: int = 0