remove node_pubkey from UpdateVmReq

This commit is contained in:
ghe0 2024-12-26 00:56:24 +02:00
parent b6dd68fc89
commit 46911cdb7a
Signed by: ghe0
GPG Key ID: 451028EE56A0FBB4
5 changed files with 222 additions and 53 deletions

162
Cargo.lock generated

@ -26,6 +26,21 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "android-tzdata"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.18" version = "0.6.18"
@ -204,6 +219,7 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
name = "brain-mock" name = "brain-mock"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"chrono",
"dashmap", "dashmap",
"env_logger", "env_logger",
"log", "log",
@ -216,6 +232,12 @@ dependencies = [
"uuid", "uuid",
] ]
[[package]]
name = "bumpalo"
version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.5.0" version = "1.5.0"
@ -228,18 +250,47 @@ version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
[[package]]
name = "cc"
version = "1.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e"
dependencies = [
"shlex",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
version = "0.4.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
dependencies = [
"android-tzdata",
"iana-time-zone",
"js-sys",
"num-traits",
"wasm-bindgen",
"windows-targets",
]
[[package]] [[package]]
name = "colorchoice" name = "colorchoice"
version = "1.0.3" version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.21" version = "0.8.21"
@ -527,6 +578,29 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "iana-time-zone"
version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "1.9.3" version = "1.9.3"
@ -568,6 +642,16 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "js-sys"
version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.168" version = "0.2.168"
@ -640,6 +724,15 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "object" name = "object"
version = "0.36.5" version = "0.36.5"
@ -924,6 +1017,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.9" version = "0.4.9"
@ -1193,6 +1292,69 @@ version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
dependencies = [
"cfg-if",
"once_cell",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
dependencies = [
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.52.0" version = "0.52.0"

@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
chrono = "0.4.39"
dashmap = "6.1.0" dashmap = "6.1.0"
env_logger = "0.11.6" env_logger = "0.11.6"
log = "0.4.22" log = "0.4.22"

@ -42,7 +42,6 @@ message NewVMReq {
message UpdateVMReq { message UpdateVMReq {
string uuid = 1; string uuid = 1;
string node_pubkey = 2;
uint32 disk_size_gb = 3; uint32 disk_size_gb = 3;
uint32 vcpus = 4; uint32 vcpus = 4;
uint32 memory_mb = 5; uint32 memory_mb = 5;

@ -1,5 +1,6 @@
#![allow(dead_code)] #![allow(dead_code)]
use crate::grpc::brain as grpc; use crate::grpc::brain as grpc;
use chrono::Utc;
use dashmap::DashMap; use dashmap::DashMap;
use log::{debug, info, warn}; use log::{debug, info, warn};
use std::sync::RwLock; use std::sync::RwLock;
@ -97,8 +98,8 @@ impl Into<grpc::VmContract> for Contract {
pub struct BrainData { pub struct BrainData {
nodes: RwLock<Vec<Node>>, nodes: RwLock<Vec<Node>>,
contracts: RwLock<Vec<Contract>>, contracts: RwLock<Vec<Contract>>,
tmp_vmrequests: DashMap<String, (grpc::NewVmReq, OneshotSender<grpc::NewVmResp>)>, tmp_newvm_reqs: DashMap<String, (grpc::NewVmReq, OneshotSender<grpc::NewVmResp>)>,
tmp_updatevmrequests: DashMap<String, (grpc::UpdateVmReq, OneshotSender<grpc::UpdateVmResp>)>, tmp_updatevm_reqs: DashMap<String, (grpc::UpdateVmReq, OneshotSender<grpc::UpdateVmResp>)>,
daemon_deletevm_tx: DashMap<String, Sender<grpc::DeleteVmReq>>, daemon_deletevm_tx: DashMap<String, Sender<grpc::DeleteVmReq>>,
daemon_newvm_tx: DashMap<String, Sender<grpc::NewVmReq>>, daemon_newvm_tx: DashMap<String, Sender<grpc::NewVmReq>>,
daemon_updatevm_tx: DashMap<String, Sender<grpc::UpdateVmReq>>, daemon_updatevm_tx: DashMap<String, Sender<grpc::UpdateVmReq>>,
@ -116,8 +117,8 @@ impl BrainData {
Self { Self {
nodes: RwLock::new(Vec::new()), nodes: RwLock::new(Vec::new()),
contracts: RwLock::new(Vec::new()), contracts: RwLock::new(Vec::new()),
tmp_vmrequests: DashMap::new(), tmp_newvm_reqs: DashMap::new(),
tmp_updatevmrequests: DashMap::new(), tmp_updatevm_reqs: DashMap::new(),
daemon_deletevm_tx: DashMap::new(), daemon_deletevm_tx: DashMap::new(),
daemon_newvm_tx: DashMap::new(), daemon_newvm_tx: DashMap::new(),
daemon_updatevm_tx: DashMap::new(), daemon_updatevm_tx: DashMap::new(),
@ -141,10 +142,8 @@ impl BrainData {
self.daemon_deletevm_tx.insert(node_pubkey.to_string(), tx); self.daemon_deletevm_tx.insert(node_pubkey.to_string(), tx);
} }
pub async fn add_daemon_updatevm_tx(&self, node_pubkey: &str, tx: Sender<grpc::UpdateVmReq>) { pub fn add_daemon_updatevm_tx(&self, node_pubkey: &str, tx: Sender<grpc::UpdateVmReq>) {
log::debug!("Adding daemon updatevm tx for node_pubkey: {}", node_pubkey); log::debug!("Adding daemon updatevm tx for node_pubkey: {}", node_pubkey);
self.tmp_updatevmrequests
.retain(|_, req| req.0.node_pubkey != node_pubkey);
self.daemon_updatevm_tx.insert(node_pubkey.to_string(), tx); self.daemon_updatevm_tx.insert(node_pubkey.to_string(), tx);
info!("Added daemon TX for {}", node_pubkey); info!("Added daemon TX for {}", node_pubkey);
} }
@ -170,13 +169,13 @@ impl BrainData {
} }
pub async fn add_daemon_newvm_tx(&self, node_pubkey: &str, tx: Sender<grpc::NewVmReq>) { pub async fn add_daemon_newvm_tx(&self, node_pubkey: &str, tx: Sender<grpc::NewVmReq>) {
self.tmp_vmrequests self.tmp_newvm_reqs
.retain(|_, req| req.0.node_pubkey != node_pubkey); .retain(|_, req| req.0.node_pubkey != node_pubkey);
self.daemon_newvm_tx.insert(node_pubkey.to_string(), tx); self.daemon_newvm_tx.insert(node_pubkey.to_string(), tx);
} }
pub async fn submit_vmconfirmation(&self, confirmation: grpc::NewVmResp) { pub async fn submit_vmconfirmation(&self, confirmation: grpc::NewVmResp) {
let newvmreq = match self.tmp_vmrequests.remove(&confirmation.uuid) { let newvmreq = match self.tmp_newvm_reqs.remove(&confirmation.uuid) {
Some((_, r)) => r, Some((_, r)) => r,
None => { None => {
log::error!( log::error!(
@ -202,8 +201,8 @@ impl BrainData {
exposed_ports: confirmation.exposed_ports, exposed_ports: confirmation.exposed_ports,
public_ipv4: confirmation.public_ipv4, public_ipv4: confirmation.public_ipv4,
public_ipv6: confirmation.public_ipv6, public_ipv6: confirmation.public_ipv6,
created_at: format!("{:?}", std::time::SystemTime::now()), created_at: Utc::now().to_rfc3339(),
updated_at: format!("{:?}", std::time::SystemTime::now()), updated_at: String::new(),
hostname: newvmreq.0.hostname, hostname: newvmreq.0.hostname,
admin_pubkey: newvmreq.0.admin_pubkey, admin_pubkey: newvmreq.0.admin_pubkey,
node_pubkey: newvmreq.0.node_pubkey, node_pubkey: newvmreq.0.node_pubkey,
@ -217,36 +216,31 @@ impl BrainData {
self.contracts.write().unwrap().push(contract); self.contracts.write().unwrap().push(contract);
} }
pub async fn submit_update_vmconfirmation(&self, confirmation: grpc::UpdateVmResp) { pub async fn submit_updatevm_resp(&self, resp: grpc::UpdateVmResp) {
let updatevmreq = match self.tmp_updatevmrequests.remove(&confirmation.uuid) { let updatevmreq = match self.tmp_updatevm_reqs.remove(&resp.uuid) {
Some((_, r)) => r, Some((_, r)) => r,
None => { None => {
log::error!( log::error!(
"Received confirmation for ghost UpdateVMRequest {}", "Received confirmation for ghost UpdateVMRequest {}",
confirmation.uuid resp.uuid
); );
return; return;
} }
}; };
if let Err(e) = updatevmreq.1.send(confirmation.clone()) { if let Err(e) = updatevmreq.1.send(resp.clone()) {
log::error!( log::error!("CLI RX dropped before receiving UpdateVMResp {resp:?}. Error is: {e:?}");
"CLI RX for {} dropped before receiving confirmation {:?}. Error is: {:?}",
&updatevmreq.0.node_pubkey,
confirmation,
e
);
} }
if confirmation.error != "" { if resp.error != "" {
return; return;
} }
let mut contracts = self.contracts.write().unwrap(); let mut contracts = self.contracts.write().unwrap();
if let Some(contract) = contracts.iter_mut().find(|c| c.uuid == confirmation.uuid) { if let Some(contract) = contracts.iter_mut().find(|c| c.uuid == resp.uuid) {
contract.disk_size_gb = updatevmreq.0.disk_size_gb; contract.disk_size_gb = updatevmreq.0.disk_size_gb;
contract.vcpus = updatevmreq.0.vcpus; contract.vcpus = updatevmreq.0.vcpus;
contract.memory_mb = updatevmreq.0.memory_mb; contract.memory_mb = updatevmreq.0.memory_mb;
contract.kernel_sha = updatevmreq.0.kernel_sha; contract.kernel_sha = updatevmreq.0.kernel_sha;
contract.dtrfs_sha = updatevmreq.0.dtrfs_sha; contract.dtrfs_sha = updatevmreq.0.dtrfs_sha;
contract.updated_at = format!("{:?}", std::time::SystemTime::now()); contract.updated_at = Utc::now().to_rfc3339();
} }
} }
@ -259,7 +253,7 @@ impl BrainData {
req.uuid = uuid.clone(); req.uuid = uuid.clone();
info!("Inserting new vm request in memory: {req:?}"); info!("Inserting new vm request in memory: {req:?}");
self.tmp_vmrequests self.tmp_newvm_reqs
.insert(req.uuid.clone(), (req.clone(), tx)); .insert(req.uuid.clone(), (req.clone(), tx));
if let Some(server_tx) = self.daemon_newvm_tx.get(&req.node_pubkey) { if let Some(server_tx) = self.daemon_newvm_tx.get(&req.node_pubkey) {
debug!( debug!(
@ -285,31 +279,45 @@ impl BrainData {
} }
} }
pub async fn submit_updatevmrequest( pub async fn submit_updatevm_req(
&self, &self,
req: grpc::UpdateVmReq, req: grpc::UpdateVmReq,
tx: OneshotSender<grpc::UpdateVmResp>, tx: OneshotSender<grpc::UpdateVmResp>,
) { ) {
let uuid = req.uuid.clone(); let uuid = req.uuid.clone();
info!("Inserting new vm update request in memory: {req:?}"); info!("Inserting new vm update request in memory: {req:?}");
self.tmp_updatevmrequests let node_pubkey = match self.find_contract_by_uuid(&req.uuid) {
Some(contract) => contract.node_pubkey,
None => {
log::warn!(
"Received UpdateVMReq for a contract that does not exist: {}",
req.uuid
);
let _ = tx.send(grpc::UpdateVmResp {
uuid,
error: "Contract does not exist.".to_string(),
});
return;
}
};
self.tmp_updatevm_reqs
.insert(req.uuid.clone(), (req.clone(), tx)); .insert(req.uuid.clone(), (req.clone(), tx));
if let Some(server_tx) = self.daemon_updatevm_tx.get(&req.node_pubkey) { if let Some(server_tx) = self.daemon_updatevm_tx.get(&node_pubkey) {
debug!( debug!(
"Found daemon TX for {}. Sending updateVMReq {}", "Found daemon TX for {}. Sending updateVMReq {}",
req.node_pubkey, req.uuid node_pubkey, req.uuid
); );
match server_tx.send(req.clone()).await { match server_tx.send(req.clone()).await {
Ok(_) => { Ok(_) => {
debug!("Successfully sent updateVMReq to {}", req.node_pubkey); debug!("Successfully sent updateVMReq to {}", node_pubkey);
return; return;
} }
Err(e) => { Err(e) => {
warn!( warn!(
"Failed to send updateVMReq to {}: {}. Cleaning memory...", "Failed to send updateVMReq to {}: {}. Cleaning memory...",
req.node_pubkey, e node_pubkey, e
); );
self.submit_update_vmconfirmation(grpc::UpdateVmResp { self.submit_updatevm_resp(grpc::UpdateVmResp {
uuid, uuid,
error: "Daemon is offline.".to_string(), error: "Daemon is offline.".to_string(),
}) })
@ -317,8 +325,8 @@ impl BrainData {
} }
} }
} else { } else {
warn!("No daemon TX found for {}", req.node_pubkey); warn!("No daemon TX found for {}", node_pubkey);
self.submit_update_vmconfirmation(grpc::UpdateVmResp { self.submit_updatevm_resp(grpc::UpdateVmResp {
uuid, uuid,
error: "Daemon is offline.".to_string(), error: "Daemon is offline.".to_string(),
}) })

@ -170,15 +170,20 @@ impl BrainDaemonService for BrainDaemonMock {
let (grpc_tx, grpc_rx) = mpsc::channel(6); let (grpc_tx, grpc_rx) = mpsc::channel(6);
let (data_tx, mut data_rx) = mpsc::channel(6); let (data_tx, mut data_rx) = mpsc::channel(6);
self.data self.data
.add_daemon_updatevm_tx(&req.node_pubkey, data_tx) .add_daemon_updatevm_tx(&req.node_pubkey, data_tx);
.await;
let data = self.data.clone(); let data = self.data.clone();
tokio::spawn(async move { tokio::spawn(async move {
while let Some(updatevmreq) = data_rx.recv().await { while let Some(updatevmreq) = data_rx.recv().await {
debug!("Sending UpdateVMRequest to {}: {updatevmreq:?}", req.node_pubkey); debug!(
"Sending UpdateVMRequest to {}: {updatevmreq:?}",
req.node_pubkey
);
if let Err(e) = grpc_tx.send(Ok(updatevmreq.clone())).await { if let Err(e) = grpc_tx.send(Ok(updatevmreq.clone())).await {
warn!("Could not send UpdateVMRequest to {}: {e:?}", req.node_pubkey); warn!(
data.submit_update_vmconfirmation(UpdateVmResp { "Could not send UpdateVMRequest to {}: {e:?}",
req.node_pubkey
);
data.submit_updatevm_resp(UpdateVmResp {
error: "Daemon not connected.".to_string(), error: "Daemon not connected.".to_string(),
uuid: updatevmreq.uuid, uuid: updatevmreq.uuid,
}) })
@ -198,12 +203,12 @@ impl BrainDaemonService for BrainDaemonMock {
req: Request<Streaming<UpdateVmResp>>, req: Request<Streaming<UpdateVmResp>>,
) -> Result<Response<Empty>, Status> { ) -> Result<Response<Empty>, Status> {
debug!("Some node connected to stream NewVMResp"); debug!("Some node connected to stream NewVMResp");
let mut confirmations = req.into_inner(); let mut resp_stream = req.into_inner();
while let Some(confirmation) = confirmations.next().await { while let Some(update_vm_resp) = resp_stream.next().await {
match confirmation { match update_vm_resp {
Ok(c) => { Ok(c) => {
info!("Received confirmation from daemon: {c:?}"); info!("Received confirmation from daemon: {c:?}");
self.data.submit_update_vmconfirmation(c).await; self.data.submit_updatevm_resp(c).await;
} }
Err(e) => { Err(e) => {
log::warn!("Daemon disconnected from Streaming<NewVMResp>: {e:?}") log::warn!("Daemon disconnected from Streaming<NewVMResp>: {e:?}")
@ -239,18 +244,14 @@ impl BrainCliService for BrainCliMock {
} }
} }
async fn update_vm( async fn update_vm(&self, req: Request<UpdateVmReq>) -> Result<Response<UpdateVmResp>, Status> {
&self,
req: Request<UpdateVmReq>,
) -> Result<Response<UpdateVmResp>, Status> {
let req = req.into_inner(); let req = req.into_inner();
info!("Update VM requested via CLI: {req:?}"); info!("Update VM requested via CLI: {req:?}");
let node_pubkey = req.node_pubkey.clone();
let (oneshot_tx, oneshot_rx) = tokio::sync::oneshot::channel(); let (oneshot_tx, oneshot_rx) = tokio::sync::oneshot::channel();
self.data.submit_updatevmrequest(req, oneshot_tx).await; self.data.submit_updatevm_req(req, oneshot_tx).await;
match oneshot_rx.await { match oneshot_rx.await {
Ok(response) => { Ok(response) => {
info!("Sending Update VM confirmation to {node_pubkey}: {response:?}"); info!("Sending UpdateVMResp: {response:?}");
Ok(Response::new(response)) Ok(Response::new(response))
} }
Err(e) => { Err(e) => {
@ -308,6 +309,4 @@ impl BrainCliService for BrainCliMock {
self.data.delete_vm(req).await; self.data.delete_vm(req).await;
Ok(Response::new(Empty {})) Ok(Response::new(Empty {}))
} }
} }