fix RequiresNew in diff
With the new diff.Apply we can keep the diff mostly intact, but we need turn off all RequiresNew flags so that the prior state is not removed from the apply.
This commit is contained in:
parent
653bb74403
commit
3b04b41250
|
@ -15,6 +15,27 @@ func TestResourceList_changed(t *testing.T) {
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
resource.TestStep{
|
resource.TestStep{
|
||||||
Config: strings.TrimSpace(`
|
Config: strings.TrimSpace(`
|
||||||
|
resource "test_resource_list" "foo" {
|
||||||
|
list_block {
|
||||||
|
string = "a"
|
||||||
|
int = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"test_resource_list.foo", "list_block.#", "1",
|
||||||
|
),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"test_resource_list.foo", "list_block.0.string", "a",
|
||||||
|
),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"test_resource_list.foo", "list_block.0.int", "1",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
Config: strings.TrimSpace(`
|
||||||
resource "test_resource_list" "foo" {
|
resource "test_resource_list" "foo" {
|
||||||
list_block {
|
list_block {
|
||||||
string = "a"
|
string = "a"
|
||||||
|
|
|
@ -713,17 +713,27 @@ func (s *GRPCProviderServer) ApplyResourceChange(_ context.Context, req *proto.A
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// strip out non-diffs
|
|
||||||
for k, v := range diff.Attributes {
|
|
||||||
if v.New == v.Old && !v.NewComputed && v.NewExtra == "" {
|
|
||||||
delete(diff.Attributes, k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if private != nil {
|
if private != nil {
|
||||||
diff.Meta = private
|
diff.Meta = private
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We need to turn off any RequiresNew. There could be attributes
|
||||||
|
// without changes in here inserted by helper/schema, but if they have
|
||||||
|
// RequiresNew then the state will will be dropped from the ResourceData.
|
||||||
|
for k := range diff.Attributes {
|
||||||
|
diff.Attributes[k].RequiresNew = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// check that any "removed" attributes actually exist in the prior state, or
|
||||||
|
// helper/schema will confuse itself
|
||||||
|
for k, d := range diff.Attributes {
|
||||||
|
if d.NewRemoved {
|
||||||
|
if _, ok := priorState.Attributes[k]; !ok {
|
||||||
|
delete(diff.Attributes, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
newInstanceState, err := s.provider.Apply(info, priorState, diff)
|
newInstanceState, err := s.provider.Apply(info, priorState, diff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
|
resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
|
||||||
|
|
Loading…
Reference in New Issue