diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4dbd2552d..b3793323bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -154,6 +154,7 @@ jobs: AGENTOS_SIDECAR_BIN: ${{ github.workspace }}/target/debug/agentos-native-sidecar run: | cargo test -p agentos-client \ + --features service-internals \ --lib \ --test scaffold \ --test e2e_smoke \ @@ -163,6 +164,7 @@ jobs: --test sidecar_pool_e2e \ --test cron_e2e \ --test cron_grammar_e2e \ + --test vm_config_compare_e2e \ -- --test-threads=1 - name: Stage stripped sidecar artifacts run: | diff --git a/crates/client/tests/vm_config_compare_e2e.rs b/crates/client/tests/vm_config_compare_e2e.rs new file mode 100644 index 0000000000..24e3648cac --- /dev/null +++ b/crates/client/tests/vm_config_compare_e2e.rs @@ -0,0 +1,45 @@ +//! Config comparison against a running VM through a real `agentos-native-sidecar`. +#![cfg(feature = "service-internals")] + +mod common; + +use std::collections::BTreeMap; + +use agentos_client::config::AgentOsConfig; +use agentos_client::service_internals::vm_config_equivalent; +use agentos_client::AgentOs; + +fn config(environment: Option>) -> AgentOsConfig { + AgentOsConfig { + environment, + ..Default::default() + } +} + +#[tokio::test] +async fn running_vm_compares_configs_through_the_sidecar() { + if !common::require_sidecar("running_vm_compares_configs_through_the_sidecar") { + return; + } + let vm = AgentOs::create(config(None)) + .await + .expect("create VM against real sidecar"); + + let same = vm_config_equivalent(&vm, &config(None), &config(None), Vec::new(), Vec::new()) + .await + .expect("compare an unchanged config"); + let changed_environment = Some(BTreeMap::from([(String::from("DEBUG"), String::from("1"))])); + let changed = vm_config_equivalent( + &vm, + &config(None), + &config(changed_environment), + Vec::new(), + Vec::new(), + ) + .await + .expect("compare a config with a changed environment"); + vm.shutdown().await.expect("shutdown VM"); + + assert!(same); + assert!(!changed); +} diff --git a/crates/native-sidecar/src/service.rs b/crates/native-sidecar/src/service.rs index 35e1a09e2a..22adffb08f 100644 --- a/crates/native-sidecar/src/service.rs +++ b/crates/native-sidecar/src/service.rs @@ -2607,6 +2607,7 @@ where | RequestRoute::GetZombieTimerCount(_) | RequestRoute::ProvidedCommands(_) | RequestRoute::ListMounts(_) + | RequestRoute::CompareVmConfig(_) | RequestRoute::GuestFilesystemCall(_) | RequestRoute::GuestKernelCall(_) | RequestRoute::BootstrapRootFilesystem(_) @@ -2801,6 +2802,12 @@ where let future = self.list_mounts(&request, payload); Ok(Some(PreparedRequest::from_vm_command(request, future))) } + RequestRoute::CompareVmConfig(payload) => { + let result = self.compare_vm_config(&request, payload); + Ok(Some(PreparedRequest::from_future(request, async move { + result + }))) + } RequestRoute::BootstrapRootFilesystem(payload) => { let future = self.bootstrap_root_filesystem(&request, payload.entries); Ok(Some(PreparedRequest::from_vm_command(request, future))) @@ -3032,9 +3039,7 @@ where }) }))) } - RequestRoute::CreateVm(_) - | RequestRoute::CompareVmConfig(_) - | RequestRoute::DisposeVm(_) => { + RequestRoute::CreateVm(_) | RequestRoute::DisposeVm(_) => { unreachable!("VM creation and disposal use dedicated prepared routes") } }