mirror of
https://github.com/hansjone/netx.git
synced 2026-10-09 06:40:45 +08:00
Wait indefinitely for UME topology dumps while the connection stays up.
Default topology read timeout to 0 (no deadline) and extend stale-running reap to 24h so long TopoNodes/TopologicalLinks pulls are not killed mid-stream. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
6622d4ce7a
commit
cd7d1fc6e7
4 changed files with 32 additions and 13 deletions
|
|
@ -32,8 +32,10 @@ NETX_UME_TOPO_NODES_PATH=/restconf/data/zte-resources-module:TopoNodes
|
||||||
NETX_UME_TOPOLOGICAL_LINKS_PATH=/restconf/data/zte-resources-module:TopologicalLinks
|
NETX_UME_TOPOLOGICAL_LINKS_PATH=/restconf/data/zte-resources-module:TopologicalLinks
|
||||||
NETX_UME_SYNC_TOPOLOGY_AUTO_ENABLED=true
|
NETX_UME_SYNC_TOPOLOGY_AUTO_ENABLED=true
|
||||||
NETX_UME_SYNC_TOPOLOGY_EVERY_HOURS=24
|
NETX_UME_SYNC_TOPOLOGY_EVERY_HOURS=24
|
||||||
# NETX_UME_TOPOLOGY_TIMEOUT_S=600
|
# Topology dump: 0 = no read timeout (wait while TCP stays up). Set e.g. 3600 to cap.
|
||||||
# NETX_UME_SYNC_TOPOLOGY_STALE_RUNNING_SEC=1800
|
# NETX_UME_TOPOLOGY_TIMEOUT_S=0
|
||||||
|
# Reap stuck topology jobs only after this many seconds (default 24h).
|
||||||
|
# NETX_UME_SYNC_TOPOLOGY_STALE_RUNNING_SEC=86400
|
||||||
NETX_UME_SYNC_ALARMS_CURRENT_ENABLED=true
|
NETX_UME_SYNC_ALARMS_CURRENT_ENABLED=true
|
||||||
NETX_UME_SYNC_ALARMS_CURRENT_INTERVAL_S=18000
|
NETX_UME_SYNC_ALARMS_CURRENT_INTERVAL_S=18000
|
||||||
NETX_UME_SYNC_ALARMS_CURRENT_SKIP_WHEN_WS=true
|
NETX_UME_SYNC_ALARMS_CURRENT_SKIP_WHEN_WS=true
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,10 @@ class Settings(BaseSettings):
|
||||||
ume_sync_inventory_every_hours: int = 48
|
ume_sync_inventory_every_hours: int = 48
|
||||||
ume_sync_topology_auto_enabled: bool = True
|
ume_sync_topology_auto_enabled: bool = True
|
||||||
ume_sync_topology_every_hours: int = 24
|
ume_sync_topology_every_hours: int = 24
|
||||||
ume_topology_timeout_s: float = 600.0
|
# Topology REST dump: 0 = no read timeout (wait while the connection stays up).
|
||||||
ume_sync_topology_stale_running_sec: int = 1800
|
ume_topology_timeout_s: float = 0.0
|
||||||
|
# Do not reap a still-running topology pull until this age (long UME dumps).
|
||||||
|
ume_sync_topology_stale_running_sec: int = 86400
|
||||||
ume_token_path: str = "/restconf/operations/zte-security:oauth_token"
|
ume_token_path: str = "/restconf/operations/zte-security:oauth_token"
|
||||||
ume_token_handshake_path: str = "/restconf/operations/zte-security:oauth_handshake"
|
ume_token_handshake_path: str = "/restconf/operations/zte-security:oauth_handshake"
|
||||||
ume_token_logout_path: str = "/restconf/operations/zte-security:oauth_token"
|
ume_token_logout_path: str = "/restconf/operations/zte-security:oauth_token"
|
||||||
|
|
|
||||||
|
|
@ -237,16 +237,30 @@ class UMEClient:
|
||||||
headers[self.auth_header] = token
|
headers[self.auth_header] = token
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
def _client(self, *, timeout_s: float | None = None) -> httpx.Client:
|
def _client(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
timeout_s: float | None = None,
|
||||||
|
timeout: httpx.Timeout | None = None,
|
||||||
|
) -> httpx.Client:
|
||||||
# Use explicit HTTPTransport to keep behavior consistent with onsite validation.
|
# Use explicit HTTPTransport to keep behavior consistent with onsite validation.
|
||||||
# In this mode, requests run over HTTP/1.1 and avoid HTTP/2 negotiation issues.
|
# In this mode, requests run over HTTP/1.1 and avoid HTTP/2 negotiation issues.
|
||||||
transport = httpx.HTTPTransport(verify=self.verify_tls, http2=False)
|
transport = httpx.HTTPTransport(verify=self.verify_tls, http2=False)
|
||||||
if timeout_s is None:
|
if timeout is not None:
|
||||||
to: float | httpx.Timeout = self.timeout_s
|
to: float | httpx.Timeout = timeout
|
||||||
|
elif timeout_s is None:
|
||||||
|
to = self.timeout_s
|
||||||
|
elif float(timeout_s) <= 0:
|
||||||
|
# No read/write deadline — keep waiting while the peer still streams.
|
||||||
|
to = httpx.Timeout(connect=30.0, read=None, write=None, pool=30.0)
|
||||||
else:
|
else:
|
||||||
# Large topology dumps need a long read window; connect stays short.
|
|
||||||
read_s = max(3.0, float(timeout_s))
|
read_s = max(3.0, float(timeout_s))
|
||||||
to = httpx.Timeout(connect=min(30.0, read_s), read=read_s, write=min(60.0, read_s), pool=30.0)
|
to = httpx.Timeout(
|
||||||
|
connect=min(30.0, read_s),
|
||||||
|
read=read_s,
|
||||||
|
write=min(60.0, read_s),
|
||||||
|
pool=30.0,
|
||||||
|
)
|
||||||
return httpx.Client(transport=transport, timeout=to)
|
return httpx.Client(transport=transport, timeout=to)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -618,10 +632,11 @@ class UMEClient:
|
||||||
return rows, diag
|
return rows, diag
|
||||||
|
|
||||||
def _topology_timeout_s(self) -> float:
|
def _topology_timeout_s(self) -> float:
|
||||||
|
"""Read timeout seconds for topology dumps; ``0`` = wait while connected."""
|
||||||
base = float(getattr(settings, "ume_topology_timeout_s", 0) or 0)
|
base = float(getattr(settings, "ume_topology_timeout_s", 0) or 0)
|
||||||
if base > 0:
|
if base <= 0:
|
||||||
return max(30.0, base)
|
return 0.0
|
||||||
return max(self.timeout_s, 600.0)
|
return max(30.0, base)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _extract_restconf_list(payload: dict[str, Any], *, containers: list[str], items: list[str]) -> list[dict[str, Any]]:
|
def _extract_restconf_list(payload: dict[str, Any], *, containers: list[str], items: list[str]) -> list[dict[str, Any]]:
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ def _ume_ne_id_for_topo_node(*, node_type: str, name: str) -> str:
|
||||||
|
|
||||||
|
|
||||||
def _stale_running_sec() -> int:
|
def _stale_running_sec() -> int:
|
||||||
return max(300, int(getattr(settings, "ume_sync_topology_stale_running_sec", 1800) or 1800))
|
return max(3600, int(getattr(settings, "ume_sync_topology_stale_running_sec", 86400) or 86400))
|
||||||
|
|
||||||
|
|
||||||
def fail_stale_topology_running_jobs(db: Session | None = None) -> int:
|
def fail_stale_topology_running_jobs(db: Session | None = None) -> int:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue