forked from Deuxfleurs/garage
Fmt & cleanup
This commit is contained in:
parent
7a19daafbd
commit
ec03e3d16c
3 changed files with 59 additions and 34 deletions
|
@ -3,7 +3,9 @@ use std::sync::Arc;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
use futures::future::Future;
|
use futures::future::Future;
|
||||||
use http::header::{CONTENT_TYPE, ALLOW, ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN};
|
use http::header::{
|
||||||
|
ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW, CONTENT_TYPE,
|
||||||
|
};
|
||||||
use hyper::{Body, Request, Response};
|
use hyper::{Body, Request, Response};
|
||||||
|
|
||||||
use opentelemetry::trace::{SpanRef, Tracer};
|
use opentelemetry::trace::{SpanRef, Tracer};
|
||||||
|
@ -16,8 +18,8 @@ use garage_util::error::Error as GarageError;
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::generic_server::*;
|
use crate::generic_server::*;
|
||||||
|
|
||||||
use crate::admin::router::{Authorization, Endpoint};
|
|
||||||
use crate::admin::cluster::*;
|
use crate::admin::cluster::*;
|
||||||
|
use crate::admin::router::{Authorization, Endpoint};
|
||||||
|
|
||||||
pub struct AdminApiServer {
|
pub struct AdminApiServer {
|
||||||
garage: Arc<Garage>,
|
garage: Arc<Garage>,
|
||||||
|
@ -123,6 +125,7 @@ impl ApiHandler for AdminApiServer {
|
||||||
Endpoint::Options => self.handle_options(&req),
|
Endpoint::Options => self.handle_options(&req),
|
||||||
Endpoint::Metrics => self.handle_metrics(),
|
Endpoint::Metrics => self.handle_metrics(),
|
||||||
Endpoint::GetClusterStatus => handle_get_cluster_status(&self.garage).await,
|
Endpoint::GetClusterStatus => handle_get_cluster_status(&self.garage).await,
|
||||||
|
Endpoint::GetClusterLayout => handle_get_cluster_layout(&self.garage).await,
|
||||||
_ => Err(Error::NotImplemented(format!(
|
_ => Err(Error::NotImplemented(format!(
|
||||||
"Admin endpoint {} not implemented yet",
|
"Admin endpoint {} not implemented yet",
|
||||||
endpoint.name()
|
endpoint.name()
|
||||||
|
|
|
@ -1,47 +1,37 @@
|
||||||
use std::sync::Arc;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::net::{IpAddr, SocketAddr};
|
use std::net::SocketAddr;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use serde::{Serialize};
|
use serde::Serialize;
|
||||||
|
|
||||||
use hyper::{Body, Request, Response, StatusCode};
|
use hyper::{Body, Response, StatusCode};
|
||||||
|
|
||||||
use garage_util::data::*;
|
|
||||||
use garage_util::error::Error as GarageError;
|
|
||||||
use garage_rpc::layout::*;
|
use garage_rpc::layout::*;
|
||||||
use garage_rpc::system::*;
|
use garage_util::error::Error as GarageError;
|
||||||
|
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
|
|
||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
|
|
||||||
|
pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
|
||||||
pub async fn handle_get_cluster_status(
|
|
||||||
garage: &Arc<Garage>,
|
|
||||||
) -> Result<Response<Body>, Error> {
|
|
||||||
let layout = garage.system.get_cluster_layout();
|
|
||||||
|
|
||||||
let res = GetClusterStatusResponse {
|
let res = GetClusterStatusResponse {
|
||||||
known_nodes: garage.system.get_known_nodes()
|
known_nodes: garage
|
||||||
|
.system
|
||||||
|
.get_known_nodes()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|i| (hex::encode(i.id), KnownNodeResp {
|
.map(|i| {
|
||||||
|
(
|
||||||
|
hex::encode(i.id),
|
||||||
|
KnownNodeResp {
|
||||||
addr: i.addr,
|
addr: i.addr,
|
||||||
is_up: i.is_up,
|
is_up: i.is_up,
|
||||||
last_seen_secs_ago: i.last_seen_secs_ago,
|
last_seen_secs_ago: i.last_seen_secs_ago,
|
||||||
hostname: i.status.hostname,
|
hostname: i.status.hostname,
|
||||||
}))
|
},
|
||||||
.collect(),
|
)
|
||||||
roles: layout.roles.items()
|
})
|
||||||
.iter()
|
|
||||||
.filter(|(_, _, v)| v.0.is_some())
|
|
||||||
.map(|(k, _, v)| (hex::encode(k), v.0.clone()))
|
|
||||||
.collect(),
|
|
||||||
staged_role_changes: layout.staging.items()
|
|
||||||
.iter()
|
|
||||||
.filter(|(k, _, v)| layout.roles.get(k) != Some(v))
|
|
||||||
.map(|(k, _, v)| (hex::encode(k), v.0.clone()))
|
|
||||||
.collect(),
|
.collect(),
|
||||||
|
layout: get_cluster_layout(garage),
|
||||||
};
|
};
|
||||||
|
|
||||||
let resp_json = serde_json::to_string_pretty(&res).map_err(GarageError::from)?;
|
let resp_json = serde_json::to_string_pretty(&res).map_err(GarageError::from)?;
|
||||||
|
@ -50,11 +40,44 @@ pub async fn handle_get_cluster_status(
|
||||||
.body(Body::from(resp_json))?)
|
.body(Body::from(resp_json))?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn handle_get_cluster_layout(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
|
||||||
|
let res = get_cluster_layout(garage);
|
||||||
|
let resp_json = serde_json::to_string_pretty(&res).map_err(GarageError::from)?;
|
||||||
|
Ok(Response::builder()
|
||||||
|
.status(StatusCode::OK)
|
||||||
|
.body(Body::from(resp_json))?)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_cluster_layout(garage: &Arc<Garage>) -> GetClusterLayoutResponse {
|
||||||
|
let layout = garage.system.get_cluster_layout();
|
||||||
|
|
||||||
|
GetClusterLayoutResponse {
|
||||||
|
roles: layout
|
||||||
|
.roles
|
||||||
|
.items()
|
||||||
|
.iter()
|
||||||
|
.filter(|(_, _, v)| v.0.is_some())
|
||||||
|
.map(|(k, _, v)| (hex::encode(k), v.0.clone()))
|
||||||
|
.collect(),
|
||||||
|
staged_role_changes: layout
|
||||||
|
.staging
|
||||||
|
.items()
|
||||||
|
.iter()
|
||||||
|
.filter(|(k, _, v)| layout.roles.get(k) != Some(v))
|
||||||
|
.map(|(k, _, v)| (hex::encode(k), v.0.clone()))
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct GetClusterStatusResponse {
|
struct GetClusterStatusResponse {
|
||||||
#[serde(rename = "knownNodes")]
|
#[serde(rename = "knownNodes")]
|
||||||
known_nodes: HashMap<String, KnownNodeResp>,
|
known_nodes: HashMap<String, KnownNodeResp>,
|
||||||
|
layout: GetClusterLayoutResponse,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct GetClusterLayoutResponse {
|
||||||
roles: HashMap<String, Option<NodeRole>>,
|
roles: HashMap<String, Option<NodeRole>>,
|
||||||
#[serde(rename = "stagedRoleChanges")]
|
#[serde(rename = "stagedRoleChanges")]
|
||||||
staged_role_changes: HashMap<String, Option<NodeRole>>,
|
staged_role_changes: HashMap<String, Option<NodeRole>>,
|
||||||
|
|
|
@ -462,7 +462,6 @@ impl System {
|
||||||
SystemRpc::ReturnKnownNodes(known_nodes)
|
SystemRpc::ReturnKnownNodes(known_nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async fn handle_advertise_status(
|
async fn handle_advertise_status(
|
||||||
self: &Arc<Self>,
|
self: &Arc<Self>,
|
||||||
from: Uuid,
|
from: Uuid,
|
||||||
|
|
Loading…
Reference in a new issue