From 9630cd5f951e1665c37f2fd75b77122913180c53 Mon Sep 17 00:00:00 2001 From: Noor Date: Wed, 18 Jun 2025 19:19:28 +0530 Subject: [PATCH] Brain redirect on app deploy and delete Improve macro with full crate path for log debug Simplifies brain URL selection by using lazy static variables for staging and testing environments. --- src/config.rs | 13 +++++-------- src/constants.rs | 9 +++++++++ src/sgx/grpc_brain.rs | 23 +++++++++++++++++++---- src/sgx/grpc_dtpm.rs | 2 +- src/utils.rs | 8 ++++++-- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/config.rs b/src/config.rs index eedd637..78a52a0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use crate::constants::{STAGING_BRAIN_URLS, TESTNET_BRAIN_URLS}; +use crate::constants::{BRAIN_STAGING, BRAIN_TESTING}; use crate::{general, utils::block_on}; use ed25519_dalek::SigningKey; use log::{debug, info, warn}; @@ -6,7 +6,6 @@ use openssl::bn::BigNum; use openssl::hash::{Hasher, MessageDigest}; use openssl::pkey::{PKey, Private}; use openssl::rsa::Rsa; -use rand::Rng; use serde::{Deserialize, Serialize}; use std::{fs::File, io::Write, path::Path}; @@ -313,15 +312,13 @@ impl Config { match Self::init_config().network.as_str() { "localhost" => ("https://localhost:31337".to_string(), "staging-brain".to_string()), "staging" => { - let url = STAGING_BRAIN_URLS - [rand::thread_rng().gen_range(0..STAGING_BRAIN_URLS.len())] - .to_string(); + let url = BRAIN_STAGING.to_string(); + log::info!("Using staging brain URL: {url}"); (url, "staging-brain".to_string()) } _ => { - let url = TESTNET_BRAIN_URLS - [rand::thread_rng().gen_range(0..TESTNET_BRAIN_URLS.len())] - .to_string(); + let url = BRAIN_TESTING.to_string(); + log::info!("Using testnet brain URL: {url}"); (url, "testnet-brain".to_string()) } } diff --git a/src/constants.rs b/src/constants.rs index ff3da5d..83b2e09 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,3 +1,6 @@ +use rand::Rng; +use std::sync::LazyLock; + pub const HRATLS_APP_PORT: u32 = 34500; pub const MAX_REDIRECTS: u16 = 3; pub const STAGING_BRAIN_URLS: [&str; 3] = [ @@ -11,3 +14,9 @@ pub const TESTNET_BRAIN_URLS: [&str; 3] = [ "https://149.22.95.1:44522", // testnet brain 2 "https://149.36.48.99:48638", // testnet brain 3 ]; + +pub static BRAIN_STAGING: LazyLock<&str> = + LazyLock::new(|| STAGING_BRAIN_URLS[rand::thread_rng().gen_range(0..STAGING_BRAIN_URLS.len())]); + +pub static BRAIN_TESTING: LazyLock<&str> = + LazyLock::new(|| TESTNET_BRAIN_URLS[rand::thread_rng().gen_range(0..TESTNET_BRAIN_URLS.len())]); diff --git a/src/sgx/grpc_brain.rs b/src/sgx/grpc_brain.rs index 9881ab2..67fedc6 100644 --- a/src/sgx/grpc_brain.rs +++ b/src/sgx/grpc_brain.rs @@ -7,6 +7,7 @@ use detee_shared::sgx::types::brain::AppDeployConfig; use tokio_stream::StreamExt; use tonic::transport::Channel; +use crate::call_with_follow_redirect; use crate::config::Config; use crate::sgx::utils::calculate_nanolp_for_app; use crate::utils::{self, sign_request}; @@ -25,6 +26,10 @@ pub enum Error { CorruptedRootCa(#[from] std::io::Error), #[error("Internal app error: could not parse Brain URL")] CorruptedBrainUrl, + #[error("Max redirects exceeded: {0}")] + MaxRedirectsExceeded(String), + #[error("Redirect error: {0}")] + RedirectError(String), } type Result = std::result::Result; @@ -70,6 +75,10 @@ async fn client() -> Result> { Ok(BrainAppCliClient::new(Config::connect_brain_channel(default_brain_url).await?)) } +async fn client_from_endpoint(reconnect_endpoint: String) -> Result> { + Ok(BrainAppCliClient::new(Config::connect_brain_channel(reconnect_endpoint).await?)) +} + pub async fn new_app(app_deploy_config: AppDeployConfig) -> Result { let resource = app_deploy_config.clone().resource; let mut req: NewAppReq = app_deploy_config.clone().into(); @@ -87,15 +96,21 @@ pub async fn new_app(app_deploy_config: AppDeployConfig) -> Result { req.admin_pubkey = Config::get_detee_wallet()?; req.hratls_pubkey = Config::get_hratls_pubkey_hex()?; - let res = client().await?.new_app(sign_request(req)?).await?; - - Ok(res.into_inner()) + let client = client().await?; + match call_with_follow_redirect!(client, req, new_app).await { + Ok(res) => Ok(res.into_inner()), + Err(e) => { + log::error!("Failed to create new app: {}", e); + Err(e.into()) + } + } } pub async fn delete_app(app_uuid: String) -> Result<()> { let admin_pubkey = Config::get_detee_wallet()?; let delete_req = DelAppReq { uuid: app_uuid, admin_pubkey }; - let _ = client().await?.delete_app(sign_request(delete_req)?).await?; + let client = client().await?; + let _ = call_with_follow_redirect!(client, delete_req, delete_app).await?; Ok(()) } diff --git a/src/sgx/grpc_dtpm.rs b/src/sgx/grpc_dtpm.rs index 9a27269..8891e2a 100644 --- a/src/sgx/grpc_dtpm.rs +++ b/src/sgx/grpc_dtpm.rs @@ -46,7 +46,7 @@ pub async fn connect_app_dtpm_client(app_uuid: &str) -> Result