Remove deprecated Catalog v0 support and refactor legacy catalog handling.

- Removed `get_catalog` handler and associated Catalog v0 route.
- Updated `get_legacy_catalog` to accept `filename` for enhanced flexibility.
- Adjusted integration tests to validate changes and focus on Catalog v1 support.
- Refactored `SupportedOperation` definitions to exclude Catalog v0.
This commit is contained in:
Till Wegmueller 2025-12-08 22:10:11 +01:00
parent 048dddf487
commit 84b2c50ed6
No known key found for this signature in database
6 changed files with 6 additions and 27 deletions

View file

@ -1696,7 +1696,7 @@ impl FileBackend {
Err(RepositoryError::NotFound(format!("manifest for {} not found", fmri))) Err(RepositoryError::NotFound(format!("manifest for {} not found", fmri)))
} }
/// Fetch legacy catalog content (stub) /// Fetch legacy catalog content (stub)
pub fn fetch_legacy_catalog(&self, _publisher: &str) -> Result<String> { pub fn fetch_legacy_catalog(&self, _publisher: &str, _filename: &str) -> Result<PathBuf> {
todo!("Implement legacy catalog format for REST API"); todo!("Implement legacy catalog format for REST API");
} }

View file

@ -1,7 +1,6 @@
use axum::{ use axum::{
extract::{Path, State, Request}, extract::{Path, State, Request},
response::{IntoResponse, Response}, response::{IntoResponse, Response},
http::header,
}; };
use std::sync::Arc; use std::sync::Arc;
use crate::repo::DepotRepo; use crate::repo::DepotRepo;
@ -9,25 +8,12 @@ use crate::errors::DepotError;
use tower_http::services::ServeFile; use tower_http::services::ServeFile;
use tower::ServiceExt; use tower::ServiceExt;
pub async fn get_catalog(
State(repo): State<Arc<DepotRepo>>,
Path(publisher): Path<String>,
) -> Result<Response, DepotError> {
let content = repo.get_legacy_catalog(&publisher)?;
Ok((
[(header::CONTENT_TYPE, "text/plain")],
content
).into_response())
}
pub async fn get_catalog_v1( pub async fn get_catalog_v1(
State(repo): State<Arc<DepotRepo>>, State(repo): State<Arc<DepotRepo>>,
Path((publisher, filename)): Path<(String, String)>, Path((publisher, filename)): Path<(String, String)>,
req: Request, req: Request,
) -> Result<Response, DepotError> { ) -> Result<Response, DepotError> {
let path = repo.get_catalog_file_path(&publisher, &filename) let path = repo.get_legacy_catalog(&publisher, &filename)?;
.ok_or_else(|| DepotError::Repo(libips::repository::RepositoryError::NotFound(filename.clone())))?;
let service = ServeFile::new(path); let service = ServeFile::new(path);
let result = service.oneshot(req).await; let result = service.oneshot(req).await;

View file

@ -58,7 +58,7 @@ pub async fn get_versions() -> impl IntoResponse {
operations: vec![ operations: vec![
SupportedOperation { op: Operation::Info, versions: vec![0] }, SupportedOperation { op: Operation::Info, versions: vec![0] },
SupportedOperation { op: Operation::Versions, versions: vec![0] }, SupportedOperation { op: Operation::Versions, versions: vec![0] },
SupportedOperation { op: Operation::Catalog, versions: vec![0, 1] }, SupportedOperation { op: Operation::Catalog, versions: vec![1] },
SupportedOperation { op: Operation::Manifest, versions: vec![0, 1] }, SupportedOperation { op: Operation::Manifest, versions: vec![0, 1] },
SupportedOperation { op: Operation::File, versions: vec![0, 1] }, SupportedOperation { op: Operation::File, versions: vec![0, 1] },
SupportedOperation { op: Operation::Publisher, versions: vec![0, 1] }, SupportedOperation { op: Operation::Publisher, versions: vec![0, 1] },

View file

@ -9,7 +9,6 @@ use crate::http::handlers::{versions, catalog, manifest, file, info, publisher};
pub fn app_router(state: Arc<DepotRepo>) -> Router { pub fn app_router(state: Arc<DepotRepo>) -> Router {
Router::new() Router::new()
.route("/versions/0/", get(versions::get_versions)) .route("/versions/0/", get(versions::get_versions))
.route("/{publisher}/catalog/0/", get(catalog::get_catalog))
.route("/{publisher}/catalog/1/{filename}", get(catalog::get_catalog_v1)) .route("/{publisher}/catalog/1/{filename}", get(catalog::get_catalog_v1))
.route("/{publisher}/manifest/0/{fmri}", get(manifest::get_manifest)) .route("/{publisher}/manifest/0/{fmri}", get(manifest::get_manifest))
.route("/{publisher}/manifest/1/{fmri}", get(manifest::get_manifest)) .route("/{publisher}/manifest/1/{fmri}", get(manifest::get_manifest))

View file

@ -36,9 +36,9 @@ impl DepotRepo {
backend.fetch_manifest_text(publisher, fmri).map_err(DepotError::Repo) backend.fetch_manifest_text(publisher, fmri).map_err(DepotError::Repo)
} }
pub fn get_legacy_catalog(&self, publisher: &str) -> Result<String> { pub fn get_legacy_catalog(&self, publisher: &str, filename: &str) -> Result<PathBuf> {
let backend = self.backend.lock().map_err(|e| DepotError::Server(format!("Lock poisoned: {}", e)))?; let backend = self.backend.lock().map_err(|e| DepotError::Server(format!("Lock poisoned: {}", e)))?;
backend.fetch_legacy_catalog(publisher).map_err(DepotError::Repo) backend.fetch_legacy_catalog(publisher, filename).map_err(DepotError::Repo)
} }
pub fn get_catalog_file_path(&self, publisher: &str, filename: &str) -> Option<PathBuf> { pub fn get_catalog_file_path(&self, publisher: &str, filename: &str) -> Option<PathBuf> {

View file

@ -101,16 +101,10 @@ async fn test_depot_server() {
assert!(resp.status().is_success()); assert!(resp.status().is_success());
let text = resp.text().await.unwrap(); let text = resp.text().await.unwrap();
assert!(text.contains("pkg-server pkg6depotd-0.5.1")); assert!(text.contains("pkg-server pkg6depotd-0.5.1"));
assert!(text.contains("catalog 0 1")); assert!(text.contains("catalog 1"));
assert!(text.contains("manifest 0 1")); assert!(text.contains("manifest 0 1"));
// 2. Test Catalog // 2. Test Catalog
// Catalog v0 stub check
/*
let catalog_url = format!("{}/test/catalog/0/", base_url);
let resp = client.get(&catalog_url).send().await.unwrap();
assert!(resp.status().is_success());
*/
// Test Catalog v1 // Test Catalog v1
let catalog_v1_url = format!("{}/test/catalog/1/catalog.attrs", base_url); let catalog_v1_url = format!("{}/test/catalog/1/catalog.attrs", base_url);