enable update process for VM hostname
This commit is contained in:
parent
4bd6b48877
commit
b12c8ebb4b
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -1110,7 +1110,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.git?branch=main#a874749fd5d7d8a5c964835f11bc8f97007f9f9e"
|
source = "git+ssh://git@gitea.detee.cloud/testnet/proto.git?branch=main#70e83dd0e982eeb491212c4a9d265df0b148fe24"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"prost",
|
"prost",
|
||||||
|
@ -24,6 +24,10 @@ if [[ -z "${MEASUREMENT}" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ -z "${VM_HOSTNAME}" ]]; then
|
||||||
|
VM_HOSTNAME="detee-vm"
|
||||||
|
fi
|
||||||
|
|
||||||
server="$SERVER_ADDR"
|
server="$SERVER_ADDR"
|
||||||
ssh_pubkey_dir="${HOME}/.detee/cli/vms/ssh"
|
ssh_pubkey_dir="${HOME}/.detee/cli/vms/ssh"
|
||||||
cert_dir="${HOME}/.detee/cli/vms/certs"
|
cert_dir="${HOME}/.detee/cli/vms/certs"
|
||||||
@ -155,6 +159,7 @@ if [[ -n "$DETEE_INSTALL_URL" ]] && [[ -n "$DETEE_INSTALL_URL" ]]; then
|
|||||||
--data-urlencode "url=${DETEE_INSTALL_URL}" \
|
--data-urlencode "url=${DETEE_INSTALL_URL}" \
|
||||||
-d "sha=${DETEE_INSTALL_SHA}" \
|
-d "sha=${DETEE_INSTALL_SHA}" \
|
||||||
-d "keyfile=$(cat "$keyfile" | basenc --base64url -w 0)" \
|
-d "keyfile=$(cat "$keyfile" | basenc --base64url -w 0)" \
|
||||||
|
-d "hostname=${VM_HOSTNAME}" \
|
||||||
"https://dtrfs-api:${port}/install" || exit 1
|
"https://dtrfs-api:${port}/install" || exit 1
|
||||||
else
|
else
|
||||||
echo
|
echo
|
||||||
|
@ -436,6 +436,12 @@ fn clap_cmd() -> Command {
|
|||||||
.help("supply the uuid of the VM you wish to upgrade")
|
.help("supply the uuid of the VM you wish to upgrade")
|
||||||
.required(true)
|
.required(true)
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new("hostname")
|
||||||
|
.long("hostname")
|
||||||
|
.default_value("")
|
||||||
|
.help("change the hostname within the smart contract")
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("vcpus")
|
Arg::new("vcpus")
|
||||||
.long("vcpus")
|
.long("vcpus")
|
||||||
|
@ -88,12 +88,14 @@ fn handle_vm_list(update_vm_args: &ArgMatches) -> Result<Vec<snp::VmContract>, B
|
|||||||
|
|
||||||
fn handle_vm_update(update_vm_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> {
|
fn handle_vm_update(update_vm_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> {
|
||||||
let uuid = update_vm_args.get_one::<String>("uuid").unwrap().clone();
|
let uuid = update_vm_args.get_one::<String>("uuid").unwrap().clone();
|
||||||
|
let hostname = update_vm_args.get_one::<String>("hostname").unwrap().clone();
|
||||||
let memory = *update_vm_args.get_one::<u32>("memory").unwrap();
|
let memory = *update_vm_args.get_one::<u32>("memory").unwrap();
|
||||||
if memory > 0 && memory < 800 {
|
if memory > 0 && memory < 800 {
|
||||||
log::error!("At least 800MB of memory must be assgined to the VM");
|
log::error!("At least 800MB of memory must be assgined to the VM");
|
||||||
return Ok(SimpleOutput::from(""));
|
return Ok(SimpleOutput::from(""));
|
||||||
}
|
}
|
||||||
snp::update::Request::process_request(
|
snp::update::Request::process_request(
|
||||||
|
hostname,
|
||||||
&uuid,
|
&uuid,
|
||||||
*update_vm_args.get_one::<u32>("vcpus").unwrap(),
|
*update_vm_args.get_one::<u32>("vcpus").unwrap(),
|
||||||
memory,
|
memory,
|
||||||
|
@ -81,7 +81,6 @@ impl Request {
|
|||||||
let args = new_vm_resp.args.ok_or(Error::NoMeasurement)?;
|
let args = new_vm_resp.args.ok_or(Error::NoMeasurement)?;
|
||||||
let measurement_args = injector::Args {
|
let measurement_args = injector::Args {
|
||||||
uuid: new_vm_resp.uuid.clone(),
|
uuid: new_vm_resp.uuid.clone(),
|
||||||
hostname: self.hostname.clone(),
|
|
||||||
vcpus: self.vcpus,
|
vcpus: self.vcpus,
|
||||||
kernel: kernel_sha,
|
kernel: kernel_sha,
|
||||||
initrd: dtrfs_sha,
|
initrd: dtrfs_sha,
|
||||||
|
@ -5,7 +5,6 @@ use std::net::IpAddr;
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Args {
|
pub struct Args {
|
||||||
pub uuid: String,
|
pub uuid: String,
|
||||||
pub hostname: String,
|
|
||||||
pub vcpus: u32,
|
pub vcpus: u32,
|
||||||
pub kernel: String,
|
pub kernel: String,
|
||||||
pub initrd: String,
|
pub initrd: String,
|
||||||
@ -98,7 +97,7 @@ impl Args {
|
|||||||
ip_string = "detee_net_eth0=10.0.2.15_24_10.0.2.2 ".to_string() + &ip_string;
|
ip_string = "detee_net_eth0=10.0.2.15_24_10.0.2.2 ".to_string() + &ip_string;
|
||||||
}
|
}
|
||||||
let admin_key = format!("detee_admin={} ", Config::get_detee_wallet()?);
|
let admin_key = format!("detee_admin={} ", Config::get_detee_wallet()?);
|
||||||
let hostname = format!("detee_name={}", self.hostname);
|
let hostname = format!("detee_uuid={}", self.uuid);
|
||||||
let params = format!("{}{}{}", ip_string, admin_key, hostname);
|
let params = format!("{}{}{}", ip_string, admin_key, hostname);
|
||||||
debug!("Calculated kernel params for {} to: {}", self.uuid, params);
|
debug!("Calculated kernel params for {} to: {}", self.uuid, params);
|
||||||
Ok(params)
|
Ok(params)
|
||||||
@ -109,7 +108,7 @@ pub fn execute(
|
|||||||
measurement: String,
|
measurement: String,
|
||||||
server_addr: String,
|
server_addr: String,
|
||||||
os_template: Option<(&str, &str)>,
|
os_template: Option<(&str, &str)>,
|
||||||
log_file_name: &str,
|
vm_hostname: &str,
|
||||||
) -> Result<super::VmSshArgs, Error> {
|
) -> Result<super::VmSshArgs, Error> {
|
||||||
let parsed_addr = match server_addr.parse::<std::net::SocketAddrV4>() {
|
let parsed_addr = match server_addr.parse::<std::net::SocketAddrV4>() {
|
||||||
Ok(addr) => addr,
|
Ok(addr) => addr,
|
||||||
@ -125,7 +124,7 @@ pub fn execute(
|
|||||||
};
|
};
|
||||||
eprintln!("Injecting disk encryption key into VM. This will take a minute. Do not interrupt.");
|
eprintln!("Injecting disk encryption key into VM. This will take a minute. Do not interrupt.");
|
||||||
let (os_template_url, os_template_sha) = os_template.unwrap_or(("", ""));
|
let (os_template_url, os_template_sha) = os_template.unwrap_or(("", ""));
|
||||||
let logs_path = Config::logs_dir()? + "/" + log_file_name;
|
let logs_path = Config::logs_dir()? + "/" + vm_hostname;
|
||||||
log::info!("Logs will be saved to {}", logs_path);
|
log::info!("Logs will be saved to {}", logs_path);
|
||||||
let logs_file = std::fs::File::create(logs_path.clone())?;
|
let logs_file = std::fs::File::create(logs_path.clone())?;
|
||||||
let mut child_process = std::process::Command::new("detee-cli_injector.sh")
|
let mut child_process = std::process::Command::new("detee-cli_injector.sh")
|
||||||
@ -134,6 +133,7 @@ pub fn execute(
|
|||||||
.env("DETEE_INSTALL_URL", os_template_url)
|
.env("DETEE_INSTALL_URL", os_template_url)
|
||||||
.env("DETEE_INSTALL_SHA", os_template_sha)
|
.env("DETEE_INSTALL_SHA", os_template_sha)
|
||||||
.env("MEASUREMENT", measurement)
|
.env("MEASUREMENT", measurement)
|
||||||
|
.env("VM_HOSTNAME", vm_hostname)
|
||||||
.stdout(logs_file.try_clone()?)
|
.stdout(logs_file.try_clone()?)
|
||||||
.stderr(logs_file)
|
.stderr(logs_file)
|
||||||
.spawn()?;
|
.spawn()?;
|
||||||
|
@ -396,12 +396,12 @@ pub fn calculate_nanolp(
|
|||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref DEFAULT_DTRFS: Dtrfs = Dtrfs {
|
static ref DEFAULT_DTRFS: Dtrfs = Dtrfs {
|
||||||
name: "dtrfs-6.13.6-arch1-1".to_string(),
|
name: "dtrfs-6.13.7-arch1-1".to_string(),
|
||||||
vendor: "ghe0".to_string(),
|
vendor: "ghe0".to_string(),
|
||||||
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.6-arch1-1.cpio.gz".to_string(),
|
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.7-arch1-1.cpio.gz".to_string(),
|
||||||
dtrfs_sha: "de48048fb42fe4054611f14e51ce175ca90645734fe41349642f036b8bca8fcd".to_string(),
|
dtrfs_sha: "dc02e091da80c281fe735a1be86b3fe766f1741d82c32f5dc64344b345827c6d".to_string(),
|
||||||
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.6-arch1-1".to_string(),
|
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.7-arch1-1".to_string(),
|
||||||
kernel_sha: "7efaca6c348cd4136afe3ece0beec346da713029347a0d4e71e12a0b91570de7".to_string()
|
kernel_sha: "469a89668d2f5744b3f80417fcf0a4ce0140fcb78f1e8834ef8e3668eecc934c".to_string()
|
||||||
};
|
};
|
||||||
static ref DEFAULT_ARCHLINUX: Distro = Distro {
|
static ref DEFAULT_ARCHLINUX: Distro = Distro {
|
||||||
name: "archlinux_2025-02-21".to_string(),
|
name: "archlinux_2025-02-21".to_string(),
|
||||||
@ -429,20 +429,20 @@ lazy_static! {
|
|||||||
name: "dtrfs-6.13.6-arch1-1".to_string(),
|
name: "dtrfs-6.13.6-arch1-1".to_string(),
|
||||||
vendor: "ghe0".to_string(),
|
vendor: "ghe0".to_string(),
|
||||||
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.6-arch1-1.cpio.gz".to_string(),
|
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.6-arch1-1.cpio.gz".to_string(),
|
||||||
dtrfs_sha: "83675cf2a27db526ec0705daf2606674778759fb33cdb8b1dfc4ddd623608806"
|
dtrfs_sha: "de48048fb42fe4054611f14e51ce175ca90645734fe41349642f036b8bca8fcd"
|
||||||
.to_string(),
|
.to_string(),
|
||||||
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.6-arch1-1".to_string(),
|
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.6-arch1-1".to_string(),
|
||||||
kernel_sha: "7efaca6c348cd4136afe3ece0beec346da713029347a0d4e71e12a0b91570de7"
|
kernel_sha: "7efaca6c348cd4136afe3ece0beec346da713029347a0d4e71e12a0b91570de7"
|
||||||
.to_string()
|
.to_string()
|
||||||
},
|
},
|
||||||
Dtrfs {
|
Dtrfs {
|
||||||
name: "dtrfs-6.13.4-arch1-1".to_string(),
|
name: "dtrfs-6.13.6-arch1-1".to_string(),
|
||||||
vendor: "ghe0".to_string(),
|
vendor: "ghe0".to_string(),
|
||||||
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.4-arch1-1.cpio.gz".to_string(),
|
dtrfs_url: "http://registry.detee.ltd/detee-archtop-6.13.6-arch1-1.cpio.gz".to_string(),
|
||||||
dtrfs_sha: "3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b"
|
dtrfs_sha: "83675cf2a27db526ec0705daf2606674778759fb33cdb8b1dfc4ddd623608806"
|
||||||
.to_string(),
|
.to_string(),
|
||||||
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.4-arch1-1".to_string(),
|
kernel_url: "http://registry.detee.ltd/vmlinuz-linux-6.13.6-arch1-1".to_string(),
|
||||||
kernel_sha: "3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151"
|
kernel_sha: "7efaca6c348cd4136afe3ece0beec346da713029347a0d4e71e12a0b91570de7"
|
||||||
.to_string()
|
.to_string()
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -8,6 +8,7 @@ use log::{debug, info};
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Default, PartialEq)]
|
#[derive(Clone, Debug, Default, PartialEq)]
|
||||||
pub struct Request {
|
pub struct Request {
|
||||||
|
hostname: String,
|
||||||
vcpus: u32,
|
vcpus: u32,
|
||||||
memory_mb: u32,
|
memory_mb: u32,
|
||||||
disk_size_gb: u32,
|
disk_size_gb: u32,
|
||||||
@ -16,6 +17,7 @@ pub struct Request {
|
|||||||
|
|
||||||
impl Request {
|
impl Request {
|
||||||
pub fn process_request(
|
pub fn process_request(
|
||||||
|
hostname: String,
|
||||||
uuid: &str,
|
uuid: &str,
|
||||||
vcpus: u32,
|
vcpus: u32,
|
||||||
memory_mb: u32,
|
memory_mb: u32,
|
||||||
@ -30,7 +32,7 @@ impl Request {
|
|||||||
Some(Dtrfs::load_from_file(path)?)
|
Some(Dtrfs::load_from_file(path)?)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let req = Self { vcpus, memory_mb, disk_size_gb, dtrfs };
|
let req = Self { hostname, vcpus, memory_mb, disk_size_gb, dtrfs };
|
||||||
if req == Self::default() {
|
if req == Self::default() {
|
||||||
log::info!("Skipping hardware upgrade (no arguments specified).");
|
log::info!("Skipping hardware upgrade (no arguments specified).");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -47,26 +49,32 @@ impl Request {
|
|||||||
return Err(Error::Node(update_vm_resp.error));
|
return Err(Error::Node(update_vm_resp.error));
|
||||||
}
|
}
|
||||||
|
|
||||||
eprintln!("The node accepted the hardware modifications for the VM.");
|
eprintln!("The modifications got approved. Proceeding with update...");
|
||||||
let current_contract = block_on(grpc::get_contract_by_uuid(uuid))?;
|
let updated_contract = block_on(grpc::get_contract_by_uuid(uuid))?;
|
||||||
debug!("Got the current contract for the VM after update. {current_contract:#?}");
|
debug!("Got the current contract for the VM after update. {updated_contract:#?}");
|
||||||
|
|
||||||
|
if !(self.vcpus != 0 || self.dtrfs.is_some()) {
|
||||||
|
eprintln!("vCPUs and kernel did not get modified. Secret injection is not required.");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let args = update_vm_resp.args.ok_or(Error::NoMeasurement)?;
|
let args = update_vm_resp.args.ok_or(Error::NoMeasurement)?;
|
||||||
let measurement_args = injector::Args {
|
let measurement_args = injector::Args {
|
||||||
uuid: update_vm_resp.uuid,
|
uuid: update_vm_resp.uuid,
|
||||||
hostname: current_contract.hostname.clone(),
|
vcpus: updated_contract.vcpus,
|
||||||
vcpus: current_contract.vcpus,
|
kernel: updated_contract.kernel_sha,
|
||||||
kernel: current_contract.kernel_sha,
|
initrd: updated_contract.dtrfs_sha,
|
||||||
initrd: current_contract.dtrfs_sha,
|
|
||||||
args: args.clone(),
|
args: args.clone(),
|
||||||
};
|
};
|
||||||
let measurement = measurement_args.get_measurement()?;
|
let measurement = measurement_args.get_measurement()?;
|
||||||
|
|
||||||
if self.vcpus != 0 || self.dtrfs.is_some() {
|
injector::execute(
|
||||||
injector::execute(measurement, args.dtrfs_api_endpoint, None, uuid)?;
|
measurement,
|
||||||
} else {
|
args.dtrfs_api_endpoint,
|
||||||
println!("vCPUs and kernel did not get modified. Secret injection is not required.");
|
None,
|
||||||
}
|
&updated_contract.hostname,
|
||||||
|
)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +86,7 @@ impl Request {
|
|||||||
};
|
};
|
||||||
Ok(block_on(grpc::update_vm(proto::UpdateVmReq {
|
Ok(block_on(grpc::update_vm(proto::UpdateVmReq {
|
||||||
uuid: uuid.to_string(),
|
uuid: uuid.to_string(),
|
||||||
|
hostname: self.hostname.clone(),
|
||||||
admin_pubkey: Config::get_detee_wallet()?,
|
admin_pubkey: Config::get_detee_wallet()?,
|
||||||
disk_size_gb: self.disk_size_gb,
|
disk_size_gb: self.disk_size_gb,
|
||||||
vcpus: self.vcpus,
|
vcpus: self.vcpus,
|
||||||
|
Loading…
Reference in New Issue
Block a user