core: Move some of the helper/schema shims so provider mock can use them
The old names are now wrappers around these new functions.
This commit is contained in:
parent
9c4aed52b3
commit
76d11f44cc
|
@ -2,9 +2,7 @@ package schema
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/config"
|
|
||||||
"github.com/hashicorp/terraform/config/hcl2shim"
|
"github.com/hashicorp/terraform/config/hcl2shim"
|
||||||
"github.com/hashicorp/terraform/configs/configschema"
|
"github.com/hashicorp/terraform/configs/configschema"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
|
@ -40,57 +38,7 @@ func diffFromValues(prior, planned cty.Value, res *Resource, cust CustomizeDiffF
|
||||||
// the legacy provider Diff method to the state required for the new
|
// the legacy provider Diff method to the state required for the new
|
||||||
// PlanResourceChange method.
|
// PlanResourceChange method.
|
||||||
func ApplyDiff(state cty.Value, d *terraform.InstanceDiff, schemaBlock *configschema.Block) (cty.Value, error) {
|
func ApplyDiff(state cty.Value, d *terraform.InstanceDiff, schemaBlock *configschema.Block) (cty.Value, error) {
|
||||||
// No diff means the state is unchanged.
|
return d.ApplyToValue(state, schemaBlock)
|
||||||
if d.Empty() {
|
|
||||||
return state, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create an InstanceState attributes from our existing state.
|
|
||||||
// We can use this to more easily apply the diff changes.
|
|
||||||
attrs := hcl2shim.FlatmapValueFromHCL2(state)
|
|
||||||
if attrs == nil {
|
|
||||||
attrs = map[string]string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.Destroy || d.DestroyDeposed || d.DestroyTainted {
|
|
||||||
// to mark a destroy, we remove all attributes
|
|
||||||
attrs = map[string]string{}
|
|
||||||
} else if attrs["id"] == "" || d.RequiresNew() {
|
|
||||||
// Since "id" is always computed, make sure it always has a value. Set
|
|
||||||
// it as unknown to generate the correct cty.Value
|
|
||||||
attrs["id"] = config.UnknownVariableValue
|
|
||||||
}
|
|
||||||
|
|
||||||
for attr, diff := range d.Attributes {
|
|
||||||
old, exists := attrs[attr]
|
|
||||||
|
|
||||||
if exists &&
|
|
||||||
old != diff.Old &&
|
|
||||||
// if new or old is unknown, then there's no mismatch
|
|
||||||
old != config.UnknownVariableValue &&
|
|
||||||
diff.Old != config.UnknownVariableValue {
|
|
||||||
return state, fmt.Errorf("mismatched diff: %q != %q", old, diff.Old)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diff.NewComputed {
|
|
||||||
attrs[attr] = config.UnknownVariableValue
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if diff.NewRemoved {
|
|
||||||
delete(attrs, attr)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
attrs[attr] = diff.New
|
|
||||||
}
|
|
||||||
|
|
||||||
val, err := hcl2shim.HCL2ValueFromFlatmap(attrs, schemaBlock.ImpliedType())
|
|
||||||
if err != nil {
|
|
||||||
return val, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return schemaBlock.CoerceValue(val)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateValueToJSONMap converts a cty.Value to generic JSON map via the cty JSON
|
// StateValueToJSONMap converts a cty.Value to generic JSON map via the cty JSON
|
||||||
|
@ -155,12 +103,5 @@ func StateValueFromInstanceState(is *terraform.InstanceState, ty cty.Type) (cty.
|
||||||
// the provider, because the legacy providers used the private Meta data in the
|
// the provider, because the legacy providers used the private Meta data in the
|
||||||
// InstanceState to store the schema version.
|
// InstanceState to store the schema version.
|
||||||
func InstanceStateFromStateValue(state cty.Value, schemaVersion int) *terraform.InstanceState {
|
func InstanceStateFromStateValue(state cty.Value, schemaVersion int) *terraform.InstanceState {
|
||||||
attrs := hcl2shim.FlatmapValueFromHCL2(state)
|
return terraform.NewInstanceStateShimmedFromValue(state, schemaVersion)
|
||||||
return &terraform.InstanceState{
|
|
||||||
ID: attrs["id"],
|
|
||||||
Attributes: attrs,
|
|
||||||
Meta: map[string]interface{}{
|
|
||||||
"schema_version": schemaVersion,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,10 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/addrs"
|
"github.com/hashicorp/terraform/addrs"
|
||||||
|
"github.com/hashicorp/terraform/config"
|
||||||
|
"github.com/hashicorp/terraform/config/hcl2shim"
|
||||||
|
"github.com/hashicorp/terraform/configs/configschema"
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
|
||||||
"github.com/mitchellh/copystructure"
|
"github.com/mitchellh/copystructure"
|
||||||
)
|
)
|
||||||
|
@ -404,6 +408,66 @@ type InstanceDiff struct {
|
||||||
func (d *InstanceDiff) Lock() { d.mu.Lock() }
|
func (d *InstanceDiff) Lock() { d.mu.Lock() }
|
||||||
func (d *InstanceDiff) Unlock() { d.mu.Unlock() }
|
func (d *InstanceDiff) Unlock() { d.mu.Unlock() }
|
||||||
|
|
||||||
|
// ApplyToValue merges the receiver into the given base value, returning a
|
||||||
|
// new value that incorporates the planned changes. The given value must
|
||||||
|
// conform to the given schema, or this method will panic.
|
||||||
|
//
|
||||||
|
// This method is intended for shimming old subsystems that still use this
|
||||||
|
// legacy diff type to work with the new-style types.
|
||||||
|
func (d *InstanceDiff) ApplyToValue(base cty.Value, schema *configschema.Block) (cty.Value, error) {
|
||||||
|
// No diff means the state is unchanged.
|
||||||
|
if d.Empty() {
|
||||||
|
return base, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an InstanceState attributes from our existing state.
|
||||||
|
// We can use this to more easily apply the diff changes.
|
||||||
|
attrs := hcl2shim.FlatmapValueFromHCL2(base)
|
||||||
|
if attrs == nil {
|
||||||
|
attrs = map[string]string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.Destroy || d.DestroyDeposed || d.DestroyTainted {
|
||||||
|
// to mark a destroy, we remove all attributes
|
||||||
|
attrs = map[string]string{}
|
||||||
|
} else if attrs["id"] == "" || d.RequiresNew() {
|
||||||
|
// Since "id" is always computed, make sure it always has a value. Set
|
||||||
|
// it as unknown to generate the correct cty.Value
|
||||||
|
attrs["id"] = config.UnknownVariableValue
|
||||||
|
}
|
||||||
|
|
||||||
|
for attr, diff := range d.Attributes {
|
||||||
|
old, exists := attrs[attr]
|
||||||
|
|
||||||
|
if exists &&
|
||||||
|
old != diff.Old &&
|
||||||
|
// if new or old is unknown, then there's no mismatch
|
||||||
|
old != config.UnknownVariableValue &&
|
||||||
|
diff.Old != config.UnknownVariableValue {
|
||||||
|
return base, fmt.Errorf("mismatched diff: %q != %q", old, diff.Old)
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff.NewComputed {
|
||||||
|
attrs[attr] = config.UnknownVariableValue
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff.NewRemoved {
|
||||||
|
delete(attrs, attr)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs[attr] = diff.New
|
||||||
|
}
|
||||||
|
|
||||||
|
val, err := hcl2shim.HCL2ValueFromFlatmap(attrs, schema.ImpliedType())
|
||||||
|
if err != nil {
|
||||||
|
return val, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return schema.CoerceValue(val)
|
||||||
|
}
|
||||||
|
|
||||||
// ResourceAttrDiff is the diff of a single attribute of a resource.
|
// ResourceAttrDiff is the diff of a single attribute of a resource.
|
||||||
type ResourceAttrDiff struct {
|
type ResourceAttrDiff struct {
|
||||||
Old string // Old Value
|
Old string // Old Value
|
||||||
|
|
|
@ -17,22 +17,23 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
"github.com/hashicorp/terraform/plans"
|
|
||||||
|
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/go-version"
|
"github.com/hashicorp/go-version"
|
||||||
"github.com/hashicorp/hcl2/hcl"
|
"github.com/hashicorp/hcl2/hcl"
|
||||||
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
||||||
"github.com/hashicorp/terraform/addrs"
|
|
||||||
"github.com/hashicorp/terraform/config"
|
|
||||||
"github.com/hashicorp/terraform/configs"
|
|
||||||
"github.com/hashicorp/terraform/configs/configschema"
|
|
||||||
"github.com/hashicorp/terraform/tfdiags"
|
|
||||||
tfversion "github.com/hashicorp/terraform/version"
|
|
||||||
"github.com/mitchellh/copystructure"
|
"github.com/mitchellh/copystructure"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
ctyjson "github.com/zclconf/go-cty/cty/json"
|
ctyjson "github.com/zclconf/go-cty/cty/json"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
|
"github.com/hashicorp/terraform/config"
|
||||||
|
"github.com/hashicorp/terraform/config/hcl2shim"
|
||||||
|
"github.com/hashicorp/terraform/configs"
|
||||||
|
"github.com/hashicorp/terraform/configs/configschema"
|
||||||
|
"github.com/hashicorp/terraform/plans"
|
||||||
|
"github.com/hashicorp/terraform/tfdiags"
|
||||||
|
tfversion "github.com/hashicorp/terraform/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -1658,6 +1659,22 @@ func (s *InstanceState) init() {
|
||||||
s.Ephemeral.init()
|
s.Ephemeral.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInstanceStateShimmedFromValue is a shim method to lower a new-style
|
||||||
|
// object value representing the attributes of an instance object into the
|
||||||
|
// legacy InstanceState representation.
|
||||||
|
//
|
||||||
|
// This is for shimming to old components only and should not be used in new code.
|
||||||
|
func NewInstanceStateShimmedFromValue(state cty.Value, schemaVersion int) *InstanceState {
|
||||||
|
attrs := hcl2shim.FlatmapValueFromHCL2(state)
|
||||||
|
return &InstanceState{
|
||||||
|
ID: attrs["id"],
|
||||||
|
Attributes: attrs,
|
||||||
|
Meta: map[string]interface{}{
|
||||||
|
"schema_version": schemaVersion,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copy all the Fields from another InstanceState
|
// Copy all the Fields from another InstanceState
|
||||||
func (s *InstanceState) Set(from *InstanceState) {
|
func (s *InstanceState) Set(from *InstanceState) {
|
||||||
s.Lock()
|
s.Lock()
|
||||||
|
|
Loading…
Reference in New Issue