after creating a VM, save it to active_vm
This commit is contained in:
parent
b5332316c2
commit
784414815e
81
src/db.rs
81
src/db.rs
@ -1,6 +1,6 @@
|
|||||||
use crate::old_brain;
|
use crate::old_brain;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::sync::LazyLock;
|
use std::{str::FromStr, sync::LazyLock};
|
||||||
use surrealdb::{
|
use surrealdb::{
|
||||||
engine::remote::ws::{Client, Ws},
|
engine::remote::ws::{Client, Ws},
|
||||||
opt::auth::Root,
|
opt::auth::Root,
|
||||||
@ -218,8 +218,7 @@ impl VmNodeWithReports {
|
|||||||
query += &format!("&& ip = '{}' ", filters.ip);
|
query += &format!("&& ip = '{}' ", filters.ip);
|
||||||
}
|
}
|
||||||
query += ";";
|
query += ";";
|
||||||
let mut result =
|
let mut result = DB.query(query).await?;
|
||||||
DB.query(query).await?;
|
|
||||||
let vm_nodes: Vec<Self> = result.take(0)?;
|
let vm_nodes: Vec<Self> = result.take(0)?;
|
||||||
Ok(vm_nodes)
|
Ok(vm_nodes)
|
||||||
}
|
}
|
||||||
@ -274,12 +273,22 @@ pub struct NewVmReq {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl NewVmReq {
|
impl NewVmReq {
|
||||||
|
pub async fn get(id: &str) -> Result<Option<Self>, Error> {
|
||||||
|
let new_vm_req: Option<Self> = DB.select((NEW_VM_REQ, id)).await?;
|
||||||
|
Ok(new_vm_req)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn delete(id: &str) -> Result<(), Error> {
|
||||||
|
let _: Option<Self> = DB.delete((NEW_VM_REQ, id)).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn submit_error(id: &str, error: String) -> Result<(), Error> {
|
pub async fn submit_error(id: &str, error: String) -> Result<(), Error> {
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct NewVmError {
|
struct NewVmError {
|
||||||
error: String,
|
error: String,
|
||||||
}
|
}
|
||||||
let _: Option<VmNode> = DB.update((NEW_VM_REQ, id)).merge(NewVmError { error }).await?;
|
let _: Option<Self> = DB.update((NEW_VM_REQ, id)).merge(NewVmError { error }).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,6 +380,66 @@ pub struct ActiveVm {
|
|||||||
pub collected_at: Datetime,
|
pub collected_at: Datetime,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ActiveVm {
|
||||||
|
pub async fn activate(
|
||||||
|
id: &str,
|
||||||
|
args: detee_shared::vm_proto::MeasurementArgs,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let new_vm_req = match NewVmReq::get(id).await? {
|
||||||
|
Some(r) => r,
|
||||||
|
None => return Ok(()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut public_ipv4 = String::new();
|
||||||
|
let mut public_ipv6 = String::new();
|
||||||
|
|
||||||
|
for ip in args.ips.iter() {
|
||||||
|
if let Ok(ipv4_addr) = std::net::Ipv4Addr::from_str(&ip.address) {
|
||||||
|
if !ipv4_addr.is_private() && !ipv4_addr.is_link_local() {
|
||||||
|
public_ipv4 = ipv4_addr.to_string();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if let Ok(ipv6_addr) = std::net::Ipv6Addr::from_str(&ip.address) {
|
||||||
|
public_ipv6 = ipv6_addr.to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut mapped_ports = Vec::new();
|
||||||
|
let mut guest_ports= vec![ 22 ];
|
||||||
|
guest_ports.append(&mut args.exposed_ports.clone());
|
||||||
|
let mut i = 0;
|
||||||
|
while i < new_vm_req.extra_ports.len() && i < guest_ports.len() {
|
||||||
|
mapped_ports.push((args.exposed_ports[i], guest_ports[i]));
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let active_vm = ActiveVm {
|
||||||
|
id: RecordId::from((ACTIVE_VM, id)),
|
||||||
|
admin: new_vm_req.admin,
|
||||||
|
vm_node: new_vm_req.vm_node,
|
||||||
|
hostname: new_vm_req.hostname,
|
||||||
|
mapped_ports,
|
||||||
|
public_ipv4,
|
||||||
|
public_ipv6,
|
||||||
|
disk_size_gb: new_vm_req.disk_size_gb,
|
||||||
|
vcpus: new_vm_req.vcpus,
|
||||||
|
memory_mb: new_vm_req.memory_mb,
|
||||||
|
dtrfs_sha: new_vm_req.dtrfs_sha,
|
||||||
|
kernel_sha: new_vm_req.kernel_sha,
|
||||||
|
created_at: new_vm_req.created_at.clone(),
|
||||||
|
price_per_unit: new_vm_req.price_per_unit,
|
||||||
|
locked_nano: new_vm_req.locked_nano,
|
||||||
|
collected_at: new_vm_req.created_at,
|
||||||
|
};
|
||||||
|
|
||||||
|
let _: Vec<ActiveVm> = DB.insert(()).relation(active_vm).await?;
|
||||||
|
|
||||||
|
NewVmReq::delete(id).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct UpdateVmReq {
|
pub struct UpdateVmReq {
|
||||||
pub id: RecordId,
|
pub id: RecordId,
|
||||||
@ -528,7 +597,6 @@ pub struct ActiveVmWithNode {
|
|||||||
pub admin: RecordId,
|
pub admin: RecordId,
|
||||||
#[serde(rename = "out")]
|
#[serde(rename = "out")]
|
||||||
pub vm_node: VmNode,
|
pub vm_node: VmNode,
|
||||||
pub state: String,
|
|
||||||
pub hostname: String,
|
pub hostname: String,
|
||||||
pub mapped_ports: Vec<(u32, u32)>,
|
pub mapped_ports: Vec<(u32, u32)>,
|
||||||
pub public_ipv4: String,
|
pub public_ipv4: String,
|
||||||
@ -539,7 +607,6 @@ pub struct ActiveVmWithNode {
|
|||||||
pub dtrfs_sha: String,
|
pub dtrfs_sha: String,
|
||||||
pub kernel_sha: String,
|
pub kernel_sha: String,
|
||||||
pub created_at: Datetime,
|
pub created_at: Datetime,
|
||||||
pub updated_at: Datetime,
|
|
||||||
pub price_per_unit: u64,
|
pub price_per_unit: u64,
|
||||||
pub locked_nano: u64,
|
pub locked_nano: u64,
|
||||||
pub collected_at: Datetime,
|
pub collected_at: Datetime,
|
||||||
@ -648,7 +715,6 @@ pub struct AppContract {
|
|||||||
admin: RecordId,
|
admin: RecordId,
|
||||||
#[serde(rename = "out")]
|
#[serde(rename = "out")]
|
||||||
app_node: RecordId,
|
app_node: RecordId,
|
||||||
state: String,
|
|
||||||
app_name: String,
|
app_name: String,
|
||||||
mapped_ports: Vec<(u64, u64)>,
|
mapped_ports: Vec<(u64, u64)>,
|
||||||
host_ipv4: String,
|
host_ipv4: String,
|
||||||
@ -656,7 +722,6 @@ pub struct AppContract {
|
|||||||
memory_mb: u64,
|
memory_mb: u64,
|
||||||
disk_size_gb: u64,
|
disk_size_gb: u64,
|
||||||
created_at: Datetime,
|
created_at: Datetime,
|
||||||
updated_at: Datetime,
|
|
||||||
price_per_unit: u64,
|
price_per_unit: u64,
|
||||||
locked_nano: u64,
|
locked_nano: u64,
|
||||||
collected_at: Datetime,
|
collected_at: Datetime,
|
||||||
|
14
src/grpc.rs
14
src/grpc.rs
@ -166,7 +166,10 @@ impl From<db::ActiveVmWithNode> for VmContract {
|
|||||||
kernel_sha: db_c.kernel_sha.clone(),
|
kernel_sha: db_c.kernel_sha.clone(),
|
||||||
nano_per_minute: db_c.price_per_minute(),
|
nano_per_minute: db_c.price_per_minute(),
|
||||||
created_at: db_c.created_at.to_rfc3339(),
|
created_at: db_c.created_at.to_rfc3339(),
|
||||||
updated_at: db_c.updated_at.to_rfc3339(),
|
// TODO: remove updated_at from the proto
|
||||||
|
// This will get moved to VM history (users will be able to
|
||||||
|
// query old contracts, which also shows updates of existing contracts).
|
||||||
|
updated_at: db_c.created_at.to_rfc3339(),
|
||||||
collected_at: db_c.collected_at.to_rfc3339(),
|
collected_at: db_c.collected_at.to_rfc3339(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -354,14 +357,21 @@ impl BrainVmDaemon for BrainVmDaemonForReal {
|
|||||||
match daemon_message {
|
match daemon_message {
|
||||||
Ok(msg) => match msg.msg {
|
Ok(msg) => match msg.msg {
|
||||||
Some(vm_daemon_message::Msg::NewVmResp(new_vm_resp)) => {
|
Some(vm_daemon_message::Msg::NewVmResp(new_vm_resp)) => {
|
||||||
|
// TODO: move new_vm_req to active_vm
|
||||||
|
// also handle failure properly
|
||||||
if !new_vm_resp.error.is_empty() {
|
if !new_vm_resp.error.is_empty() {
|
||||||
|
db::NewVmReq::submit_error(&new_vm_resp.uuid, new_vm_resp.error)
|
||||||
|
.await?;
|
||||||
} else {
|
} else {
|
||||||
db::upsert_record(
|
db::upsert_record(
|
||||||
"measurement_args",
|
"measurement_args",
|
||||||
&new_vm_resp.uuid,
|
&new_vm_resp.uuid,
|
||||||
new_vm_resp.args,
|
new_vm_resp.args.clone(),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
if let Some(args) = new_vm_resp.args {
|
||||||
|
db::ActiveVm::activate(&new_vm_resp.uuid, args).await?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(vm_daemon_message::Msg::UpdateVmResp(update_vm_resp)) => {
|
Some(vm_daemon_message::Msg::UpdateVmResp(update_vm_resp)) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user