pulumi/pkg/backend/display
Will Jones ba43cb6fc7
Don't set `PendingReplacement` until `Delete` succeeds (#16699)
There are a number of use cases for `Delete` steps in a Pulumi
operation. Aside from direct deletions, where a resource has been
removed from a program, they are also a key component of _replacements_,
whereby a resource has changed in a manner where it cannot simply be
updated in the provider but instead must be completely removed and
reconstructed. In such cases, Pulumi offers two options:

* "Delete after replace", in which a new resource is first created
before the old one is deleted.
* "Delete before replace", in which the old resource is first deleted
before a replacement is created.

Delete-after-replace is the default, since where possible it is
typically the preferred option by users, enabling e.g. zero-downtime
deployments. However, there are cases where delete-after-replace is not
possible (e.g. because the new and old resources would clash in some
manner), and so delete-before-replace is an option that can be opted
into.

In cases where the deletion must happen first, we must be careful how we
handle the Pulumi state. Either or both of the delete and create calls
could fail, and we always want a state file that tells us how to resume
a failed call to yield the desired outcome. In the case of
delete-before-replace operations, a key component of resumable state is
the `PendingReplacement` field on a resource. `PendingReplacement`
indicates that a resource has been deleted in the provider, but that
this deletion is part of a replacement (and thus that a create call will
subsequently occur). In this way, the deleted resource can remain in the
state file throughout the operation, meaning that e.g. resources that
depend on the deleted resource won't have their dependencies violated
(causing a snapshot integrity error).

Alas, until this point, `PendingReplacement` was set unconditionally on
the creation of a delete-before-replace step, meaning that if the
provider delete failed, we'd elide the delete on a retry and end up with
a bad state failing snapshot integrity checks. This commit fixes this by
moving the setting of `PendingReplacement` inside `DeleteStep.Apply`, so
that it occurs only if the provider delete call succeeds. It also adds a
lifecycle test to test this case and hopefully guard against
regressions.

Fixes #16597
Part of #16667
2024-07-18 12:27:06 +00:00
..
internal/terminal Add vim shortcuts and Home and End Keys to terminal (#15418) 2024-02-24 08:31:36 +00:00
testdata Don't rewrite step operations following failure (#16292) 2024-05-31 10:48:07 +00:00
wasm [display] Enable WASM compilation (#16246) 2024-05-24 20:27:56 +00:00
diff.go Change `pulumi refresh` to report diff relative to desired state instead of relative to only output changes (#16146) 2024-06-12 16:17:05 +00:00
diff_test.go Fix JSON/YAML diffs (#15171) 2024-01-18 14:19:54 +00:00
display.go display: only hide replacement steps in diff (#16065) 2024-04-26 14:54:21 +00:00
doc.go Document Go packages (#6009) 2021-01-11 11:07:59 -07:00
events.go be consistent in the way we round seconds (#16070) 2024-04-29 08:46:36 +00:00
events_test.go Don't omit an empty detailedDiff (#15213) 2024-01-23 00:00:14 +00:00
json.go Change `pulumi refresh` to report diff relative to desired state instead of relative to only output changes (#16146) 2024-06-12 16:17:05 +00:00
jsonmessage.go Decouple persist and display events (#15709) 2024-03-18 16:53:13 +00:00
object_diff.go Fix mangled diffs of strings containing url-encoded chars (#16147) 2024-05-08 08:23:40 +00:00
object_diff_test.go Fix a panic in diff display when parsing YAML strings (#14710) 2023-12-02 01:24:13 +00:00
options.go Add display to the engine tests (#16050) 2024-05-13 07:18:25 +00:00
progress.go Don't set `PendingReplacement` until `Delete` succeeds (#16699) 2024-07-18 12:27:06 +00:00
progress_test.go Display `[retain]` in all cases of delete retention (#16506) 2024-06-28 23:19:26 +00:00
query.go Add `--suppress-progresss` flag to CLI (#14690) 2024-02-05 11:48:10 +00:00
rows.go Display `[retain]` in all cases of delete retention (#16506) 2024-06-28 23:19:26 +00:00
sigint_unix.go [cli] Reimplement the interactive renderer 2022-11-07 22:02:44 -08:00
sigint_windows.go [cli] Reimplement the interactive renderer 2022-11-07 22:02:44 -08:00
tableutil.go [color] Use graphemes to measure strings. 2022-11-09 08:23:00 -08:00
tree.go Add display to the engine tests (#16050) 2024-05-13 07:18:25 +00:00
tree_test.go fix deadlock in stopwatch mutex (#16129) 2024-05-06 16:28:18 +00:00
watch.go turn on the golangci-lint exhaustive linter (#15028) 2024-01-17 16:50:41 +00:00