openvmm_helpers/
hypervisor.rs1use hypervisor_resources::HypervisorKind;
8use vm_resource::Resource;
9
10pub fn choose_hypervisor() -> anyhow::Result<Resource<HypervisorKind>> {
15 for probe in hypervisor_resources::probes() {
16 if let Some(resource) = probe.try_new_resource()? {
17 return Ok(resource);
18 }
19 }
20 anyhow::bail!("no hypervisor available");
21}
22
23fn parse_hypervisor_spec(spec: &str) -> anyhow::Result<(&str, Vec<(&str, &str)>)> {
28 let (name, rest) = spec.split_once(':').unwrap_or((spec, ""));
29 anyhow::ensure!(!name.is_empty(), "empty hypervisor name in spec: {spec}");
30 let params = if rest.is_empty() {
31 Vec::new()
32 } else {
33 rest.split(',')
34 .filter(|item| !item.is_empty())
35 .map(|item| {
36 let (key, val) = item.split_once('=').unwrap_or((item, "true"));
37 anyhow::ensure!(!key.is_empty(), "empty parameter key in spec: {spec}");
38 Ok((key, val))
39 })
40 .collect::<anyhow::Result<Vec<_>>>()?
41 };
42 Ok((name, params))
43}
44
45pub fn hypervisor_resource(spec: &str) -> anyhow::Result<Resource<HypervisorKind>> {
52 let (name, params) = parse_hypervisor_spec(spec)?;
53 let probe = hypervisor_resources::probe_by_name(name)
54 .ok_or_else(|| anyhow::anyhow!("unknown hypervisor: {name}"))?;
55 probe.new_resource(¶ms)
56}