From 198f43f472a1fe0ddbe3935cc80658824b487a57 Mon Sep 17 00:00:00 2001 From: Noor Date: Tue, 20 May 2025 20:20:02 +0530 Subject: [PATCH] Fix: vm creating error catching Insufficient fund error from transaction returning approprate error variant --- src/db/mod.rs | 2 ++ src/db/vm.rs | 14 +++++++++++++- tests/grpc_vm_cli_test.rs | 10 ++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/db/mod.rs b/src/db/mod.rs index e22e6d1..500f7b3 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -30,6 +30,8 @@ pub enum Error { AppDaemonConnection(#[from] tokio::sync::mpsc::error::SendError), #[error("AppDaemon Error {0}")] NewAppDaemonResp(String), + #[error("Insufficient funds, deposit more tokens")] + InsufficientFunds, } pub mod prelude { diff --git a/src/db/vm.rs b/src/db/vm.rs index d0e7f91..82acfc2 100644 --- a/src/db/vm.rs +++ b/src/db/vm.rs @@ -239,7 +239,18 @@ impl NewVmReq { self.price_per_unit ); //let _: Vec = db.insert(NEW_VM_REQ).relation(self).await?; - db.query(query).await?; + let mut query_resp = db.query(query).await?; + let resp_err = query_resp.take_errors(); + + if let Some(insufficient_funds_error) = resp_err.get(&1) { + if let surrealdb::Error::Api(surrealdb::error::Api::Query(tx_query_error)) = + insufficient_funds_error + { + log::error!("Transaction error: {}", tx_query_error); + return Err(Error::InsufficientFunds); + } + } + Ok(()) } } @@ -276,6 +287,7 @@ impl WrappedMeasurement { if let Some(args) = args { return Ok(Self::Args(vm_id.to_string(), args)); } + log::trace!("listening for table: {table}"); tokio::time::timeout(Duration::from_secs(10), async { loop { diff --git a/tests/grpc_vm_cli_test.rs b/tests/grpc_vm_cli_test.rs index e1e1df4..4b6069d 100644 --- a/tests/grpc_vm_cli_test.rs +++ b/tests/grpc_vm_cli_test.rs @@ -20,11 +20,17 @@ async fn test_vm_creation() { let key = Key::new(); - let _ = create_new_vm(&db, &key, &daemon_key, &brain_channel).await; + let new_vm_resp = create_new_vm(&db, &key, &daemon_key, &brain_channel).await; + + assert!(new_vm_resp.is_err()); + let grpc_error_message = new_vm_resp.err().unwrap().to_string(); + assert!(grpc_error_message.contains("Insufficient funds")); + + // TODO: Airdrop the user and try creating the VM again } #[tokio::test] -async fn test_vm_creation_timeout() { +async fn test_timeout_vm_creation() { prepare_test_db().await.unwrap(); // env_logger::builder().filter_level(log::LevelFilter::Error).init();