added code to create new VM
compiles but not tested yet
This commit is contained in:
parent
363724e5d7
commit
6f9cb36bea
3
Cargo.lock
generated
3
Cargo.lock
generated
@ -1000,7 +1000,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "detee-shared"
|
name = "detee-shared"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=surreal_brain#fb38352e1b47837b14f32d8df5ae7f6b17202aae"
|
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=surreal_brain#d0d4622c52efdf74ed6582fbac23a6159986ade3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode 2.0.1",
|
"bincode 2.0.1",
|
||||||
"prost",
|
"prost",
|
||||||
@ -3779,6 +3779,7 @@ dependencies = [
|
|||||||
"env_logger",
|
"env_logger",
|
||||||
"futures",
|
"futures",
|
||||||
"log",
|
"log",
|
||||||
|
"nanoid",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
|
@ -20,6 +20,7 @@ tokio-stream = "0.1.17"
|
|||||||
log = "0.4.27"
|
log = "0.4.27"
|
||||||
env_logger = "0.11.8"
|
env_logger = "0.11.8"
|
||||||
thiserror = "2.0.12"
|
thiserror = "2.0.12"
|
||||||
|
nanoid = "0.4.0"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = true
|
lto = true
|
||||||
|
@ -36,6 +36,7 @@ DEFINE FIELD created_at ON TABLE new_vm_req TYPE datetime;
|
|||||||
DEFINE FIELD updated_at ON TABLE new_vm_req TYPE datetime;
|
DEFINE FIELD updated_at ON TABLE new_vm_req TYPE datetime;
|
||||||
DEFINE FIELD price_per_unit ON TABLE new_vm_req TYPE int;
|
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 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 TABLE active_vm TYPE RELATION FROM account TO vm_node SCHEMAFULL;
|
||||||
DEFINE FIELD hostname ON TABLE active_vm TYPE string;
|
DEFINE FIELD hostname ON TABLE active_vm TYPE string;
|
||||||
|
134
src/db.rs
134
src/db.rs
@ -18,6 +18,13 @@ pub const NEW_VM_REQ: &str = "new_vm_req";
|
|||||||
pub const UPDATE_VM_REQ: &str = "update_vm_req";
|
pub const UPDATE_VM_REQ: &str = "update_vm_req";
|
||||||
pub const DELETED_VM: &str = "deleted_vm";
|
pub const DELETED_VM: &str = "deleted_vm";
|
||||||
|
|
||||||
|
pub const ID_ALPHABET: [char; 62] = [
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
|
||||||
|
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B',
|
||||||
|
'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
|
||||||
|
'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
];
|
||||||
|
|
||||||
#[derive(thiserror::Error, Debug)]
|
#[derive(thiserror::Error, Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[error("Internal DB error: {0}")]
|
#[error("Internal DB error: {0}")]
|
||||||
@ -34,6 +41,17 @@ pub async fn init() -> surrealdb::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn upsert_record<SomeRecord: Serialize + 'static>(
|
||||||
|
table: &str,
|
||||||
|
id: &str,
|
||||||
|
my_record: SomeRecord,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Wrapper {}
|
||||||
|
let _: Option<Wrapper> = DB.create((table, id)).content(my_record).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn migration0(old_data: &old_brain::BrainData) -> surrealdb::Result<()> {
|
pub async fn migration0(old_data: &old_brain::BrainData) -> surrealdb::Result<()> {
|
||||||
let accounts: Vec<Account> = old_data.into();
|
let accounts: Vec<Account> = old_data.into();
|
||||||
let vm_nodes: Vec<VmNode> = old_data.into();
|
let vm_nodes: Vec<VmNode> = old_data.into();
|
||||||
@ -85,6 +103,21 @@ impl Account {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Account {
|
||||||
|
pub async fn is_banned_by_node(user: &str, node: &str) -> Result<bool, Error> {
|
||||||
|
let ban: Option<Self> = DB
|
||||||
|
.query(format!(
|
||||||
|
"(select operator->ban[0] as ban
|
||||||
|
from vm_node:{node}
|
||||||
|
where operator->ban->account contains account:{user}
|
||||||
|
).ban;"
|
||||||
|
))
|
||||||
|
.await?
|
||||||
|
.take(0)?;
|
||||||
|
Ok(ban.is_some())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct VmNode {
|
pub struct VmNode {
|
||||||
pub id: RecordId,
|
pub id: RecordId,
|
||||||
@ -104,6 +137,24 @@ pub struct VmNode {
|
|||||||
pub offline_minutes: u64,
|
pub offline_minutes: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct VmNodeResources {
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VmNodeResources {
|
||||||
|
pub async fn merge(self, node_id: &str) -> Result<(), Error> {
|
||||||
|
let _: Option<VmNode> = DB.update((VM_NODE, node_id)).merge(self).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl VmNode {
|
impl VmNode {
|
||||||
pub async fn register(self) -> Result<(), Error> {
|
pub async fn register(self) -> Result<(), Error> {
|
||||||
let _: Option<VmNode> = DB.upsert(self.id.clone()).content(self).await?;
|
let _: Option<VmNode> = DB.upsert(self.id.clone()).content(self).await?;
|
||||||
@ -176,6 +227,82 @@ pub struct NewVmReq {
|
|||||||
pub created_at: Datetime,
|
pub created_at: Datetime,
|
||||||
pub price_per_unit: u64,
|
pub price_per_unit: u64,
|
||||||
pub locked_nano: u64,
|
pub locked_nano: u64,
|
||||||
|
pub error: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NewVmReq {
|
||||||
|
pub async fn submit_error(id: &str, error: String) -> Result<(), Error> {
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct NewVmError {
|
||||||
|
error: String,
|
||||||
|
}
|
||||||
|
let _: Option<VmNode> = DB.update((NEW_VM_REQ, id)).merge(NewVmError { error }).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn submit(self) -> Result<(), Error> {
|
||||||
|
let _: Option<Self> = DB.create(self.id.clone()).content(self).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// first string is the vm_id
|
||||||
|
pub enum NewVmResp {
|
||||||
|
// TODO: find a more elegant way to do this than importing gRPC in the DB module
|
||||||
|
// https://en.wikipedia.org/wiki/Dependency_inversion_principle
|
||||||
|
Args(String, detee_shared::snp::pb::vm_proto::MeasurementArgs),
|
||||||
|
Error(String, String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NewVmResp {
|
||||||
|
pub async fn listen(vm_id: &str) -> Result<NewVmResp, Error> {
|
||||||
|
let mut resp = DB
|
||||||
|
.query(format!("live select * from {NEW_VM_REQ} where id = {NEW_VM_REQ}:{vm_id};"))
|
||||||
|
.query(format!(
|
||||||
|
"live select * from measurement_args where id = measurement_args:{vm_id};"
|
||||||
|
))
|
||||||
|
.await?;
|
||||||
|
let mut live_stream1 = resp.stream::<Notification<NewVmReq>>(0)?;
|
||||||
|
let mut live_stream2 =
|
||||||
|
resp.stream::<Notification<detee_shared::snp::pb::vm_proto::MeasurementArgs>>(1)?;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
tokio::select! {
|
||||||
|
new_vm_req_notif = live_stream1.next() => {
|
||||||
|
if let Some(new_vm_req_notif) = new_vm_req_notif {
|
||||||
|
match new_vm_req_notif {
|
||||||
|
Ok(new_vm_req_notif) => {
|
||||||
|
match new_vm_req_notif.action {
|
||||||
|
surrealdb::Action::Update => {
|
||||||
|
if !new_vm_req_notif.data.error.is_empty() {
|
||||||
|
return Ok(Self::Error(vm_id.to_string(), new_vm_req_notif.data.error));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
Err(e) => return Err(e.into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args_notif = live_stream2.next() => {
|
||||||
|
if let Some(args_notif) = args_notif {
|
||||||
|
match args_notif {
|
||||||
|
Ok(args_notif) => {
|
||||||
|
match args_notif.action {
|
||||||
|
surrealdb::Action::Create => {
|
||||||
|
return Ok(Self::Args(vm_id.to_string(), args_notif.data));
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
Err(e) => return Err(e.into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
@ -219,7 +346,9 @@ pub struct UpdateVmReq {
|
|||||||
pub locked_nano: u64,
|
pub locked_nano: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn listen_for_node<T: Into<DaemonNotification> + std::marker::Unpin + for<'de> Deserialize<'de>>(
|
pub async fn listen_for_node<
|
||||||
|
T: Into<DaemonNotification> + std::marker::Unpin + for<'de> Deserialize<'de>,
|
||||||
|
>(
|
||||||
node: &str,
|
node: &str,
|
||||||
tx: Sender<DaemonNotification>,
|
tx: Sender<DaemonNotification>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
@ -230,7 +359,7 @@ pub async fn listen_for_node<T: Into<DaemonNotification> + std::marker::Unpin +
|
|||||||
wat => {
|
wat => {
|
||||||
log::error!("listen_for_node: T has type {wat}");
|
log::error!("listen_for_node: T has type {wat}");
|
||||||
String::from("wat")
|
String::from("wat")
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
let mut resp =
|
let mut resp =
|
||||||
DB.query(format!("live select * from {table_name} where out = vm_node:{node};")).await?;
|
DB.query(format!("live select * from {table_name} where out = vm_node:{node};")).await?;
|
||||||
@ -346,7 +475,6 @@ impl ActiveVm {
|
|||||||
pub fn price_per_minute(&self) -> u64 {
|
pub fn price_per_minute(&self) -> u64 {
|
||||||
self.total_units() * self.price_per_unit
|
self.total_units() * self.price_per_unit
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
189
src/grpc.rs
189
src/grpc.rs
@ -13,9 +13,11 @@ use detee_shared::{
|
|||||||
*,
|
*,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
use nanoid::nanoid;
|
||||||
|
|
||||||
use log::info;
|
use log::info;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
use surrealdb::RecordId;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio_stream::wrappers::ReceiverStream;
|
use tokio_stream::wrappers::ReceiverStream;
|
||||||
use tokio_stream::{Stream, StreamExt};
|
use tokio_stream::{Stream, StreamExt};
|
||||||
@ -29,6 +31,31 @@ impl From<db::Account> for AccountBalance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<NewVmReq> for db::NewVmReq {
|
||||||
|
fn from(new_vm_req: NewVmReq) -> Self {
|
||||||
|
Self {
|
||||||
|
id: RecordId::from((db::NEW_VM_REQ, nanoid!(40, &db::ID_ALPHABET))),
|
||||||
|
hostname: new_vm_req.hostname,
|
||||||
|
admin: RecordId::from((db::ACCOUNT, new_vm_req.admin_pubkey)),
|
||||||
|
vm_node: RecordId::from((db::VM_NODE, new_vm_req.node_pubkey)),
|
||||||
|
extra_ports: new_vm_req.extra_ports,
|
||||||
|
public_ipv4: new_vm_req.public_ipv4,
|
||||||
|
public_ipv6: new_vm_req.public_ipv6,
|
||||||
|
disk_size_gb: new_vm_req.disk_size_gb,
|
||||||
|
vcpus: new_vm_req.vcpus,
|
||||||
|
memory_mb: new_vm_req.memory_mb,
|
||||||
|
kernel_url: new_vm_req.kernel_url,
|
||||||
|
kernel_sha: new_vm_req.kernel_sha,
|
||||||
|
dtrfs_url: new_vm_req.dtrfs_url,
|
||||||
|
dtrfs_sha: new_vm_req.dtrfs_sha,
|
||||||
|
price_per_unit: new_vm_req.price_per_unit,
|
||||||
|
locked_nano: new_vm_req.locked_nano,
|
||||||
|
created_at: surrealdb::sql::Datetime::default(),
|
||||||
|
error: String::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<db::NewVmReq> for NewVmReq {
|
impl From<db::NewVmReq> for NewVmReq {
|
||||||
fn from(new_vm_req: db::NewVmReq) -> Self {
|
fn from(new_vm_req: db::NewVmReq) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -52,6 +79,19 @@ impl From<db::NewVmReq> for NewVmReq {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<db::NewVmResp> for NewVmResp {
|
||||||
|
fn from(resp: db::NewVmResp) -> Self {
|
||||||
|
match resp {
|
||||||
|
// TODO: This will require a small architecture change to pass MeasurementArgs from
|
||||||
|
// Daemon to CLI
|
||||||
|
db::NewVmResp::Args(uuid, args) => {
|
||||||
|
NewVmResp { uuid, error: String::new(), args: Some(args) }
|
||||||
|
}
|
||||||
|
db::NewVmResp::Error(uuid, error) => NewVmResp { uuid, error, args: None },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<db::UpdateVmReq> for UpdateVmReq {
|
impl From<db::UpdateVmReq> for UpdateVmReq {
|
||||||
fn from(update_vm_req: db::UpdateVmReq) -> Self {
|
fn from(update_vm_req: db::UpdateVmReq) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -181,6 +221,20 @@ impl From<db::AppNodeWithReports> for AppNodeListResp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<VmNodeResources> for db::VmNodeResources {
|
||||||
|
fn from(res: VmNodeResources) -> Self {
|
||||||
|
Self {
|
||||||
|
avail_mem_mb: res.avail_memory_mb,
|
||||||
|
avail_vcpus: res.avail_vcpus,
|
||||||
|
avail_storage_gbs: res.avail_storage_gb,
|
||||||
|
avail_ipv4: res.avail_ipv4,
|
||||||
|
avail_ipv6: res.avail_ipv6,
|
||||||
|
avail_ports: res.avail_ports,
|
||||||
|
max_ports_per_vm: res.max_ports_per_vm,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct BrainVmDaemonForReal {}
|
struct BrainVmDaemonForReal {}
|
||||||
|
|
||||||
#[tonic::async_trait]
|
#[tonic::async_trait]
|
||||||
@ -273,52 +327,54 @@ impl BrainVmDaemon for BrainVmDaemonForReal {
|
|||||||
|
|
||||||
async fn daemon_messages(
|
async fn daemon_messages(
|
||||||
&self,
|
&self,
|
||||||
_req: Request<Streaming<VmDaemonMessage>>,
|
req: Request<Streaming<VmDaemonMessage>>,
|
||||||
) -> Result<Response<Empty>, Status> {
|
) -> Result<Response<Empty>, Status> {
|
||||||
todo!();
|
let mut req_stream = req.into_inner();
|
||||||
// let mut req_stream = req.into_inner();
|
let pubkey: String;
|
||||||
// let pubkey: String;
|
if let Some(Ok(msg)) = req_stream.next().await {
|
||||||
// if let Some(Ok(msg)) = req_stream.next().await {
|
log::debug!("demon_messages received the following auth message: {:?}", msg.msg);
|
||||||
// log::debug!("demon_messages received the following auth message: {:?}", msg.msg);
|
if let Some(vm_daemon_message::Msg::Auth(auth)) = msg.msg {
|
||||||
// if let Some(vm_daemon_message::Msg::Auth(auth)) = msg.msg {
|
pubkey = auth.pubkey.clone();
|
||||||
// pubkey = auth.pubkey.clone();
|
check_sig_from_parts(
|
||||||
// check_sig_from_parts(
|
&pubkey,
|
||||||
// &pubkey,
|
&auth.timestamp,
|
||||||
// &auth.timestamp,
|
&format!("{:?}", auth.contracts),
|
||||||
// &format!("{:?}", auth.contracts),
|
&auth.signature,
|
||||||
// &auth.signature,
|
)?;
|
||||||
// )?;
|
} else {
|
||||||
// } else {
|
return Err(Status::unauthenticated(
|
||||||
// return Err(Status::unauthenticated(
|
"Could not authenticate the daemon: could not extract auth signature",
|
||||||
// "Could not authenticate the daemon: could not extract auth signature",
|
));
|
||||||
// ));
|
}
|
||||||
// }
|
} else {
|
||||||
// } else {
|
return Err(Status::unauthenticated("Could not authenticate the daemon"));
|
||||||
// return Err(Status::unauthenticated("Could not authenticate the daemon"));
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
// // info!("Received a message from daemon {pubkey}: {daemon_message:?}");
|
while let Some(daemon_message) = req_stream.next().await {
|
||||||
// while let Some(daemon_message) = req_stream.next().await {
|
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)) => {
|
if !new_vm_resp.error.is_empty() {
|
||||||
// self.data.submit_newvm_resp(new_vm_resp).await;
|
} else {
|
||||||
// }
|
db::upsert_record("measurement_args", &new_vm_resp.uuid, new_vm_resp.args).await?;
|
||||||
// Some(vm_daemon_message::Msg::UpdateVmResp(update_vm_resp)) => {
|
}
|
||||||
// self.data.submit_updatevm_resp(update_vm_resp).await;
|
}
|
||||||
// }
|
Some(vm_daemon_message::Msg::UpdateVmResp(update_vm_resp)) => {
|
||||||
// Some(vm_daemon_message::Msg::VmNodeResources(node_resources)) => {
|
todo!();
|
||||||
// self.data.submit_node_resources(node_resources);
|
// self.data.submit_updatevm_resp(update_vm_resp).await;
|
||||||
// }
|
}
|
||||||
// _ => {}
|
Some(vm_daemon_message::Msg::VmNodeResources(node_resources)) => {
|
||||||
// },
|
let node_resources: db::VmNodeResources = node_resources.into();
|
||||||
// Err(e) => {
|
node_resources.merge(&pubkey).await?;
|
||||||
// log::warn!("Daemon disconnected: {e:?}");
|
}
|
||||||
// self.data.del_daemon_tx(&pubkey);
|
_ => {}
|
||||||
// }
|
},
|
||||||
// }
|
Err(e) => {
|
||||||
// }
|
log::warn!("Daemon disconnected: {e:?}");
|
||||||
// Ok(Response::new(Empty {}))
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(Response::new(Empty {}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -495,30 +551,27 @@ impl BrainVmCli for BrainVmCliForReal {
|
|||||||
async fn new_vm(&self, req: Request<NewVmReq>) -> Result<Response<NewVmResp>, Status> {
|
async fn new_vm(&self, req: Request<NewVmReq>) -> Result<Response<NewVmResp>, Status> {
|
||||||
let req = check_sig_from_req(req)?;
|
let req = check_sig_from_req(req)?;
|
||||||
info!("New VM requested via CLI: {req:?}");
|
info!("New VM requested via CLI: {req:?}");
|
||||||
todo!();
|
if db::Account::is_banned_by_node(&req.admin_pubkey, &req.node_pubkey).await? {
|
||||||
// if self
|
return Err(Status::permission_denied("This operator banned you. What did you do?"));
|
||||||
// .data
|
}
|
||||||
// .is_user_banned_by_node(&req.admin_pubkey, &req.node_pubkey)
|
|
||||||
// {
|
let new_vm_req: db::NewVmReq = req.into();
|
||||||
// return Err(Status::permission_denied(
|
let id = new_vm_req.id.key().to_string();
|
||||||
// "This operator banned you. What did you do?",
|
let (oneshot_tx, oneshot_rx) = tokio::sync::oneshot::channel();
|
||||||
// ));
|
tokio::spawn(async move {
|
||||||
// }
|
let _ = oneshot_tx.send(db::NewVmResp::listen(&id).await);
|
||||||
// let admin_pubkey = req.admin_pubkey.clone();
|
});
|
||||||
// let (oneshot_tx, oneshot_rx) = tokio::sync::oneshot::channel();
|
new_vm_req.submit().await?;
|
||||||
// self.data.submit_newvm_req(req, oneshot_tx).await;
|
|
||||||
// match oneshot_rx.await {
|
match oneshot_rx.await {
|
||||||
// Ok(response) => {
|
Ok(new_vm_resp) => Ok(Response::new(new_vm_resp?.into())),
|
||||||
// info!("Sending VM confirmation to {admin_pubkey}: {response:?}");
|
Err(e) => {
|
||||||
// Ok(Response::new(response))
|
log::error!("Something weird happened. Reached error {e:?}");
|
||||||
// }
|
Err(Status::unknown(
|
||||||
// Err(e) => {
|
"Request failed due to unknown error. Please try again or contact the DeTEE devs team.",
|
||||||
// log::error!("Something weird happened. Reached error {e:?}");
|
))
|
||||||
// Err(Status::unknown(
|
}
|
||||||
// "Request failed due to unknown error. Please try again or contact the DeTEE devs team.",
|
}
|
||||||
// ))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_vm(&self, req: Request<UpdateVmReq>) -> Result<Response<UpdateVmResp>, Status> {
|
async fn update_vm(&self, req: Request<UpdateVmReq>) -> Result<Response<UpdateVmResp>, Status> {
|
||||||
|
Loading…
Reference in New Issue
Block a user