added capability to get only one node

This commit is contained in:
ghe0 2024-12-28 22:31:55 +02:00
parent 7b3ee9319f
commit b13b545501
Signed by: ghe0
GPG Key ID: 451028EE56A0FBB4
3 changed files with 48 additions and 3 deletions

@ -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);
}

@ -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<Node> {
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<Contract> {
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()
}
}

@ -373,6 +373,20 @@ impl BrainCliService for BrainCliMock {
))
}
async fn get_one_node(
&self,
req: Request<NodeFilters>,
) -> Result<Response<NodeListResp>, 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<DeleteVmReq>) -> Result<Response<Empty>, Status> {
let req = req.into_inner();
info!("Unknown CLI requested to delete vm {}", req.uuid);