hypercall_admin/monitoring/
rsm.rs1use 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)]
22pub 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}