Revert "v0.4.65: Local directory ISO source (bind-mount workaround for Unraid)"

This reverts commit 72a2089c98.
This commit is contained in:
Miles Ward
2026-05-28 10:47:17 -04:00
parent 761489761c
commit 07e7c18698
12 changed files with 29 additions and 1027 deletions
+1 -95
View File
@@ -14,7 +14,7 @@ use axum::body::Body;
use axum::http::{header, Request, StatusCode};
use openpxe_core::{ClientRegistry, DeploymentQueue, HostBindings, LogBus, Metrics, SettingsStore};
use openpxe_http_api::{build_router, AppState};
use openpxe_iso_store::{IsoStore, LocalDirManager, NfsHostCaps, NfsManager};
use openpxe_iso_store::{IsoStore, NfsManager};
use tempfile::tempdir;
use tower::ServiceExt;
@@ -96,8 +96,6 @@ async fn build_state() -> (AppState, tempfile::TempDir) {
let settings = SettingsStore::load_or_default(dir.path());
let nfs = NfsManager::new(dir.path(), iso_store.clone());
iso_store.set_nfs_root(nfs.mount_root());
let local_dirs = LocalDirManager::new(dir.path(), iso_store.clone());
let nfs_host_caps = NfsHostCaps::detect();
let log_bus = LogBus::new(64);
let hosts = HostBindings::load_or_default(dir.path());
let boot_log = openpxe_core::BootLog::load_or_default(dir.path());
@@ -120,8 +118,6 @@ async fn build_state() -> (AppState, tempfile::TempDir) {
metrics,
smb: None,
nfs,
local_dirs,
nfs_host_caps,
uploads: openpxe_http_api::uploads::UploadSessions::default(),
log_bus,
started_at: time::OffsetDateTime::now_utc(),
@@ -499,96 +495,6 @@ async fn nfs_list_starts_empty() {
assert_eq!(v["mounts"].as_array().unwrap().len(), 0);
}
// ── v0.4.65: host kernel caps + local directories ───────────────────────
#[tokio::test]
async fn nfs_capabilities_endpoint_returns_a_snapshot() {
// The endpoint must always answer 200 with the shape the UI
// expects, regardless of what `/proc/filesystems` actually says on
// the test host. (CI runs both with and without NFS modules.)
let (state, _dir) = build_state().await;
let app = build_router(state);
let (s, b) = get(&app, "/api/nfs/capabilities").await;
assert_eq!(s, StatusCode::OK);
let v: serde_json::Value = serde_json::from_slice(&b).unwrap();
assert!(v["available"].is_boolean());
assert!(v["has_nfs3"].is_boolean());
assert!(v["has_nfs4"].is_boolean());
assert!(v["detail"].is_string());
// Consistency: availability is true iff at least one of the
// booleans is true.
let derived = v["has_nfs3"].as_bool().unwrap() || v["has_nfs4"].as_bool().unwrap();
assert_eq!(v["available"].as_bool().unwrap(), derived);
}
#[tokio::test]
async fn local_dirs_list_starts_empty() {
let (state, _dir) = build_state().await;
let app = build_router(state);
let (s, b) = get(&app, "/api/local-dirs").await;
assert_eq!(s, StatusCode::OK);
let v: serde_json::Value = serde_json::from_slice(&b).unwrap();
assert_eq!(v["directories"].as_array().unwrap().len(), 0);
}
#[tokio::test]
async fn local_dirs_add_rejects_relative_path() {
let (state, _dir) = build_state().await;
let app = build_router(state);
let (s, b) = post_json(
&app,
"/api/local-dirs",
r#"{"path":"relative/path"}"#,
)
.await;
assert_eq!(s, StatusCode::BAD_REQUEST);
let msg = String::from_utf8_lossy(&b);
assert!(
msg.to_lowercase().contains("absolute"),
"expected absolute-path hint, got: {msg}"
);
}
#[tokio::test]
async fn local_dirs_add_then_remove_round_trip() {
let (state, work_dir) = build_state().await;
let app = build_router(state);
// Use a fresh subdirectory of the test's work_dir as the bind-
// mount stand-in. It exists, is readable, contains no ISOs.
let dir = work_dir.path().join("external-isos");
std::fs::create_dir(&dir).unwrap();
let body = format!(
r#"{{"path":"{}","label":"my-isos"}}"#,
dir.display()
);
let (s, b) = post_json(&app, "/api/local-dirs", &body).await;
assert_eq!(s, StatusCode::CREATED, "add: {}", String::from_utf8_lossy(&b));
let added: serde_json::Value = serde_json::from_slice(&b).unwrap();
let id = added["id"].as_str().unwrap().to_string();
assert_eq!(added["label"], "my-isos");
assert_eq!(added["iso_count"], 0);
// List should now show one row.
let (s, b) = get(&app, "/api/local-dirs").await;
assert_eq!(s, StatusCode::OK);
let v: serde_json::Value = serde_json::from_slice(&b).unwrap();
assert_eq!(v["directories"].as_array().unwrap().len(), 1);
// Remove (DELETE) clears the row.
let req = Request::builder()
.method("DELETE")
.uri(format!("/api/local-dirs/{id}"))
.body(axum::body::Body::empty())
.unwrap();
let resp = app.clone().oneshot(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::NO_CONTENT);
let (s, b) = get(&app, "/api/local-dirs").await;
assert_eq!(s, StatusCode::OK);
let v: serde_json::Value = serde_json::from_slice(&b).unwrap();
assert_eq!(v["directories"].as_array().unwrap().len(), 0);
}
#[tokio::test]
async fn terminal_help_and_status_round_trip() {
let (state, _dir) = build_state().await;