test(podman): move podman_preflight into driver-podman integration tests

podman_preflight verifies that openshell-driver-podman fails fast when
its Podman socket is unreachable. It only needs the standalone driver
binary, not a gateway, so it never fit the gateway-backed e2e-podman
harness it lived under and never ran anywhere in CI.

Move it into crates/openshell-driver-podman/tests/ as a plain Cargo
integration test. It now runs via the existing required workspace test
job with no special mise task, workflow step, or coverage exception.

Signed-off-by: politerealism <burdcat17@gmail.com>
This commit is contained in:
politerealism
2026-09-28 13:50:13 -04:00
parent eef8bec0c9
commit d44269b126
5 changed files with 37 additions and 44 deletions
Generated
+1
View File
@@ -4264,6 +4264,7 @@ dependencies = [
"serde_json",
"tar",
"temp-env",
"tempfile",
"thiserror 2.0.20",
"tokio",
"tokio-stream",
@@ -51,6 +51,7 @@ openshell-otel-test-support = { path = "../openshell-otel-test-support" }
opentelemetry_sdk = { workspace = true, features = ["testing"] }
prost-types = { workspace = true }
temp-env = "0.3"
tempfile = "3"
tokio = { workspace = true, features = ["test-util"] }
[lints]
@@ -1,49 +1,47 @@
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
#![cfg(feature = "e2e-podman")]
//! Podman driver daemon-unavailable e2e tests.
//! Podman driver daemon-unavailable integration tests.
//!
//! These tests verify that `openshell-driver-podman` fails fast with an
//! actionable error when it cannot reach a Podman API socket, instead of
//! hanging or silently serving gRPC against a dead connection.
//!
//! The tests do NOT require a running Podman daemon or gateway — they point
//! They do NOT require a running Podman daemon or gateway — they point
//! `--podman-socket` at a path that is guaranteed not to exist to simulate
//! the daemon being unavailable.
//! the daemon being unavailable. As a plain Cargo integration test in this
//! crate, this runs via the normal `cargo test -p openshell-driver-podman`
//! lane with no special CI wiring: Cargo provides `CARGO_BIN_EXE_<name>` for
//! this crate's own `[[bin]]` target automatically.
use std::path::{Path, PathBuf};
use std::path::PathBuf;
use std::time::{Duration, Instant};
use openshell_e2e::harness::output::strip_ansi;
/// Strip ANSI escape codes (e.g. colors) from a string, for readable failure
/// messages. Not required for the assertions below to pass — the driver's
/// own tracing output carries ANSI codes even when captured non-interactively,
/// but they never fragment the substrings these tests check for — this is
/// purely so a failed assertion's `{clean}` output is readable.
fn strip_ansi(s: &str) -> String {
let mut out = String::with_capacity(s.len());
let mut chars = s.chars().peekable();
/// Locate the workspace root by walking up from this crate's manifest directory.
fn workspace_root() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.ancestors()
.nth(2)
.expect("failed to resolve workspace root from CARGO_MANIFEST_DIR")
.to_path_buf()
}
while let Some(c) = chars.next() {
if c == '\x1b' {
if chars.peek() == Some(&'[') {
chars.next();
for c in chars.by_ref() {
if c.is_ascii_alphabetic() {
break;
}
}
}
} else {
out.push(c);
}
}
/// Return the path to the `openshell-driver-podman` binary.
///
/// Uses `OPENSHELL_EXTERNAL_DRIVER_BIN` when set (the same env var the shell
/// e2e harness uses for prebuilt standalone driver artifacts), otherwise
/// expects the binary at `<workspace>/target/debug/openshell-driver-podman`.
fn driver_podman_bin() -> PathBuf {
let bin = std::env::var_os("OPENSHELL_EXTERNAL_DRIVER_BIN").map_or_else(
|| workspace_root().join("target/debug/openshell-driver-podman"),
PathBuf::from,
);
assert!(
bin.is_file(),
"openshell-driver-podman binary not found at {} — set OPENSHELL_EXTERNAL_DRIVER_BIN \
or run `cargo build -p openshell-driver-podman` first",
bin.display()
);
bin
out
}
/// Run `openshell-driver-podman` pointed at a Podman socket that does not
@@ -53,17 +51,19 @@ fn driver_podman_bin() -> PathBuf {
/// socket briefly re-activating), so this can take several seconds.
async fn run_with_unreachable_podman_socket() -> (String, i32, Duration, PathBuf) {
let tmpdir = tempfile::tempdir().expect("create isolated socket dir");
let missing_socket = tmpdir.path().join("openshell-e2e-nonexistent-podman.sock");
let missing_socket = tmpdir
.path()
.join("openshell-driver-podman-nonexistent.sock");
let start = Instant::now();
let mut cmd = tokio::process::Command::new(driver_podman_bin());
let mut cmd = tokio::process::Command::new(env!("CARGO_BIN_EXE_openshell-driver-podman"));
cmd.arg("--podman-socket")
.arg(&missing_socket)
.kill_on_drop(true)
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped());
let output = tokio::time::timeout(Duration::from_secs(60), cmd.output())
let output = tokio::time::timeout(Duration::from_mins(1), cmd.output())
.await
.expect("openshell-driver-podman should exit instead of hanging")
.expect("spawn openshell-driver-podman");
-5
View File
@@ -93,11 +93,6 @@ name = "podman_host_gateway"
path = "tests/podman_host_gateway.rs"
required-features = ["e2e-podman"]
[[test]]
name = "podman_preflight"
path = "tests/podman_preflight.rs"
required-features = ["e2e-podman"]
[[test]]
name = "podman_corporate_proxy"
path = "tests/podman_corporate_proxy.rs"
-4
View File
@@ -116,10 +116,6 @@ let
"podman_corporate_proxy"
"podman_gateway_start"
"podman_oci_identity"
# This validates the standalone driver binary's daemon-unavailable path and
# belongs in the Podman driver crate's integration tests. The E2E archive
# does not contain `openshell-driver-podman`.
"podman_preflight"
"provider_auto_create"
# The provider-refresh feature suite covers revoked Keycloak grants. This
# binary instead covers stable workload handles across repeated rotations