diff --git a/helper/schema/grpc_provider.go b/helper/schema/grpc_provider.go index 49a541b4d5..d24c126899 100644 --- a/helper/schema/grpc_provider.go +++ b/helper/schema/grpc_provider.go @@ -1261,13 +1261,17 @@ func normalizeNullValues(dst, src cty.Value, apply bool) cty.Value { } // Handle null/empty changes for collections during apply. - // A change between null and empty values prefers src to make sure the state + // A change from emtpy to null values prefers src to make sure the state // is consistent between plan and apply. + // A change from null to empty values prefers dst to not generate drifts of + // values when refresh. if ty.IsCollectionType() && apply { dstEmpty := !dst.IsNull() && dst.IsKnown() && dst.LengthInt() == 0 srcEmpty := !src.IsNull() && src.IsKnown() && src.LengthInt() == 0 - if (src.IsNull() && dstEmpty) || (srcEmpty && dst.IsNull()) { + if src.IsNull() && dstEmpty { + return dst + } else if srcEmpty && dst.IsNull() { return src } } diff --git a/helper/schema/grpc_provider_test.go b/helper/schema/grpc_provider_test.go index 6dad0b3141..3b687eda6d 100644 --- a/helper/schema/grpc_provider_test.go +++ b/helper/schema/grpc_provider_test.go @@ -1369,7 +1369,7 @@ func TestNormalizeNullValues(t *testing.T) { "network_interface": cty.ListVal([]cty.Value{ cty.ObjectVal(map[string]cty.Value{ "network_ip": cty.StringVal("10.128.0.64"), - "access_config": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{"public_ptr_domain_name": cty.String, "nat_ip": cty.String}))), + "access_config": cty.ListValEmpty(cty.Object(map[string]cty.Type{"public_ptr_domain_name": cty.String, "nat_ip": cty.String})), "address": cty.StringVal("address"), "name": cty.StringVal("nic0"), }), @@ -1529,9 +1529,9 @@ func TestNormalizeNullValues(t *testing.T) { })), }), Expect: cty.ObjectVal(map[string]cty.Value{ - "set": cty.NullVal(cty.Set(cty.Object(map[string]cty.Type{ + "set": cty.SetValEmpty(cty.Object(map[string]cty.Type{ "list": cty.List(cty.String), - }))), + })), }), Apply: true, },