diff --git a/libsql-server/src/http/admin/mod.rs b/libsql-server/src/http/admin/mod.rs index 6953696312..bfce6a4df0 100644 --- a/libsql-server/src/http/admin/mod.rs +++ b/libsql-server/src/http/admin/mod.rs @@ -142,6 +142,7 @@ where }; let router = axum::Router::new() .route("/", get(handle_get_index)) + .route("/v1/namespaces", get(handle_get_namespaces)) .route( "/v1/namespaces/:namespace/config", get(handle_get_config).post(handle_post_config), @@ -238,6 +239,19 @@ async fn handle_get_index() -> &'static str { "Welcome to the sqld admin API" } +async fn handle_get_namespaces( + State(app_state): State>>, +) -> Json> { + let store = app_state.namespaces.meta_store(); + let namespaces = store + .list_names() + .await + .iter() + .map(|n| n.to_string()) + .collect(); + Json(namespaces) +} + async fn handle_metrics(State(metrics): State) -> String { metrics.render() } diff --git a/libsql-server/src/namespace/meta_store.rs b/libsql-server/src/namespace/meta_store.rs index 70b419ebe9..d5ad57795d 100644 --- a/libsql-server/src/namespace/meta_store.rs +++ b/libsql-server/src/namespace/meta_store.rs @@ -562,6 +562,10 @@ impl MetaStore { self.inner.configs.lock().await.contains_key(namespace) } + pub async fn list_names(&self) -> Vec { + self.inner.configs.lock().await.keys().cloned().collect() + } + pub(crate) async fn shutdown(&self) -> crate::Result<()> { let replicator = self.inner.wal_manager.wrapper().as_ref();