Skip to main content

hypercall_admin/monitoring/
rsm.rs

1//! RSM signer status admin endpoint.
2
3use axum::extract::State;
4use axum::http::StatusCode;
5use tracing::warn;
6
7use crate::state::AdminState;
8use hypercall_runtime_api::error::ApiError;
9use hypercall_runtime_api::sonic_json::SonicJson;
10
11#[utoipa::path(
12    get,
13    path = "/monitoring/rsm/status",
14    responses(
15        (status = 200, description = "RSM signer status", body = hypercall_signer::RsmSignerStatus),
16        (status = 401, description = "Invalid or missing X-Admin-Key header"),
17        (status = 503, description = "RSM signer is not configured or status is unavailable")
18    ),
19    tag = "Monitoring",
20    security(("admin_key" = []))
21)]
22/// Get RSM signer status.
23pub async fn get_rsm_status(
24    State(state): State<AdminState>,
25) -> Result<SonicJson<hypercall_signer::RsmSignerStatus>, ApiError> {
26    let signer = state.rsm_signer.as_ref().ok_or_else(|| {
27        ApiError::new(
28            StatusCode::SERVICE_UNAVAILABLE,
29            "service_unavailable",
30            "RSM signer is not configured",
31        )
32    })?;
33
34    let status = signer.status().await.map_err(|error| {
35        warn!("rsm status check failed: {}", error);
36        ApiError::new(
37            StatusCode::SERVICE_UNAVAILABLE,
38            "service_unavailable",
39            "RSM signer status unavailable",
40        )
41    })?;
42
43    Ok(SonicJson(status))
44}