Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization
linux
microvm
firecracker
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}