Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 2 additions & 11 deletions crates/api-core/src/handlers/power_shelf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,8 @@ pub async fn delete_power_shelf(
}

/// Force deletes a power shelf and optionally its associated interfaces from the database.
/// Unlike `delete_power_shelf` (soft delete), this immediately hard-deletes the power shelf,
/// its state history, and optionally its machine interfaces.
/// Unlike `delete_power_shelf` (soft delete), this immediately hard-deletes the power shelf
/// while retaining its state history.
pub async fn admin_force_delete_power_shelf(
api: &Api,
request: Request<rpc::AdminForceDeletePowerShelfRequest>,
Expand Down Expand Up @@ -275,15 +275,6 @@ pub async fn admin_force_delete_power_shelf(
interfaces_deleted = interface_ids.len() as u32;
}

// Delete state history.
db::state_history::delete_by_object_id(
&mut txn,
db::state_history::StateHistoryTableId::PowerShelf,
&power_shelf_id,
)
.await
.map_err(CarbideError::from)?;

// Hard-delete the power shelf.
db_power_shelf::final_delete(power_shelf_id, &mut txn)
.await
Expand Down
10 changes: 1 addition & 9 deletions crates/api-core/src/handlers/rack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ pub async fn delete_rack(

/// Force deletes a rack from the database.
/// Unlike `delete_rack` (soft delete), this immediately hard-deletes the rack
/// and its state history.
/// while retaining its state history.
pub async fn admin_force_delete_rack(
api: &Api,
request: Request<rpc::AdminForceDeleteRackRequest>,
Expand Down Expand Up @@ -242,14 +242,6 @@ pub async fn admin_force_delete_rack(
.into());
}

db::state_history::delete_by_object_id(
&mut txn,
db::state_history::StateHistoryTableId::Rack,
&rack_id,
)
.await
.map_err(CarbideError::from)?;

db_rack::final_delete(&mut txn, &rack_id)
.await
.map_err(CarbideError::from)?;
Expand Down
13 changes: 2 additions & 11 deletions crates/api-core/src/handlers/switch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,8 @@ pub async fn delete_switch(
}

/// Force deletes a switch and optionally its associated interfaces from the database.
/// Unlike `delete_switch` (soft delete), this immediately hard-deletes the switch,
/// its state history, and optionally its machine interfaces.
/// Unlike `delete_switch` (soft delete), this immediately hard-deletes the switch
/// while retaining its state history.
pub async fn admin_force_delete_switch(
api: &Api,
request: Request<rpc::AdminForceDeleteSwitchRequest>,
Expand Down Expand Up @@ -359,15 +359,6 @@ pub async fn admin_force_delete_switch(
interfaces_deleted = interface_ids.len() as u32;
}

// Delete state history.
db::state_history::delete_by_object_id(
&mut txn,
db::state_history::StateHistoryTableId::Switch,
&switch_id,
)
.await
.map_err(CarbideError::from)?;

// Hard-delete the switch.
db_switch::final_delete(switch_id, &mut txn)
.await
Expand Down
2 changes: 1 addition & 1 deletion crates/api-core/src/tests/machine_history.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ async fn test_old_machine_state_history(

let mut txn = env.pool.begin().await?;

let query = "INSERT INTO machine_state_history (machine_id, state, state_version) VALUES ($1, $2::jsonb, $3)";
let query = "INSERT INTO machine_state_history (object_id, state, state_version) VALUES ($1, $2::jsonb, $3)";
sqlx::query(query)
.bind(host_machine_id.to_string())
.bind(r#"{"state": "hostinit", "machine_state": {"state": "nolongerarealstate"}}"#)
Expand Down
25 changes: 25 additions & 0 deletions crates/api-core/src/tests/power_shelf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,17 @@ async fn test_force_delete_power_shelf_success(
)
.await?;

let mut txn = env.pool.begin().await?;
db::state_history::persist(
&mut txn,
db::state_history::StateHistoryTableId::PowerShelf,
&power_shelf_id,
&"retained-before-force-delete",
config_version::ConfigVersion::initial(),
)
.await?;
txn.commit().await?;

// Force delete without deleting interfaces.
let response = env
.api
Expand Down Expand Up @@ -666,6 +677,20 @@ async fn test_force_delete_power_shelf_success(
"Power shelf should be hard-deleted"
);

let mut conn = env.pool.acquire().await?;
let history = db::state_history::for_object(
&mut conn,
db::state_history::StateHistoryTableId::PowerShelf,
&power_shelf_id,
)
.await?;
assert!(
history
.iter()
.any(|record| record.state == r#""retained-before-force-delete""#),
"Power shelf state history should be retained",
);

Ok(())
}

Expand Down
25 changes: 25 additions & 0 deletions crates/api-core/src/tests/rack_find.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,17 @@ async fn test_force_delete_rack_success(
.unwrap();
drop(txn);

let mut txn = env.pool.begin().await?;
db::state_history::persist(
&mut txn,
db::state_history::StateHistoryTableId::Rack,
&rack_id,
&"retained-before-force-delete",
config_version::ConfigVersion::initial(),
)
.await?;
txn.commit().await?;

let response = env
.api
.admin_force_delete_rack(tonic::Request::new(AdminForceDeleteRackRequest {
Expand All @@ -147,6 +158,20 @@ async fn test_force_delete_rack_success(

assert!(racks.is_empty(), "Rack should be hard-deleted");

let mut conn = env.pool.acquire().await?;
let history = db::state_history::for_object(
&mut conn,
db::state_history::StateHistoryTableId::Rack,
&rack_id,
)
.await?;
assert!(
history
.iter()
.any(|record| record.state == r#""retained-before-force-delete""#),
"Rack state history should be retained",
);

Ok(())
}

Expand Down
25 changes: 25 additions & 0 deletions crates/api-core/src/tests/switch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,17 @@ async fn test_force_delete_switch_success(

let switch_id = new_switch(&env, None, None).await?;

let mut txn = env.pool.begin().await?;
db::state_history::persist(
&mut txn,
db::state_history::StateHistoryTableId::Switch,
&switch_id,
&"retained-before-force-delete",
config_version::ConfigVersion::initial(),
)
.await?;
txn.commit().await?;

// Force delete without deleting interfaces.
let response = env
.api
Expand Down Expand Up @@ -655,6 +666,20 @@ async fn test_force_delete_switch_success(
"Switch should be hard-deleted"
);

let mut conn = env.pool.acquire().await?;
let history = db::state_history::for_object(
&mut conn,
db::state_history::StateHistoryTableId::Switch,
&switch_id,
)
.await?;
assert!(
history
.iter()
.any(|record| record.state == r#""retained-before-force-delete""#),
"Switch state history should be retained",
);

Ok(())
}

Expand Down
4 changes: 2 additions & 2 deletions crates/api-core/src/tests/vpc_prefix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -466,9 +466,9 @@ async fn test_deleted_provisioning_vpc_prefix_enters_deleting_on_first_controlle
assert_eq!(
sqlx::query_scalar::<_, i64>(
"SELECT COUNT(*) FROM vpc_prefix_state_history \
WHERE vpc_prefix_id = $1 AND state->>'state' = 'ready'",
WHERE object_id = $1 AND state->>'state' = 'ready'",
)
.bind(id)
.bind(id.to_string())
.fetch_one(&env.pool)
.await
.expect("Could not count ready history records"),
Expand Down
Loading
Loading