mirror of
https://github.com/CloudNebulaProject/reddwarf.git
synced 2026-04-10 13:20:40 +00:00
Service networking:
- ClusterIP IPAM allocation on service create/delete via reusable Ipam with_prefix()
- ServiceController watches Pod/Service events + periodic reconcile to track endpoints
- NatManager generates ipnat rdr rules for ClusterIP -> pod IP forwarding
- Embedded DNS server resolves {svc}.{ns}.svc.cluster.local to ClusterIP
- New CLI flags: --service-cidr (default 10.96.0.0/12), --cluster-dns (default 0.0.0.0:10053)
Quick wins:
- ipadm IP assignment: configure_zone_ip() runs ipadm/route inside zone via zlogin after boot
- Node heartbeat zone state reporting: reddwarf.io/zone-count and zone-summary annotations
- bhyve brand support: ZoneBrand::Bhyve, install args, zonecfg device generation, controller integration
189 tests passing, clippy clean.
https://claude.ai/code/session_016QLFjAyYGzMPbBjEGMe75j
83 lines
3 KiB
Rust
83 lines
3 KiB
Rust
use crate::error::Result;
|
|
use crate::types::{NetworkMode, ZoneConfig, ZoneInfo, ZoneState};
|
|
use async_trait::async_trait;
|
|
|
|
/// Trait for zone runtime implementations
|
|
///
|
|
/// This trait abstracts over the illumos zone lifecycle and networking
|
|
/// operations. It enables testing via `MockRuntime` on non-illumos platforms.
|
|
///
|
|
/// Storage operations (ZFS dataset create/destroy, snapshots, volumes) are
|
|
/// handled by the separate `StorageEngine` trait, which is injected into
|
|
/// runtime implementations.
|
|
#[async_trait]
|
|
pub trait ZoneRuntime: Send + Sync {
|
|
// --- Zone lifecycle ---
|
|
|
|
/// Create a zone configuration (zonecfg)
|
|
async fn create_zone(&self, config: &ZoneConfig) -> Result<()>;
|
|
|
|
/// Install a zone (zoneadm install)
|
|
async fn install_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
/// Boot a zone (zoneadm boot)
|
|
async fn boot_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
/// Gracefully shut down a zone (zoneadm shutdown)
|
|
async fn shutdown_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
/// Forcefully halt a zone (zoneadm halt)
|
|
async fn halt_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
/// Uninstall a zone (zoneadm uninstall -F)
|
|
async fn uninstall_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
/// Delete a zone configuration (zonecfg delete -F)
|
|
async fn delete_zone(&self, zone_name: &str) -> Result<()>;
|
|
|
|
// --- Zone query ---
|
|
|
|
/// Get the current state of a zone
|
|
async fn get_zone_state(&self, zone_name: &str) -> Result<ZoneState>;
|
|
|
|
/// Get full info about a zone
|
|
async fn get_zone_info(&self, zone_name: &str) -> Result<ZoneInfo>;
|
|
|
|
/// List all managed zones
|
|
async fn list_zones(&self) -> Result<Vec<ZoneInfo>>;
|
|
|
|
// --- Exec ---
|
|
|
|
/// Execute a command inside a running zone
|
|
///
|
|
/// Returns the command output including exit code. A non-zero exit code
|
|
/// is NOT treated as an error — callers (e.g. probe executors) interpret
|
|
/// the exit code themselves.
|
|
async fn exec_in_zone(
|
|
&self,
|
|
zone_name: &str,
|
|
command: &[String],
|
|
) -> Result<crate::command::CommandOutput>;
|
|
|
|
// --- Networking ---
|
|
|
|
/// Set up network for a zone
|
|
async fn setup_network(&self, zone_name: &str, network: &NetworkMode) -> Result<()>;
|
|
|
|
/// Configure IP address inside a running zone via ipadm
|
|
///
|
|
/// Must be called after the zone is booted. Creates the IP interface,
|
|
/// assigns a static address, and configures the default route.
|
|
async fn configure_zone_ip(&self, zone_name: &str, network: &NetworkMode) -> Result<()>;
|
|
|
|
/// Tear down network for a zone
|
|
async fn teardown_network(&self, zone_name: &str, network: &NetworkMode) -> Result<()>;
|
|
|
|
// --- High-level lifecycle ---
|
|
|
|
/// Full provisioning: create dataset -> setup network -> create zone -> install -> boot
|
|
async fn provision(&self, config: &ZoneConfig) -> Result<()>;
|
|
|
|
/// Full deprovisioning: halt -> uninstall -> delete -> teardown network -> destroy dataset
|
|
async fn deprovision(&self, config: &ZoneConfig) -> Result<()>;
|
|
}
|