diff --git a/helper/plugin/grpc_provider.go b/helper/plugin/grpc_provider.go index 371b1701a..b1b4b5d3d 100644 --- a/helper/plugin/grpc_provider.go +++ b/helper/plugin/grpc_provider.go @@ -492,6 +492,8 @@ func (s *GRPCProviderServer) PlanResourceChange(_ context.Context, req *proto.Pl return resp, nil } + create := priorStateVal.IsNull() + proposedNewStateVal, err := msgpack.Unmarshal(req.ProposedNewState.Msgpack, block.ImpliedType()) if err != nil { resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err) @@ -533,7 +535,7 @@ func (s *GRPCProviderServer) PlanResourceChange(_ context.Context, req *proto.Pl } // if this is a new instance, we need to make sure ID is going to be computed - if priorStateVal.IsNull() { + if create { if diff == nil { diff = terraform.NewInstanceDiff() } @@ -556,6 +558,17 @@ func (s *GRPCProviderServer) PlanResourceChange(_ context.Context, req *proto.Pl priorState = &terraform.InstanceState{} } + // if we're not creating a new resource, remove any new computed fields + if !create { + for attr, d := range diff.Attributes { + // If there's no change, then don't let this go through as NewComputed. + // This usually only happens when Old and New are both empty. + if d.NewComputed && d.Old == d.New { + delete(diff.Attributes, attr) + } + } + } + // now we need to apply the diff to the prior state, so get the planned state plannedAttrs, err := diff.Apply(priorState.Attributes, block) @@ -598,7 +611,7 @@ func (s *GRPCProviderServer) PlanResourceChange(_ context.Context, req *proto.Pl // if this was creating the resource, we need to set any remaining computed // fields - if priorStateVal.IsNull() { + if create { plannedStateVal = SetUnknowns(plannedStateVal, block) }