// tests/cloud_init_tests.rs use anyhow::Result; use kvm_install_vm::cloudinit::CloudInitManager; use std::fs; use tempfile::tempdir; #[test] fn test_create_cloud_init_config() -> Result<()> { let (user_data, meta_data) = CloudInitManager::create_cloud_init_config( "test-vm", "example.local", "ssh-rsa AAAAB3NzaC1yc2E... test-key", "testuser", "UTC", "wheel", "systemctl disable cloud-init", )?; // Verify user_data contains expected elements assert!(user_data.contains("hostname: test-vm")); assert!(user_data.contains("fqdn: test-vm.example.local")); assert!(user_data.contains("name: testuser")); assert!(user_data.contains("groups: ['wheel']")); assert!(user_data.contains("ssh-rsa AAAAB3NzaC1yc2E... test-key")); assert!(user_data.contains("timezone: UTC")); // Verify meta_data contains expected elements assert!(meta_data.contains("instance-id: test-vm")); assert!(meta_data.contains("local-hostname: test-vm")); Ok(()) } #[test] fn test_create_cloud_init_iso() -> Result<()> { // Skip if neither genisoimage nor mkisofs is available let has_genisoimage = std::process::Command::new("genisoimage") .arg("--version") .output() .is_ok(); let has_mkisofs = std::process::Command::new("mkisofs") .arg("--version") .output() .is_ok(); if !has_genisoimage && !has_mkisofs { println!("Skipping test_create_cloud_init_iso: neither genisoimage nor mkisofs available"); return Ok(()); } let temp_dir = tempdir()?; // Create test cloud-init data let user_data = "#cloud-config\nhostname: test-vm\n"; let meta_data = "instance-id: test-vm\nlocal-hostname: test-vm\n"; // Create ISO let iso_path = CloudInitManager::create_cloud_init_iso(temp_dir.path(), "test-vm", user_data, meta_data)?; // Verify ISO was created assert!(iso_path.exists()); assert!(fs::metadata(&iso_path)?.len() > 0); // Verify the temporary files were cleaned up assert!(!temp_dir.path().join("user-data").exists()); assert!(!temp_dir.path().join("meta-data").exists()); Ok(()) } #[test] fn test_find_ssh_public_key() { // This test is tricky because it depends on the local environment // Just check that the function either succeeds or fails with a reasonable error match CloudInitManager::find_ssh_public_key() { Ok(key) => { assert!(!key.is_empty()); assert!(key.starts_with("ssh-")); } Err(e) => { // The error should mention SSH keys assert!(format!("{}", e).contains("SSH")); } } }