From b13b545501a66dcdb597b6be7594a54b53c92c18 Mon Sep 17 00:00:00 2001 From: ghe0 Date: Sat, 28 Dec 2024 22:31:55 +0200 Subject: [PATCH] added capability to get only one node --- brain.proto | 4 ++++ src/data.rs | 33 ++++++++++++++++++++++++++++++--- src/grpc.rs | 14 ++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/brain.proto b/brain.proto index e096b24..92a219c 100644 --- a/brain.proto +++ b/brain.proto @@ -119,6 +119,9 @@ message NodeFilters { uint32 memory_mb = 5; uint32 storage_gb = 6; string country = 7; + string region = 8; + string city = 9; + string ip = 10; } message NodeListResp { @@ -135,6 +138,7 @@ service BrainCliService { rpc CreateVMContract (NewVMReq) returns (NewVMResp); rpc ListVMContracts (ListVMContractsReq) returns (stream VMContract); rpc ListNodes (NodeFilters) returns (stream NodeListResp); + rpc GetOneNode (NodeFilters) returns (NodeListResp); rpc DeleteVM (DeleteVMReq) returns (Empty); rpc UpdateVM (UpdateVMReq) returns (UpdateVMResp); } diff --git a/src/data.rs b/src/data.rs index 69f03bb..cc0c8fc 100644 --- a/src/data.rs +++ b/src/data.rs @@ -376,7 +376,6 @@ impl BrainData { let nodes = self.nodes.read().unwrap(); nodes .iter() - .cloned() .filter(|n| { n.avail_ports >= filters.free_ports && (!filters.offers_ipv4 || n.avail_ipv4 > 0) @@ -384,10 +383,38 @@ impl BrainData { && n.avail_vcpus >= filters.vcpus && n.avail_mem_mb >= filters.memory_mb && n.avail_storage_gbs >= filters.storage_gb + && (!filters.country.is_empty() && (n.country == filters.country)) + && (!filters.city.is_empty() && (n.city == filters.city)) + && (!filters.region.is_empty() && (n.region == filters.region)) + && (!filters.ip.is_empty() && (n.ip == filters.ip)) }) + .cloned() .collect() } + // TODO: sort by rating + pub fn get_one_node_by_filters( + &self, + filters: &crate::grpc::brain::NodeFilters, + ) -> Option { + let nodes = self.nodes.read().unwrap(); + nodes + .iter() + .find(|n| { + n.avail_ports >= filters.free_ports + && (!filters.offers_ipv4 || n.avail_ipv4 > 0) + && (!filters.offers_ipv6 || n.avail_ipv6 > 0) + && n.avail_vcpus >= filters.vcpus + && n.avail_mem_mb >= filters.memory_mb + && n.avail_storage_gbs >= filters.storage_gb + && (!filters.country.is_empty() && (n.country == filters.country)) + && (!filters.city.is_empty() && (n.city == filters.city)) + && (!filters.region.is_empty() && (n.region == filters.region)) + && (!filters.ip.is_empty() && (n.ip == filters.ip)) + }) + .cloned() + } + pub fn find_contract_by_uuid(&self, uuid: &str) -> Option { let contracts = self.contracts.read().unwrap(); contracts.iter().cloned().find(|c| c.uuid == uuid) @@ -400,8 +427,8 @@ impl BrainData { .read() .unwrap() .iter() - .cloned() .filter(|c| c.admin_pubkey == admin_pubkey) + .cloned() .collect(); debug!("Found {} contracts or {admin_pubkey}.", contracts.len()); contracts @@ -411,8 +438,8 @@ impl BrainData { let contracts = self.contracts.read().unwrap(); contracts .iter() - .cloned() .filter(|c| c.node_pubkey == node_pubkey) + .cloned() .collect() } } diff --git a/src/grpc.rs b/src/grpc.rs index 674c03c..9e3985f 100644 --- a/src/grpc.rs +++ b/src/grpc.rs @@ -373,6 +373,20 @@ impl BrainCliService for BrainCliMock { )) } + async fn get_one_node( + &self, + req: Request, + ) -> Result, Status> { + let req = req.into_inner(); + info!("Unknown CLI requested ListNodesStream: {req:?}"); + match self.data.get_one_node_by_filters(&req) { + Some(node) => Ok(Response::new(node.into())), + None => Err(Status::not_found( + "Could not find any node based on your search criteria", + )), + } + } + async fn delete_vm(&self, req: Request) -> Result, Status> { let req = req.into_inner(); info!("Unknown CLI requested to delete vm {}", req.uuid);