feat(swarm): expose needs_resync on TopologySummary + upsert record_error
Two small observability follow-ups to the phase-1 agent/topology wiring: TopologySummary now carries needs_resync so operators can see the heartbeat's resync flag via the topology list/detail API without dropping into the DB. TopologyStore.record_error becomes an upsert — when a docker/compose failure fires during the first materialise (put() never reached), we still land a marker row so GET /topology/state surfaces the error and the next heartbeat carries an empty applied_version_hash. That empty hash is what master's heartbeat check relies on to flag the topology for resync instead of assuming the apply succeeded.
This commit is contained in:
@@ -84,6 +84,22 @@ async def test_summary_accepts_repo_topology_row(repo):
|
||||
summary = TopologySummary(**row)
|
||||
assert summary.id == tid
|
||||
assert summary.version == 1
|
||||
# Defaults surface cleanly on a fresh topology.
|
||||
assert summary.needs_resync is False
|
||||
assert summary.target_host_uuid is None
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_summary_surfaces_needs_resync_flag(repo):
|
||||
"""When the heartbeat handler flags a topology for resync, the API
|
||||
list/detail views must expose it so operators can debug without
|
||||
shelling into the DB."""
|
||||
plan = generate(_cfg())
|
||||
tid = await persist(repo, plan)
|
||||
await repo.set_topology_resync(tid, True)
|
||||
row = await repo.get_topology(tid)
|
||||
summary = TopologySummary(**row)
|
||||
assert summary.needs_resync is True
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
|
||||
Reference in New Issue
Block a user