Redirect to pubsub node and some bug fixes #8
| @ -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 crate::{general, utils::block_on}; | ||||||
| use ed25519_dalek::SigningKey; | use ed25519_dalek::SigningKey; | ||||||
| use log::{debug, info, warn}; | use log::{debug, info, warn}; | ||||||
| @ -6,7 +6,6 @@ use openssl::bn::BigNum; | |||||||
| use openssl::hash::{Hasher, MessageDigest}; | use openssl::hash::{Hasher, MessageDigest}; | ||||||
| use openssl::pkey::{PKey, Private}; | use openssl::pkey::{PKey, Private}; | ||||||
| use openssl::rsa::Rsa; | use openssl::rsa::Rsa; | ||||||
| use rand::Rng; |  | ||||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||||
| use std::{fs::File, io::Write, path::Path}; | use std::{fs::File, io::Write, path::Path}; | ||||||
| 
 | 
 | ||||||
| @ -313,15 +312,13 @@ impl Config { | |||||||
|         match Self::init_config().network.as_str() { |         match Self::init_config().network.as_str() { | ||||||
|             "localhost" => ("https://localhost:31337".to_string(), "staging-brain".to_string()), |             "localhost" => ("https://localhost:31337".to_string(), "staging-brain".to_string()), | ||||||
|             "staging" => { |             "staging" => { | ||||||
|                 let url = STAGING_BRAIN_URLS |                 let url = BRAIN_STAGING.to_string(); | ||||||
|                     [rand::thread_rng().gen_range(0..STAGING_BRAIN_URLS.len())] |                 log::info!("Using staging brain URL: {url}"); | ||||||
|                 .to_string(); |  | ||||||
|                 (url, "staging-brain".to_string()) |                 (url, "staging-brain".to_string()) | ||||||
|             } |             } | ||||||
|             _ => { |             _ => { | ||||||
|                 let url = TESTNET_BRAIN_URLS |                 let url = BRAIN_TESTING.to_string(); | ||||||
|                     [rand::thread_rng().gen_range(0..TESTNET_BRAIN_URLS.len())] |                 log::info!("Using testnet brain URL: {url}"); | ||||||
|                 .to_string(); |  | ||||||
|                 (url, "testnet-brain".to_string()) |                 (url, "testnet-brain".to_string()) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,3 +1,6 @@ | |||||||
|  | use rand::Rng; | ||||||
|  | use std::sync::LazyLock; | ||||||
|  | 
 | ||||||
| pub const HRATLS_APP_PORT: u32 = 34500; | pub const HRATLS_APP_PORT: u32 = 34500; | ||||||
| pub const MAX_REDIRECTS: u16 = 3; | pub const MAX_REDIRECTS: u16 = 3; | ||||||
| pub const STAGING_BRAIN_URLS: [&str; 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.22.95.1:44522",     // testnet brain 2
 | ||||||
|     "https://149.36.48.99:48638",    // testnet brain 3
 |     "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())]); | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ use detee_shared::sgx::types::brain::AppDeployConfig; | |||||||
| use tokio_stream::StreamExt; | use tokio_stream::StreamExt; | ||||||
| use tonic::transport::Channel; | use tonic::transport::Channel; | ||||||
| 
 | 
 | ||||||
|  | use crate::call_with_follow_redirect; | ||||||
| use crate::config::Config; | use crate::config::Config; | ||||||
| use crate::sgx::utils::calculate_nanolp_for_app; | use crate::sgx::utils::calculate_nanolp_for_app; | ||||||
| use crate::utils::{self, sign_request}; | use crate::utils::{self, sign_request}; | ||||||
| @ -25,6 +26,10 @@ pub enum Error { | |||||||
|     CorruptedRootCa(#[from] std::io::Error), |     CorruptedRootCa(#[from] std::io::Error), | ||||||
|     #[error("Internal app error: could not parse Brain URL")] |     #[error("Internal app error: could not parse Brain URL")] | ||||||
|     CorruptedBrainUrl, |     CorruptedBrainUrl, | ||||||
|  |     #[error("Max redirects exceeded: {0}")] | ||||||
|  |     MaxRedirectsExceeded(String), | ||||||
|  |     #[error("Redirect error: {0}")] | ||||||
|  |     RedirectError(String), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Result<T> = std::result::Result<T, Error>; | type Result<T> = std::result::Result<T, Error>; | ||||||
| @ -70,6 +75,10 @@ async fn client() -> Result<BrainAppCliClient<Channel>> { | |||||||
|     Ok(BrainAppCliClient::new(Config::connect_brain_channel(default_brain_url).await?)) |     Ok(BrainAppCliClient::new(Config::connect_brain_channel(default_brain_url).await?)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | async fn client_from_endpoint(reconnect_endpoint: String) -> Result<BrainAppCliClient<Channel>> { | ||||||
|  |     Ok(BrainAppCliClient::new(Config::connect_brain_channel(reconnect_endpoint).await?)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub async fn new_app(app_deploy_config: AppDeployConfig) -> Result<NewAppRes> { | pub async fn new_app(app_deploy_config: AppDeployConfig) -> Result<NewAppRes> { | ||||||
|     let resource = app_deploy_config.clone().resource; |     let resource = app_deploy_config.clone().resource; | ||||||
|     let mut req: NewAppReq = app_deploy_config.clone().into(); |     let mut req: NewAppReq = app_deploy_config.clone().into(); | ||||||
| @ -87,15 +96,21 @@ pub async fn new_app(app_deploy_config: AppDeployConfig) -> Result<NewAppRes> { | |||||||
|     req.admin_pubkey = Config::get_detee_wallet()?; |     req.admin_pubkey = Config::get_detee_wallet()?; | ||||||
|     req.hratls_pubkey = Config::get_hratls_pubkey_hex()?; |     req.hratls_pubkey = Config::get_hratls_pubkey_hex()?; | ||||||
| 
 | 
 | ||||||
|     let res = client().await?.new_app(sign_request(req)?).await?; |     let client = client().await?; | ||||||
| 
 |     match call_with_follow_redirect!(client, req, new_app).await { | ||||||
|     Ok(res.into_inner()) |         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<()> { | pub async fn delete_app(app_uuid: String) -> Result<()> { | ||||||
|     let admin_pubkey = Config::get_detee_wallet()?; |     let admin_pubkey = Config::get_detee_wallet()?; | ||||||
|     let delete_req = DelAppReq { uuid: app_uuid, admin_pubkey }; |     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(()) |     Ok(()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -46,7 +46,7 @@ pub async fn connect_app_dtpm_client(app_uuid: &str) -> Result<DtpmConfigManager | |||||||
|     let private_key_pem = Config::get_hratls_private_key()?; |     let private_key_pem = Config::get_hratls_private_key()?; | ||||||
| 
 | 
 | ||||||
|     let (hratls_uri, package_mr_enclave) = hratls_url_and_mr_enclave_from_app_id(app_uuid).await?; |     let (hratls_uri, package_mr_enclave) = hratls_url_and_mr_enclave_from_app_id(app_uuid).await?; | ||||||
|     log::info!("hratls uri: {}\nmr_enclave: {:?}", &hratls_uri, &package_mr_enclave); |     log::info!("hratls uri: {} mr_enclave: {:?}", &hratls_uri, &package_mr_enclave); | ||||||
| 
 | 
 | ||||||
|     let hratls_config = |     let hratls_config = | ||||||
|         Arc::new(RwLock::new(HRaTlsConfig::new().with_hratls_private_key_pem(private_key_pem))); |         Arc::new(RwLock::new(HRaTlsConfig::new().with_hratls_private_key_pem(private_key_pem))); | ||||||
|  | |||||||
| @ -54,7 +54,11 @@ macro_rules! call_with_follow_redirect { | |||||||
|             let mut client = $client; |             let mut client = $client; | ||||||
| 
 | 
 | ||||||
|             for attempt in 0..crate::constants::MAX_REDIRECTS { |             for attempt in 0..crate::constants::MAX_REDIRECTS { | ||||||
|                 debug!("Attempt #{}: Calling method '{}'...", attempt + 1, stringify!($method)); |                 log::debug!( | ||||||
|  |                     "Attempt #{}: Calling method '{}'...", | ||||||
|  |                     attempt + 1, | ||||||
|  |                     stringify!($method) | ||||||
|  |                 ); | ||||||
| 
 | 
 | ||||||
|                 let req_data_clone = $req_data.clone(); |                 let req_data_clone = $req_data.clone(); | ||||||
|                 let signed_req = crate::utils::sign_request(req_data_clone)?; |                 let signed_req = crate::utils::sign_request(req_data_clone)?; | ||||||
| @ -76,7 +80,7 @@ macro_rules! call_with_follow_redirect { | |||||||
|                                 ) |                                 ) | ||||||
|                             })?; |                             })?; | ||||||
| 
 | 
 | ||||||
|                         info!("Server moved. Redirecting to {}...", redirect_url); |                         log::info!("Server moved. Redirecting to {}...", redirect_url); | ||||||
| 
 | 
 | ||||||
|                         client = client_from_endpoint(format!("https://{}", redirect_url)).await?; |                         client = client_from_endpoint(format!("https://{}", redirect_url)).await?; | ||||||
|                         continue; |                         continue; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user