use serde_json::json;
use super::host::WorkloadHost;
use super::seed::{SEED_ID, SeedApiRuntime};
use super::seed_ops::{KIND_SEED_FIRMWARE, SeedBackup, UpgradeOutcome};
use super::types::{RuntimeError, VerifiedWorkload};
use crate::chain;
impl WorkloadHost {
pub async fn upgrade_seed_firmware(
&self,
seed: &SeedApiRuntime,
backup: &SeedBackup,
target_version: &str,
) -> Result<UpgradeOutcome, RuntimeError> {
let w = VerifiedWorkload::store_pin("cognitum", "seed-firmware", target_version, None)?;
self.check("workload.install", &w, KIND_SEED_FIRMWARE, false)?;
let r = seed.upgrade_firmware(backup, target_version).await;
let mut payload = json!({
"runtime": SEED_ID, "phase": "firmware-upgrade", "backup": backup.audit(),
"from_version": backup.firmware(), "target_version": target_version,
});
if let Ok(o) = &r {
payload["result"] = json!(format!("{o:?}"));
}
self.outcome(chain::EVENT_KIND_WORKLOAD_INSTALL, payload, &r);
r
}
pub async fn recover_seed_writes(
&self,
seed: &SeedApiRuntime,
backup: &SeedBackup,
) -> Result<(), RuntimeError> {
let w = VerifiedWorkload::store_pin("cognitum", "seed-firmware", backup.firmware(), None)?;
self.check("workload.install", &w, KIND_SEED_FIRMWARE, false)?;
let r = seed.recover_writes_gated(backup).await;
let payload = json!({
"runtime": SEED_ID, "phase": "writes-gated-recovery", "backup": backup.audit(),
});
self.outcome(chain::EVENT_KIND_WORKLOAD_INSTALL, payload, &r);
r
}
}