diff --git a/internal/plans/changes.go b/internal/plans/changes.go index bcab96ed6d..ba06244cb9 100644 --- a/internal/plans/changes.go +++ b/internal/plans/changes.go @@ -147,6 +147,19 @@ type ResourceInstanceChange struct { // will apply to. Addr addrs.AbsResourceInstance + // PrevRunAddr is the absolute address that this resource instance had at + // the conclusion of a previous run. + // + // This will typically be the same as Addr, but can be different if the + // previous resource instance was subject to a "moved" block that we + // handled in the process of creating this plan. + // + // For the initial creation of a resource instance there isn't really any + // meaningful "previous run address", but PrevRunAddr will still be set + // equal to Addr in that case in order to simplify logic elsewhere which + // aims to detect and react to the movement of instances between addresses. + PrevRunAddr addrs.AbsResourceInstance + // DeposedKey is the identifier for a deposed object associated with the // given instance, or states.NotDeposed if this change applies to the // current object. @@ -203,8 +216,15 @@ func (rc *ResourceInstanceChange) Encode(ty cty.Type) (*ResourceInstanceChangeSr if err != nil { return nil, err } + prevRunAddr := rc.PrevRunAddr + if prevRunAddr.Resource.Resource.Type == "" { + // Suggests an old caller that hasn't been properly updated to + // populate this yet. + prevRunAddr = rc.Addr + } return &ResourceInstanceChangeSrc{ Addr: rc.Addr, + PrevRunAddr: prevRunAddr, DeposedKey: rc.DeposedKey, ProviderAddr: rc.ProviderAddr, ChangeSrc: *cs, diff --git a/internal/plans/changes_src.go b/internal/plans/changes_src.go index b254f17600..69330a21d8 100644 --- a/internal/plans/changes_src.go +++ b/internal/plans/changes_src.go @@ -16,6 +16,19 @@ type ResourceInstanceChangeSrc struct { // will apply to. Addr addrs.AbsResourceInstance + // PrevRunAddr is the absolute address that this resource instance had at + // the conclusion of a previous run. + // + // This will typically be the same as Addr, but can be different if the + // previous resource instance was subject to a "moved" block that we + // handled in the process of creating this plan. + // + // For the initial creation of a resource instance there isn't really any + // meaningful "previous run address", but PrevRunAddr will still be set + // equal to Addr in that case in order to simplify logic elsewhere which + // aims to detect and react to the movement of instances between addresses. + PrevRunAddr addrs.AbsResourceInstance + // DeposedKey is the identifier for a deposed object associated with the // given instance, or states.NotDeposed if this change applies to the // current object. @@ -66,8 +79,15 @@ func (rcs *ResourceInstanceChangeSrc) Decode(ty cty.Type) (*ResourceInstanceChan if err != nil { return nil, err } + prevRunAddr := rcs.PrevRunAddr + if prevRunAddr.Resource.Resource.Type == "" { + // Suggests an old caller that hasn't been properly updated to + // populate this yet. + prevRunAddr = rcs.Addr + } return &ResourceInstanceChange{ Addr: rcs.Addr, + PrevRunAddr: prevRunAddr, DeposedKey: rcs.DeposedKey, ProviderAddr: rcs.ProviderAddr, Change: *change, diff --git a/internal/plans/internal/planproto/planfile.pb.go b/internal/plans/internal/planproto/planfile.pb.go index e5e6dc7aca..9f541946c6 100644 --- a/internal/plans/internal/planproto/planfile.pb.go +++ b/internal/plans/internal/planproto/planfile.pb.go @@ -194,52 +194,6 @@ func (ResourceInstanceActionReason) EnumDescriptor() ([]byte, []int) { return file_planfile_proto_rawDescGZIP(), []int{2} } -type ResourceInstanceChange_ResourceMode int32 - -const ( - ResourceInstanceChange_managed ResourceInstanceChange_ResourceMode = 0 // for "resource" blocks in configuration - ResourceInstanceChange_data ResourceInstanceChange_ResourceMode = 1 // for "data" blocks in configuration -) - -// Enum value maps for ResourceInstanceChange_ResourceMode. -var ( - ResourceInstanceChange_ResourceMode_name = map[int32]string{ - 0: "managed", - 1: "data", - } - ResourceInstanceChange_ResourceMode_value = map[string]int32{ - "managed": 0, - "data": 1, - } -) - -func (x ResourceInstanceChange_ResourceMode) Enum() *ResourceInstanceChange_ResourceMode { - p := new(ResourceInstanceChange_ResourceMode) - *p = x - return p -} - -func (x ResourceInstanceChange_ResourceMode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ResourceInstanceChange_ResourceMode) Descriptor() protoreflect.EnumDescriptor { - return file_planfile_proto_enumTypes[3].Descriptor() -} - -func (ResourceInstanceChange_ResourceMode) Type() protoreflect.EnumType { - return &file_planfile_proto_enumTypes[3] -} - -func (x ResourceInstanceChange_ResourceMode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ResourceInstanceChange_ResourceMode.Descriptor instead. -func (ResourceInstanceChange_ResourceMode) EnumDescriptor() ([]byte, []int) { - return file_planfile_proto_rawDescGZIP(), []int{3, 0} -} - // Plan is the root message type for the tfplan file type Plan struct { state protoimpl.MessageState @@ -553,27 +507,16 @@ type ResourceInstanceChange struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // module_path is an address to the module that defined this resource. - // module_path is omitted for resources in the root module. For descendent modules - // it is a string like module.foo.module.bar as would be seen at the beginning of a - // resource address. The format of this string is not yet frozen and so external - // callers should treat it as an opaque key for filtering purposes. - ModulePath string `protobuf:"bytes,1,opt,name=module_path,json=modulePath,proto3" json:"module_path,omitempty"` - // mode is the resource mode. - Mode ResourceInstanceChange_ResourceMode `protobuf:"varint,2,opt,name=mode,proto3,enum=tfplan.ResourceInstanceChange_ResourceMode" json:"mode,omitempty"` - // type is the resource type name, like "aws_instance". - Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` - // name is the logical name of the resource as defined in configuration. - // For example, in aws_instance.foo this would be "foo". - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - // instance_key is either an integer index or a string key, depending on which iteration - // attributes ("count" or "for_each") are being used for this resource. If none - // are in use, this field is omitted. + // addr is a string representation of the resource instance address that + // this change will apply to. + Addr string `protobuf:"bytes,13,opt,name=addr,proto3" json:"addr,omitempty"` + // prev_run_addr is a string representation of the address at which + // this resource instance was tracked during the previous apply operation. // - // Types that are assignable to InstanceKey: - // *ResourceInstanceChange_Str - // *ResourceInstanceChange_Int - InstanceKey isResourceInstanceChange_InstanceKey `protobuf_oneof:"instance_key"` + // This is populated only if it would be different from addr due to + // Terraform having reacted to refactoring annotations in the configuration. + // If empty, the previous run address is the same as the current address. + PrevRunAddr string `protobuf:"bytes,14,opt,name=prev_run_addr,json=prevRunAddr,proto3" json:"prev_run_addr,omitempty"` // deposed_key, if set, indicates that this change applies to a deposed // object for the indicated instance with the given deposed key. If not // set, the change applies to the instance's current object. @@ -583,8 +526,7 @@ type ResourceInstanceChange struct { // apply it. Provider string `protobuf:"bytes,8,opt,name=provider,proto3" json:"provider,omitempty"` // Description of the proposed change. May use "create", "read", "update", - // "replace" and "delete" actions. "no-op" changes are not currently used here - // but consumers must accept and discard them to allow for future expansion. + // "replace", "delete" and "no-op" actions. Change *Change `protobuf:"bytes,9,opt,name=change,proto3" json:"change,omitempty"` // raw blob value provided by the provider as additional context for the // change. Must be considered an opaque value for any consumer other than @@ -633,55 +575,20 @@ func (*ResourceInstanceChange) Descriptor() ([]byte, []int) { return file_planfile_proto_rawDescGZIP(), []int{3} } -func (x *ResourceInstanceChange) GetModulePath() string { +func (x *ResourceInstanceChange) GetAddr() string { if x != nil { - return x.ModulePath + return x.Addr } return "" } -func (x *ResourceInstanceChange) GetMode() ResourceInstanceChange_ResourceMode { +func (x *ResourceInstanceChange) GetPrevRunAddr() string { if x != nil { - return x.Mode - } - return ResourceInstanceChange_managed -} - -func (x *ResourceInstanceChange) GetType() string { - if x != nil { - return x.Type + return x.PrevRunAddr } return "" } -func (x *ResourceInstanceChange) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (m *ResourceInstanceChange) GetInstanceKey() isResourceInstanceChange_InstanceKey { - if m != nil { - return m.InstanceKey - } - return nil -} - -func (x *ResourceInstanceChange) GetStr() string { - if x, ok := x.GetInstanceKey().(*ResourceInstanceChange_Str); ok { - return x.Str - } - return "" -} - -func (x *ResourceInstanceChange) GetInt() int64 { - if x, ok := x.GetInstanceKey().(*ResourceInstanceChange_Int); ok { - return x.Int - } - return 0 -} - func (x *ResourceInstanceChange) GetDeposedKey() string { if x != nil { return x.DeposedKey @@ -724,22 +631,6 @@ func (x *ResourceInstanceChange) GetActionReason() ResourceInstanceActionReason return ResourceInstanceActionReason_NONE } -type isResourceInstanceChange_InstanceKey interface { - isResourceInstanceChange_InstanceKey() -} - -type ResourceInstanceChange_Str struct { - Str string `protobuf:"bytes,5,opt,name=str,proto3,oneof"` -} - -type ResourceInstanceChange_Int struct { - Int int64 `protobuf:"varint,6,opt,name=int,proto3,oneof"` -} - -func (*ResourceInstanceChange_Str) isResourceInstanceChange_InstanceKey() {} - -func (*ResourceInstanceChange_Int) isResourceInstanceChange_InstanceKey() {} - type OutputChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1125,84 +1016,73 @@ var file_planfile_proto_rawDesc = []byte{ 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x13, 0x61, 0x66, 0x74, 0x65, 0x72, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x22, 0x84, 0x04, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3f, - 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x12, 0x0a, 0x03, 0x69, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x06, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, + 0x68, 0x73, 0x22, 0xd3, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x52, 0x75, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x49, 0x0a, + 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, - 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, - 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x10, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x68, 0x0a, 0x0c, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, - 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x22, 0x1e, 0x0a, - 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x22, 0xa5, 0x01, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, - 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, - 0x74, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2a, 0x31, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, - 0x54, 0x52, 0x4f, 0x59, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, - 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x2a, 0x70, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, - 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, - 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, - 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x80, 0x01, 0x0a, 0x1c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, - 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x44, - 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, - 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, - 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x41, - 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x42, 0x42, 0x5a, - 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x22, 0x1e, 0x0a, 0x04, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x22, 0xa5, 0x01, 0x0a, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, + 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x74, + 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x37, 0x0a, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x2a, 0x31, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, + 0x52, 0x4f, 0x59, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, + 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x2a, 0x70, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, + 0x06, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x80, 0x01, 0x0a, 0x1c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, + 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, 0x5f, + 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x50, + 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x4e, + 0x4e, 0x4f, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x42, 0x42, 0x5a, 0x40, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1217,51 +1097,49 @@ func file_planfile_proto_rawDescGZIP() []byte { return file_planfile_proto_rawDescData } -var file_planfile_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_planfile_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_planfile_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_planfile_proto_goTypes = []interface{}{ - (Mode)(0), // 0: tfplan.Mode - (Action)(0), // 1: tfplan.Action - (ResourceInstanceActionReason)(0), // 2: tfplan.ResourceInstanceActionReason - (ResourceInstanceChange_ResourceMode)(0), // 3: tfplan.ResourceInstanceChange.ResourceMode - (*Plan)(nil), // 4: tfplan.Plan - (*Backend)(nil), // 5: tfplan.Backend - (*Change)(nil), // 6: tfplan.Change - (*ResourceInstanceChange)(nil), // 7: tfplan.ResourceInstanceChange - (*OutputChange)(nil), // 8: tfplan.OutputChange - (*DynamicValue)(nil), // 9: tfplan.DynamicValue - (*Hash)(nil), // 10: tfplan.Hash - (*Path)(nil), // 11: tfplan.Path - nil, // 12: tfplan.Plan.VariablesEntry - nil, // 13: tfplan.Plan.ProviderHashesEntry - (*Path_Step)(nil), // 14: tfplan.Path.Step + (Mode)(0), // 0: tfplan.Mode + (Action)(0), // 1: tfplan.Action + (ResourceInstanceActionReason)(0), // 2: tfplan.ResourceInstanceActionReason + (*Plan)(nil), // 3: tfplan.Plan + (*Backend)(nil), // 4: tfplan.Backend + (*Change)(nil), // 5: tfplan.Change + (*ResourceInstanceChange)(nil), // 6: tfplan.ResourceInstanceChange + (*OutputChange)(nil), // 7: tfplan.OutputChange + (*DynamicValue)(nil), // 8: tfplan.DynamicValue + (*Hash)(nil), // 9: tfplan.Hash + (*Path)(nil), // 10: tfplan.Path + nil, // 11: tfplan.Plan.VariablesEntry + nil, // 12: tfplan.Plan.ProviderHashesEntry + (*Path_Step)(nil), // 13: tfplan.Path.Step } var file_planfile_proto_depIdxs = []int32{ 0, // 0: tfplan.Plan.ui_mode:type_name -> tfplan.Mode - 12, // 1: tfplan.Plan.variables:type_name -> tfplan.Plan.VariablesEntry - 7, // 2: tfplan.Plan.resource_changes:type_name -> tfplan.ResourceInstanceChange - 8, // 3: tfplan.Plan.output_changes:type_name -> tfplan.OutputChange - 13, // 4: tfplan.Plan.provider_hashes:type_name -> tfplan.Plan.ProviderHashesEntry - 5, // 5: tfplan.Plan.backend:type_name -> tfplan.Backend - 9, // 6: tfplan.Backend.config:type_name -> tfplan.DynamicValue + 11, // 1: tfplan.Plan.variables:type_name -> tfplan.Plan.VariablesEntry + 6, // 2: tfplan.Plan.resource_changes:type_name -> tfplan.ResourceInstanceChange + 7, // 3: tfplan.Plan.output_changes:type_name -> tfplan.OutputChange + 12, // 4: tfplan.Plan.provider_hashes:type_name -> tfplan.Plan.ProviderHashesEntry + 4, // 5: tfplan.Plan.backend:type_name -> tfplan.Backend + 8, // 6: tfplan.Backend.config:type_name -> tfplan.DynamicValue 1, // 7: tfplan.Change.action:type_name -> tfplan.Action - 9, // 8: tfplan.Change.values:type_name -> tfplan.DynamicValue - 11, // 9: tfplan.Change.before_sensitive_paths:type_name -> tfplan.Path - 11, // 10: tfplan.Change.after_sensitive_paths:type_name -> tfplan.Path - 3, // 11: tfplan.ResourceInstanceChange.mode:type_name -> tfplan.ResourceInstanceChange.ResourceMode - 6, // 12: tfplan.ResourceInstanceChange.change:type_name -> tfplan.Change - 11, // 13: tfplan.ResourceInstanceChange.required_replace:type_name -> tfplan.Path - 2, // 14: tfplan.ResourceInstanceChange.action_reason:type_name -> tfplan.ResourceInstanceActionReason - 6, // 15: tfplan.OutputChange.change:type_name -> tfplan.Change - 14, // 16: tfplan.Path.steps:type_name -> tfplan.Path.Step - 9, // 17: tfplan.Plan.VariablesEntry.value:type_name -> tfplan.DynamicValue - 10, // 18: tfplan.Plan.ProviderHashesEntry.value:type_name -> tfplan.Hash - 9, // 19: tfplan.Path.Step.element_key:type_name -> tfplan.DynamicValue - 20, // [20:20] is the sub-list for method output_type - 20, // [20:20] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 8, // 8: tfplan.Change.values:type_name -> tfplan.DynamicValue + 10, // 9: tfplan.Change.before_sensitive_paths:type_name -> tfplan.Path + 10, // 10: tfplan.Change.after_sensitive_paths:type_name -> tfplan.Path + 5, // 11: tfplan.ResourceInstanceChange.change:type_name -> tfplan.Change + 10, // 12: tfplan.ResourceInstanceChange.required_replace:type_name -> tfplan.Path + 2, // 13: tfplan.ResourceInstanceChange.action_reason:type_name -> tfplan.ResourceInstanceActionReason + 5, // 14: tfplan.OutputChange.change:type_name -> tfplan.Change + 13, // 15: tfplan.Path.steps:type_name -> tfplan.Path.Step + 8, // 16: tfplan.Plan.VariablesEntry.value:type_name -> tfplan.DynamicValue + 9, // 17: tfplan.Plan.ProviderHashesEntry.value:type_name -> tfplan.Hash + 8, // 18: tfplan.Path.Step.element_key:type_name -> tfplan.DynamicValue + 19, // [19:19] is the sub-list for method output_type + 19, // [19:19] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_planfile_proto_init() } @@ -1379,10 +1257,6 @@ func file_planfile_proto_init() { } } } - file_planfile_proto_msgTypes[3].OneofWrappers = []interface{}{ - (*ResourceInstanceChange_Str)(nil), - (*ResourceInstanceChange_Int)(nil), - } file_planfile_proto_msgTypes[10].OneofWrappers = []interface{}{ (*Path_Step_AttributeName)(nil), (*Path_Step_ElementKey)(nil), @@ -1392,7 +1266,7 @@ func file_planfile_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_planfile_proto_rawDesc, - NumEnums: 4, + NumEnums: 3, NumMessages: 11, NumExtensions: 0, NumServices: 0, diff --git a/internal/plans/internal/planproto/planfile.proto b/internal/plans/internal/planproto/planfile.proto index bd673e50da..6ec4ae4024 100644 --- a/internal/plans/internal/planproto/planfile.proto +++ b/internal/plans/internal/planproto/planfile.proto @@ -129,34 +129,23 @@ enum ResourceInstanceActionReason { } message ResourceInstanceChange { - // module_path is an address to the module that defined this resource. - // module_path is omitted for resources in the root module. For descendent modules - // it is a string like module.foo.module.bar as would be seen at the beginning of a - // resource address. The format of this string is not yet frozen and so external - // callers should treat it as an opaque key for filtering purposes. - string module_path = 1; + // addr is a string representation of the resource instance address that + // this change will apply to. + string addr = 13; - // mode is the resource mode. - ResourceMode mode = 2; - enum ResourceMode { - managed = 0; // for "resource" blocks in configuration - data = 1; // for "data" blocks in configuration - } + // prev_run_addr is a string representation of the address at which + // this resource instance was tracked during the previous apply operation. + // + // This is populated only if it would be different from addr due to + // Terraform having reacted to refactoring annotations in the configuration. + // If empty, the previous run address is the same as the current address. + string prev_run_addr = 14; - // type is the resource type name, like "aws_instance". - string type = 3; - - // name is the logical name of the resource as defined in configuration. - // For example, in aws_instance.foo this would be "foo". - string name = 4; - - // instance_key is either an integer index or a string key, depending on which iteration - // attributes ("count" or "for_each") are being used for this resource. If none - // are in use, this field is omitted. - oneof instance_key { - string str = 5; - int64 int = 6; - }; + // NOTE: Earlier versions of this format had fields 1 through 6 describing + // various indivdual parts of "addr". We're now using our standard compact + // string representation to capture the same information. We don't support + // preserving plan files from one Terraform version to the next, so we + // no longer declare nor accept those fields. // deposed_key, if set, indicates that this change applies to a deposed // object for the indicated instance with the given deposed key. If not @@ -169,8 +158,7 @@ message ResourceInstanceChange { string provider = 8; // Description of the proposed change. May use "create", "read", "update", - // "replace" and "delete" actions. "no-op" changes are not currently used here - // but consumers must accept and discard them to allow for future expansion. + // "replace", "delete" and "no-op" actions. Change change = 9; // raw blob value provided by the provider as additional context for the diff --git a/internal/plans/planfile/tfplan.go b/internal/plans/planfile/tfplan.go index 735a33ae12..7572020b6c 100644 --- a/internal/plans/planfile/tfplan.go +++ b/internal/plans/planfile/tfplan.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/plans/internal/planproto" "github.com/hashicorp/terraform/internal/states" - "github.com/hashicorp/terraform/internal/tfdiags" "github.com/hashicorp/terraform/version" "github.com/zclconf/go-cty/cty" ) @@ -157,12 +156,23 @@ func resourceChangeFromTfplan(rawChange *planproto.ResourceInstanceChange) (*pla ret := &plans.ResourceInstanceChangeSrc{} - moduleAddr := addrs.RootModuleInstance - if rawChange.ModulePath != "" { - var diags tfdiags.Diagnostics - moduleAddr, diags = addrs.ParseModuleInstanceStr(rawChange.ModulePath) + if rawChange.Addr == "" { + // If "Addr" isn't populated then seems likely that this is a plan + // file created by an earlier version of Terraform, which had the + // same information spread over various other fields: + // ModulePath, Mode, Name, Type, and InstanceKey. + return nil, fmt.Errorf("no instance address for resource instance change; perhaps this plan was created by a different version of Terraform?") + } + + instAddr, diags := addrs.ParseAbsResourceInstanceStr(rawChange.Addr) + if diags.HasErrors() { + return nil, fmt.Errorf("invalid resource instance address %q: %w", rawChange.Addr, diags.Err()) + } + prevRunAddr := instAddr + if rawChange.PrevRunAddr != "" { + prevRunAddr, diags = addrs.ParseAbsResourceInstanceStr(rawChange.PrevRunAddr) if diags.HasErrors() { - return nil, diags.Err() + return nil, fmt.Errorf("invalid resource instance previous run address %q: %w", rawChange.PrevRunAddr, diags.Err()) } } @@ -172,37 +182,8 @@ func resourceChangeFromTfplan(rawChange *planproto.ResourceInstanceChange) (*pla } ret.ProviderAddr = providerAddr - var mode addrs.ResourceMode - switch rawChange.Mode { - case planproto.ResourceInstanceChange_managed: - mode = addrs.ManagedResourceMode - case planproto.ResourceInstanceChange_data: - mode = addrs.DataResourceMode - default: - return nil, fmt.Errorf("resource has invalid mode %s", rawChange.Mode) - } - - typeName := rawChange.Type - name := rawChange.Name - - resAddr := addrs.Resource{ - Mode: mode, - Type: typeName, - Name: name, - } - - var instKey addrs.InstanceKey - switch rawTk := rawChange.InstanceKey.(type) { - case nil: - case *planproto.ResourceInstanceChange_Int: - instKey = addrs.IntKey(rawTk.Int) - case *planproto.ResourceInstanceChange_Str: - instKey = addrs.StringKey(rawTk.Str) - default: - return nil, fmt.Errorf("instance of %s has invalid key type %T", resAddr.Absolute(moduleAddr), rawChange.InstanceKey) - } - - ret.Addr = resAddr.Instance(instKey).Absolute(moduleAddr) + ret.Addr = instAddr + ret.PrevRunAddr = prevRunAddr if rawChange.DeposedKey != "" { if len(rawChange.DeposedKey) != 8 { @@ -454,35 +435,20 @@ func writeTfplan(plan *plans.Plan, w io.Writer) error { func resourceChangeToTfplan(change *plans.ResourceInstanceChangeSrc) (*planproto.ResourceInstanceChange, error) { ret := &planproto.ResourceInstanceChange{} - ret.ModulePath = change.Addr.Module.String() - - relAddr := change.Addr.Resource - - switch relAddr.Resource.Mode { - case addrs.ManagedResourceMode: - ret.Mode = planproto.ResourceInstanceChange_managed - case addrs.DataResourceMode: - ret.Mode = planproto.ResourceInstanceChange_data - default: - return nil, fmt.Errorf("resource %s has unsupported mode %s", relAddr, relAddr.Resource.Mode) + if change.PrevRunAddr.Resource.Resource.Type == "" { + // Suggests that an old caller wasn't yet updated to populate this + // properly. All code that generates plans should populate this field, + // even if it's just to write in the same value as in change.Addr. + change.PrevRunAddr = change.Addr } - ret.Type = relAddr.Resource.Type - ret.Name = relAddr.Resource.Name - - switch tk := relAddr.Key.(type) { - case nil: - // Nothing to do, then. - case addrs.IntKey: - ret.InstanceKey = &planproto.ResourceInstanceChange_Int{ - Int: int64(tk), - } - case addrs.StringKey: - ret.InstanceKey = &planproto.ResourceInstanceChange_Str{ - Str: string(tk), - } - default: - return nil, fmt.Errorf("resource %s has unsupported instance key type %T", relAddr, relAddr.Key) + ret.Addr = change.Addr.String() + ret.PrevRunAddr = change.PrevRunAddr.String() + if ret.PrevRunAddr == ret.Addr { + // In the on-disk format we leave PrevRunAddr unpopulated in the common + // case where it's the same as Addr, and then fill it back in again on + // read. + ret.PrevRunAddr = "" } ret.DeposedKey = string(change.DeposedKey) @@ -500,7 +466,7 @@ func resourceChangeToTfplan(change *plans.ResourceInstanceChangeSrc) (*planproto valChange, err := changeToTfplan(&change.ChangeSrc) if err != nil { - return nil, fmt.Errorf("failed to serialize resource %s change: %s", relAddr, err) + return nil, fmt.Errorf("failed to serialize resource %s change: %s", change.Addr, err) } ret.Change = valChange @@ -514,7 +480,7 @@ func resourceChangeToTfplan(change *plans.ResourceInstanceChangeSrc) (*planproto case plans.ResourceInstanceReplaceByRequest: ret.ActionReason = planproto.ResourceInstanceActionReason_REPLACE_BY_REQUEST default: - return nil, fmt.Errorf("resource %s has unsupported action reason %s", relAddr, change.ActionReason) + return nil, fmt.Errorf("resource %s has unsupported action reason %s", change.Addr, change.ActionReason) } if len(change.Private) > 0 { diff --git a/internal/plans/planfile/tfplan_test.go b/internal/plans/planfile/tfplan_test.go index cc90874f07..b6c69657e4 100644 --- a/internal/plans/planfile/tfplan_test.go +++ b/internal/plans/planfile/tfplan_test.go @@ -57,6 +57,11 @@ func TestTFPlanRoundTrip(t *testing.T) { Type: "test_thing", Name: "woot", }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", + Name: "woot", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), ProviderAddr: addrs.AbsProviderConfig{ Provider: addrs.NewDefaultProvider("test"), Module: addrs.RootModule, @@ -93,7 +98,12 @@ func TestTFPlanRoundTrip(t *testing.T) { Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "woot", - }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + }.Instance(addrs.IntKey(1)).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", + Name: "woot", + }.Instance(addrs.IntKey(1)).Absolute(addrs.RootModuleInstance), DeposedKey: "foodface", ProviderAddr: addrs.AbsProviderConfig{ Provider: addrs.NewDefaultProvider("test"), @@ -214,6 +224,11 @@ func TestTFPlanRoundTripDestroy(t *testing.T) { Type: "test_thing", Name: "woot", }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", + Name: "woot", + }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), ProviderAddr: addrs.AbsProviderConfig{ Provider: addrs.NewDefaultProvider("test"), Module: addrs.RootModule, diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index d2279f88f3..7735897ce4 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -392,8 +392,9 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx EvalContext, currentState // that we checked something and concluded no changes were needed // vs. that something being entirely excluded e.g. due to -target. noop := &plans.ResourceInstanceChange{ - Addr: absAddr, - DeposedKey: deposedKey, + Addr: absAddr, + PrevRunAddr: absAddr, // TODO-PrevRunAddr: If this instance was moved/renamed in this run, record its old address + DeposedKey: deposedKey, Change: plans.Change{ Action: plans.NoOp, Before: cty.NullVal(cty.DynamicPseudoType), @@ -419,8 +420,9 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx EvalContext, currentState // Plan is always the same for a destroy. We don't need the provider's // help for this one. plan := &plans.ResourceInstanceChange{ - Addr: absAddr, - DeposedKey: deposedKey, + Addr: absAddr, + PrevRunAddr: absAddr, // TODO-PrevRunAddr: If this instance was moved/renamed in this run, record its old address + DeposedKey: deposedKey, Change: plans.Change{ Action: plans.Delete, Before: currentState.Value, @@ -444,7 +446,7 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx EvalContext, currentState return plan, diags } -// writeChange saves a planned change for an instance object into the set of +// writeChange saves a planned change for an instance object into the set of // global planned changes. func (n *NodeAbstractResourceInstance) writeChange(ctx EvalContext, change *plans.ResourceInstanceChange, deposedKey states.DeposedKey) error { changes := ctx.Changes() @@ -469,6 +471,16 @@ func (n *NodeAbstractResourceInstance) writeChange(ctx EvalContext, change *plan // Should never happen, and indicates a bug in the caller. panic("inconsistent address and/or deposed key in writeChange") } + if change.PrevRunAddr.Resource.Resource.Type == "" { + // Should never happen, and indicates a bug in the caller. + // (The change.Encode function actually has its own fixup to just + // quietly make this match change.Addr in the incorrect case, but we + // intentionally panic here in order to catch incorrect callers where + // the stack trace will hopefully be actually useful. The tolerance + // at the next layer down is mainly to accommodate sloppy input in + // older tests.) + panic("unpopulated ResourceInstanceChange.PrevRunAddr in writeChange") + } ri := n.Addr.Resource schema, _ := providerSchema.SchemaForResourceAddr(ri.Resource) @@ -1054,6 +1066,7 @@ func (n *NodeAbstractResourceInstance) plan( // Update our return plan plan = &plans.ResourceInstanceChange{ Addr: n.Addr, + PrevRunAddr: n.Addr, // TODO-PrevRunAddr: If this instance was moved/renamed in this run, record its old address Private: plannedPrivate, ProviderAddr: n.ResolvedProvider, Change: plans.Change{ @@ -1515,6 +1528,7 @@ func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, currentSt // value containing unknowns from PlanDataResourceObject. plannedChange := &plans.ResourceInstanceChange{ Addr: n.Addr, + PrevRunAddr: n.Addr, // data resources are not refactorable ProviderAddr: n.ResolvedProvider, Change: plans.Change{ Action: plans.Read,