Compare commits
1 Commits
815701184f
...
186146a597
Author | SHA1 | Date | |
---|---|---|---|
186146a597 |
46
src/db/vm.rs
46
src/db/vm.rs
@ -189,7 +189,46 @@ impl NewVmReq {
|
||||
}
|
||||
|
||||
pub async fn submit(self, db: &Surreal<Client>) -> Result<(), Error> {
|
||||
let _: Vec<Self> = db.insert(NEW_VM_REQ).relation(self).await?;
|
||||
let locked_nano = self.locked_nano;
|
||||
let account = self.admin.key().to_string();
|
||||
let vm_id = self.id.key().to_string();
|
||||
let vm_node = self.vm_node.key().to_string();
|
||||
// TODO: check for possible injection and maybe use .bind()
|
||||
let query = format!(
|
||||
"
|
||||
BEGIN TRANSACTION;
|
||||
UPDATE account:{account} SET balance -= {locked_nano};
|
||||
IF account:{account}.balance < 0 {{
|
||||
THROW 'Insufficient funds.'
|
||||
}};
|
||||
UPDATE account:{account} SET tmp_locked += {locked_nano};
|
||||
RELATE
|
||||
account:{account}
|
||||
->new_vm_req:{vm_id}
|
||||
->vm_node:{vm_node}
|
||||
CONTENT {{
|
||||
created_at: time::now(), hostname: '{}', vcpus: {}, memory_mb: {}, disk_size_gb: {},
|
||||
extra_ports: {}, public_ipv4: {:?}, public_ipv6: {:?},
|
||||
dtrfs_url: '{}', dtrfs_sha: '{}', kernel_url: '{}', kernel_sha: '{}',
|
||||
price_per_unit: {}, locked_nano: {locked_nano}, error: ''
|
||||
}};
|
||||
COMMIT TRANSACTION;
|
||||
",
|
||||
self.hostname,
|
||||
self.vcpus,
|
||||
self.memory_mb,
|
||||
self.disk_size_gb,
|
||||
format!("{:?}", self.extra_ports,),
|
||||
self.public_ipv4,
|
||||
self.public_ipv6,
|
||||
self.dtrfs_url,
|
||||
self.dtrfs_sha,
|
||||
self.kernel_url,
|
||||
self.kernel_sha,
|
||||
self.price_per_unit
|
||||
);
|
||||
//let _: Vec<Self> = db.insert(NEW_VM_REQ).relation(self).await?;
|
||||
db.query(query).await?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@ -367,9 +406,12 @@ impl ActiveVm {
|
||||
collected_at: new_vm_req.created_at,
|
||||
};
|
||||
|
||||
let admin_account = active_vm.admin.key().to_string();
|
||||
let locked_nano = active_vm.locked_nano;
|
||||
let _: Vec<ActiveVm> = db.insert(()).relation(active_vm).await?;
|
||||
|
||||
NewVmReq::delete(db, id).await?;
|
||||
db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};"))
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user