features: app engine #1
| @ -1,4 +1,4 @@ | |||||||
| use crate::constants::{ACCOUNT, ACTIVE_APP, APP_NODE}; | use crate::constants::{ACCOUNT, ACTIVE_APP, APP_NODE, NEW_APP_REQ}; | ||||||
| use crate::db::general::Report; | use crate::db::general::Report; | ||||||
| 
 | 
 | ||||||
| use super::Error; | use super::Error; | ||||||
| @ -72,6 +72,28 @@ pub struct NewAppReq { | |||||||
|     pub created_at: Datetime, |     pub created_at: Datetime, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl NewAppReq { | ||||||
|  |     pub async fn get(db: &Surreal<Client>, id: &str) -> Result<Option<Self>, Error> { | ||||||
|  |         let new_app_req: Option<Self> = db.select((NEW_APP_REQ, id)).await?; | ||||||
|  |         Ok(new_app_req) | ||||||
|  |     } | ||||||
|  |     pub async fn submit_error( | ||||||
|  |         db: &Surreal<Client>, | ||||||
|  |         id: &str, | ||||||
|  |         error: String, | ||||||
|  |     ) -> Result<Option<Self>, Error> { | ||||||
|  |         #[derive(Serialize)] | ||||||
|  |         struct NewAppError { | ||||||
|  |             error: String, | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         let record: Option<Self> = | ||||||
|  |             db.update((NEW_APP_REQ, id)).merge(NewAppError { error }).await?; | ||||||
|  | 
 | ||||||
|  |         Ok(record) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Debug, Serialize, Deserialize)] | #[derive(Debug, Serialize, Deserialize)] | ||||||
| pub struct AppNodeWithReports { | pub struct AppNodeWithReports { | ||||||
|     pub id: RecordId, |     pub id: RecordId, | ||||||
| @ -112,6 +134,38 @@ pub struct ActiveApp { | |||||||
|     hratls_pubkey: String, |     hratls_pubkey: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl ActiveApp { | ||||||
|  |     pub async fn activate(db: &Surreal<Client>, id: &str) -> Result<(), Error> { | ||||||
|  |         let new_app_req = match NewAppReq::get(db, id).await? { | ||||||
|  |             Some(r) => r, | ||||||
|  |             None => return Ok(()), | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let active_app = Self { | ||||||
|  |             id: RecordId::from((ACTIVE_APP, id)), | ||||||
|  |             admin: new_app_req.admin, | ||||||
|  |             app_node: new_app_req.app_node, | ||||||
|  |             app_name: new_app_req.app_name, | ||||||
|  |             mapped_ports: vec![], | ||||||
|  |             host_ipv4: String::new(), | ||||||
|  |             vcpus: new_app_req.vcpu as u64, | ||||||
|  |             memory_mb: new_app_req.memory_mb as u64, | ||||||
|  |             disk_size_gb: new_app_req.disk_mb as u64, | ||||||
|  |             created_at: new_app_req.created_at.clone(), | ||||||
|  |             price_per_unit: new_app_req.price_per_unit, | ||||||
|  |             locked_nano: new_app_req.locked_nano, | ||||||
|  |             collected_at: new_app_req.created_at, | ||||||
|  |             mr_enclave: new_app_req.mr_enclave.clone(), | ||||||
|  |             package_url: new_app_req.package_url.clone(), | ||||||
|  |             hratls_pubkey: new_app_req.hratls_pubkey.clone(), | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let _: Vec<ActiveApp> = db.insert(()).relation(active_app).await?; | ||||||
|  | 
 | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Debug, Serialize, Deserialize)] | #[derive(Debug, Serialize, Deserialize)] | ||||||
| pub struct ActiveAppWithNode { | pub struct ActiveAppWithNode { | ||||||
|     pub id: RecordId, |     pub id: RecordId, | ||||||
| @ -153,6 +207,26 @@ impl ActiveAppWithNode { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[derive(Debug, Serialize)] | ||||||
|  | pub struct AppNodeResources { | ||||||
|  |     pub avail_no_of_port: u32, | ||||||
|  |     pub avail_vcpus: u32, | ||||||
|  |     pub avail_memory_mb: u32, | ||||||
|  |     pub avail_storage_mb: u32, | ||||||
|  |     pub max_ports_per_app: u32, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl AppNodeResources { | ||||||
|  |     pub async fn merge( | ||||||
|  |         self, | ||||||
|  |         db: &Surreal<Client>, | ||||||
|  |         node_pubkey: &str, | ||||||
|  |     ) -> Result<Option<AppNode>, Error> { | ||||||
|  |         let app_node: Option<AppNode> = db.update((APP_NODE, node_pubkey)).merge(self).await?; | ||||||
|  |         Ok(app_node) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| impl From<&old_brain::BrainData> for Vec<AppNode> { | impl From<&old_brain::BrainData> for Vec<AppNode> { | ||||||
|     fn from(old_data: &old_brain::BrainData) -> Self { |     fn from(old_data: &old_brain::BrainData) -> Self { | ||||||
|         let mut nodes = Vec::new(); |         let mut nodes = Vec::new(); | ||||||
|  | |||||||
| @ -136,7 +136,35 @@ impl BrainAppDaemon for AppDaemonServer { | |||||||
|             return Err(Status::unauthenticated("Could not authenticate the app daemon")); |             return Err(Status::unauthenticated("Could not authenticate the app daemon")); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         todo!() |         while let Some(daemon_message) = req_stream.next().await { | ||||||
|  |             match daemon_message { | ||||||
|  |                 Ok(msg) => match msg.msg { | ||||||
|  |                     Some(daemon_message_app::Msg::NewAppRes(new_app_resp)) => { | ||||||
|  |                         if !new_app_resp.error.is_empty() { | ||||||
|  |                             db::NewAppReq::submit_error( | ||||||
|  |                                 &self.db, | ||||||
|  |                                 &new_app_resp.uuid, | ||||||
|  |                                 new_app_resp.error, | ||||||
|  |                             ) | ||||||
|  |                             .await?; | ||||||
|  |                         } else { | ||||||
|  |                             db::ActiveApp::activate(&self.db, &new_app_resp.uuid).await?; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     Some(daemon_message_app::Msg::AppNodeResources(app_node_resources)) => { | ||||||
|  |                         let node_resource: db::AppNodeResources = app_node_resources.into(); | ||||||
|  |                         node_resource.merge(&self.db, &pubkey).await?; | ||||||
|  |                     } | ||||||
|  |                     _ => {} | ||||||
|  |                 }, | ||||||
|  | 
 | ||||||
|  |                 Err(e) => { | ||||||
|  |                     log::warn!("App Daemon Disconnected: {e:?}") | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Ok(Response::new(Empty {})) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -329,3 +329,15 @@ impl From<db::AppDaemonMsg> for BrainMessageApp { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | impl From<AppNodeResources> for db::AppNodeResources { | ||||||
|  |     fn from(value: AppNodeResources) -> Self { | ||||||
|  |         Self { | ||||||
|  |             avail_no_of_port: value.avail_no_of_port, | ||||||
|  |             avail_vcpus: value.avail_vcpus, | ||||||
|  |             avail_memory_mb: value.avail_memory_mb, | ||||||
|  |             avail_storage_mb: value.avail_storage_mb, | ||||||
|  |             max_ports_per_app: value.max_ports_per_app, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user