diff --git a/Cargo.lock b/Cargo.lock index 2681bd6..38a28bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -410,7 +410,7 @@ dependencies = [ [[package]] name = "detee-shared" version = "0.1.0" -source = "git+ssh://git@gitea.detee.cloud/noormohammedb/detee-shared?branch=stable_01#54abe74d42946b238c2ce44bb33f55778490b13d" +source = "git+ssh://git@gitea.detee.cloud/noormohammedb/detee-shared?branch=stable_01#a6baa4059d2836b88d52cd56216993e92e83ecbc" dependencies = [ "base64", "prost", diff --git a/src/config.rs b/src/config.rs index 786617f..14d6d74 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,7 @@ use anyhow::Result; use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct HostConfig { pub brain_url: String, pub host_ip_address: String, @@ -9,13 +9,21 @@ pub struct HostConfig { pub max_cores_per_app: u32, pub max_vcpu_reservation: u32, pub max_mem_reservation_mb: u32, - pub max_ports_per_app: u16, + pub max_disk_reservation_mb: u32, + pub max_ports_per_app: u32, // price per unit per minute pub price: u64, + #[serde(default = "default_reserved_no_of_port")] + pub reserved_no_of_port: u32, + pub delete_archive: bool, } +fn default_reserved_no_of_port() -> u32 { + 16 +} + /* impl Default for HostConfig { fn default() -> Self { @@ -51,6 +59,7 @@ impl HostConfig { pub fn load_from_disk(path: &str) -> Result { let content = std::fs::read_to_string(path)?; let config: Self = serde_yml::from_str(&content)?; + // TODO: validate all the resource are available in node Ok(config) } diff --git a/src/data.rs b/src/data.rs index ed5836a..d9d3c5c 100644 --- a/src/data.rs +++ b/src/data.rs @@ -17,7 +17,7 @@ use crate::global::APP_CONFIG_DIR; use crate::global::APP_NAME_PREFIX; use crate::global::USED_RESOURCES_PATH; -#[derive(Debug, Default, Deserialize, Serialize)] +#[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct HostResources { pub existing_apps: HashSet, pub reserved_vcpus: u32, diff --git a/src/main.rs b/src/main.rs index 88a208b..6fe18b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,11 +9,13 @@ use anyhow::Result; use data::App; use detee_shared::sgx::pb::brain::brain_message_app; use detee_shared::sgx::pb::brain::AppContract; +use detee_shared::sgx::pb::brain::AppNodeResources; use detee_shared::sgx::pb::brain::BrainMessageApp; use detee_shared::sgx::pb::brain::DaemonMessageApp; use detee_shared::sgx::pb::brain::MappedPort; use detee_shared::sgx::pb::brain::NewAppRes; use detee_shared::sgx::types::brain::AppDeployConfig; +use global::PUBLIC_KEY; use log::info; use log::warn; use std::collections::HashSet; @@ -82,6 +84,8 @@ impl AppHandler { } async fn run(mut self) { + sleep(Duration::from_millis(500)).await; + self.send_node_resources().await; while let Some(brain_msg) = self.receiver.recv().await { match brain_msg.msg { Some(brain_message_app::Msg::NewAppReq(msg)) => { @@ -150,8 +154,31 @@ impl AppHandler { Ok(()) } - async fn send_node_resources(&self) { - // TODO: send host resources to brain + async fn send_node_resources(&mut self) { + let host_config = self.host_config.clone(); + let host_resource = self.host_resource.clone(); + + let node_pubkey = PUBLIC_KEY.to_string(); + let avail_no_of_port = 65535 + - (1024 + + host_config.reserved_no_of_port + + host_resource.reserved_host_ports.len() as u32); + let avail_vcpus = host_config.max_vcpu_reservation - host_resource.reserved_vcpus; + let avail_memory_mb = host_config.max_mem_reservation_mb - host_resource.reserved_memory_mb; + let avail_storage_mb = host_config.max_disk_reservation_mb - host_resource.reserved_disk_mb; + let max_ports_per_app = host_config.max_ports_per_app; + + let resource_update = AppNodeResources { + node_pubkey, + avail_no_of_port, + avail_vcpus, + avail_memory_mb, + avail_storage_mb, + max_ports_per_app, + }; + + log::debug!("sending node resources on brain: {resource_update:?}"); + let _ = self.sender.send(resource_update.into()).await; } }