diff --git a/crates/krata/proto/krata/common.proto b/crates/krata/proto/krata/common.proto index cbf6e69..a402d0a 100644 --- a/crates/krata/proto/krata/common.proto +++ b/crates/krata/proto/krata/common.proto @@ -1,13 +1,24 @@ syntax = "proto3"; +package krata.common; + option java_multiple_files = true; option java_package = "dev.krata.proto.common"; option java_outer_classname = "CommonProto"; -package krata.common; +message Guest { + string id = 1; + GuestSpec spec = 2; + GuestState state = 3; +} -message GuestOciImageSpec { - string image = 1; +message GuestSpec { + string name = 1; + GuestImageSpec image = 2; + uint32 vcpus = 3; + uint64 mem = 4; + repeated GuestEnvVar env = 5; + repeated string run = 6; } message GuestImageSpec { @@ -16,13 +27,30 @@ message GuestImageSpec { } } -message GuestSpec { - string name = 1; - GuestImageSpec image = 2; - uint32 vcpus = 3; - uint64 mem = 4; - repeated string env = 5; - repeated string run = 6; +message GuestOciImageSpec { + string image = 1; +} + +message GuestEnvVar { + string key = 1; + string value = 2; +} + +message GuestState { + GuestStatus status = 1; + GuestNetworkState network = 2; + GuestExitInfo exit_info = 3; + GuestErrorInfo error_info = 4; +} + +enum GuestStatus { + GUEST_STATUS_UNKNOWN = 0; + GUEST_STATUS_STARTING = 1; + GUEST_STATUS_STARTED = 2; + GUEST_STATUS_EXITED = 3; + GUEST_STATUS_DESTROYING = 4; + GUEST_STATUS_DESTROYED = 5; + GUEST_STATUS_FAILED = 6; } message GuestNetworkState { @@ -37,26 +65,3 @@ message GuestExitInfo { message GuestErrorInfo { string message = 1; } - -enum GuestStatus { - GUEST_STATUS_UNKNOWN = 0; - GUEST_STATUS_STARTING = 1; - GUEST_STATUS_STARTED = 2; - GUEST_STATUS_EXITED = 3; - GUEST_STATUS_DESTROYING = 4; - GUEST_STATUS_DESTROYED = 5; - GUEST_STATUS_FAILED = 6; -} - -message GuestState { - GuestStatus status = 1; - GuestNetworkState network = 2; - GuestExitInfo exit_info = 3; - GuestErrorInfo error_info = 4; -} - -message Guest { - string id = 1; - GuestSpec spec = 2; - GuestState state = 3; -} diff --git a/crates/krata/proto/krata/control.proto b/crates/krata/proto/krata/control.proto index 090b7a3..a369421 100644 --- a/crates/krata/proto/krata/control.proto +++ b/crates/krata/proto/krata/control.proto @@ -1,13 +1,22 @@ syntax = "proto3"; +package krata.control; + option java_multiple_files = true; option java_package = "dev.krata.proto.control"; option java_outer_classname = "ControlProto"; -package krata.control; - import "krata/common.proto"; +service ControlService { + rpc CreateGuest(CreateGuestRequest) returns (CreateGuestReply); + rpc DestroyGuest(DestroyGuestRequest) returns (DestroyGuestReply); + rpc ResolveGuest(ResolveGuestRequest) returns (ResolveGuestReply); + rpc ListGuests(ListGuestsRequest) returns (ListGuestsReply); + rpc ConsoleData(stream ConsoleDataRequest) returns (stream ConsoleDataReply); + rpc WatchEvents(WatchEventsRequest) returns (stream WatchEventsReply); +} + message CreateGuestRequest { krata.common.GuestSpec spec = 1; } @@ -16,12 +25,12 @@ message CreateGuestReply { string guest_id = 1; } -message ListGuestsRequest {} - -message ListGuestsReply { - repeated krata.common.Guest guests = 1; +message DestroyGuestRequest { + string guest_id = 1; } +message DestroyGuestReply {} + message ResolveGuestRequest { string name = 1; } @@ -30,11 +39,11 @@ message ResolveGuestReply { krata.common.Guest guest = 1; } -message DestroyGuestRequest { - string guest_id = 1; -} +message ListGuestsRequest {} -message DestroyGuestReply {} +message ListGuestsReply { + repeated krata.common.Guest guests = 1; +} message ConsoleDataRequest { string guest_id = 1; @@ -47,21 +56,12 @@ message ConsoleDataReply { message WatchEventsRequest {} -message GuestChangedEvent { - krata.common.Guest guest = 1; -} - message WatchEventsReply { oneof event { GuestChangedEvent guest_changed = 1; } } -service ControlService { - rpc CreateGuest(CreateGuestRequest) returns (CreateGuestReply); - rpc DestroyGuest(DestroyGuestRequest) returns (DestroyGuestReply); - rpc ListGuests(ListGuestsRequest) returns (ListGuestsReply); - rpc ResolveGuest(ResolveGuestRequest) returns (ResolveGuestReply); - rpc ConsoleData(stream ConsoleDataRequest) returns (stream ConsoleDataReply); - rpc WatchEvents(WatchEventsRequest) returns (stream WatchEventsReply); +message GuestChangedEvent { + krata.common.Guest guest = 1; } diff --git a/crates/krata/src/launchcfg.rs b/crates/krata/src/launchcfg.rs index 8dae750..8a5d5b6 100644 --- a/crates/krata/src/launchcfg.rs +++ b/crates/krata/src/launchcfg.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] @@ -28,6 +30,6 @@ pub struct LaunchNetwork { #[derive(Serialize, Deserialize, Debug)] pub struct LaunchInfo { pub network: Option, - pub env: Option>, + pub env: HashMap, pub run: Option>, } diff --git a/crates/kratactl/src/cli/launch.rs b/crates/kratactl/src/cli/launch.rs index 66694e1..46a9f7c 100644 --- a/crates/kratactl/src/cli/launch.rs +++ b/crates/kratactl/src/cli/launch.rs @@ -1,7 +1,12 @@ +use std::collections::HashMap; + use anyhow::Result; use clap::Parser; use krata::{ - common::{guest_image_spec::Image, GuestImageSpec, GuestOciImageSpec, GuestSpec, GuestStatus}, + common::{ + guest_image_spec::Image, GuestEnvVar, GuestImageSpec, GuestOciImageSpec, GuestSpec, + GuestStatus, + }, control::{ control_service_client::ControlServiceClient, watch_events_reply::Event, CreateGuestRequest, }, @@ -46,7 +51,13 @@ impl LauchCommand { }), vcpus: self.cpus, mem: self.mem, - env: self.env.unwrap_or_default(), + env: env_map(&self.env.unwrap_or_default()) + .iter() + .map(|(key, value)| GuestEnvVar { + key: key.clone(), + value: value.clone(), + }) + .collect(), run: self.run, }), }; @@ -121,3 +132,13 @@ async fn wait_guest_started(id: &str, events: EventStream) -> Result<()> { } Ok(()) } + +fn env_map(env: &[String]) -> HashMap { + let mut map = HashMap::::new(); + for item in env { + if let Some((key, value)) = item.split_once('=') { + map.insert(key.to_string(), value.to_string()); + } + } + map +} diff --git a/crates/kratad/src/reconcile/guest.rs b/crates/kratad/src/reconcile/guest.rs index cfad6c1..3f4d5f4 100644 --- a/crates/kratad/src/reconcile/guest.rs +++ b/crates/kratad/src/reconcile/guest.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use std::{collections::HashMap, time::Duration}; use anyhow::{anyhow, Result}; use krata::{ @@ -199,7 +199,11 @@ impl GuestReconciler { image: &oci.image, vcpus: spec.vcpus, mem: spec.mem, - env: empty_vec_optional(spec.env.clone()), + env: spec + .env + .iter() + .map(|x| (x.key.clone(), x.value.clone())) + .collect::>(), run: empty_vec_optional(spec.run.clone()), debug: false, }) diff --git a/crates/krataguest/src/init.rs b/crates/krataguest/src/init.rs index 8bf73a2..99404a6 100644 --- a/crates/krataguest/src/init.rs +++ b/crates/krataguest/src/init.rs @@ -405,17 +405,14 @@ impl GuestInit { let path = cmd.remove(0); - let mut env = vec!["KRATA_CONTAINER=1".to_string(), "TERM=vt100".to_string()]; - + let mut env = HashMap::new(); if let Some(config_env) = config.env() { - env.extend_from_slice(config_env); + env.extend(GuestInit::env_map(config_env)); } + env.extend(launch.env.clone()); + env.insert("KRATA_CONTAINER".to_string(), "1".to_string()); + env.insert("TERM".to_string(), "vt100".to_string()); - if let Some(extra_env) = &launch.env { - env.extend_from_slice(extra_env.as_slice()); - } - - let env = GuestInit::env_map(env); let path = GuestInit::resolve_executable(&env, path.into())?; let Some(file_name) = path.file_name() else { return Err(anyhow!("cannot get file name of command path")); @@ -453,7 +450,7 @@ impl GuestInit { Ok(results) } - fn env_map(env: Vec) -> HashMap { + fn env_map(env: &[String]) -> HashMap { let mut map = HashMap::::new(); for item in env { if let Some((key, value)) = item.split_once('=') { diff --git a/crates/kratart/src/launch/mod.rs b/crates/kratart/src/launch/mod.rs index 781c0e0..d1dcc53 100644 --- a/crates/kratart/src/launch/mod.rs +++ b/crates/kratart/src/launch/mod.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::net::IpAddr; use std::{fs, net::Ipv4Addr, str::FromStr}; @@ -27,7 +28,7 @@ pub struct GuestLaunchRequest<'a> { pub image: &'a str, pub vcpus: u32, pub mem: u64, - pub env: Option>, + pub env: HashMap, pub run: Option>, pub debug: bool, }