added capability to get only one node
This commit is contained in:
parent
7b3ee9319f
commit
b13b545501
@ -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);
|
||||
}
|
||||
|
33
src/data.rs
33
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<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()
|
||||
}
|
||||
}
|
||||
|
14
src/grpc.rs
14
src/grpc.rs
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user