[FEATURE] `predelete` hook: run a statement or script before a resource's `delete`
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Domain
- cloud, devops, infrastructure
Research direction
Start by reading the teardown delete flow and the existing type: script resource contract, then inspect tests/live_stacks/aws_ssm_onfailure for the existing S3 DeleteBucket failure case. Define and test the ordering, retry, failure, dry-run, skip, and idempotency behavior described here; done means a predelete anchor and manifest script work without affecting build or test.
Written by the indexing model from the issue text.
Description
Problem
Some resources cannot be deleted until something else is done to them first, and that something is not expressible as a single statement in the resource's .iql file. The canonical case is an S3 bucket: DeleteBucket fails with 409 BucketNotEmpty (surfaced by stackql as no response body for operation = DeleteBucket) while the bucket holds objects, and emptying a bucket needs an object listing loop (and a version listing loop for versioned buckets). A Databricks workspace root bucket is never empty at teardown time because the control plane writes DBFS and log data into it.
Today the only options are:
skip_on_delete: trueon the bucket, which retains it (fine when the data should be kept, wrong when it should not),--on-failure ignore, which finishes the teardown but leaves the bucket behind, or- an out-of-band
aws s3 rm --recursivebefore runningteardown.
Other resources with the same shape: ECR repositories with images, Cognito user pools with a deletion protection flag, RDS instances with deletion protection, Key Vaults with soft delete, GitHub repositories with branch protection rules, or any resource where a dependent that is not managed by the stack has to be cleared first.
Proposal
A predelete hook that teardown runs for a resource after the exists check reports the resource present and before its delete statement. Two forms:
- A
/*+ predelete */anchor in the resource's.iqlfile for cases that are a single statement (for example flipping a deletion protection property with anUPDATE, or aDELETEon a dependent resource that the provider can address in one call). Rendered with the same context asdelete, includingthis.*fields captured by the exists check. - A
predeletescript in the manifest for cases that need a loop or an external tool, using the same contract astype: scriptresources (run withsh -c, exports optional):
- name: aws/s3/root_bucket
file: aws/s3/bucket.iql
predelete:
run: aws s3 rm s3://{{ root_bucket_name }} --recursive
props:
- name: bucket_name
value: "{{ root_bucket_name }}"
If both are present the anchor runs first, then the script.
Behaviour to pin down
- Ordering. exists check, then
predelete, thendelete, thencallback:delete, then the post-delete check (perpostdelete_retries/postdelete_retry_delay). When the delete is re-issued (thedeleteanchor'sretries),predeleteshould run again before each attempt, since the reason for the retry may be that more objects appeared. - Failure. A failing
predeleteis a failed delete: abort under--on-failure error, log and report the resource as not confirmed deleted under--on-failure ignore. Fatal errors abort in both modes. - Dry run. Render and log the anchor / script without executing, like
delete. - Not run when the resource does not exist, when the resource has
skip_on_delete: true, or when the delete is skipped because a query references an export that could not be collected. - Not run by
buildortest. - Idempotency is the author's responsibility, as with
scriptresources; document that apredeletemay run more than once per teardown. - The anchor form should support the usual options (
retries,retry_delay).
Related
- #56 / #57:
skip_on_delete,--on-failure ignoreand the end-of-run summary of unconfirmed deletes, which are the current workarounds. - The
tests/live_stacks/aws_ssm_onfailurelive stack already has an S3DeleteBucketfailure case; apredeletethat empties a bucket could be exercised there, or in a small dedicated S3 stack (an empty standard bucket is free).
- Dominant language
- Rust
- Stars
- 1
- Forks
- 0
- Avg merge
- 12m
- Merged PRs (30d)
- 3
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from stackql/stackql-deploy-rs
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
stackql/stackql-deploy-rs#59 · 1 comment ·
-
[FEATURE] Waiter semantics for `callback`: stop on terminal failure, time-based bounds, backoff Openenhancement
Difficulty 5/5 Over a week Newbie friendliness 45/100
stackql/stackql-deploy-rs#60 ·
All issues in stackql/stackql-deploy-rs
Similar issues
-
Browser (wasm) relay client cannot connect to relays whose URL has a trailing-dot FQDN hostname Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
n0-computer/iroh#4550 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
paritytech/zombienet-sdk#591 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
farion1231/cc-switch#7638 · 1 comment ·
-
onnx-ir re-exports ModelProto and GraphProto but not NodeProto, AttributeProto and AttributeType Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100