mod common;
use std::time::Duration;
use lightshuttle_manifest::Manifest;
use lightshuttle_runtime::{LifecycleManager, LifecyclePlan};
const HEALTH_DEADLINE: Duration = Duration::from_secs(60);
const STOP_GRACE: Duration = Duration::from_secs(3);
fn plan_from(yaml: &str) -> LifecyclePlan {
let manifest = Manifest::parse(yaml).expect("manifest parses");
LifecyclePlan::from_manifest(&manifest).expect("plan builds")
}
#[tokio::test]
#[ignore = "requires a running Docker daemon"]
async fn sibling_resolves_peer_by_resource_alias() {
if !common::docker_available() {
eprintln!("skipping: docker not available");
return;
}
let project = common::unique_project("dns");
let _guard = common::ProjectCleanup::new(project.clone());
let plan = plan_from(&dns_stack(&project));
let runtime = lightshuttle_runtime::DockerRuntime::connect().expect("Docker daemon reachable");
let (manager, mut events) = LifecycleManager::new(plan, runtime);
manager.start_all().await.expect("stack boots");
common::wait_for_healthy(&mut events, "client", HEALTH_DEADLINE)
.await
.expect("client should resolve `server` by alias and report healthy");
manager.stop_all(STOP_GRACE).await.expect("stack stops");
}
fn dns_stack(project: &str) -> String {
format!(
r#"
project:
name: {project}
resources:
server:
container:
image: alpine:3.20
command: ["sh", "-c", "sleep 60"]
client:
container:
image: alpine:3.20
command: ["sh", "-c", "sleep 60"]
depends_on: [server]
healthcheck:
test: ["CMD-SHELL", "ping -c1 -W2 server || exit 1"]
interval: "1s"
timeout: "3s"
retries: 10
start_period: "1s"
"#
)
}