update functionality for the brain #2

Merged
ghe0 merged 11 commits from new-updater into main 2025-01-09 22:29:56 +00:00
Showing only changes of commit 02ff2f6991 - Show all commits

@ -185,7 +185,7 @@ impl BrainData {
} }
pub async fn submit_newvm_resp(&self, mut new_vm_resp: grpc::NewVmResp) { pub async fn submit_newvm_resp(&self, mut new_vm_resp: grpc::NewVmResp) {
let newvmreq = match self.tmp_newvm_reqs.remove(&new_vm_resp.uuid) { let new_vm_req = match self.tmp_newvm_reqs.remove(&new_vm_resp.uuid) {
Some((_, r)) => r, Some((_, r)) => r,
None => { None => {
log::error!( log::error!(
@ -204,10 +204,10 @@ impl BrainData {
return; return;
} }
}; };
if let Err(e) = newvmreq.1.send(new_vm_resp.clone()) { if let Err(e) = new_vm_req.1.send(new_vm_resp.clone()) {
log::error!( log::error!(
"CLI RX for {} dropped before receiving confirmation {:?}. Error is: {:?}", "CLI RX for {} dropped before receiving confirmation {:?}. Error is: {:?}",
&newvmreq.0.admin_pubkey, &new_vm_req.0.admin_pubkey,
new_vm_resp, new_vm_resp,
e e
); );
ghe0 marked this conversation as resolved Outdated
Outdated
Review

If the daemon does not provide Measurement Args, the CLI can't execute the attestation. I believe we should not accept grpc::NewVmResp that does not contain Args. This should be replaced with a NewVmResp that contains an error with the message "SNP Node did not provide measurement args"

Also, this means the contract is broken so we need to discuss the cases.

If the daemon does not provide Measurement Args, the CLI can't execute the attestation. I believe we should not accept `grpc::NewVmResp` that does not contain Args. This should be replaced with a NewVmResp that contains an error with the message "SNP Node did not provide measurement args" Also, this means the contract is broken so we need to discuss the cases.
@ -229,6 +229,7 @@ impl BrainData {
public_ipv6 = ipv6_addr.to_string(); public_ipv6 = ipv6_addr.to_string();
} }
} }
let contract = Contract { let contract = Contract {
uuid: new_vm_resp.uuid, uuid: new_vm_resp.uuid,
exposed_ports: args.exposed_ports, exposed_ports: args.exposed_ports,
@ -236,17 +237,24 @@ impl BrainData {
public_ipv6, public_ipv6,
created_at: Utc::now().to_rfc3339(), created_at: Utc::now().to_rfc3339(),
updated_at: String::new(), updated_at: String::new(),
hostname: newvmreq.0.hostname, hostname: new_vm_req.0.hostname,
admin_pubkey: newvmreq.0.admin_pubkey, admin_pubkey: new_vm_req.0.admin_pubkey,
node_pubkey: newvmreq.0.node_pubkey, node_pubkey: new_vm_req.0.node_pubkey.clone(),
disk_size_gb: newvmreq.0.disk_size_gb, disk_size_gb: new_vm_req.0.disk_size_gb,
vcpus: newvmreq.0.vcpus, vcpus: new_vm_req.0.vcpus,
memory_mb: newvmreq.0.memory_mb, memory_mb: new_vm_req.0.memory_mb,
kernel_sha: newvmreq.0.kernel_sha, kernel_sha: new_vm_req.0.kernel_sha,
dtrfs_sha: newvmreq.0.dtrfs_sha, dtrfs_sha: new_vm_req.0.dtrfs_sha,
}; };
info!("Created new contract: {contract:?}"); info!("Created new contract: {contract:?}");
self.contracts.write().unwrap().push(contract); self.contracts.write().unwrap().push(contract);
let args = new_vm_resp.args.as_mut().unwrap();
if args.dtrfs_api_endpoint.starts_with(':') {
if let Some(node) = self.find_nodes_by_pubkey(&new_vm_req.0.node_pubkey) {
args.dtrfs_api_endpoint = format!("{}{}", node.ip, args.dtrfs_api_endpoint);
}
}
} }
pub async fn submit_updatevm_resp(&self, mut resp: grpc::UpdateVmResp) { pub async fn submit_updatevm_resp(&self, mut resp: grpc::UpdateVmResp) {
@ -278,14 +286,6 @@ impl BrainData {
if args.dtrfs_api_endpoint.starts_with(':') { if args.dtrfs_api_endpoint.starts_with(':') {
if let Some(node) = self.find_nodes_by_pubkey(&contract.node_pubkey) { if let Some(node) = self.find_nodes_by_pubkey(&contract.node_pubkey) {
args.dtrfs_api_endpoint = format!("{}{}", node.ip, args.dtrfs_api_endpoint); args.dtrfs_api_endpoint = format!("{}{}", node.ip, args.dtrfs_api_endpoint);
} else {
// This should never happen.
log::error!(
"Node {} not found for contract {}. Cannot update contract.",
contract.node_pubkey,
contract.uuid
);
return;
} }
} }