From ea65e1d24bf9327edd2244a81e9c307f3001b16f Mon Sep 17 00:00:00 2001 From: Jonathan Voss Date: Mon, 17 Aug 2026 04:50:22 +0000 Subject: http-api: T9224: add ping endpoint to REST API --- src/services/api/rest/models.py | 25 +++++++++++++++++++++++++ src/services/api/rest/routers.py | 26 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) (limited to 'src') diff --git a/src/services/api/rest/models.py b/src/services/api/rest/models.py index bfea17344..d3ee3a08e 100644 --- a/src/services/api/rest/models.py +++ b/src/services/api/rest/models.py @@ -304,6 +304,31 @@ class PoweroffModel(ApiModel): } +class PingModel(ApiModel): + op: StrictStr + host: StrictStr + count: StrictInt = 5 + vrf: StrictStr = None + + @field_validator('count') + @classmethod + def check_between(cls, count: int) -> int: + if not 1 <= count <= 10: + raise ValueError('count must be between 1 and 10') + return count + + class Config: + schema_extra = { + 'example': { + 'key': 'id_key', + 'op': 'ping', + 'host': 'host', + 'count': 5, + 'vrf': 'vrf', + } + } + + class TracerouteModel(ApiModel): op: StrictStr host: StrictStr diff --git a/src/services/api/rest/routers.py b/src/services/api/rest/routers.py index fe67d4612..a241cabf8 100644 --- a/src/services/api/rest/routers.py +++ b/src/services/api/rest/routers.py @@ -74,6 +74,7 @@ from .models import RebootModel from .models import ResetModel from .models import RenewModel from .models import ImportPkiModel +from .models import PingModel from .models import PoweroffModel from .models import TracerouteModel @@ -218,6 +219,7 @@ class MultipartRequest(Request): '/container-image', '/image', '/configure-section', + '/ping', '/traceroute', ): if 'path' not in c: @@ -959,6 +961,30 @@ def poweroff_op(data: PoweroffModel): return success(res) +@router.post('/ping') +def ping_op(data: PingModel): + state = SessionState() + session = state.session + + op = data.op + host = data.host + count = data.count + vrf = data.vrf + + try: + if op == 'ping': + res = session.ping(host, count, vrf) + else: + return error(400, f"'{op}' is not a valid operation") + except ConfigSessionError as e: + return error(400, str(e)) + except Exception: + LOG.critical(traceback.format_exc()) + return error(500, 'An internal error occurred. Check the logs for details.') + + return success(res) + + @router.post('/traceroute') def traceroute_op(data: TracerouteModel): state = SessionState() -- cgit v1.2.3