This commit is contained in:
Maxime Van Hees
2025-09-01 16:12:50 +02:00
parent da3da0ae30
commit f4512b66cf
8 changed files with 991 additions and 238 deletions

View File

@@ -25,7 +25,7 @@ fn map_to_vmspec(spec: Map) -> Result<VmSpec, Box<EvalAltResult>> {
let memory_mb = get_int(&spec, "memory_mb").unwrap_or(512) as u32;
let cmdline = get_string(&spec, "cmdline");
let extra_args = get_string_array(&spec, "extra_args");
Ok(VmSpec {
id,
kernel_path,
@@ -37,6 +37,7 @@ fn map_to_vmspec(spec: Map) -> Result<VmSpec, Box<EvalAltResult>> {
memory_mb,
cmdline,
extra_args,
net_profile: None,
})
}
@@ -76,6 +77,8 @@ fn vmspec_to_map(s: &VmSpec) -> Map {
} else {
m.insert("extra_args".into(), Dynamic::UNIT);
}
// net_profile not exposed in Rhai yet; return UNIT for now
m.insert("net_profile".into(), Dynamic::UNIT);
m
}

View File

@@ -1,7 +1,7 @@
use crate::cloudhv::builder::CloudHvBuilder;
use crate::hostcheck::host_check_deps;
use crate::image_prep::{image_prepare, Flavor as ImgFlavor, ImagePrepOptions, NetPlanOpts};
use rhai::{Engine, EvalAltResult, Map};
use rhai::{Engine, EvalAltResult, Map, Array};
fn builder_new(id: &str) -> CloudHvBuilder {
CloudHvBuilder::new(id)
@@ -47,6 +47,30 @@ fn builder_no_default_net(mut b: CloudHvBuilder) -> CloudHvBuilder {
b
}
// New networking profile helpers
fn builder_network_default_nat(mut b: CloudHvBuilder) -> CloudHvBuilder {
b.network_default_nat();
b
}
fn builder_network_none(mut b: CloudHvBuilder) -> CloudHvBuilder {
b.network_none();
b
}
fn builder_network_bridge_only(mut b: CloudHvBuilder) -> CloudHvBuilder {
b.network_bridge_only();
b
}
fn builder_network_custom(mut b: CloudHvBuilder, args: Array) -> CloudHvBuilder {
let mut v: Vec<String> = Vec::new();
for it in args {
if it.is_string() {
v.push(it.clone().cast::<String>());
}
}
b.network_custom_cli(v);
b
}
fn builder_launch(mut b: CloudHvBuilder) -> Result<String, Box<EvalAltResult>> {
b.launch().map_err(|e| {
Box::new(EvalAltResult::ErrorRuntime(
@@ -102,6 +126,8 @@ fn vm_easy_launch(flavor: &str, id: &str, memory_mb: i64, vcpus: i64) -> Result<
if vcpus > 0 {
b.vcpus(vcpus as u32);
}
// Default profile: NAT with IPv6 via Mycelium (opt-out via env)
b.network_default_nat();
b.launch().map_err(|e| {
Box::new(EvalAltResult::ErrorRuntime(
format!("vm_easy_launch failed at launch: {}", e).into(),
@@ -125,6 +151,11 @@ pub fn register_cloudhv_builder_module(engine: &mut Engine) -> Result<(), Box<Ev
engine.register_fn("cmdline", builder_cmdline);
engine.register_fn("extra_arg", builder_extra_arg);
engine.register_fn("no_default_net", builder_no_default_net);
// Networking profiles
engine.register_fn("network_default_nat", builder_network_default_nat);
engine.register_fn("network_none", builder_network_none);
engine.register_fn("network_bridge_only", builder_network_bridge_only);
engine.register_fn("network_custom", builder_network_custom);
// Action
engine.register_fn("launch", builder_launch);