diff --git a/Cargo.lock b/Cargo.lock index 87e6b57..e138dc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "detee-shared" version = "0.1.0" -source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=credits_app#01e93d3a2e4502c0e8e72026e8a1c55810961815" +source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=offers#4753a17fa29393b3f99b6dfcdcec48d935e6ebd9" dependencies = [ "bincode 2.0.1", "prost", diff --git a/Cargo.toml b/Cargo.toml index c117b51..cc29262 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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_app" } +detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "offers" } ed25519-dalek = "2.1.1" bs58 = "0.5.1" tokio-stream = "0.1.17" diff --git a/src/bin/migration0.rs b/src/bin/migration1.rs similarity index 85% rename from src/bin/migration0.rs rename to src/bin/migration1.rs index f3d8a2f..64b4005 100644 --- a/src/bin/migration0.rs +++ b/src/bin/migration1.rs @@ -4,12 +4,12 @@ // and dangling impls from the model use dotenv::dotenv; use std::error::Error; -use surreal_brain::{db, old_brain}; +use surreal_brain::db; #[tokio::main] async fn main() -> Result<(), Box> { dotenv().ok(); - let old_brain_data = old_brain::BrainData::load_from_disk()?; + // let old_brain_data = old_brain::BrainData::load_from_disk()?; // println!("{}", serde_yaml::to_string(&old_brain_data)?); let db_url = std::env::var("DB_URL").expect("DB_URL not set in .env"); @@ -21,7 +21,7 @@ async fn main() -> Result<(), Box> { let db = db::db_connection(&db_url, &db_user, &db_pass, &db_ns, &db_name).await.unwrap(); env_logger::builder().filter_level(log::LevelFilter::Trace); - db::migration0(&db, &old_brain_data).await?; + db::migration1_patch(&db).await?; Ok(()) } diff --git a/src/constants.rs b/src/constants.rs index e41996d..5ba503b 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -8,7 +8,10 @@ pub const CERT_PATH: &str = "/etc/detee/brain/brain-crt.pem"; pub const CERT_KEY_PATH: &str = "/etc/detee/brain/brain-key.pem"; pub const CONFIG_PATH: &str = "/etc/detee/brain/config.ini"; -pub const DB_SCHEMA_FILES: [&str; 2] = ["surql/tables.sql", "surql/functions.sql"]; +pub const MIGRATION_0_SCHEMA: [&str; 2] = ["surql/migration0/tables.sql", "surql/migration0/functions.sql"]; +pub const MIGRATION_0_MOCK_DATA: &str = "surql/migration0/mock_data.sql"; +pub const MIGRATION_1_PATCH: &str = "surql/migration1/patch_tables.sql"; +pub const MIGRATION_1_SCHEMA: &str = "surql/migration1/final_tables.sql"; pub static ADMIN_ACCOUNTS: LazyLock> = LazyLock::new(|| { let default_admin_keys = vec![ @@ -23,8 +26,6 @@ pub static ADMIN_ACCOUNTS: LazyLock> = LazyLock::new(|| { .unwrap_or(default_admin_keys) }); -pub const OLD_BRAIN_DATA_PATH: &str = "./saved_data.yaml"; - pub const ACCOUNT: &str = "account"; pub const KICK: &str = "kick"; pub const BAN: &str = "ban"; diff --git a/src/db/app.rs b/src/db/app.rs index 8e0ed25..60f3622 100644 --- a/src/db/app.rs +++ b/src/db/app.rs @@ -4,10 +4,10 @@ use std::time::Duration; use super::Error; use crate::constants::{ - ACCOUNT, ACTIVE_APP, APP_DAEMON_TIMEOUT, APP_NODE, DEFAULT_ENDPOINT, DELETED_APP, NEW_APP_REQ, + ACCOUNT, ACTIVE_APP, APP_DAEMON_TIMEOUT, APP_NODE, DELETED_APP, NEW_APP_REQ, }; use crate::db::general::Report; -use crate::{db, old_brain}; +use crate::db; use detee_shared::app_proto::{self, NewAppRes}; use serde::{Deserialize, Serialize}; use surrealdb::engine::remote::ws::Client; @@ -631,72 +631,6 @@ impl AppNodeResources { } } -impl From<&old_brain::BrainData> for Vec { - fn from(old_data: &old_brain::BrainData) -> Self { - let mut nodes = Vec::new(); - for old_node in old_data.app_nodes.iter() { - nodes.push(AppNode { - id: RecordId::from((APP_NODE, old_node.node_pubkey.clone())), - operator: RecordId::from((ACCOUNT, old_node.operator_wallet.clone())), - pub_sub_node: DEFAULT_ENDPOINT.to_string(), - country: old_node.country.clone(), - region: old_node.region.clone(), - city: old_node.city.clone(), - ip: old_node.ip.clone(), - avail_mem_mib: old_node.avail_mem_mb, - avail_vcpus: old_node.avail_vcpus, - avail_storage_mib: old_node.avail_storage_mb, - avail_ports: old_node.avail_no_of_port, - max_ports_per_app: old_node.max_ports_per_app, - price: old_node.price, - disconnected_at: Datetime::default(), - connected_at: Datetime::default(), - }); - } - nodes - } -} - -impl From<&old_brain::BrainData> for Vec { - fn from(old_data: &old_brain::BrainData) -> Self { - let mut contracts = Vec::new(); - for old_c in old_data.app_contracts.iter() { - let mut mapped_ports = Vec::new(); - for port in old_c.mapped_ports.clone().into_iter().map(|(b, c)| (b as u32, c as u32)) { - mapped_ports.push(port); - } - - let mr_enclave_hex = old_c - .public_package_mr_enclave - .clone() - .unwrap_or_default() - .iter() - .map(|byte| format!("{byte:02X}")) - .collect(); - - contracts.push(ActiveApp { - id: RecordId::from((ACTIVE_APP, old_c.uuid.replace("-", ""))), - admin: RecordId::from((ACCOUNT, old_c.admin_pubkey.clone())), - app_node: RecordId::from((APP_NODE, old_c.node_pubkey.clone())), - mapped_ports, - host_ipv4: old_c.host_ipv4.clone(), - disk_size_mib: old_c.disk_size_mb, - vcpus: old_c.vcpus, - memory_mib: old_c.memory_mb, - price_per_unit: old_c.price_per_unit, - locked_nano: old_c.locked_nano, - created_at: old_c.created_at.into(), - collected_at: old_c.collected_at.into(), - app_name: old_c.app_name.clone(), - mr_enclave: mr_enclave_hex, - package_url: old_c.package_url.clone(), - hratls_pubkey: old_c.hratls_pubkey.clone(), - }); - } - contracts - } -} - #[derive(Debug, Serialize, Deserialize)] pub struct DeletedApp { pub id: RecordId, diff --git a/src/db/general.rs b/src/db/general.rs index 7def9ed..a544ade 100644 --- a/src/db/general.rs +++ b/src/db/general.rs @@ -3,7 +3,6 @@ use super::Error; use crate::constants::{ACCOUNT, BAN, KICK, TOKEN_DECIMAL, VM_NODE}; use crate::db::prelude::*; -use crate::old_brain; use serde::{Deserialize, Serialize}; use surrealdb::engine::remote::ws::Client; use surrealdb::sql::Datetime; @@ -147,27 +146,6 @@ impl Account { } } -impl From<&old_brain::BrainData> for Vec { - fn from(old_data: &old_brain::BrainData) -> Self { - let mut accounts = Vec::new(); - for old_account in old_data.accounts.iter() { - let mut a = Account { - id: RecordId::from((ACCOUNT, old_account.key())), - balance: old_account.value().balance, - tmp_locked: old_account.value().tmp_locked, - escrow: 0, - email: String::new(), - }; - if let Some(operator) = old_data.operators.get(old_account.key()) { - a.escrow = operator.escrow; - a.email = operator.email.clone(); - } - accounts.push(a); - } - accounts - } -} - #[derive(Debug, Serialize, Deserialize)] pub struct Ban { #[serde(rename = "in")] @@ -339,8 +317,8 @@ impl Operator { let operator = Self::inspect(db, account).await?; let mut result = db .query(format!( - "select *, operator, <-report.* as reports from vm_node - where operator = account:{account};" + "select *, operator, <-report.* as reports + from vm_node where operator = account:{account};" )) .query(format!( "select *, operator, <-report.* as reports from app_node diff --git a/src/db/mod.rs b/src/db/mod.rs index b6a3f42..b2e8f67 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -5,10 +5,9 @@ pub mod general; pub mod vm; use crate::constants::{ - APP_NODE, DB_SCHEMA_FILES, DEFAULT_ENDPOINT, DELETED_APP, DELETED_VM, NEW_APP_REQ, NEW_VM_REQ, - UPDATE_VM_REQ, + APP_NODE, DEFAULT_ENDPOINT, DELETED_APP, DELETED_VM, MIGRATION_0_MOCK_DATA, MIGRATION_0_SCHEMA, + MIGRATION_1_PATCH, MIGRATION_1_SCHEMA, NEW_APP_REQ, NEW_VM_REQ, UPDATE_VM_REQ, }; -use crate::old_brain; use prelude::*; use serde::{Deserialize, Serialize}; use surrealdb::engine::remote::ws::{Client, Ws}; @@ -77,34 +76,35 @@ pub async fn db_connection( Ok(db_connection) } -pub async fn migration0( - db: &Surreal, - old_data: &old_brain::BrainData, -) -> Result<(), Error> { - let accounts: Vec = old_data.into(); - let vm_nodes: Vec = old_data.into(); - let app_nodes: Vec = old_data.into(); - let active_vm: Vec = old_data.into(); - let active_app: Vec = old_data.into(); +// TODO: figure if we can inspect DB schema in the DB with the schema from migration0, +// and execute migration1_patch only if it is needed. - for schema_data in DB_SCHEMA_FILES.map(|path| (std::fs::read_to_string(path), path)) { +pub async fn migration0_tables(db: &Surreal) -> Result<(), Error> { + for schema_data in MIGRATION_0_SCHEMA.map(|path| (std::fs::read_to_string(path), path)) { let schema_file = schema_data.1; println!("Loading schema from {schema_file}"); let schema = schema_data.0?; db.query(schema).await?; } + Ok(()) +} - println!("Inserting accounts..."); - let _: Vec = db.insert(()).content(accounts).await?; - println!("Inserting vm nodes..."); - let _: Vec = db.insert(()).content(vm_nodes).await?; - println!("Inserting app nodes..."); - let _: Vec = db.insert(()).content(app_nodes).await.unwrap(); - println!("Inserting active vm contracts..."); - let _: Vec = db.insert(()).relation(active_vm).await?; - println!("Inserting app contracts..."); - let _: Vec = db.insert(()).relation(active_app).await?; +pub async fn migration0_mock_data(db: &Surreal) -> Result<(), Error> { + let patch_instructions = std::fs::read_to_string(MIGRATION_0_MOCK_DATA)?; + db.query(patch_instructions).await?; + Ok(()) +} +pub async fn migration1_patch(db: &Surreal) -> Result<(), Error> { + let patch_instructions = std::fs::read_to_string(MIGRATION_1_PATCH)?; + println!("Applying patch {MIGRATION_1_PATCH}"); + db.query(patch_instructions).await?; + Ok(()) +} + +pub async fn migration1_tables(db: &Surreal) -> Result<(), Error> { + let patch_instructions = std::fs::read_to_string(MIGRATION_1_SCHEMA)?; + db.query(patch_instructions).await?; Ok(()) } diff --git a/src/db/vm.rs b/src/db/vm.rs index 17ccd91..4bba16a 100644 --- a/src/db/vm.rs +++ b/src/db/vm.rs @@ -5,11 +5,10 @@ use std::time::Duration; use super::Error; use crate::constants::{ - ACCOUNT, ACTIVE_VM, DEFAULT_ENDPOINT, DELETED_VM, NEW_VM_REQ, UPDATE_VM_REQ, VM_DAEMON_TIMEOUT, - VM_NODE, VM_UPDATE_EVENT, + ACCOUNT, ACTIVE_VM, DELETED_VM, NEW_VM_REQ, UPDATE_VM_REQ, VM_DAEMON_TIMEOUT, VM_NODE, + VM_UPDATE_EVENT, }; use crate::db::{Account, ErrorFromTable, Report}; -use crate::old_brain; use detee_shared::vm_proto; use serde::{Deserialize, Serialize}; use surrealdb::engine::remote::ws::Client; @@ -26,16 +25,13 @@ pub struct VmNode { pub region: String, pub city: String, pub ip: String, - pub avail_mem_mib: u32, - pub avail_vcpus: u32, - pub avail_storage_mib: u32, pub avail_ipv4: u32, pub avail_ipv6: u32, pub avail_ports: u32, pub max_ports_per_vm: u32, - pub price: u64, pub connected_at: Datetime, pub disconnected_at: Datetime, + pub offers: Vec, } impl VmNode { @@ -59,13 +55,11 @@ impl VmNode { #[derive(Serialize)] pub struct VmNodeResources { - pub avail_mem_mib: u32, - pub avail_vcpus: u32, - pub avail_storage_mib: u32, pub avail_ipv4: u32, pub avail_ipv6: u32, pub avail_ports: u32, pub max_ports_per_vm: u32, + pub offers: Vec, } impl VmNodeResources { @@ -75,6 +69,14 @@ impl VmNodeResources { } } +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct VmNodeOffer { + pub price: u64, + pub memory_mib: u64, + pub vcpus: u64, + pub disk_mib: u64, +} + #[derive(Debug, Serialize, Deserialize)] pub struct VmNodeWithReports { pub id: RecordId, @@ -83,15 +85,12 @@ pub struct VmNodeWithReports { pub region: String, pub city: String, pub ip: String, - pub avail_mem_mib: u64, - pub avail_vcpus: u64, - pub avail_storage_mib: u64, pub avail_ipv4: u32, pub avail_ipv6: u32, pub avail_ports: u32, pub max_ports_per_vm: u32, - pub price: u64, pub reports: Vec, + pub offers: Vec, } impl VmNodeWithReports { @@ -100,14 +99,15 @@ impl VmNodeWithReports { filters: vm_proto::VmNodeFilters, ) -> Result, Error> { let mut query = format!( - "select *, <-report.* as reports from {VM_NODE} where + "select *, <-report.* as reports + from {VM_NODE} where avail_ports >= {} && max_ports_per_vm >= {} && avail_ipv4 >= {} && avail_ipv6 >= {} && - avail_vcpus >= {} && - avail_mem_mib >= {} && - avail_storage_mib >= {}\n", + offers.*.vcpus >= {} && + offers.*.memory_mib >= {} && + offers.*.disk_mib >= {}\n", filters.free_ports, filters.free_ports, filters.offers_ipv4 as u32, @@ -133,6 +133,20 @@ impl VmNodeWithReports { let vm_nodes: Vec = result.take(0)?; Ok(vm_nodes) } + + pub async fn find_by_daemon_pubkey( + db: &Surreal, + daemon_key: &str, + ) -> Result, Error> { + let vm_node: Option = db + .query(format!( + "SELECT *, <-report.* as reports + FROM {VM_NODE} WHERE id = {VM_NODE}:{daemon_key};" + )) + .await? + .take(0)?; + Ok(vm_node) + } } pub enum VmDaemonMsg { @@ -1006,64 +1020,3 @@ impl ActiveVmWithNode { Ok(active_vms) } } - -// TODO: delete all of these From implementation after migration 0 gets executed - -impl From<&old_brain::BrainData> for Vec { - fn from(old_data: &old_brain::BrainData) -> Self { - let mut nodes = Vec::new(); - for old_node in old_data.vm_nodes.iter() { - nodes.push(VmNode { - id: RecordId::from((VM_NODE, old_node.public_key.clone())), - operator: RecordId::from((ACCOUNT, old_node.operator_wallet.clone())), - pub_sub_node: DEFAULT_ENDPOINT.to_string(), - country: old_node.country.clone(), - region: old_node.region.clone(), - city: old_node.city.clone(), - ip: old_node.ip.clone(), - avail_mem_mib: old_node.avail_mem_mb, - avail_vcpus: old_node.avail_vcpus, - avail_storage_mib: old_node.avail_storage_gbs * 1024, - avail_ipv4: old_node.avail_ipv4, - avail_ipv6: old_node.avail_ipv6, - avail_ports: old_node.avail_ports, - max_ports_per_vm: old_node.max_ports_per_vm, - price: old_node.price, - disconnected_at: Datetime::default(), - connected_at: Datetime::default(), - }); - } - nodes - } -} - -impl From<&old_brain::BrainData> for Vec { - fn from(old_data: &old_brain::BrainData) -> Self { - let mut contracts = Vec::new(); - for old_c in old_data.vm_contracts.iter() { - let mut mapped_ports = Vec::new(); - for port in old_c.exposed_ports.iter() { - mapped_ports.push((*port, 8080u32)); - } - contracts.push(ActiveVm { - id: RecordId::from((ACTIVE_VM, old_c.uuid.replace("-", ""))), - admin: RecordId::from((ACCOUNT, old_c.admin_pubkey.clone())), - vm_node: RecordId::from((VM_NODE, old_c.node_pubkey.clone())), - hostname: old_c.hostname.clone(), - mapped_ports, - public_ipv4: old_c.public_ipv4.clone(), - public_ipv6: old_c.public_ipv6.clone(), - disk_size_mib: old_c.disk_size_gb * 1024, - vcpus: old_c.vcpus, - memory_mib: old_c.memory_mb, - dtrfs_sha: old_c.dtrfs_sha.clone(), - kernel_sha: old_c.kernel_sha.clone(), - price_per_unit: old_c.price_per_unit, - locked_nano: old_c.locked_nano, - created_at: old_c.created_at.into(), - collected_at: old_c.collected_at.into(), - }); - } - contracts - } -} diff --git a/src/grpc/types.rs b/src/grpc/types.rs index af6968b..a644bc5 100644 --- a/src/grpc/types.rs +++ b/src/grpc/types.rs @@ -229,12 +229,18 @@ impl From for VmNodeListResp { city: vm_node.city, ip: vm_node.ip, reports: vm_node.reports.iter().map(|n| n.reason.clone()).collect(), - price: vm_node.price, - vcpus: vm_node.avail_vcpus, - memory_mib: vm_node.avail_mem_mib, - disk_mib: vm_node.avail_storage_mib, public_ipv4: vm_node.avail_ipv4 > 0, public_ipv6: vm_node.avail_ipv6 > 0, + offers: vm_node + .offers + .iter() + .map(|offer| VmNodeOffer { + price: offer.price, + vcpus: offer.vcpus, + memory_mib: offer.memory_mib, + disk_mib: offer.disk_mib, + }) + .collect(), } } } @@ -261,13 +267,20 @@ impl From for AppNodeListResp { impl From for db::VmNodeResources { fn from(res: VmNodeResources) -> Self { Self { - avail_mem_mib: res.avail_memory_mib, - avail_vcpus: res.avail_vcpus, - avail_storage_mib: res.avail_storage_mib, avail_ipv4: res.avail_ipv4, avail_ipv6: res.avail_ipv6, avail_ports: res.avail_ports, max_ports_per_vm: res.max_ports_per_vm, + offers: res + .offers + .iter() + .map(|offer| db::VmNodeOffer { + price: offer.price, + vcpus: offer.vcpus, + memory_mib: offer.memory_mib, + disk_mib: offer.disk_mib, + }) + .collect(), } } } diff --git a/src/grpc/vm.rs b/src/grpc/vm.rs index dd3ce02..de41c12 100644 --- a/src/grpc/vm.rs +++ b/src/grpc/vm.rs @@ -50,16 +50,13 @@ impl BrainVmDaemon for VmDaemonServer { region: req.region, city: req.city, ip: req.main_ip, - price: req.price, - avail_mem_mib: 0, - avail_vcpus: 0, - avail_storage_mib: 0, avail_ipv4: 0, avail_ipv6: 0, avail_ports: 0, max_ports_per_vm: 0, disconnected_at: surrealdb::sql::Datetime::default(), connected_at: surrealdb::sql::Datetime::default(), + offers: Vec::new(), } .register(&self.db) .await?; diff --git a/src/lib.rs b/src/lib.rs index 7b50299..5f8aed0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,4 +3,3 @@ pub mod constants; pub mod db; pub mod grpc; -pub mod old_brain; diff --git a/src/old_brain.rs b/src/old_brain.rs deleted file mode 100644 index d4dc2ee..0000000 --- a/src/old_brain.rs +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -// TODO: delete this file after migration0 gets executed - -use chrono::Utc; -use dashmap::DashMap; -use serde::{Deserialize, Serialize}; -use std::collections::{HashMap, HashSet}; - -use crate::constants::OLD_BRAIN_DATA_PATH; - -#[derive(Clone, Default, Serialize, Deserialize, Debug)] -pub struct AccountData { - pub balance: u64, - pub tmp_locked: u64, - // holds reasons why VMs of this account got kicked - pub kicked_for: Vec, - pub last_kick: chrono::DateTime, - // holds accounts that banned this account - pub banned_by: HashSet, -} - -#[derive(Clone, Default, Serialize, Deserialize)] -pub struct OperatorData { - pub escrow: u64, - pub email: String, - pub banned_users: HashSet, - pub vm_nodes: HashSet, - pub app_nodes: HashSet, -} - -#[derive(Eq, PartialEq, Clone, Debug, Default, Serialize, Deserialize)] -pub struct VmNode { - pub public_key: String, - pub operator_wallet: String, - pub country: String, - pub region: String, - pub city: String, - pub ip: String, - pub avail_mem_mb: u32, - pub avail_vcpus: u32, - pub avail_storage_gbs: u32, - pub avail_ipv4: u32, - pub avail_ipv6: u32, - pub avail_ports: u32, - pub max_ports_per_vm: u32, - // nanoLP per unit per minute - pub price: u64, - // 1st String is user wallet and 2nd String is report message - pub reports: HashMap, - pub offline_minutes: u64, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct VmContract { - pub uuid: String, - pub hostname: String, - pub admin_pubkey: String, - pub node_pubkey: String, - pub exposed_ports: Vec, - pub public_ipv4: String, - pub public_ipv6: String, - pub disk_size_gb: u32, - pub vcpus: u32, - pub memory_mb: u32, - pub kernel_sha: String, - pub dtrfs_sha: String, - pub created_at: chrono::DateTime, - pub updated_at: chrono::DateTime, - // recommended value is 20000 - /// price per unit per minute - pub price_per_unit: u64, - pub locked_nano: u64, - pub collected_at: chrono::DateTime, -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize)] -pub struct AppContract { - pub uuid: String, - pub package_url: String, - pub admin_pubkey: String, - pub node_pubkey: String, - pub mapped_ports: Vec<(u16, u16)>, - pub host_ipv4: String, - pub disk_size_mb: u32, - pub vcpus: u32, - pub memory_mb: u32, - pub created_at: chrono::DateTime, - pub updated_at: chrono::DateTime, - // price per unit per minute - // recommended value is 20000 - pub price_per_unit: u64, - pub locked_nano: u64, - pub collected_at: chrono::DateTime, - pub hratls_pubkey: String, - pub public_package_mr_enclave: Option>, - pub app_name: String, -} - -#[derive(Eq, Hash, PartialEq, Clone, Debug, Default, Serialize, Deserialize)] -pub struct AppNode { - pub node_pubkey: String, - pub operator_wallet: String, - pub country: String, - pub region: String, - pub city: String, - pub ip: String, - pub avail_mem_mb: u32, - pub avail_vcpus: u32, - pub avail_storage_mb: u32, - pub avail_no_of_port: u32, - pub max_ports_per_app: u32, - // nanotokens per unit per minute - pub price: u64, - pub offline_minutes: u64, -} - -#[derive(Default, Serialize, Deserialize)] -pub struct BrainData { - pub accounts: DashMap, - pub operators: DashMap, - pub vm_nodes: Vec, - pub vm_contracts: Vec, - - pub app_nodes: Vec, - pub app_contracts: Vec, -} - -impl BrainData { - pub fn load_from_disk() -> Result> { - let content = std::fs::read_to_string(OLD_BRAIN_DATA_PATH)?; - let data: Self = serde_yaml::from_str(&content)?; - Ok(data) - } -} diff --git a/surql/functions.sql b/surql/migration0/functions.sql similarity index 100% rename from surql/functions.sql rename to surql/migration0/functions.sql diff --git a/surql/migration0/mock_data.sql b/surql/migration0/mock_data.sql new file mode 100644 index 0000000..7907302 --- /dev/null +++ b/surql/migration0/mock_data.sql @@ -0,0 +1,377 @@ +-- ------------------------------ +-- OPTION +-- ------------------------------ + +OPTION IMPORT; + +-- ------------------------------ +-- FUNCTIONS +-- ------------------------------ + +DEFINE FUNCTION fn::app_price_per_minute($app_id: record) { +LET $app = (SELECT * FROM $app_id)[0]; +RETURN (($app.vcpus * 5) + ($app.memory_mib / 200) + ($app.disk_size_mib / 10)) * $app.price_per_unit; +} PERMISSIONS FULL; +DEFINE FUNCTION fn::delete_app($app_id: record) { +LET $app = (SELECT * FROM $app_id)[0]; +LET $account = $app.in; +LET $deleted_app = $app.patch([{ op: 'replace', path: 'id', value: type::record('deleted_app:' + record::id($app.id)) }]); +IF $app.locked_nano >= 0 { UPDATE $account SET balance += $app.locked_nano; }; +INSERT RELATION INTO deleted_app ($deleted_app); +RETURN (DELETE $app.id RETURN BEFORE); +} PERMISSIONS FULL; +DEFINE FUNCTION fn::delete_vm($vm_id: record) { +LET $vm = (SELECT * FROM $vm_id)[0]; +LET $account = $vm.in; +LET $deleted_vm = $vm.patch([{ op: 'replace', path: 'id', value: type::record('deleted_vm:' + record::id($vm.id)) }]); +IF $vm.locked_nano >= 0 { UPDATE $account SET balance += $vm.locked_nano; }; +INSERT RELATION INTO deleted_vm ($deleted_vm); +RETURN (DELETE $vm.id RETURN BEFORE); +} PERMISSIONS FULL; +DEFINE FUNCTION fn::vm_price_per_minute($vm_id: record) { +LET $vm = (SELECT * FROM $vm_id)[0]; +LET $ip_price = IF $vm.public_ipv4.len() > 0 { 10 } ELSE { 0 }; +RETURN (($vm.vcpus * 10) + (($vm.memory_mib + 256) / 200) + ($vm.disk_size_mib / 1024 / 10) + $ip_price) * $vm.price_per_unit; +} PERMISSIONS FULL; + +-- ------------------------------ +-- TABLE: account +-- ------------------------------ + +DEFINE TABLE account TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD balance ON account TYPE int DEFAULT 0 PERMISSIONS FULL; +DEFINE FIELD email ON account TYPE string DEFAULT '' PERMISSIONS FULL; +DEFINE FIELD escrow ON account TYPE int DEFAULT 0 PERMISSIONS FULL; +DEFINE FIELD tmp_locked ON account TYPE int DEFAULT 0 PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: account +-- ------------------------------ + +INSERT [ { balance: 9978460000, email: '', escrow: 0, id: account:3BNggj8ZTsoSjfAGdPfmcU2Gobm2qcTEBg9iHXEUPe1t, tmp_locked: 0 }, { balance: 1670441080000, email: '', escrow: 0, id: account:45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr, tmp_locked: 0 }, { balance: 1076960680000, email: '', escrow: 0, id: account:49JBVzmgsQbUURHzAWax2gxo6jmukqbEQzP97YeeNQyu, tmp_locked: 0 }, { balance: 25949200000, email: 'test_mock@operator', escrow: 5499700480000, id: account:4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ, tmp_locked: 0 }, { balance: 3271040000, email: '', escrow: 888888888899999, id: account:7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB, tmp_locked: 0 }, { balance: 99980200000, email: '', escrow: 0, id: account:B981xPHmHthfKr15J9uJ64qd9zt2KsdiEuDRR7UUCGWi, tmp_locked: 0 }, { balance: 4672207240000, email: 'first_on_detee@proton.me', escrow: 5096692000000, id: account:BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS, tmp_locked: 0 }, { balance: 25000000000, email: '', escrow: 0, id: account:CLYyE6id5876DW69LHDynuH6TjJPvWRBTQC5XDZ6jfT1, tmp_locked: 0 }, { balance: 4794480000, email: '', escrow: 0, id: account:Cnkvn3WuHYfTzh1YK1TAv2VD25sNvstJNnQtxjcdQSL7, tmp_locked: 0 }, { balance: 20293420000, email: '', escrow: 0, id: account:DXXkYSnhP3ijsHYxkedcuMomEyc122WaAbkDX7SaGuUS, tmp_locked: 0 }, { balance: 74660380000, email: '', escrow: 0, id: account:DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX, tmp_locked: 0 }, { balance: 21121600000, email: '', escrow: 0, id: account:E3bgXsWvgichXeC6AqULJCZDp7FbEdTxBD67UaYVWf9y, tmp_locked: 0 }, { balance: 181560160000, email: '', escrow: 0, id: account:FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ, tmp_locked: 0 }, { balance: 25949200000, email: '', escrow: 0, id: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, tmp_locked: 0 }, { balance: 500000000000, email: '', escrow: 0, id: account:GmE4JH3bL4NpmzwKCBJemJzRTumJAnbcXLGqce5mREgS, tmp_locked: 0 }, { balance: 976000000, email: '', escrow: 0, id: account:H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc, tmp_locked: 0 }, { balance: 979410300000, email: '', escrow: 0, id: account:HQyGWpiteHbxjszngZvmiX7ZFZAmF6nFjEraBa1M6bbM, tmp_locked: 0 }, { balance: 25949200000, email: 'test_mock_extend@operator', escrow: 5499700480000, id: account:Hv5q3enK249RUnLRLi9YNQMrPCRxvL2XnhznkzrtCmkG, tmp_locked: 0 }, { balance: 25000000000, email: '', escrow: 0, id: account:db5ZB6uDbF1mUUgeggBZ9XKbi3mUfX6WHkBpbwUHJpB, tmp_locked: 0 }, { balance: 1000000000, email: '', escrow: 0, id: account:fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1, tmp_locked: 0 }, { balance: 554454460000, email: 'gheo@detee.ltd', escrow: 5499700480000, id: account:x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK, tmp_locked: 547200000 } ]; + +-- ------------------------------ +-- TABLE: active_app +-- ------------------------------ + +DEFINE TABLE active_app TYPE RELATION IN account OUT app_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD app_name ON active_app TYPE string PERMISSIONS FULL; +DEFINE FIELD collected_at ON active_app TYPE datetime PERMISSIONS FULL; +DEFINE FIELD created_at ON active_app TYPE datetime PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON active_app TYPE int PERMISSIONS FULL; +DEFINE FIELD host_ipv4 ON active_app TYPE string PERMISSIONS FULL; +DEFINE FIELD hratls_pubkey ON active_app TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON active_app TYPE record PERMISSIONS FULL; +DEFINE FIELD locked_nano ON active_app TYPE int PERMISSIONS FULL; +DEFINE FIELD mapped_ports ON active_app TYPE array<[int, int]> PERMISSIONS FULL; +DEFINE FIELD mapped_ports[*] ON active_app TYPE [int, int] PERMISSIONS FULL; +DEFINE FIELD memory_mib ON active_app TYPE int PERMISSIONS FULL; +DEFINE FIELD mr_enclave ON active_app TYPE string PERMISSIONS FULL; +DEFINE FIELD out ON active_app TYPE record PERMISSIONS FULL; +DEFINE FIELD package_url ON active_app TYPE string PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON active_app TYPE int PERMISSIONS FULL; +DEFINE FIELD vcpus ON active_app TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: active_app +-- ------------------------------ + +INSERT RELATION [ { __: true, app_name: 'diligent-seahorse', collected_at: d'2025-04-21T11:28:24.905665571Z', created_at: d'2025-04-21T11:27:28.833236909Z', disk_size_mib: 1000, host_ipv4: '212.95.45.139', hratls_pubkey: '7E0F887AA6BB9104EEC1066F454D4C2D9063D676715F55F919D3FBCEDC63240B', id: active_app:e3d01f252b2a410b80e312f44e474334, in: account:H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc, locked_nano: 121200000, mapped_ports: [[27158, 34500], [28667, 8080]], memory_mib: 1000, mr_enclave: '34B766D2FBDBDA8CA8760AC162F0937CF0BD2E5F8AAC0FF6E372469FE8D409EA', out: app_node:BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg, package_url: 'https://registry.detee.ltd/sgx/packages/base_package_2025-04-17_11-01-08.tar.gz', price_per_unit: 200000, vcpus: 1 } ]; + +-- ------------------------------ +-- TABLE: active_vm +-- ------------------------------ + +DEFINE TABLE active_vm TYPE RELATION IN account OUT vm_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD collected_at ON active_vm TYPE datetime PERMISSIONS FULL; +DEFINE FIELD created_at ON active_vm TYPE datetime PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON active_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD dtrfs_sha ON active_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD hostname ON active_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON active_vm TYPE record PERMISSIONS FULL; +DEFINE FIELD kernel_sha ON active_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD locked_nano ON active_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD mapped_ports ON active_vm TYPE array<[int, int]> PERMISSIONS FULL; +DEFINE FIELD mapped_ports[*] ON active_vm TYPE [int, int] PERMISSIONS FULL; +DEFINE FIELD memory_mib ON active_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD out ON active_vm TYPE record PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON active_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD public_ipv4 ON active_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD public_ipv6 ON active_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD vcpus ON active_vm TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: active_vm +-- ------------------------------ + +INSERT RELATION [ { __: true, collected_at: d'2025-04-20T00:34:15.461211040Z', created_at: d'2025-04-07T22:57:57.646151746Z', disk_size_mib: 10485760, dtrfs_sha: 'b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45', hostname: 'sofenty', id: active_vm:16577f1c98674a1780a86cf0490f1270, in: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, kernel_sha: 'e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542', locked_nano: 11867500000, mapped_ports: [], memory_mib: 3000, out: vm_node:Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu, price_per_unit: 20000, public_ipv4: '156.146.63.217', public_ipv6: '', vcpus: 2 }, { __: true, collected_at: d'2025-04-20T00:34:15.461240342Z', created_at: d'2025-04-16T20:37:57.176592933Z', disk_size_mib: 10485760, dtrfs_sha: 'd207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990', hostname: 'shadowy-hobo', id: active_vm:1bf3630937744825b023b2a0ef0405ed, in: account:x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK, kernel_sha: 'e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919', locked_nano: 12730960000, mapped_ports: [[46393, 8080]], memory_mib: 1000, out: vm_node:3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4, price_per_unit: 20000, public_ipv4: '', public_ipv6: '', vcpus: 1 }, { __: true, collected_at: d'2025-04-20T00:34:15.461240342Z', created_at: d'2025-04-16T20:37:57.176592933Z', disk_size_mib: 10485760, dtrfs_sha: 'd207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990', hostname: 'test-extend', id: active_vm:1d749a816c27a22efa0e574b023a6afef040fe5, in: account:GmE4JH3bL4NpmzwKCBJemJzRTumJAnbcXLGqce5mREgS, kernel_sha: 'e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919', locked_nano: 60000, mapped_ports: [[46393, 8080]], memory_mib: 1000, out: vm_node:8ue3VHMnJg2i8pwTQ6mJtvYuS2kd9n1XLLco8GUPfT95, price_per_unit: 20000, public_ipv4: '', public_ipv6: '', vcpus: 1 }, { __: true, collected_at: d'2025-04-20T00:34:15.461201690Z', created_at: d'2025-03-20T14:40:25.557753393Z', disk_size_mib: 10485760, dtrfs_sha: '0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e', hostname: 'astromech-wrench', id: active_vm:1f49a71cf68c4c64a82ef50e0ba0b574, in: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, kernel_sha: '3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767', locked_nano: 11865620000, mapped_ports: [], memory_mib: 3000, out: vm_node:DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb, price_per_unit: 20000, public_ipv4: '149.22.95.2', public_ipv6: '', vcpus: 2 }, { __: true, collected_at: d'2025-04-20T00:34:15.461191231Z', created_at: d'2025-03-12T16:28:24.749161605Z', disk_size_mib: 10485760, dtrfs_sha: '03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee', hostname: 'heroic-door', id: active_vm:2309440623074332a642acee718d0186, in: account:DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX, kernel_sha: '14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692', locked_nano: 14134140000, mapped_ports: [[38288, 8080]], memory_mib: 1000, out: vm_node:7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9, price_per_unit: 20000, public_ipv4: '', public_ipv6: '', vcpus: 1 }, { __: true, collected_at: d'2025-04-20T00:34:15.461219779Z', created_at: d'2025-04-12T13:44:56.957037550Z', disk_size_mib: 30720, dtrfs_sha: 'b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45', hostname: 'cloaked-mailbox', id: active_vm:4b6e25ca87ac478b8f16aa8f5c44c704, in: account:DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX, kernel_sha: 'e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542', locked_nano: 11177760000, mapped_ports: [], memory_mib: 1000, out: vm_node:DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb, price_per_unit: 20000, public_ipv4: '149.22.95.2', public_ipv6: '', vcpus: 1 }, { __: true, collected_at: d'2025-04-20T00:34:15.461240342Z', created_at: d'2025-04-16T20:37:57.176592933Z', disk_size_mib: 10485760, dtrfs_sha: 'd207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990', hostname: 'hallow-hobo', id: active_vm:5af49a714c64a82ef50e574b023b2a0ef0405ed, in: account:4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ, kernel_sha: 'e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919', locked_nano: 12730960000, mapped_ports: [[46393, 8080]], memory_mib: 1000, out: vm_node:7fujZQeTme52RdXTLmQST5jBgAbvzic5iERtH5EWoYjk, price_per_unit: 20000, public_ipv4: '', public_ipv6: '', vcpus: 1 }, { __: true, collected_at: d'2025-04-20T00:34:15.461165181Z', created_at: d'2025-02-28T23:19:41.769423466Z', disk_size_mib: 10485760, dtrfs_sha: '3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b', hostname: 'detee-landing-fr', id: active_vm:958165e3dea8407d8c42dd17002ef79c, in: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, kernel_sha: '3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151', locked_nano: 14875500000, mapped_ports: [], memory_mib: 3000, out: vm_node:Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu, price_per_unit: 20000, public_ipv4: '156.146.63.216', public_ipv6: '', vcpus: 2 }, { __: true, collected_at: d'2025-04-20T00:34:15.461181545Z', created_at: d'2025-03-06T19:51:39.595163157Z', disk_size_mib: 10485760, dtrfs_sha: '3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b', hostname: 'detee-landing-gb', id: active_vm:e807a2fdcf904a14bc3a89ce6dc59033, in: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, kernel_sha: '3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151', locked_nano: 14875500000, mapped_ports: [], memory_mib: 3000, out: vm_node:7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9, price_per_unit: 20000, public_ipv4: '173.234.136.154', public_ipv6: '', vcpus: 2 }, { __: true, collected_at: d'2025-04-20T00:34:15.461230948Z', created_at: d'2025-04-15T00:46:35.622165457Z', disk_size_mib: 10485760, dtrfs_sha: 'b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45', hostname: 'twenty', id: active_vm:eb1a13edd7824b71886073540129cb7d, in: account:FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL, kernel_sha: 'e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542', locked_nano: 15570720000, mapped_ports: [], memory_mib: 4000, out: vm_node:3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4, price_per_unit: 20000, public_ipv4: '149.36.48.100', public_ipv6: '', vcpus: 4 } ]; + +-- ------------------------------ +-- TABLE: app_node +-- ------------------------------ + +DEFINE TABLE app_node TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD avail_mem_mib ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_ports ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_storage_mib ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_vcpus ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD city ON app_node TYPE string PERMISSIONS FULL; +DEFINE FIELD connected_at ON app_node TYPE datetime PERMISSIONS FULL; +DEFINE FIELD country ON app_node TYPE string PERMISSIONS FULL; +DEFINE FIELD disconnected_at ON app_node TYPE datetime PERMISSIONS FULL; +DEFINE FIELD ip ON app_node TYPE string PERMISSIONS FULL; +DEFINE FIELD max_ports_per_app ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD operator ON app_node TYPE record PERMISSIONS FULL; +DEFINE FIELD price ON app_node TYPE int PERMISSIONS FULL; +DEFINE FIELD pub_sub_node ON app_node TYPE string DEFAULT '127.0.0.1:31337' PERMISSIONS FULL; +DEFINE FIELD region ON app_node TYPE string PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: app_node +-- ------------------------------ + +INSERT [ { avail_mem_mib: 16000, avail_ports: 20000, avail_storage_mib: 200000, avail_vcpus: 16, city: 'Frankfurt am Main', connected_at: d'2025-07-06T15:14:33.228406616Z', country: 'DE', disconnected_at: d'2025-07-06T15:14:33.228406558Z', id: app_node:BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg, ip: '212.95.45.139', max_ports_per_app: 9, operator: account:7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'Hesse' } ]; + +-- ------------------------------ +-- TABLE: ban +-- ------------------------------ + +DEFINE TABLE ban TYPE RELATION IN account OUT account SCHEMALESS PERMISSIONS NONE; + +DEFINE FIELD created_at ON ban TYPE datetime DEFAULT time::now() PERMISSIONS FULL; +DEFINE FIELD in ON ban TYPE record PERMISSIONS FULL; +DEFINE FIELD out ON ban TYPE record PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: ban +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: deleted_app +-- ------------------------------ + +DEFINE TABLE deleted_app TYPE RELATION IN account OUT app_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD app_name ON deleted_app TYPE string PERMISSIONS FULL; +DEFINE FIELD created_at ON deleted_app TYPE datetime PERMISSIONS FULL; +DEFINE FIELD deleted_at ON deleted_app TYPE datetime DEFAULT time::now() PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON deleted_app TYPE int PERMISSIONS FULL; +DEFINE FIELD host_ipv4 ON deleted_app TYPE string PERMISSIONS FULL; +DEFINE FIELD hratls_pubkey ON deleted_app TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON deleted_app TYPE record PERMISSIONS FULL; +DEFINE FIELD mapped_ports ON deleted_app TYPE array<[int, int]> PERMISSIONS FULL; +DEFINE FIELD mapped_ports[*] ON deleted_app TYPE [int, int] PERMISSIONS FULL; +DEFINE FIELD memory_mib ON deleted_app TYPE int PERMISSIONS FULL; +DEFINE FIELD mr_enclave ON deleted_app TYPE string PERMISSIONS FULL; +DEFINE FIELD out ON deleted_app TYPE record PERMISSIONS FULL; +DEFINE FIELD package_url ON deleted_app TYPE string PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON deleted_app TYPE int PERMISSIONS FULL; +DEFINE FIELD vcpus ON deleted_app TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: deleted_app +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: deleted_vm +-- ------------------------------ + +DEFINE TABLE deleted_vm TYPE RELATION IN account OUT vm_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD created_at ON deleted_vm TYPE datetime PERMISSIONS FULL; +DEFINE FIELD deleted_at ON deleted_vm TYPE datetime DEFAULT time::now() PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON deleted_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD dtrfs_sha ON deleted_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD hostname ON deleted_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON deleted_vm TYPE record PERMISSIONS FULL; +DEFINE FIELD kernel_sha ON deleted_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD mapped_ports ON deleted_vm TYPE array<[int, int]> PERMISSIONS FULL; +DEFINE FIELD mapped_ports[*] ON deleted_vm TYPE [int, int] PERMISSIONS FULL; +DEFINE FIELD memory_mib ON deleted_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD out ON deleted_vm TYPE record PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON deleted_vm TYPE int PERMISSIONS FULL; +DEFINE FIELD public_ipv4 ON deleted_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD public_ipv6 ON deleted_vm TYPE string PERMISSIONS FULL; +DEFINE FIELD vcpus ON deleted_vm TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: deleted_vm +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: kick +-- ------------------------------ + +DEFINE TABLE kick TYPE RELATION IN account OUT account SCHEMALESS PERMISSIONS NONE; + +DEFINE FIELD contract ON kick TYPE record PERMISSIONS FULL; +DEFINE FIELD created_at ON kick TYPE datetime PERMISSIONS FULL; +DEFINE FIELD in ON kick TYPE record PERMISSIONS FULL; +DEFINE FIELD node ON kick TYPE record PERMISSIONS FULL; +DEFINE FIELD out ON kick TYPE record PERMISSIONS FULL; +DEFINE FIELD reason ON kick TYPE string PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: kick +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: new_app_req +-- ------------------------------ + +DEFINE TABLE new_app_req TYPE RELATION IN account OUT app_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD app_name ON new_app_req TYPE string PERMISSIONS FULL; +DEFINE FIELD created_at ON new_app_req TYPE datetime PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON new_app_req TYPE int PERMISSIONS FULL; +DEFINE FIELD error ON new_app_req TYPE string PERMISSIONS FULL; +DEFINE FIELD hratls_pubkey ON new_app_req TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON new_app_req TYPE record PERMISSIONS FULL; +DEFINE FIELD locked_nano ON new_app_req TYPE int PERMISSIONS FULL; +DEFINE FIELD memory_mib ON new_app_req TYPE int PERMISSIONS FULL; +DEFINE FIELD mr_enclave ON new_app_req TYPE string PERMISSIONS FULL; +DEFINE FIELD out ON new_app_req TYPE record PERMISSIONS FULL; +DEFINE FIELD package_url ON new_app_req TYPE string PERMISSIONS FULL; +DEFINE FIELD ports ON new_app_req TYPE array PERMISSIONS FULL; +DEFINE FIELD ports[*] ON new_app_req TYPE int PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON new_app_req TYPE int PERMISSIONS FULL; +DEFINE FIELD vcpus ON new_app_req TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: new_app_req +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: new_vm_req +-- ------------------------------ + +DEFINE TABLE new_vm_req TYPE RELATION IN account OUT vm_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD created_at ON new_vm_req TYPE datetime PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON new_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD dtrfs_sha ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD dtrfs_url ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD error ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD extra_ports ON new_vm_req TYPE array PERMISSIONS FULL; +DEFINE FIELD extra_ports[*] ON new_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD hostname ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON new_vm_req TYPE record PERMISSIONS FULL; +DEFINE FIELD kernel_sha ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD kernel_url ON new_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD locked_nano ON new_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD memory_mib ON new_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD out ON new_vm_req TYPE record PERMISSIONS FULL; +DEFINE FIELD price_per_unit ON new_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD public_ipv4 ON new_vm_req TYPE bool PERMISSIONS FULL; +DEFINE FIELD public_ipv6 ON new_vm_req TYPE bool PERMISSIONS FULL; +DEFINE FIELD vcpus ON new_vm_req TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: new_vm_req +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: report +-- ------------------------------ + +DEFINE TABLE report TYPE RELATION IN account OUT vm_node | app_node SCHEMALESS PERMISSIONS NONE; + +DEFINE FIELD contract_id ON report TYPE string PERMISSIONS FULL; +DEFINE FIELD created_at ON report TYPE datetime PERMISSIONS FULL; +DEFINE FIELD in ON report TYPE record PERMISSIONS FULL; +DEFINE FIELD out ON report TYPE record PERMISSIONS FULL; +DEFINE FIELD reason ON report TYPE string PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: report +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: update_vm_req +-- ------------------------------ + +DEFINE TABLE update_vm_req TYPE RELATION IN account OUT vm_node SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD created_at ON update_vm_req TYPE datetime PERMISSIONS FULL; +DEFINE FIELD disk_size_mib ON update_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD dtrfs_sha ON update_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD dtrfs_url ON update_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD error ON update_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD in ON update_vm_req TYPE record PERMISSIONS FULL; +DEFINE FIELD kernel_sha ON update_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD kernel_url ON update_vm_req TYPE string PERMISSIONS FULL; +DEFINE FIELD memory_mib ON update_vm_req TYPE int PERMISSIONS FULL; +DEFINE FIELD out ON update_vm_req TYPE record PERMISSIONS FULL; +DEFINE FIELD vcpus ON update_vm_req TYPE int PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: update_vm_req +-- ------------------------------ + + +-- ------------------------------ +-- TABLE: vm_node +-- ------------------------------ + +DEFINE TABLE vm_node TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; + +DEFINE FIELD avail_ipv4 ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_ipv6 ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_mem_mib ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_ports ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_storage_mib ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD avail_vcpus ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD city ON vm_node TYPE string PERMISSIONS FULL; +DEFINE FIELD connected_at ON vm_node TYPE datetime PERMISSIONS FULL; +DEFINE FIELD country ON vm_node TYPE string PERMISSIONS FULL; +DEFINE FIELD disconnected_at ON vm_node TYPE datetime PERMISSIONS FULL; +DEFINE FIELD ip ON vm_node TYPE string PERMISSIONS FULL; +DEFINE FIELD max_ports_per_vm ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD operator ON vm_node TYPE record PERMISSIONS FULL; +DEFINE FIELD price ON vm_node TYPE int PERMISSIONS FULL; +DEFINE FIELD pub_sub_node ON vm_node TYPE string DEFAULT '127.0.0.1:31337' PERMISSIONS FULL; +DEFINE FIELD region ON vm_node TYPE string PERMISSIONS FULL; + + + +-- ------------------------------ +-- TABLE DATA: vm_node +-- ------------------------------ + +INSERT [ { avail_ipv4: 0, avail_ipv6: 0, avail_mem_mib: 30000, avail_ports: 20000, avail_storage_mib: 716800, avail_vcpus: 31, city: 'Montréal', connected_at: d'2025-07-06T15:14:33.228403298Z', country: 'CA', disconnected_at: d'2025-07-06T15:14:33.228403224Z', id: vm_node:2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f, ip: '184.107.169.199', max_ports_per_vm: 5, operator: account:x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK, price: 18000, pub_sub_node: '127.0.0.1:31337', region: 'Quebec' }, { avail_ipv4: 23, avail_ipv6: 0, avail_mem_mib: 120000, avail_ports: 19999, avail_storage_mib: 399360, avail_vcpus: 41, city: 'San Jose', connected_at: d'2025-07-06T15:14:33.228404068Z', country: 'US', disconnected_at: d'2025-07-06T15:14:33.228404010Z', id: vm_node:3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4, ip: '149.36.48.99', max_ports_per_vm: 5, operator: account:BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'California' }, { avail_ipv4: 2, avail_ipv6: 65516, avail_mem_mib: 26000, avail_ports: 19999, avail_storage_mib: 696320, avail_vcpus: 28, city: 'London', connected_at: d'2025-07-06T15:14:33.228401491Z', country: 'GB', disconnected_at: d'2025-07-06T15:14:33.228399092Z', id: vm_node:7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9, ip: '173.234.17.2', max_ports_per_vm: 5, operator: account:x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'England' }, { avail_ipv4: 1, avail_ipv6: 0, avail_mem_mib: 28000, avail_ports: 19999, avail_storage_mib: 1720320, avail_vcpus: 24, city: 'London', connected_at: d'2025-07-06T15:14:33.228405169Z', country: 'GB', disconnected_at: d'2025-07-06T15:14:33.228405115Z', id: vm_node:7fujZQeTme52RdXTLmQST5jBgAbvzic5iERtH5EWoYjk, ip: '193.234.17.2', max_ports_per_vm: 10, operator: account:4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ, price: 24000, pub_sub_node: '127.0.0.1:31337', region: 'England' }, { avail_ipv4: 1, avail_ipv6: 0, avail_mem_mib: 28000, avail_ports: 19999, avail_storage_mib: 1720320, avail_vcpus: 24, city: 'London', connected_at: d'2025-07-06T15:14:33.228405526Z', country: 'GB', disconnected_at: d'2025-07-06T15:14:33.228405472Z', id: vm_node:8ue3VHMnJg2i8pwTQ6mJtvYuS2kd9n1XLLco8GUPfT95, ip: '193.234.17.2', max_ports_per_vm: 10, operator: account:Hv5q3enK249RUnLRLi9YNQMrPCRxvL2XnhznkzrtCmkG, price: 24000, pub_sub_node: '127.0.0.1:31337', region: 'England' }, { avail_ipv4: 25, avail_ipv6: 0, avail_mem_mib: 109000, avail_ports: 20000, avail_storage_mib: 409600, avail_vcpus: 45, city: 'Vancouver', connected_at: d'2025-07-06T15:14:33.228403686Z', country: 'CA', disconnected_at: d'2025-07-06T15:14:33.228403612Z', id: vm_node:DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb, ip: '149.22.95.1', max_ports_per_vm: 5, operator: account:BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'British Columbia' }, { avail_ipv4: 2, avail_ipv6: 0, avail_mem_mib: 123000, avail_ports: 20000, avail_storage_mib: 450560, avail_vcpus: 46, city: 'Paris', connected_at: d'2025-07-06T15:14:33.228402681Z', country: 'FR', disconnected_at: d'2025-07-06T15:14:33.228402603Z', id: vm_node:Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu, ip: '156.146.63.215', max_ports_per_vm: 5, operator: account:BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'Île-de-France' }, { avail_ipv4: 26, avail_ipv6: 0, avail_mem_mib: 125000, avail_ports: 20000, avail_storage_mib: 409600, avail_vcpus: 46, city: 'Vancouver', connected_at: d'2025-07-06T15:14:33.228404815Z', country: 'CA', disconnected_at: d'2025-07-06T15:14:33.228404760Z', id: vm_node:HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv, ip: '149.22.95.28', max_ports_per_vm: 5, operator: account:BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS, price: 20000, pub_sub_node: '127.0.0.1:31337', region: 'British Columbia' } ]; + diff --git a/surql/tables.sql b/surql/migration0/tables.sql similarity index 100% rename from surql/tables.sql rename to surql/migration0/tables.sql diff --git a/surql/migration1/final_tables.sql b/surql/migration1/final_tables.sql new file mode 100644 index 0000000..0e9559a --- /dev/null +++ b/surql/migration1/final_tables.sql @@ -0,0 +1,158 @@ +-- SPDX-License-Identifier: Apache-2.0 + +DEFINE TABLE account SCHEMAFULL; +DEFINE FIELD balance ON TABLE account TYPE int DEFAULT 0; +DEFINE FIELD tmp_locked ON TABLE account TYPE int DEFAULT 0; +DEFINE FIELD escrow ON TABLE account TYPE int DEFAULT 0; +DEFINE FIELD email ON TABLE account TYPE string DEFAULT ""; + +DEFINE TABLE vm_node SCHEMAFULL; +DEFINE FIELD operator ON TABLE vm_node TYPE record; +DEFINE FIELD pub_sub_node ON TABLE vm_node TYPE string default "127.0.0.1:31337"; +DEFINE FIELD country ON TABLE vm_node TYPE string; +DEFINE FIELD region ON TABLE vm_node TYPE string; +DEFINE FIELD city ON TABLE vm_node TYPE string; +DEFINE FIELD ip ON TABLE vm_node TYPE string; +DEFINE FIELD avail_ipv4 ON TABLE vm_node TYPE int; +DEFINE FIELD avail_ipv6 ON TABLE vm_node TYPE int; +DEFINE FIELD avail_ports ON TABLE vm_node TYPE int; +DEFINE FIELD max_ports_per_vm ON TABLE vm_node TYPE int; +DEFINE FIELD connected_at ON TABLE vm_node TYPE datetime; +DEFINE FIELD disconnected_at ON TABLE vm_node TYPE datetime; + +DEFINE TABLE vm_node_offer SCHEMAFULL; +DEFINE FIELD vm_node ON TABLE vm_node_offer TYPE record; +DEFINE FIELD price ON TABLE vm_node_offer TYPE int; +DEFINE FIELD vcpus ON TABLE vm_node_offer TYPE int; +DEFINE FIELD memory_mib ON TABLE vm_node_offer TYPE int; +DEFINE FIELD disk_mib ON TABLE vm_node_offer TYPE int; + +DEFINE TABLE new_vm_req TYPE RELATION FROM account TO vm_node SCHEMAFULL; +DEFINE FIELD hostname ON TABLE new_vm_req TYPE string; +DEFINE FIELD extra_ports ON TABLE new_vm_req TYPE array; +DEFINE FIELD public_ipv4 ON TABLE new_vm_req TYPE bool; +DEFINE FIELD public_ipv6 ON TABLE new_vm_req TYPE bool; +DEFINE FIELD disk_size_mib ON TABLE new_vm_req TYPE int; +DEFINE FIELD vcpus ON TABLE new_vm_req TYPE int; +DEFINE FIELD memory_mib ON TABLE new_vm_req TYPE int; +DEFINE FIELD dtrfs_sha ON TABLE new_vm_req TYPE string; +DEFINE FIELD dtrfs_url ON TABLE new_vm_req TYPE string; +DEFINE FIELD kernel_sha ON TABLE new_vm_req TYPE string; +DEFINE FIELD kernel_url ON TABLE new_vm_req TYPE string; +DEFINE FIELD created_at ON TABLE new_vm_req TYPE datetime; +DEFINE FIELD price_per_unit ON TABLE new_vm_req TYPE int; +DEFINE FIELD locked_nano ON TABLE new_vm_req TYPE int; +DEFINE FIELD error ON TABLE new_vm_req TYPE string; + +DEFINE TABLE active_vm TYPE RELATION FROM account TO vm_node SCHEMAFULL; +DEFINE FIELD hostname ON TABLE active_vm TYPE string; +DEFINE FIELD mapped_ports ON TABLE active_vm TYPE array<[int, int]>; +DEFINE FIELD public_ipv4 ON TABLE active_vm TYPE string; +DEFINE FIELD public_ipv6 ON TABLE active_vm TYPE string; +DEFINE FIELD disk_size_mib ON TABLE active_vm TYPE int; +DEFINE FIELD vcpus ON TABLE active_vm TYPE int; +DEFINE FIELD memory_mib ON TABLE active_vm TYPE int; +DEFINE FIELD dtrfs_sha ON TABLE active_vm TYPE string; +DEFINE FIELD kernel_sha ON TABLE active_vm TYPE string; +DEFINE FIELD created_at ON TABLE active_vm TYPE datetime; +DEFINE FIELD price_per_unit ON TABLE active_vm TYPE int; +DEFINE FIELD locked_nano ON TABLE active_vm TYPE int; +DEFINE FIELD collected_at ON TABLE active_vm TYPE datetime; + +DEFINE TABLE update_vm_req TYPE RELATION FROM account TO vm_node SCHEMAFULL; +DEFINE FIELD vcpus ON TABLE update_vm_req TYPE int; +DEFINE FIELD memory_mib ON TABLE update_vm_req TYPE int; +DEFINE FIELD disk_size_mib ON TABLE update_vm_req TYPE int; +DEFINE FIELD dtrfs_sha ON TABLE update_vm_req TYPE string; +DEFINE FIELD dtrfs_url ON TABLE update_vm_req TYPE string; +DEFINE FIELD kernel_sha ON TABLE update_vm_req TYPE string; +DEFINE FIELD kernel_url ON TABLE update_vm_req TYPE string; +DEFINE FIELD created_at ON TABLE update_vm_req TYPE datetime; +DEFINE FIELD error ON TABLE update_vm_req TYPE string; + +DEFINE TABLE deleted_vm TYPE RELATION FROM account TO vm_node SCHEMAFULL; +DEFINE FIELD hostname ON TABLE deleted_vm TYPE string; +DEFINE FIELD mapped_ports ON TABLE deleted_vm TYPE array<[int, int]>; +DEFINE FIELD public_ipv4 ON TABLE deleted_vm TYPE string; +DEFINE FIELD public_ipv6 ON TABLE deleted_vm TYPE string; +DEFINE FIELD disk_size_mib ON TABLE deleted_vm TYPE int; +DEFINE FIELD vcpus ON TABLE deleted_vm TYPE int; +DEFINE FIELD memory_mib ON TABLE deleted_vm TYPE int; +DEFINE FIELD dtrfs_sha ON TABLE deleted_vm TYPE string; +DEFINE FIELD kernel_sha ON TABLE deleted_vm TYPE string; +DEFINE FIELD created_at ON TABLE deleted_vm TYPE datetime; +DEFINE FIELD deleted_at ON TABLE deleted_vm TYPE datetime DEFAULT time::now(); +DEFINE FIELD price_per_unit ON TABLE deleted_vm TYPE int; + +DEFINE TABLE app_node SCHEMAFULL; +DEFINE FIELD operator ON TABLE app_node TYPE record; +DEFINE FIELD pub_sub_node ON TABLE app_node TYPE string default "127.0.0.1:31337"; +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_mib ON TABLE app_node TYPE int; +DEFINE FIELD avail_vcpus 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; +DEFINE FIELD connected_at ON TABLE app_node TYPE datetime; +DEFINE FIELD disconnected_at ON TABLE app_node TYPE datetime; + +DEFINE TABLE new_app_req Type RELATION FROM account to app_node SCHEMAFULL; +DEFINE FIELD app_name ON TABLE new_app_req TYPE string; +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; +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_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; +DEFINE FIELD created_at ON TABLE new_app_req TYPE datetime; + +DEFINE TABLE active_app TYPE RELATION FROM account TO app_node SCHEMAFULL; +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_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; +DEFINE FIELD collected_at ON TABLE active_app TYPE datetime; +DEFINE FIELD mr_enclave ON TABLE active_app TYPE string; +DEFINE FIELD package_url ON TABLE active_app TYPE string; +DEFINE FIELD hratls_pubkey ON TABLE active_app TYPE string; + +DEFINE TABLE deleted_app TYPE RELATION FROM account TO app_node SCHEMAFULL; +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_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; +DEFINE FIELD mr_enclave ON TABLE deleted_app TYPE string; +DEFINE FIELD package_url ON TABLE deleted_app TYPE string; +DEFINE FIELD hratls_pubkey ON TABLE deleted_app TYPE string; + +DEFINE TABLE ban TYPE RELATION FROM account TO account; +DEFINE FIELD created_at ON TABLE ban TYPE datetime DEFAULT time::now();; + +DEFINE TABLE kick TYPE RELATION FROM account TO account; +DEFINE FIELD created_at ON TABLE kick TYPE datetime; +DEFINE FIELD reason ON TABLE kick TYPE string; +DEFINE FIELD contract ON TABLE kick TYPE record; +DEFINE FIELD node ON TABLE kick TYPE record; + +DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node; +DEFINE FIELD created_at ON TABLE report TYPE datetime; +DEFINE FIELD reason ON TABLE report TYPE string; +DEFINE FIELD contract_id ON TABLE report TYPE string; diff --git a/surql/migration1/patch_tables.sql b/surql/migration1/patch_tables.sql new file mode 100644 index 0000000..18ed78a --- /dev/null +++ b/surql/migration1/patch_tables.sql @@ -0,0 +1,14 @@ +-- SPDX-License-Identifier: Apache-2.0 + +REMOVE FIELD price ON TABLE vm_node; +REMOVE FIELD avail_vcpus ON TABLE vm_node; +REMOVE FIELD avail_storage_mib ON TABLE vm_node; +REMOVE FIELD avail_mem_mib ON TABLE vm_node; +DEFINE FIELD offers ON TABLE vm_node TYPE array DEFAULT []; +DEFINE FIELD offers.* ON TABLE vm_node TYPE object; +DEFINE FIELD offers.*.price ON TABLE vm_node TYPE int; +DEFINE FIELD offers.*.vcpus ON TABLE vm_node TYPE int; +DEFINE FIELD offers.*.memory_mib ON TABLE vm_node TYPE int; +DEFINE FIELD offers.*.disk_mib ON TABLE vm_node TYPE int; +update vm_node SET offers=[]; +UPDATE vm_node; diff --git a/tests/common/prepare_test_env.rs b/tests/common/prepare_test_env.rs index af3a42c..651d96e 100644 --- a/tests/common/prepare_test_env.rs +++ b/tests/common/prepare_test_env.rs @@ -9,7 +9,6 @@ use detee_shared::vm_proto::brain_vm_daemon_server::BrainVmDaemonServer; use dotenv::dotenv; use hyper_util::rt::TokioIo; use std::sync::Arc; -use surreal_brain::constants::DB_SCHEMA_FILES; use surreal_brain::grpc::app::{AppCliServer, AppDaemonServer}; use surreal_brain::grpc::general::GeneralCliServer; use surreal_brain::grpc::vm::{VmCliServer, VmDaemonServer}; @@ -34,15 +33,11 @@ pub async fn prepare_test_db() -> Result> { let db = surreal_brain::db::db_connection(&db_url, &db_user, &db_pass, db_ns, db_name).await?; DB_STATE .get_or_init(|| async { - let raw_mock_data = std::fs::read_to_string("tests/mock_data.yaml")?; - let mock_data: surreal_brain::old_brain::BrainData = - serde_yaml::from_str(&raw_mock_data)?; - db.query(format!("REMOVE DATABASE {db_name}")).await?; - for schema in DB_SCHEMA_FILES.map(std::fs::read_to_string) { - db.query(schema?).await?; - } - surreal_brain::db::migration0(&db, &mock_data).await?; + // enable this for single isolated tests without mock data + // surreal_brain::db::migration0_tables(&db).await?; + surreal_brain::db::migration0_mock_data(&db).await?; + surreal_brain::db::migration1_patch(&db).await?; Ok::<(), anyhow::Error>(()) }) .await; diff --git a/tests/common/vm_daemon_utils.rs b/tests/common/vm_daemon_utils.rs index cc15d94..374e3c9 100644 --- a/tests/common/vm_daemon_utils.rs +++ b/tests/common/vm_daemon_utils.rs @@ -57,7 +57,6 @@ pub async fn register_vm_node( city: ip_info.city, country: ip_info.country, region: ip_info.region, - price: 1200, }; let mut grpc_stream = client.register_vm_node(key.sign_request(req)?).await?.into_inner(); diff --git a/tests/grpc_general_test.rs b/tests/grpc_general_test.rs index 3b1b4fa..1f183cc 100644 --- a/tests/grpc_general_test.rs +++ b/tests/grpc_general_test.rs @@ -12,7 +12,7 @@ use detee_shared::general_proto::brain_general_cli_client::BrainGeneralCliClient use detee_shared::general_proto::{AirdropReq, BanUserReq, SlashReq}; use detee_shared::vm_proto::brain_vm_daemon_client::BrainVmDaemonClient; use futures::StreamExt; -use surreal_brain::constants::{ACCOUNT, ACTIVE_APP, ACTIVE_VM, BAN, TOKEN_DECIMAL, VM_NODE}; +use surreal_brain::constants::{ACCOUNT, ACTIVE_APP, ACTIVE_VM, BAN, TOKEN_DECIMAL}; use surreal_brain::db::prelude as db; use surreal_brain::db::vm::VmNodeWithReports; @@ -145,18 +145,10 @@ async fn test_report_node() { .unwrap() .into_inner(); - let vm_nodes: Vec = db - .query(format!( - "SELECT *, <-report.* as reports FROM {VM_NODE} WHERE id = {VM_NODE}:{daemon_key};" - )) - .await - .unwrap() - .take(0) - .unwrap(); - - let vm_node_with_report = &vm_nodes[0]; - - assert!(vm_node_with_report.reports[0].reason == reason); + let vm_node = VmNodeWithReports::find_by_daemon_pubkey(&db, &daemon_key).await.unwrap(); + assert!(vm_node.is_some()); + let vm_node = vm_node.unwrap(); + assert!(vm_node.reports[0].reason == reason); } #[tokio::test] diff --git a/tests/grpc_vm_daemon_test.rs b/tests/grpc_vm_daemon_test.rs index 9b05fc3..ad13ced 100644 --- a/tests/grpc_vm_daemon_test.rs +++ b/tests/grpc_vm_daemon_test.rs @@ -8,6 +8,7 @@ use detee_shared::vm_proto::brain_vm_cli_client::BrainVmCliClient; use detee_shared::vm_proto::brain_vm_daemon_client::BrainVmDaemonClient; use surreal_brain::constants::VM_NODE; use surreal_brain::db::prelude as db; +use surreal_brain::db::vm::VmNodeWithReports; use tokio_stream::wrappers::ReceiverStream; mod common; @@ -90,10 +91,11 @@ async fn test_vm_daemon_resource_msg() { avail_ports: 5, avail_ipv4: 2, avail_ipv6: 88, - avail_vcpus: 4, - avail_memory_mib: 8192, - avail_storage_mib: 102400, max_ports_per_vm: 5, + offers: vec![ + vm_proto::VmNodeOffer { price: 1200, vcpus: 4, memory_mib: 8192, disk_mib: 102400 }, + vm_proto::VmNodeOffer { price: 750, vcpus: 1, memory_mib: 8192, disk_mib: 1002400 }, + ], }; let req_data_copy = req_data.clone(); @@ -109,26 +111,26 @@ async fn test_vm_daemon_resource_msg() { tokio::time::sleep(tokio::time::Duration::from_millis(300)).await; - let vm_node_opt: Option = db.select((VM_NODE, daemon_key.pubkey)).await.unwrap(); + let vm_node_opt: Option = + db.select((VM_NODE, daemon_key.pubkey.clone())).await.unwrap(); assert!(vm_node_opt.is_some()); - let db::VmNode { - avail_mem_mib, - avail_vcpus, - avail_storage_mib, - avail_ports, - avail_ipv4, - avail_ipv6, - max_ports_per_vm, - .. - } = vm_node_opt.unwrap(); + let db::VmNode { avail_ports, avail_ipv4, avail_ipv6, max_ports_per_vm, .. } = + vm_node_opt.unwrap(); - assert_eq!(avail_mem_mib, req_data.avail_memory_mib); - assert_eq!(avail_vcpus, req_data.avail_vcpus); - assert_eq!(avail_storage_mib, req_data.avail_storage_mib); assert_eq!(avail_ports, req_data.avail_ports); assert_eq!(avail_ipv4, req_data.avail_ipv4); assert_eq!(avail_ipv6, req_data.avail_ipv6); assert_eq!(max_ports_per_vm, req_data.max_ports_per_vm); + + let vm_node_with_offers = + VmNodeWithReports::find_by_daemon_pubkey(&db, &daemon_key.pubkey).await.unwrap().unwrap(); + + assert_eq!(avail_ports, vm_node_with_offers.avail_ports); + assert_eq!(avail_ipv4, vm_node_with_offers.avail_ipv4); + assert_eq!(avail_ipv6, vm_node_with_offers.avail_ipv6); + assert_eq!(max_ports_per_vm, vm_node_with_offers.max_ports_per_vm); + assert_eq!(1200, vm_node_with_offers.offers[0].price); + assert_eq!(4, vm_node_with_offers.offers[0].vcpus); }