feat: report app node
include contract id in report schema validated app contract also while reporting
This commit is contained in:
		
							parent
							
								
									28ff8dcd81
								
							
						
					
					
						commit
						a1664d61e4
					
				| @ -131,3 +131,4 @@ DEFINE FIELD contract ON TABLE kick TYPE record<deleted_vm|deleted_app>; | |||||||
| DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node; | DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node; | ||||||
| DEFINE FIELD created_at ON TABLE report TYPE datetime; | DEFINE FIELD created_at ON TABLE report TYPE datetime; | ||||||
| DEFINE FIELD reason ON TABLE report TYPE string; | DEFINE FIELD reason ON TABLE report TYPE string; | ||||||
|  | DEFINE FIELD contract_id ON TABLE report TYPE string; | ||||||
|  | |||||||
| @ -20,6 +20,8 @@ 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 VM_CONTRACT: &str = "vm_contract"; | pub const VM_CONTRACT: &str = "vm_contract"; | ||||||
| 
 | 
 | ||||||
|  | pub const ACTIVE_APP: &str = "active_app"; | ||||||
|  | 
 | ||||||
| pub const ID_ALPHABET: [char; 62] = [ | 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', |     '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', |     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								src/db.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										46
									
								
								src/db.rs
									
									
									
									
									
								
							| @ -1,8 +1,8 @@ | |||||||
| use std::str::FromStr; | use std::str::FromStr; | ||||||
| 
 | 
 | ||||||
| pub use crate::constants::{ | pub use crate::constants::{ | ||||||
|     ACCOUNT, ACTIVE_VM, DB_SCHEMA_FILE, DELETED_VM, ID_ALPHABET, NEW_VM_REQ, UPDATE_VM_REQ, |     ACCOUNT, ACTIVE_APP, ACTIVE_VM, DB_SCHEMA_FILE, DELETED_VM, ID_ALPHABET, NEW_VM_REQ, | ||||||
|     VM_CONTRACT, VM_NODE, |     UPDATE_VM_REQ, VM_CONTRACT, VM_NODE, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use crate::old_brain; | use crate::old_brain; | ||||||
| @ -720,7 +720,7 @@ pub struct AppNodeWithReports { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Serialize, Deserialize)] | #[derive(Debug, Serialize, Deserialize)] | ||||||
| pub struct AppContract { | pub struct ActiveApp { | ||||||
|     id: RecordId, |     id: RecordId, | ||||||
|     #[serde(rename = "in")] |     #[serde(rename = "in")] | ||||||
|     admin: RecordId, |     admin: RecordId, | ||||||
| @ -741,6 +741,36 @@ pub struct AppContract { | |||||||
|     hratls_pubkey: String, |     hratls_pubkey: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[derive(Debug, Serialize, Deserialize)] | ||||||
|  | pub struct ActiveAppWithNode { | ||||||
|  |     pub id: RecordId, | ||||||
|  |     #[serde(rename = "in")] | ||||||
|  |     pub admin: RecordId, | ||||||
|  |     #[serde(rename = "out")] | ||||||
|  |     pub app_node: AppNode, | ||||||
|  |     pub app_name: String, | ||||||
|  |     pub mapped_ports: Vec<(u64, u64)>, | ||||||
|  |     pub host_ipv4: String, | ||||||
|  |     pub vcpus: u64, | ||||||
|  |     pub memory_mb: u64, | ||||||
|  |     pub disk_size_gb: u64, | ||||||
|  |     pub created_at: Datetime, | ||||||
|  |     pub price_per_unit: u64, | ||||||
|  |     pub locked_nano: u64, | ||||||
|  |     pub collected_at: Datetime, | ||||||
|  |     pub mr_enclave: String, | ||||||
|  |     pub package_url: String, | ||||||
|  |     pub hratls_pubkey: String, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl ActiveAppWithNode { | ||||||
|  |     pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> { | ||||||
|  |         let contract: Option<Self> = | ||||||
|  |             db.query(format!("select * from {ACTIVE_APP}:{uuid} fetch out;")).await?.take(0)?; | ||||||
|  |         Ok(contract) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Debug, Serialize, Deserialize)] | #[derive(Debug, Serialize, Deserialize)] | ||||||
| pub struct Ban { | pub struct Ban { | ||||||
|     id: RecordId, |     id: RecordId, | ||||||
| @ -771,6 +801,7 @@ pub struct Report { | |||||||
|     to_node: RecordId, |     to_node: RecordId, | ||||||
|     created_at: Datetime, |     created_at: Datetime, | ||||||
|     pub reason: String, |     pub reason: String, | ||||||
|  |     pub contract_id: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Report { | impl Report { | ||||||
| @ -780,10 +811,17 @@ impl Report { | |||||||
|         from_account: RecordId, |         from_account: RecordId, | ||||||
|         to_node: RecordId, |         to_node: RecordId, | ||||||
|         reason: String, |         reason: String, | ||||||
|  |         contract_id: String, | ||||||
|     ) -> Result<(), Error> { |     ) -> Result<(), Error> { | ||||||
|         let _: Vec<Self> = db |         let _: Vec<Self> = db | ||||||
|             .insert("report") |             .insert("report") | ||||||
|             .relation(Report { from_account, to_node, created_at: Datetime::default(), reason }) |             .relation(Report { | ||||||
|  |                 from_account, | ||||||
|  |                 to_node, | ||||||
|  |                 created_at: Datetime::default(), | ||||||
|  |                 reason, | ||||||
|  |                 contract_id, | ||||||
|  |             }) | ||||||
|             .await?; |             .await?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								src/grpc.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								src/grpc.rs
									
									
									
									
									
								
							| @ -436,20 +436,27 @@ impl BrainGeneralCli for BrainGeneralCliForReal { | |||||||
| 
 | 
 | ||||||
|     async fn report_node(&self, req: Request<ReportNodeReq>) -> Result<Response<Empty>, Status> { |     async fn report_node(&self, req: Request<ReportNodeReq>) -> Result<Response<Empty>, Status> { | ||||||
|         let req = check_sig_from_req(req)?; |         let req = check_sig_from_req(req)?; | ||||||
|         let (account, node) = |         let (account, node, contract_id) = | ||||||
|             match db::ActiveVmWithNode::get_by_uuid(&self.db, &req.contract).await? { |             match db::ActiveVmWithNode::get_by_uuid(&self.db, &req.contract).await? { | ||||||
|                 Some(vm_contract) |                 Some(vm_contract) | ||||||
|                     if vm_contract.admin.key().to_string() == req.admin_pubkey |                     if vm_contract.admin.key().to_string() == req.admin_pubkey | ||||||
|                         && vm_contract.vm_node.id.key().to_string() == req.node_pubkey => |                         && vm_contract.vm_node.id.key().to_string() == req.node_pubkey => | ||||||
|                 { |                 { | ||||||
|                     (vm_contract.admin, vm_contract.vm_node.id) |                     (vm_contract.admin, vm_contract.vm_node.id, vm_contract.id.to_string()) | ||||||
|  |                 } | ||||||
|  |                 _ => match db::ActiveAppWithNode::get_by_uuid(&self.db, &req.contract).await? { | ||||||
|  |                     Some(app_contract) | ||||||
|  |                         if app_contract.admin.key().to_string() == req.admin_pubkey | ||||||
|  |                             && app_contract.app_node.id.key().to_string() == req.node_pubkey => | ||||||
|  |                     { | ||||||
|  |                         (app_contract.admin, app_contract.app_node.id, app_contract.id.to_string()) | ||||||
|                     } |                     } | ||||||
|                     _ => { |                     _ => { | ||||||
|                     // TODO: Hey, Noor! Please add app contract here.
 |  | ||||||
|                         return Err(Status::unauthenticated("No contract found by this ID.")); |                         return Err(Status::unauthenticated("No contract found by this ID.")); | ||||||
|                     } |                     } | ||||||
|  |                 }, | ||||||
|             }; |             }; | ||||||
|         db::Report::create(&self.db, account, node, req.reason).await?; |         db::Report::create(&self.db, account, node, req.reason, contract_id).await?; | ||||||
|         Ok(Response::new(Empty {})) |         Ok(Response::new(Empty {})) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user