Fmt & cleanup

This commit is contained in:
Alex 2022-05-05 13:51:23 +02:00
parent 7a19daafbd
commit ec03e3d16c
Signed by untrusted user: lx
GPG key ID: 0E496D15096376BE
3 changed files with 59 additions and 34 deletions

View file

@ -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()

View file

@ -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| {
addr: i.addr, (
is_up: i.is_up, hex::encode(i.id),
last_seen_secs_ago: i.last_seen_secs_ago, KnownNodeResp {
hostname: i.status.hostname, addr: i.addr,
})) is_up: i.is_up,
.collect(), last_seen_secs_ago: i.last_seen_secs_ago,
roles: layout.roles.items() hostname: i.status.hostname,
.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>>,

View file

@ -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,