Refactor app engine resource units

updated app proto file to mib
fixed all tests and migrations
removed unused price calculation functions
modified mock data
This commit is contained in:
Noor 2025-06-25 18:49:39 +05:30
parent 1ca66f3bc3
commit 46ba0961bf
Signed by: noormohammedb
GPG Key ID: D83EFB8B3B967146
13 changed files with 96 additions and 104 deletions

2
Cargo.lock generated

@ -1011,7 +1011,7 @@ dependencies = [
[[package]]
name = "detee-shared"
version = "0.1.0"
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=credits-v2#6d377926408953e8da2c0f4c6625d4fb90ba7652"
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=credits_app#2fb91e5e876f28f4d7092c7fed0efc93f06111ac"
dependencies = [
"bincode 2.0.1",
"prost",

@ -15,7 +15,7 @@ serde_yaml = "0.9.34"
surrealdb = "2.2.2"
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
tonic = { version = "0.12", features = ["tls"] }
detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "credits-v2" }
detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "credits_app" }
ed25519-dalek = "2.1.1"
bs58 = "0.5.1"
tokio-stream = "0.1.17"

@ -25,9 +25,9 @@ pub struct AppNode {
pub region: String,
pub city: String,
pub ip: String,
pub avail_mem_mb: u32,
pub avail_mem_mib: u32,
pub avail_vcpus: u32,
pub avail_storage_gbs: u32,
pub avail_storage_mib: u32,
pub avail_ports: u32,
pub max_ports_per_app: u32,
pub price: u64,
@ -72,9 +72,9 @@ pub struct NewAppReq {
pub mr_enclave: String,
pub hratls_pubkey: String,
pub ports: Vec<u32>,
pub memory_mb: u32,
pub memory_mib: u32,
pub vcpus: u32,
pub disk_size_gb: u32,
pub disk_size_mib: u32,
pub locked_nano: u64,
pub price_per_unit: u64,
pub error: String,
@ -165,12 +165,12 @@ impl NewAppReq {
->$app_node
CONTENT {{
created_at: time::now(), app_name: $app_name, package_url: $package_url,
mr_enclave: $mr_enclave, hratls_pubkey: $hratls_pubkey, ports: {:?}, memory_mb: {},
vcpus: {}, disk_size_gb: {}, locked_nano: {locked_nano}, price_per_unit: {}, error: '',
mr_enclave: $mr_enclave, hratls_pubkey: $hratls_pubkey, ports: {:?}, memory_mib: {},
vcpus: {}, disk_size_mib: {}, locked_nano: {locked_nano}, price_per_unit: {}, error: '',
}};
COMMIT TRANSACTION;",
self.ports, self.memory_mb, self.vcpus, self.disk_size_gb, self.price_per_unit);
self.ports, self.memory_mib, self.vcpus, self.disk_size_mib, self.price_per_unit);
log::trace!("submit_new_app_req query: {tx_query}");
@ -212,9 +212,9 @@ pub struct AppNodeWithReports {
pub region: String,
pub city: String,
pub ip: String,
pub avail_mem_mb: u32,
pub avail_mem_mib: u32,
pub avail_vcpus: u32,
pub avail_storage_gbs: u32,
pub avail_storage_mib: u32,
pub avail_ports: u32,
pub max_ports_per_app: u32,
pub price: u64,
@ -233,13 +233,13 @@ impl AppNodeWithReports {
avail_ports >= {} &&
max_ports_per_app >= {} &&
avail_vcpus >= {} &&
avail_mem_mb >= {} &&
avail_storage_gbs >= {} ",
avail_mem_mib >= {} &&
avail_storage_mib >= {} ",
filters.free_ports,
filters.free_ports,
filters.vcpus,
filters.memory_mb,
filters.storage_gb
filters.memory_mib,
filters.storage_mib
);
// TODO: bind all strings
@ -278,8 +278,8 @@ pub struct ActiveApp {
pub mapped_ports: Vec<(u32, u32)>,
pub host_ipv4: String,
pub vcpus: u32,
pub memory_mb: u32,
pub disk_size_gb: u32,
pub memory_mib: u32,
pub disk_size_mib: u32,
pub created_at: Datetime,
pub price_per_unit: u64,
pub locked_nano: u64,
@ -299,8 +299,8 @@ impl From<ActiveApp> for DeletedApp {
mapped_ports: value.mapped_ports,
host_ipv4: value.host_ipv4,
vcpus: value.vcpus,
memory_mb: value.memory_mb,
disk_size_gb: value.disk_size_gb,
memory_mib: value.memory_mib,
disk_size_mib: value.disk_size_mib,
created_at: value.created_at,
price_per_unit: value.price_per_unit,
mr_enclave: value.mr_enclave,
@ -311,15 +311,6 @@ impl From<ActiveApp> for DeletedApp {
}
impl ActiveApp {
pub fn price_per_minute(&self) -> u64 {
(self.total_units() * self.price_per_unit as f64) as u64
}
fn total_units(&self) -> f64 {
// TODO: Optimize this based on price of hardware.
(self.vcpus as f64 * 5f64) + (self.memory_mb as f64 / 200f64) + (self.disk_size_gb as f64)
}
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> = db
.query("select * from $active_app_id;".to_string())
@ -352,8 +343,8 @@ impl ActiveApp {
mapped_ports,
host_ipv4: new_app_res.ip_address,
vcpus: new_app_req.vcpus,
memory_mb: new_app_req.memory_mb,
disk_size_gb: new_app_req.disk_size_gb,
memory_mib: new_app_req.memory_mib,
disk_size_mib: new_app_req.disk_size_mib,
created_at: new_app_req.created_at.clone(),
price_per_unit: new_app_req.price_per_unit,
locked_nano: new_app_req.locked_nano,
@ -367,7 +358,7 @@ impl ActiveApp {
let locked_nano = active_app.locked_nano;
let _: Vec<ActiveApp> = db.insert(()).relation(active_app).await?;
NewAppReq::delete(&db, &new_app_res.uuid).await?;
NewAppReq::delete(db, &new_app_res.uuid).await?;
db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};"))
.await?;
@ -498,8 +489,8 @@ pub struct ActiveAppWithNode {
pub mapped_ports: Vec<(u32, u32)>,
pub host_ipv4: String,
pub vcpus: u32,
pub memory_mb: u32,
pub disk_size_gb: u32,
pub memory_mib: u32,
pub disk_size_mib: u32,
pub created_at: Datetime,
pub price_per_unit: u64,
pub locked_nano: u64,
@ -519,8 +510,8 @@ impl From<ActiveAppWithNode> for ActiveApp {
mapped_ports: val.mapped_ports,
host_ipv4: val.host_ipv4,
vcpus: val.vcpus,
memory_mb: val.memory_mb,
disk_size_gb: val.disk_size_gb,
memory_mib: val.memory_mib,
disk_size_mib: val.disk_size_mib,
created_at: val.created_at,
price_per_unit: val.price_per_unit,
locked_nano: val.locked_nano,
@ -599,8 +590,8 @@ impl ActiveAppWithNode {
pub struct AppNodeResources {
pub avail_ports: u32,
pub avail_vcpus: u32,
pub avail_mem_mb: u32,
pub avail_storage_gbs: u32,
pub avail_mem_mib: u32,
pub avail_storage_mib: u32,
pub max_ports_per_app: u32,
}
@ -628,9 +619,9 @@ impl From<&old_brain::BrainData> for Vec<AppNode> {
region: old_node.region.clone(),
city: old_node.city.clone(),
ip: old_node.ip.clone(),
avail_mem_mb: old_node.avail_mem_mb,
avail_mem_mib: old_node.avail_mem_mib,
avail_vcpus: old_node.avail_vcpus,
avail_storage_gbs: old_node.avail_storage_mb,
avail_storage_mib: old_node.avail_storage_mib,
avail_ports: old_node.avail_no_of_port,
max_ports_per_app: old_node.max_ports_per_app,
price: old_node.price,
@ -664,9 +655,9 @@ impl From<&old_brain::BrainData> for Vec<ActiveApp> {
app_node: RecordId::from((APP_NODE, old_c.node_pubkey.clone())),
mapped_ports,
host_ipv4: old_c.host_ipv4.clone(),
disk_size_gb: old_c.disk_size_mb * 1024,
disk_size_mib: old_c.disk_size_mib,
vcpus: old_c.vcpus,
memory_mb: old_c.memory_mb,
memory_mib: old_c.memory_mib,
price_per_unit: old_c.price_per_unit,
locked_nano: old_c.locked_nano,
created_at: old_c.created_at.into(),
@ -692,8 +683,8 @@ pub struct DeletedApp {
pub mapped_ports: Vec<(u32, u32)>,
pub host_ipv4: String,
pub vcpus: u32,
pub memory_mb: u32,
pub disk_size_gb: u32,
pub memory_mib: u32,
pub disk_size_mib: u32,
pub created_at: Datetime,
pub price_per_unit: u64,
pub mr_enclave: String,

@ -1013,9 +1013,9 @@ impl From<&old_brain::BrainData> for Vec<VmNode> {
region: old_node.region.clone(),
city: old_node.city.clone(),
ip: old_node.ip.clone(),
avail_mem_mib: old_node.avail_mem_mb,
avail_mem_mib: old_node.avail_mem_mib,
avail_vcpus: old_node.avail_vcpus,
avail_storage_mib: old_node.avail_storage_gbs,
avail_storage_mib: old_node.avail_storage_mib,
avail_ipv4: old_node.avail_ipv4,
avail_ipv6: old_node.avail_ipv6,
avail_ports: old_node.avail_ports,
@ -1045,9 +1045,9 @@ impl From<&old_brain::BrainData> for Vec<ActiveVm> {
mapped_ports,
public_ipv4: old_c.public_ipv4.clone(),
public_ipv6: old_c.public_ipv6.clone(),
disk_size_mib: old_c.disk_size_gb,
disk_size_mib: old_c.disk_size_mib,
vcpus: old_c.vcpus,
memory_mib: old_c.memory_mb,
memory_mib: old_c.memory_mib,
dtrfs_sha: old_c.dtrfs_sha.clone(),
kernel_sha: old_c.kernel_sha.clone(),
price_per_unit: old_c.price_per_unit,

@ -52,9 +52,9 @@ impl BrainAppDaemon for AppDaemonServer {
ip: req.main_ip,
price: req.price,
avail_mem_mb: 0,
avail_mem_mib: 0,
avail_vcpus: 0,
avail_storage_gbs: 0,
avail_storage_mib: 0,
avail_ports: 0,
max_ports_per_app: 0,
offline_minutes: 0,

@ -280,8 +280,8 @@ impl From<db::ActiveAppWithNode> for AppContract {
node_pubkey: value.app_node.id.key().to_string(),
public_ipv4: value.host_ipv4,
resource: Some(AppResource {
memory_mb: value.memory_mb,
disk_size_gb: value.disk_size_gb,
memory_mib: value.memory_mib,
disk_size_mib: value.disk_size_mib,
vcpus: value.vcpus,
ports: value.mapped_ports.iter().map(|(_, g)| *g).collect(),
}),
@ -322,9 +322,9 @@ impl From<NewAppReq> for db::NewAppReq {
mr_enclave,
hratls_pubkey: val.hratls_pubkey,
ports: resource.ports,
memory_mb: resource.memory_mb,
memory_mib: resource.memory_mib,
vcpus: resource.vcpus,
disk_size_gb: resource.disk_size_gb,
disk_size_mib: resource.disk_size_mib,
locked_nano: val.locked_nano,
price_per_unit: val.price_per_unit,
error: String::new(),
@ -337,8 +337,8 @@ impl From<db::NewAppReq> for NewAppReq {
fn from(value: db::NewAppReq) -> Self {
let resource = AppResource {
vcpus: value.vcpus,
memory_mb: value.memory_mb,
disk_size_gb: value.disk_size_gb,
memory_mib: value.memory_mib,
disk_size_mib: value.disk_size_mib,
ports: value.ports,
};
let mr_enclave = Some(hex::decode(value.mr_enclave).unwrap_or_default());
@ -382,8 +382,8 @@ impl From<AppNodeResources> for db::AppNodeResources {
Self {
avail_ports: value.avail_no_of_port,
avail_vcpus: value.avail_vcpus,
avail_mem_mb: value.avail_memory_mb,
avail_storage_gbs: value.avail_storage_gb,
avail_mem_mib: value.avail_memory_mib,
avail_storage_mib: value.avail_storage_mib,
max_ports_per_app: value.max_ports_per_app,
}
}

@ -37,9 +37,9 @@ pub struct VmNode {
pub region: String,
pub city: String,
pub ip: String,
pub avail_mem_mb: u32,
pub avail_mem_mib: u32,
pub avail_vcpus: u32,
pub avail_storage_gbs: u32,
pub avail_storage_mib: u32,
pub avail_ipv4: u32,
pub avail_ipv6: u32,
pub avail_ports: u32,
@ -60,9 +60,9 @@ pub struct VmContract {
pub exposed_ports: Vec<u32>,
pub public_ipv4: String,
pub public_ipv6: String,
pub disk_size_gb: u32,
pub disk_size_mib: u32,
pub vcpus: u32,
pub memory_mb: u32,
pub memory_mib: u32,
pub kernel_sha: String,
pub dtrfs_sha: String,
pub created_at: chrono::DateTime<Utc>,
@ -82,9 +82,9 @@ pub struct AppContract {
pub node_pubkey: String,
pub mapped_ports: Vec<(u16, u16)>,
pub host_ipv4: String,
pub disk_size_mb: u32,
pub disk_size_mib: u32,
pub vcpus: u32,
pub memory_mb: u32,
pub memory_mib: u32,
pub created_at: chrono::DateTime<Utc>,
pub updated_at: chrono::DateTime<Utc>,
// price per unit per minute
@ -105,9 +105,9 @@ pub struct AppNode {
pub region: String,
pub city: String,
pub ip: String,
pub avail_mem_mb: u32,
pub avail_mem_mib: u32,
pub avail_vcpus: u32,
pub avail_storage_mb: u32,
pub avail_storage_mib: u32,
pub avail_no_of_port: u32,
pub max_ports_per_app: u32,
// nanotokens per unit per minute

@ -33,8 +33,8 @@ DEFINE FUNCTION OVERWRITE fn::app_price_per_minute(
LET $app = (select * from $app_id)[0];
RETURN
(($app.vcpus * 5) +
($app.memory_mb / 200) +
($app.disk_size_gb / 10))
($app.memory_mib / 200) +
($app.disk_size_mib / 10))
* $app.price_per_unit;
};

@ -88,9 +88,9 @@ DEFINE FIELD country ON TABLE app_node TYPE string;
DEFINE FIELD region ON TABLE app_node TYPE string;
DEFINE FIELD city ON TABLE app_node TYPE string;
DEFINE FIELD ip ON TABLE app_node TYPE string;
DEFINE FIELD avail_mem_mb ON TABLE app_node TYPE int;
DEFINE FIELD avail_mem_mib ON TABLE app_node TYPE int;
DEFINE FIELD avail_vcpus ON TABLE app_node TYPE int;
DEFINE FIELD avail_storage_gbs ON TABLE app_node TYPE int;
DEFINE FIELD avail_storage_mib ON TABLE app_node TYPE int;
DEFINE FIELD avail_ports ON TABLE app_node TYPE int;
DEFINE FIELD max_ports_per_app ON TABLE app_node TYPE int;
DEFINE FIELD price ON TABLE app_node TYPE int;
@ -102,9 +102,9 @@ DEFINE FIELD package_url ON TABLE new_app_req TYPE string;
DEFINE FIELD mr_enclave ON TABLE new_app_req TYPE string;
DEFINE FIELD hratls_pubkey ON TABLE new_app_req TYPE string;
DEFINE FIELD ports ON TABLE new_app_req TYPE array<int>;
DEFINE FIELD memory_mb ON TABLE new_app_req TYPE int;
DEFINE FIELD memory_mib ON TABLE new_app_req TYPE int;
DEFINE FIELD vcpus ON TABLE new_app_req TYPE int;
DEFINE FIELD disk_size_gb ON TABLE new_app_req TYPE int;
DEFINE FIELD disk_size_mib ON TABLE new_app_req TYPE int;
DEFINE FIELD locked_nano ON TABLE new_app_req TYPE int;
DEFINE FIELD price_per_unit ON TABLE new_app_req TYPE int;
DEFINE FIELD error ON TABLE new_app_req TYPE string;
@ -115,8 +115,8 @@ DEFINE FIELD app_name ON TABLE active_app TYPE string;
DEFINE FIELD mapped_ports ON TABLE active_app TYPE array<[int, int]>;
DEFINE FIELD host_ipv4 ON TABLE active_app TYPE string;
DEFINE FIELD vcpus ON TABLE active_app TYPE int;
DEFINE FIELD memory_mb ON TABLE active_app TYPE int;
DEFINE FIELD disk_size_gb ON TABLE active_app TYPE int;
DEFINE FIELD memory_mib ON TABLE active_app TYPE int;
DEFINE FIELD disk_size_mib ON TABLE active_app TYPE int;
DEFINE FIELD created_at ON TABLE active_app TYPE datetime;
DEFINE FIELD price_per_unit ON TABLE active_app TYPE int;
DEFINE FIELD locked_nano ON TABLE active_app TYPE int;
@ -130,8 +130,8 @@ DEFINE FIELD app_name ON TABLE deleted_app TYPE string;
DEFINE FIELD mapped_ports ON TABLE deleted_app TYPE array<[int, int]>;
DEFINE FIELD host_ipv4 ON TABLE deleted_app TYPE string;
DEFINE FIELD vcpus ON TABLE deleted_app TYPE int;
DEFINE FIELD memory_mb ON TABLE deleted_app TYPE int;
DEFINE FIELD disk_size_gb ON TABLE deleted_app TYPE int;
DEFINE FIELD memory_mib ON TABLE deleted_app TYPE int;
DEFINE FIELD disk_size_mib ON TABLE deleted_app TYPE int;
DEFINE FIELD created_at ON TABLE deleted_app TYPE datetime;
DEFINE FIELD deleted_at ON TABLE deleted_app TYPE datetime DEFAULT time::now();
DEFINE FIELD price_per_unit ON TABLE deleted_app TYPE int;

@ -13,8 +13,8 @@ async fn test_new_app_db_tx() {
node_pubkey: "AH3SpV6ZjXMGSSe6xGH2ekUZxyUhnesAFz4LjX7PnvVn".to_string(),
resource: Some(
AppResource {
memory_mb: 1500,
disk_size_gb: 2,
memory_mib: 1500,
disk_size_mib: 2000,
vcpus: 1,
ports: vec![ 8080 ],
},

@ -93,6 +93,7 @@ async fn test_app_creation() {
db.select::<Option<db::ActiveApp>>((ACTIVE_APP, new_app_resp.uuid)).await.unwrap();
assert!(active_app.is_some());
tokio::time::sleep(std::time::Duration::from_millis(300)).await;
let acc_db: db::Account = db.select((ACCOUNT, key.pubkey.clone())).await.unwrap().unwrap();
assert_eq!(acc_db.balance, airdrop_amount * TOKEN_DECIMAL - (locking_nano + 100));
assert_eq!(acc_db.tmp_locked, 0);

@ -102,8 +102,8 @@ async fn test_app_daemon_resource_msg() {
node_pubkey: daemon_pubkey,
avail_no_of_port: 5,
avail_vcpus: 4,
avail_memory_mb: 8192,
avail_storage_gb: 100,
avail_memory_mib: 8192,
avail_storage_mib: 10_0000,
max_ports_per_app: 5,
};
@ -123,17 +123,17 @@ async fn test_app_daemon_resource_msg() {
let app_node_opt: Option<AppNode> = db.select((APP_NODE, daemon_key.pubkey)).await.unwrap();
assert!(app_node_opt.is_some());
let db::AppNode {
avail_mem_mb,
avail_mem_mib,
avail_vcpus,
avail_storage_gbs,
avail_storage_mib,
avail_ports,
max_ports_per_app,
..
} = app_node_opt.unwrap();
assert_eq!(avail_mem_mb, req_data.avail_memory_mb);
assert_eq!(avail_mem_mib, req_data.avail_memory_mib);
assert_eq!(avail_vcpus, req_data.avail_vcpus);
assert_eq!(avail_storage_gbs, req_data.avail_storage_gb);
assert_eq!(avail_storage_mib, req_data.avail_storage_mib);
assert_eq!(avail_ports, req_data.avail_no_of_port);
assert_eq!(max_ports_per_app, req_data.max_ports_per_app);
}

@ -488,9 +488,9 @@ app_nodes:
region: Hesse
city: Frankfurt am Main
ip: 212.95.45.139
avail_mem_mb: 16000
avail_mem_mib: 16000
avail_vcpus: 16
avail_storage_mb: 200000
avail_storage_mib: 200000
avail_no_of_port: 20000
max_ports_per_app: 9
price: 20000
@ -506,9 +506,9 @@ app_contracts:
- - 28667
- 8080
host_ipv4: 212.95.45.139
disk_size_mb: 1000
disk_size_mib: 1000
vcpus: 1
memory_mb: 1000
memory_mib: 1000
created_at: 2025-04-21T11:27:28.833236909Z
updated_at: 2025-04-21T11:27:28.833237729Z
price_per_unit: 200000