Skip to content

Commit eb32039

Browse files
Luke Hobanlblackstone
Luke Hoban
andauthoredJul 1, 2021
Add replaceOnChanges resource option (pulumi#7226)
Adds a new resource option to force replacement when certain properties report changes, even if the resource provider itself does not require a replacement. Fixes pulumi#6753. Co-authored-by: Levi Blackstone <levi@pulumi.com>
1 parent 2781cf0 commit eb32039

File tree

66 files changed

+998
-347
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+998
-347
lines changed
 

‎CHANGELOG_PENDING.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
### Improvements
3-
3+
4+
- [sdk] - Add `replaceOnChanges` resource option.
5+
[#7226](https://github.com/pulumi/pulumi/pull/722
46

57
### Bug Fixes
6-

‎pkg/engine/lifeycletest/golang_sdk_test.go

+78
Original file line numberDiff line numberDiff line change
@@ -722,3 +722,81 @@ func TestProviderInheritanceGolangLifecycle(t *testing.T) {
722722
}
723723
p.Run(t, nil)
724724
}
725+
726+
// This test validates the wiring of the ReplaceOnChanges prop in the go SDK.
727+
// It doesn't attempt to validate underlying behavior.
728+
func TestReplaceOnChangesGolangLifecycle(t *testing.T) {
729+
var expectedReplaceOnChanges []string
730+
731+
loaders := []*deploytest.ProviderLoader{
732+
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
733+
return &deploytest.Provider{
734+
CreateF: func(urn resource.URN, news resource.PropertyMap, timeout float64,
735+
preview bool) (resource.ID, resource.PropertyMap, resource.Status, error) {
736+
737+
return "created-id", news, resource.StatusOK, nil
738+
},
739+
ReadF: func(urn resource.URN, id resource.ID,
740+
inputs, state resource.PropertyMap) (plugin.ReadResult, resource.Status, error) {
741+
return plugin.ReadResult{Inputs: inputs, Outputs: state}, resource.StatusOK, nil
742+
},
743+
DiffF: func(urn resource.URN, id resource.ID,
744+
olds, news resource.PropertyMap, replaceOnChanges []string) (plugin.DiffResult, error) {
745+
// just verify that the ReplaceOnChanges prop made it through
746+
assert.Equal(t, expectedReplaceOnChanges, replaceOnChanges)
747+
return plugin.DiffResult{}, nil
748+
},
749+
}, nil
750+
}),
751+
}
752+
753+
setupAndRunProgram := func(replaceOnChanges []string) *deploy.Snapshot {
754+
program := deploytest.NewLanguageRuntime(func(info plugin.RunInfo, monitor *deploytest.ResourceMonitor) error {
755+
ctx, err := pulumi.NewContext(context.Background(), pulumi.RunInfo{
756+
Project: info.Project,
757+
Stack: info.Stack,
758+
Parallel: info.Parallel,
759+
DryRun: info.DryRun,
760+
MonitorAddr: info.MonitorAddress,
761+
})
762+
assert.NoError(t, err)
763+
764+
return pulumi.RunWithContext(ctx, func(ctx *pulumi.Context) error {
765+
var res pulumi.CustomResourceState
766+
err := ctx.RegisterResource("pkgA:m:typA", "resA", nil, &res, pulumi.ReplaceOnChanges(replaceOnChanges))
767+
assert.NoError(t, err)
768+
769+
return nil
770+
})
771+
})
772+
773+
host := deploytest.NewPluginHost(nil, nil, program, loaders...)
774+
p := &TestPlan{
775+
Options: UpdateOptions{Host: host},
776+
Steps: []TestStep{
777+
{
778+
Op: Update,
779+
Validate: func(project workspace.Project, target deploy.Target, entries JournalEntries,
780+
events []Event, res result.Result) result.Result {
781+
for _, event := range events {
782+
if event.Type == ResourcePreEvent {
783+
payload := event.Payload().(ResourcePreEventPayload)
784+
assert.Equal(t, []deploy.StepOp{deploy.OpCreate}, []deploy.StepOp{payload.Metadata.Op})
785+
}
786+
}
787+
return res
788+
},
789+
},
790+
},
791+
}
792+
return p.Run(t, nil)
793+
}
794+
795+
// replace on changes specified
796+
replaceOnChanges := []string{"b"}
797+
setupAndRunProgram(replaceOnChanges)
798+
799+
// replace on changes empty
800+
replaceOnChanges = []string{}
801+
setupAndRunProgram(replaceOnChanges)
802+
}

0 commit comments

Comments
 (0)
Please sign in to comment.