summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-08-24 10:40:13 -0500
committerGitHub <noreply@github.com>2026-08-24 10:40:13 -0500
commit745a4afd9bab8a99fdfdb38febe7bf39ac8e5a25 (patch)
tree6d39c115ec2403d3dd45417704adee43d5a22d1f /src
parent0712fac9dddb4dbfede4409867d2973ccbfb5aa2 (diff)
parentea65e1d24bf9327edd2244a81e9c307f3001b16f (diff)
downloadvyos-1x-745a4afd9bab8a99fdfdb38febe7bf39ac8e5a25.tar.gz
vyos-1x-745a4afd9bab8a99fdfdb38febe7bf39ac8e5a25.zip
Merge pull request #5415 from jvoss/api_ping
http-api: T9224: add ping endpoint to REST API
Diffstat (limited to 'src')
-rw-r--r--src/services/api/rest/models.py25
-rw-r--r--src/services/api/rest/routers.py26
2 files changed, 51 insertions, 0 deletions
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()