test(ilm): cover manual transition endpoint contract (#5295)

Co-authored-by: heihutu <heihutu@gmail.com>
This commit is contained in:
houseme
2026-07-26 20:36:53 +08:00
committed by GitHub
parent 7f0c42e2bb
commit e0bd18bd50
+28
View File
@@ -354,6 +354,7 @@ struct ManualTransitionRunResponse {
mode: String, mode: String,
job_id: Option<String>, job_id: Option<String>,
status_endpoint: Option<String>, status_endpoint: Option<String>,
cancel_endpoint: Option<String>,
report: ManualTransitionRunReport, report: ManualTransitionRunReport,
} }
@@ -394,6 +395,7 @@ struct ManualTransitionRunReport {
struct ManualTransitionJobStatusResponse { struct ManualTransitionJobStatusResponse {
job_id: String, job_id: String,
status_endpoint: String, status_endpoint: String,
cancel_endpoint: String,
status: String, status: String,
cancel_requested: bool, cancel_requested: bool,
failure_reason: Option<String>, failure_reason: Option<String>,
@@ -886,10 +888,16 @@ async fn test_manual_transition_async_job_status_polling() -> TestResult {
status_endpoint.ends_with(job_id), status_endpoint.ends_with(job_id),
"status endpoint must embed job id: endpoint={status_endpoint}, job_id={job_id}" "status endpoint must embed job id: endpoint={status_endpoint}, job_id={job_id}"
); );
assert_eq!(
accepted.cancel_endpoint.as_deref(),
Some(status_endpoint),
"async run must return the cancel endpoint used by rc cancel"
);
let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?; let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?;
assert_eq!(terminal.job_id, job_id); assert_eq!(terminal.job_id, job_id);
assert_eq!(terminal.status_endpoint, status_endpoint); assert_eq!(terminal.status_endpoint, status_endpoint);
assert_eq!(terminal.cancel_endpoint, status_endpoint);
assert_eq!(terminal.status, "completed", "terminal job response: {terminal:#?}"); assert_eq!(terminal.status, "completed", "terminal job response: {terminal:#?}");
assert!(!terminal.cancel_requested); assert!(!terminal.cancel_requested);
assert_eq!(terminal.failure_reason, None); assert_eq!(terminal.failure_reason, None);
@@ -915,6 +923,8 @@ async fn test_manual_transition_async_job_status_polling() -> TestResult {
let after_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?; let after_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?;
assert_eq!(after_cancel.status, "completed"); assert_eq!(after_cancel.status, "completed");
assert_eq!(after_cancel.status_endpoint, status_endpoint);
assert_eq!(after_cancel.cancel_endpoint, status_endpoint);
assert!(!after_cancel.cancel_requested); assert!(!after_cancel.cancel_requested);
assert_eq!( assert_eq!(
cold_tier_object_count(&cold_client).await?, cold_tier_object_count(&cold_client).await?,
@@ -963,10 +973,16 @@ async fn test_manual_transition_async_limit_reports_terminal_partial() -> TestRe
.status_endpoint .status_endpoint
.as_deref() .as_deref()
.ok_or("async response must include status_endpoint")?; .ok_or("async response must include status_endpoint")?;
assert_eq!(
accepted.cancel_endpoint.as_deref(),
Some(status_endpoint),
"async partial run must return the cancel endpoint used by rc cancel"
);
let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?; let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?;
assert_eq!(terminal.job_id, job_id); assert_eq!(terminal.job_id, job_id);
assert_eq!(terminal.status_endpoint, status_endpoint); assert_eq!(terminal.status_endpoint, status_endpoint);
assert_eq!(terminal.cancel_endpoint, status_endpoint);
assert_eq!(terminal.status, "partial", "terminal limit job response: {terminal:#?}"); assert_eq!(terminal.status, "partial", "terminal limit job response: {terminal:#?}");
assert!(!terminal.cancel_requested); assert!(!terminal.cancel_requested);
assert_eq!(terminal.failure_reason, None); assert_eq!(terminal.failure_reason, None);
@@ -990,6 +1006,8 @@ async fn test_manual_transition_async_limit_reports_terminal_partial() -> TestRe
let after_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?; let after_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?;
assert_eq!(after_cancel.status, "partial"); assert_eq!(after_cancel.status, "partial");
assert_eq!(after_cancel.status_endpoint, status_endpoint);
assert_eq!(after_cancel.cancel_endpoint, status_endpoint);
assert!(!after_cancel.cancel_requested); assert!(!after_cancel.cancel_requested);
assert_eq!(after_cancel.report.bucket, terminal.report.bucket); assert_eq!(after_cancel.report.bucket, terminal.report.bucket);
assert_eq!(after_cancel.report.prefix, terminal.report.prefix); assert_eq!(after_cancel.report.prefix, terminal.report.prefix);
@@ -1004,6 +1022,8 @@ async fn test_manual_transition_async_limit_reports_terminal_partial() -> TestRe
let second_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?; let second_cancel = manual_transition_job_cancel(&hot, status_endpoint).await?;
assert_eq!(second_cancel.status, "partial"); assert_eq!(second_cancel.status, "partial");
assert_eq!(second_cancel.status_endpoint, status_endpoint);
assert_eq!(second_cancel.cancel_endpoint, status_endpoint);
assert!(!second_cancel.cancel_requested); assert!(!second_cancel.cancel_requested);
assert_eq!(second_cancel.report.scanned, terminal.report.scanned); assert_eq!(second_cancel.report.scanned, terminal.report.scanned);
assert_eq!(second_cancel.report.transition_completed, terminal.report.transition_completed); assert_eq!(second_cancel.report.transition_completed, terminal.report.transition_completed);
@@ -1462,21 +1482,29 @@ async fn test_manual_transition_async_active_cancel_reports_terminal_cancelled()
.status_endpoint .status_endpoint
.as_deref() .as_deref()
.ok_or("async response must include status_endpoint")?; .ok_or("async response must include status_endpoint")?;
assert_eq!(
accepted.cancel_endpoint.as_deref(),
Some(status_endpoint),
"async active-cancel run must return the cancel endpoint used by rc cancel"
);
let active = wait_for_manual_transition_job_running(&hot, status_endpoint, MANUAL_ACTIVE_CANCEL_RUNNING_TIMEOUT).await?; let active = wait_for_manual_transition_job_running(&hot, status_endpoint, MANUAL_ACTIVE_CANCEL_RUNNING_TIMEOUT).await?;
assert_eq!(active.job_id, job_id); assert_eq!(active.job_id, job_id);
assert_eq!(active.status_endpoint, status_endpoint); assert_eq!(active.status_endpoint, status_endpoint);
assert_eq!(active.cancel_endpoint, status_endpoint);
assert!(!active.cancel_requested); assert!(!active.cancel_requested);
let cancel_response = manual_transition_job_cancel(&hot, status_endpoint).await?; let cancel_response = manual_transition_job_cancel(&hot, status_endpoint).await?;
assert_eq!(cancel_response.job_id, job_id); assert_eq!(cancel_response.job_id, job_id);
assert_eq!(cancel_response.status_endpoint, status_endpoint); assert_eq!(cancel_response.status_endpoint, status_endpoint);
assert_eq!(cancel_response.cancel_endpoint, status_endpoint);
assert_eq!(cancel_response.status, "running", "active cancel response: {cancel_response:#?}"); assert_eq!(cancel_response.status, "running", "active cancel response: {cancel_response:#?}");
assert!(cancel_response.cancel_requested, "active cancel response: {cancel_response:#?}"); assert!(cancel_response.cancel_requested, "active cancel response: {cancel_response:#?}");
let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?; let terminal = wait_for_manual_transition_job_terminal(&hot, status_endpoint, StdDuration::from_secs(30)).await?;
assert_eq!(terminal.job_id, job_id); assert_eq!(terminal.job_id, job_id);
assert_eq!(terminal.status_endpoint, status_endpoint); assert_eq!(terminal.status_endpoint, status_endpoint);
assert_eq!(terminal.cancel_endpoint, status_endpoint);
assert_eq!(terminal.status, "cancelled", "terminal active cancel response: {terminal:#?}"); assert_eq!(terminal.status, "cancelled", "terminal active cancel response: {terminal:#?}");
assert!(terminal.cancel_requested); assert!(terminal.cancel_requested);
assert_eq!(terminal.failure_reason, None); assert_eq!(terminal.failure_reason, None);