Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization linux microvm firecracker
at main 96 lines 3.6 kB view raw
1use fire_config::{EtcdConfig, FireConfig, TailscaleOptions}; 2use firecracker_prepare::Distro; 3 4use crate::constants::{BRIDGE_DEV, FC_MAC, FIRECRACKER_SOCKET}; 5 6#[derive(Default, Clone)] 7pub struct VmOptions { 8 pub debian: Option<bool>, 9 pub alpine: Option<bool>, 10 pub ubuntu: Option<bool>, 11 pub nixos: Option<bool>, 12 pub fedora: Option<bool>, 13 pub gentoo: Option<bool>, 14 pub slackware: Option<bool>, 15 pub opensuse: Option<bool>, 16 pub opensuse_tumbleweed: Option<bool>, 17 pub almalinux: Option<bool>, 18 pub rockylinux: Option<bool>, 19 pub archlinux: Option<bool>, 20 pub vcpu: u16, 21 pub memory: u16, 22 pub vmlinux: Option<String>, 23 pub rootfs: Option<String>, 24 pub bootargs: Option<String>, 25 pub bridge: String, 26 pub tap: String, 27 pub api_socket: String, 28 pub mac_address: String, 29 pub etcd: Option<EtcdConfig>, 30 pub ssh_keys: Option<Vec<String>>, 31 pub tailscale: Option<TailscaleOptions>, 32} 33 34impl From<FireConfig> for VmOptions { 35 fn from(config: FireConfig) -> Self { 36 let vm = config.vm; 37 VmOptions { 38 debian: Some(config.distro == Distro::Debian), 39 alpine: Some(config.distro == Distro::Alpine), 40 ubuntu: Some(config.distro == Distro::Ubuntu), 41 nixos: Some(config.distro == Distro::NixOS), 42 fedora: Some(config.distro == Distro::Fedora), 43 gentoo: Some(config.distro == Distro::Gentoo), 44 slackware: Some(config.distro == Distro::Slackware), 45 opensuse: Some(config.distro == Distro::Opensuse), 46 opensuse_tumbleweed: Some(config.distro == Distro::OpensuseTumbleweed), 47 almalinux: Some(config.distro == Distro::Almalinux), 48 rockylinux: Some(config.distro == Distro::RockyLinux), 49 archlinux: Some(config.distro == Distro::Archlinux), 50 vcpu: vm.vcpu.unwrap_or(num_cpus::get() as u16), 51 memory: vm.memory.unwrap_or(512), 52 vmlinux: vm.vmlinux, 53 rootfs: vm.rootfs, 54 bootargs: vm.boot_args, 55 bridge: vm.bridge.unwrap_or(BRIDGE_DEV.into()), 56 tap: vm.tap.unwrap_or("".into()), 57 api_socket: vm.api_socket.unwrap_or(FIRECRACKER_SOCKET.into()), 58 mac_address: vm.mac.unwrap_or(FC_MAC.into()), 59 etcd: config.etcd.clone(), 60 ssh_keys: vm.ssh_keys.clone(), 61 tailscale: vm.tailscale.clone(), 62 } 63 } 64} 65 66impl Into<Distro> for VmOptions { 67 fn into(self) -> Distro { 68 if self.debian.unwrap_or(false) { 69 Distro::Debian 70 } else if self.alpine.unwrap_or(false) { 71 Distro::Alpine 72 } else if self.nixos.unwrap_or(false) { 73 Distro::NixOS 74 } else if self.fedora.unwrap_or(false) { 75 Distro::Fedora 76 } else if self.gentoo.unwrap_or(false) { 77 Distro::Gentoo 78 } else if self.slackware.unwrap_or(false) { 79 Distro::Slackware 80 } else if self.opensuse.unwrap_or(false) { 81 Distro::Opensuse 82 } else if self.opensuse_tumbleweed.unwrap_or(false) { 83 Distro::OpensuseTumbleweed 84 } else if self.almalinux.unwrap_or(false) { 85 Distro::Almalinux 86 } else if self.rockylinux.unwrap_or(false) { 87 Distro::RockyLinux 88 } else if self.archlinux.unwrap_or(false) { 89 Distro::Archlinux 90 } else if self.ubuntu.unwrap_or(true) { 91 Distro::Ubuntu 92 } else { 93 panic!("No valid distribution option provided."); 94 } 95 } 96}