inspect operator
This commit is contained in:
parent
a8cf515061
commit
ee75412bb0
@ -75,7 +75,7 @@ DEFINE FIELD reason ON TABLE kick TYPE string;
|
||||
DEFINE FIELD contract ON TABLE kick TYPE record<vm_contract|app_contract>;
|
||||
|
||||
DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node;
|
||||
DEFINE FIELD created_at ON TABLE ban TYPE datetime;
|
||||
DEFINE FIELD reason ON TABLE ban TYPE string;
|
||||
DEFINE FIELD created_at ON TABLE report TYPE datetime;
|
||||
DEFINE FIELD reason ON TABLE report TYPE string;
|
||||
|
||||
DEFINE TABLE operator TYPE RELATION FROM account TO vm_node|app_node;
|
||||
|
109
src/db.rs
109
src/db.rs
@ -100,6 +100,26 @@ pub struct VmNode {
|
||||
pub offline_minutes: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct VmNodeExtended {
|
||||
pub id: RecordId,
|
||||
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,
|
||||
pub price: u64,
|
||||
pub offline_minutes: u64,
|
||||
pub reports: Vec<Report>,
|
||||
pub operator: RecordId,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct VmContract {
|
||||
pub id: RecordId,
|
||||
@ -221,18 +241,36 @@ impl VmContractWithNode {
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct AppNode {
|
||||
id: RecordId,
|
||||
country: String,
|
||||
region: String,
|
||||
city: String,
|
||||
ip: String,
|
||||
avail_mem_mb: u32,
|
||||
avail_vcpus: u32,
|
||||
avail_storage_gbs: u32,
|
||||
avail_ports: u32,
|
||||
max_ports_per_app: u32,
|
||||
price: u64,
|
||||
offline_minutes: u64,
|
||||
pub id: RecordId,
|
||||
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_ports: u32,
|
||||
pub max_ports_per_app: u32,
|
||||
pub price: u64,
|
||||
pub offline_minutes: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct AppNodeExtended {
|
||||
pub id: RecordId,
|
||||
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_ports: u32,
|
||||
pub max_ports_per_app: u32,
|
||||
pub price: u64,
|
||||
pub offline_minutes: u64,
|
||||
pub reports: Vec<Report>,
|
||||
pub operator: RecordId,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
@ -288,12 +326,16 @@ pub struct Report {
|
||||
#[serde(rename = "out")]
|
||||
to_node: RecordId,
|
||||
created_at: Datetime,
|
||||
reason: String,
|
||||
pub reason: String,
|
||||
}
|
||||
|
||||
impl Report {
|
||||
// TODO: test this functionality and remove this comment
|
||||
pub async fn create(from_account: RecordId, to_node: RecordId, reason: String) -> Result<(), Error> {
|
||||
pub async fn create(
|
||||
from_account: RecordId,
|
||||
to_node: RecordId,
|
||||
reason: String,
|
||||
) -> Result<(), Error> {
|
||||
let _: Vec<Self> = DB
|
||||
.insert("report")
|
||||
.relation(Report { from_account, to_node, created_at: Datetime::default(), reason })
|
||||
@ -350,6 +392,45 @@ impl Operator {
|
||||
let operators: Vec<Self> = result.take(0)?;
|
||||
Ok(operators)
|
||||
}
|
||||
|
||||
pub async fn inspect_nodes(
|
||||
account: &str,
|
||||
) -> Result<(Option<Self>, Vec<VmNodeExtended>, Vec<AppNodeExtended>), Error> {
|
||||
let mut result = DB
|
||||
.query(format!(
|
||||
"select *,
|
||||
in as account,
|
||||
<-account.email[0] as email,
|
||||
<-account.escrow[0] as escrow,
|
||||
count(->vm_node) as vm_nodes,
|
||||
count(->app_node) as app_nodes,
|
||||
(select in from <-account->operator->vm_node<-report).len() +
|
||||
(select in from <-account->operator->app_node<-report).len()
|
||||
as reports
|
||||
from operator where in = account:{account} group by account;"
|
||||
))
|
||||
.query(format!(
|
||||
"select *,
|
||||
(<-operator<-account)[0].id as operator,
|
||||
<-report.* as reports
|
||||
from vm_node
|
||||
where (<-operator<-account)[0].id = account:{account};"
|
||||
))
|
||||
.query(format!(
|
||||
"select *,
|
||||
(<-operator<-account)[0].id as operator,
|
||||
<-report.* as reports
|
||||
from app_node
|
||||
where (<-operator<-account)[0].id = account:{account};"
|
||||
))
|
||||
.await?;
|
||||
|
||||
let operator: Option<Self> = result.take(0)?;
|
||||
let vm_nodes: Vec<VmNodeExtended> = result.take(1)?;
|
||||
let app_nodes: Vec<AppNodeExtended> = result.take(2)?;
|
||||
|
||||
Ok((operator, vm_nodes, app_nodes))
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: delete all of these From implementation after migration 0 gets executed
|
||||
|
47
src/grpc.rs
47
src/grpc.rs
@ -1,6 +1,6 @@
|
||||
#![allow(dead_code)]
|
||||
use crate::db;
|
||||
use detee_shared::app_proto::AppContract;
|
||||
use detee_shared::app_proto::{AppContract, AppNodeListResp};
|
||||
use detee_shared::{
|
||||
common_proto::{Empty, Pubkey},
|
||||
general_proto::{
|
||||
@ -84,6 +84,36 @@ impl From<db::Operator> for ListOperatorsResp {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<db::VmNodeExtended> for VmNodeListResp {
|
||||
fn from(vm_node: db::VmNodeExtended) -> Self {
|
||||
Self {
|
||||
operator: vm_node.operator.key().to_string(),
|
||||
node_pubkey: vm_node.id.key().to_string(),
|
||||
country: vm_node.country,
|
||||
region: vm_node.region,
|
||||
city: vm_node.city,
|
||||
ip: vm_node.ip,
|
||||
reports: vm_node.reports.iter().map(|n| n.reason.clone()).collect(),
|
||||
price: vm_node.price,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<db::AppNodeExtended> for AppNodeListResp {
|
||||
fn from(app_node: db::AppNodeExtended) -> Self {
|
||||
Self {
|
||||
operator: app_node.operator.key().to_string(),
|
||||
node_pubkey: app_node.id.key().to_string(),
|
||||
country: app_node.country,
|
||||
region: app_node.region,
|
||||
city: app_node.city,
|
||||
ip: app_node.ip,
|
||||
reports: app_node.reports.iter().map(|n| n.reason.clone()).collect(),
|
||||
price: app_node.price,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl BrainGeneralCli for BrainGeneralCliMock {
|
||||
type ListAccountsStream = Pin<Box<dyn Stream<Item = Result<Account, Status>> + Send>>;
|
||||
@ -134,13 +164,16 @@ impl BrainGeneralCli for BrainGeneralCliMock {
|
||||
|
||||
async fn inspect_operator(
|
||||
&self,
|
||||
_req: Request<Pubkey>,
|
||||
req: Request<Pubkey>,
|
||||
) -> Result<Response<InspectOperatorResp>, Status> {
|
||||
todo!();
|
||||
// match self.data.inspect_operator(&req.into_inner().pubkey) {
|
||||
// Some(op) => Ok(Response::new(op.into())),
|
||||
// None => Err(Status::not_found("The wallet you specified is not an operator")),
|
||||
// }
|
||||
match db::Operator::inspect_nodes(&req.into_inner().pubkey).await? {
|
||||
(Some(op), vm_nodes, app_nodes) => Ok(Response::new(InspectOperatorResp {
|
||||
operator: Some(op.into()),
|
||||
vm_nodes: vm_nodes.into_iter().map(|n| n.into()).collect(),
|
||||
app_nodes: app_nodes.into_iter().map(|n| n.into()).collect(),
|
||||
})),
|
||||
(None, _, _) => Err(Status::not_found("The wallet you specified is not an operator")),
|
||||
}
|
||||
}
|
||||
|
||||
async fn register_operator(
|
||||
|
Loading…
Reference in New Issue
Block a user