App engine features #1

Merged
noormohammedb merged 4 commits from app_engine_features into staging 2025-04-15 11:40:29 +00:00
2 changed files with 45 additions and 11 deletions
Showing only changes of commit af83d5f733 - Show all commits

@ -40,6 +40,9 @@ pub enum Error {
#[error("Could not find contract {0}")] #[error("Could not find contract {0}")]
AppContractNotFound(String), AppContractNotFound(String),
#[error("Could not find contract {0}")]
ContractNotFound(String),
} }
#[derive(Clone, Default, Serialize, Deserialize, Debug)] #[derive(Clone, Default, Serialize, Deserialize, Debug)]
@ -247,7 +250,7 @@ impl From<AppContract> for AppContractPB {
} }
} }
#[derive(Eq, Hash, PartialEq, Clone, Debug, Default, Serialize, Deserialize)] #[derive(Eq, PartialEq, Clone, Debug, Default, Serialize, Deserialize)]
pub struct AppNode { pub struct AppNode {
pub node_pubkey: String, pub node_pubkey: String,
pub operator_wallet: String, pub operator_wallet: String,
@ -262,7 +265,8 @@ pub struct AppNode {
pub max_ports_per_app: u32, pub max_ports_per_app: u32,
// nanotokens per unit per minute // nanotokens per unit per minute
pub price: u64, pub price: u64,
// 1st String is user wallet and 2nd String is report message
pub reports: HashMap<String, String>,
pub offline_minutes: u64, pub offline_minutes: u64,
} }
@ -594,10 +598,15 @@ impl BrainData {
}); });
} }
pub fn report_node(&self, admin_pubkey: String, node: &str, report: String) { pub fn report_any_node(&self, admin_pubkey: String, node: &str, report: String) {
let mut nodes = self.vm_nodes.write().unwrap(); let mut vm_nodes = self.vm_nodes.write().unwrap();
if let Some(node) = nodes.iter_mut().find(|n| n.public_key == node) { if let Some(vm_node) = vm_nodes.iter_mut().find(|n| n.public_key == node) {
node.reports.insert(admin_pubkey, report); vm_node.reports.insert(admin_pubkey.clone(), report.clone());
}
let mut app_nodes = self.app_nodes.write().unwrap();
if let Some(app_node) = app_nodes.iter_mut().find(|n| n.node_pubkey == node) {
app_node.reports.insert(admin_pubkey, report);
} }
} }
@ -1239,6 +1248,25 @@ impl BrainData {
} }
} }
impl BrainData {
pub fn find_any_contract_by_uuid(
&self,
uuid: &str,
) -> Result<(Option<VmContract>, Option<AppContract>), Error> {
let contracts = self.vm_contracts.read().unwrap();
if let Some(vm_contract) = contracts.iter().cloned().find(|c| c.uuid == uuid) {
return Ok((Some(vm_contract), None));
}
let app_contracts = self.app_contracts.read().unwrap();
if let Some(app_contract) = app_contracts.iter().cloned().find(|c| c.uuid == uuid) {
return Ok((None, Some(app_contract)));
}
Err(Error::ContractNotFound(uuid.to_string()))
}
}
impl BrainData { impl BrainData {
pub fn add_app_daemon_tx(&self, node_pubkey: &str, tx: Sender<BrainMessageApp>) { pub fn add_app_daemon_tx(&self, node_pubkey: &str, tx: Sender<BrainMessageApp>) {
self.app_daemon_tx.insert(node_pubkey.to_string(), tx); self.app_daemon_tx.insert(node_pubkey.to_string(), tx);

@ -99,17 +99,23 @@ impl BrainGeneralCli for BrainGeneraClilMock {
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)?;
match self.data.find_contract_by_uuid(&req.contract) { match self.data.find_any_contract_by_uuid(&req.contract) {
Ok(contract) Ok((Some(vm_contract), _))
if contract.admin_pubkey == req.admin_pubkey if vm_contract.admin_pubkey == req.admin_pubkey
&& contract.node_pubkey == req.node_pubkey => && vm_contract.node_pubkey == req.node_pubkey =>
{
()
}
Ok((_, Some(app_contract)))
if app_contract.admin_pubkey == req.admin_pubkey
&& app_contract.node_pubkey == req.node_pubkey =>
{ {
() ()
} }
_ => return Err(Status::unauthenticated("No contract found by this ID.")), _ => return Err(Status::unauthenticated("No contract found by this ID.")),
}; };
self.data self.data
.report_node(req.admin_pubkey, &req.node_pubkey, req.reason); .report_any_node(req.admin_pubkey, &req.node_pubkey, req.reason);
Ok(Response::new(Empty {})) Ok(Response::new(Empty {}))
} }