use isoloom_manifest::Manifest;
use isoloom_plan::{Capabilities, Environment, Feature};
use isoloom_render::Error as RenderError;
use isoloom_render::backend::{Backend, Files};
use isoloom_render::run_manifest::guest::GuestCompose;
use isoloom_spec::model::Target;
use crate::render;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ComposeBackend(pub Target);
impl Backend for ComposeBackend {
fn target(&self) -> Target {
self.0
}
fn capabilities(&self) -> Capabilities {
capabilities()
}
fn render(&self, env: &Environment) -> Result<Files, RenderError> {
Ok(render::render(self.0, env)?)
}
fn run_manifest(&self, env: &Environment) -> Result<Option<Manifest>, RenderError> {
if self.0 != Target::Docker {
return Ok(None);
}
let file = render::compose_file(self.0, env)?.file;
Ok(Some(crate::manifest::docker(env, &file)?))
}
}
pub fn guest(env: &Environment) -> crate::Result<GuestCompose> {
let file = render::compose_file(Target::Docker, env)?.file;
crate::manifest::guest(env, &file)
}
pub(crate) fn capabilities() -> Capabilities {
Capabilities::of([
Feature::NetworkAppliances,
Feature::Gateways,
Feature::MachineAliases,
Feature::Ulimits,
Feature::TrafficControl,
Feature::Ipv6,
Feature::Ipv6Only,
Feature::Ipv6Auto,
Feature::Secrets,
Feature::SecretOwners,
Feature::OwnedProjectFiles,
Feature::ExternalNetworks,
Feature::MachineProcess,
Feature::ContainerGpus,
Feature::ContainerDevices,
Feature::PrivateDns,
Feature::DataDisks,
Feature::TmpfsModes,
Feature::PersistentVolumes,
Feature::ExternalVolumes,
])
}
#[must_use]
pub fn capabilities_on_a_vm() -> Capabilities {
Capabilities::of([
Feature::NetworkAppliances,
Feature::Gateways,
Feature::MachineAliases,
Feature::Ulimits,
Feature::TrafficControl,
Feature::DataDisks,
Feature::TmpfsModes,
Feature::Ipv6,
Feature::Ipv6Only,
Feature::Ipv6Auto,
Feature::Secrets,
Feature::SecretOwners,
Feature::OwnedProjectFiles,
Feature::MachineProcess,
Feature::PrivateDns,
])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_vm_runs_what_compose_does_but_what_only_the_users_own_host_has() {
let own_host_only = [
Feature::ExternalNetworks,
Feature::ContainerGpus,
Feature::ContainerDevices,
Feature::PersistentVolumes,
Feature::ExternalVolumes,
];
for f in own_host_only {
assert!(capabilities().has(f) && !capabilities_on_a_vm().has(f), "{f:?}");
}
assert!(capabilities_on_a_vm().has(Feature::Secrets));
}
}