marker: fix PUT marker with an enabled-only body (bpf no longer required)

update_marker reused MarkerCreate, whose bpf is required, so a partial PUT like
{"enabled": false} was rejected with 422 "bpf field required". Add a MarkerUpdate
schema with every field optional (bpf included; capture_node_id and name are
create-only/path-driven and omitted) and use it for the PUT route — partial
updates now validate cleanly.
This commit is contained in:
YueGuobin 2026-08-02 22:32:04 +08:00
parent f7d7ba165a
commit e97df86d96
No known key found for this signature in database
3 changed files with 25 additions and 2 deletions

View File

@ -497,7 +497,7 @@ async def delete_marker(
)
async def update_marker(
marker_name: str,
marker_data: schemas.MarkerCreate,
marker_data: schemas.MarkerUpdate,
link: Link = Depends(dep_link)
) -> dict:
"""

View File

@ -20,7 +20,7 @@ from .common import ErrorMessage
from .version import Version
# Controller schemas
from .controller.links import LinkCreate, LinkUpdate, Link, UDPPortInfo, EthernetPortInfo, LinkCapture, MarkerCreate, MarkerDefinitionCreate
from .controller.links import LinkCreate, LinkUpdate, Link, UDPPortInfo, EthernetPortInfo, LinkCapture, MarkerCreate, MarkerUpdate, MarkerDefinitionCreate
from .controller.computes import ComputeCreate, ComputeUpdate, ComputeVirtualBoxVM, ComputeVMwareVM, ComputeDockerImage, AutoIdlePC, Compute
from .controller.templates import TemplateCreate, TemplateUpdate, TemplateUsage, Template
from .controller.images import Image, ImageType

View File

@ -191,6 +191,29 @@ class MarkerCreate(BaseModel):
)
class MarkerUpdate(BaseModel):
"""
Body for updating a marker partial update, every field optional.
``bpf`` is optional here (it is required on create). ``capture_node_id`` and
``name`` are create-only / path-driven and intentionally absent; an explicit
``direction: null`` clears the direction back to both (omitting keeps it).
"""
bpf: Optional[str] = None
tag: Optional[int] = None
direction: Optional[str] = Field(
None,
pattern=r"^(tx|rx)$",
description="Direction filter; an explicit null clears it to both. Omit to keep.",
)
color: Optional[str] = Field(None, description="Hex color render hint, e.g. '#ff5722'")
highlight_duration: Optional[int] = Field(
None, ge=1, description="UI highlight duration in ms; null = UI default"
)
enabled: Optional[bool] = Field(None, description="Toggle the marker on/off (instant).")
class MarkerDefinitionCreate(BaseModel):
"""
Body for creating / updating a project-level marker definition.