diff --git a/lib/bolt/cli/src/commands/cluster/server.rs b/lib/bolt/cli/src/commands/cluster/server.rs index ca48d05502..01f7e17e2e 100644 --- a/lib/bolt/cli/src/commands/cluster/server.rs +++ b/lib/bolt/cli/src/commands/cluster/server.rs @@ -373,7 +373,9 @@ mod render { pub public_ip: Option, } - pub fn servers(servers: Vec) { + pub fn servers(mut servers: Vec) { + servers.sort_by_key(|s| (s.datacenter_id, s.pool_type, s.public_ip.clone())); + let rows = servers.iter().map(|s| ServerTableRow { server_id: s.server_id, datacenter_id: s.datacenter_id, diff --git a/svc/pkg/cluster/src/ops/datacenter/topology_get.rs b/svc/pkg/cluster/src/ops/datacenter/topology_get.rs index 5992d7987f..2160685b75 100644 --- a/svc/pkg/cluster/src/ops/datacenter/topology_get.rs +++ b/svc/pkg/cluster/src/ops/datacenter/topology_get.rs @@ -163,14 +163,18 @@ pub async fn cluster_datacenter_topology_get( } } - // Get node resource limits - let node = unwrap!( - node_info.iter().find(|node| node - .ID + // Gracefully handle if node does not exist in API response + let Some(node) = node_info.iter().find(|node| { + node.ID .as_ref() - .map_or(false, |node_id| node_id == &server.nomad_node_id)), - format!("node not found {}", server.nomad_node_id) - ); + .map_or(false, |node_id| node_id == &server.nomad_node_id) + }) else { + tracing::error!(%server.nomad_node_id, "node not found in nomad response"); + + continue; + }; + + // Get node resource limits let resources = unwrap_ref!(node.node_resources); let limits = Stats { cpu: unwrap!(unwrap_ref!(resources.cpu).cpu_shares) as u64, diff --git a/svc/pkg/cluster/src/ops/server/lost_list.rs b/svc/pkg/cluster/src/ops/server/lost_list.rs index 402caab320..0b4f6d7d13 100644 --- a/svc/pkg/cluster/src/ops/server/lost_list.rs +++ b/svc/pkg/cluster/src/ops/server/lost_list.rs @@ -1,4 +1,8 @@ -use std::{net::IpAddr, collections::HashSet, convert::{TryFrom, TryInto}}; +use std::{ + collections::HashSet, + convert::{TryFrom, TryInto}, + net::IpAddr, +}; use chirp_workflow::prelude::*; use linode::util::client; @@ -6,7 +10,7 @@ use reqwest::header; use serde_json::json; use super::get::ServerRow; -use crate::types::{Filter, Server, Provider}; +use crate::types::{Filter, Provider, Server}; #[derive(Deserialize)] struct GetLinodesResponse { diff --git a/svc/pkg/cluster/src/ops/server/mod.rs b/svc/pkg/cluster/src/ops/server/mod.rs index f2f76a6204..4ce0ded602 100644 --- a/svc/pkg/cluster/src/ops/server/mod.rs +++ b/svc/pkg/cluster/src/ops/server/mod.rs @@ -2,6 +2,6 @@ pub mod destroy_with_filter; pub mod get; pub mod list; pub mod lost_list; +pub mod prune_with_filter; pub mod resolve_for_ip; pub mod taint_with_filter; -pub mod prune_with_filter; diff --git a/svc/pkg/cluster/src/ops/server/prune_with_filter.rs b/svc/pkg/cluster/src/ops/server/prune_with_filter.rs index c5d17afdf3..b5383e717d 100644 --- a/svc/pkg/cluster/src/ops/server/prune_with_filter.rs +++ b/svc/pkg/cluster/src/ops/server/prune_with_filter.rs @@ -1,11 +1,11 @@ -use std::{convert::TryFrom, collections::HashSet}; +use std::{collections::HashSet, convert::TryFrom}; use chirp_workflow::prelude::*; -use serde_json::json; use linode::util::{api, client}; use reqwest::header; +use serde_json::json; -use crate::{types::{Server, Filter, Provider}}; +use crate::types::{Filter, Provider, Server}; #[derive(Debug)] pub struct Input { @@ -21,7 +21,7 @@ pub async fn cluster_server_prune_with_filter( input: &Input, ) -> GlobalResult { let linode_token = util::env::read_secret(&["linode", "token"]).await?; - + let servers_res = ctx .op(crate::ops::server::lost_list::Input { filter: input.filter.clone(), @@ -80,7 +80,7 @@ pub async fn cluster_server_prune_with_filter( } } } - + Ok(Output {}) } @@ -102,9 +102,9 @@ async fn run_for_linode_account( } api::delete_instance(&client, linode_id).await?; - + // NOTE: Does not delete ssh keys } Ok(()) -} \ No newline at end of file +}