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