terraform: convert StateDeps to use new structs
This commit is contained in:
parent
c1e4bd7b72
commit
d59725e9fd
|
@ -7229,7 +7229,7 @@ template_file.child:
|
|||
type = template_file
|
||||
|
||||
Dependencies:
|
||||
template_file.parent
|
||||
template_file.parent.*
|
||||
template_file.parent:
|
||||
ID = foo
|
||||
template = Hi
|
||||
|
|
|
@ -18,10 +18,6 @@ type GraphNodeConfigResource struct {
|
|||
Path []string
|
||||
}
|
||||
|
||||
func (n *GraphNodeConfigResource) DependableName() []string {
|
||||
return []string{n.Resource.Id()}
|
||||
}
|
||||
|
||||
// GraphNodeDependent impl.
|
||||
func (n *GraphNodeConfigResource) DependentOn() []string {
|
||||
result := make([]string, len(n.Resource.DependsOn),
|
||||
|
|
|
@ -92,21 +92,10 @@ func (n *NodeRefreshableDataResourceInstance) EvalTree() EvalNode {
|
|||
|
||||
// If the config isn't empty we update the state
|
||||
if n.Config != nil {
|
||||
// Determine the dependencies for the state. We use some older
|
||||
// code for this that we've used for a long time.
|
||||
var stateDeps []string
|
||||
{
|
||||
oldN := &graphNodeExpandedResource{
|
||||
Resource: n.Config,
|
||||
Index: addr.Index,
|
||||
}
|
||||
stateDeps = oldN.StateDependencies()
|
||||
}
|
||||
|
||||
rs = &ResourceState{
|
||||
Type: n.Config.Type,
|
||||
Provider: n.Config.Provider,
|
||||
Dependencies: stateDeps,
|
||||
Dependencies: n.StateReferences(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package terraform
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform/config"
|
||||
"github.com/hashicorp/terraform/dag"
|
||||
|
@ -109,6 +110,63 @@ func (n *NodeAbstractResource) References() []string {
|
|||
return nil
|
||||
}
|
||||
|
||||
// StateReferences returns the dependencies to put into the state for
|
||||
// this resource.
|
||||
func (n *NodeAbstractResource) StateReferences() []string {
|
||||
self := n.ReferenceableName()
|
||||
|
||||
// Determine what our "prefix" is for checking for references to
|
||||
// ourself.
|
||||
addrCopy := n.Addr.Copy()
|
||||
addrCopy.Index = -1
|
||||
selfPrefix := addrCopy.String() + "."
|
||||
|
||||
depsRaw := n.References()
|
||||
deps := make([]string, 0, len(depsRaw))
|
||||
for _, d := range depsRaw {
|
||||
// Ignore any variable dependencies
|
||||
if strings.HasPrefix(d, "var.") {
|
||||
continue
|
||||
}
|
||||
|
||||
// If this has a backup ref, ignore those for now. The old state
|
||||
// file never contained those and I'd rather store the rich types we
|
||||
// add in the future.
|
||||
if idx := strings.IndexRune(d, '/'); idx != -1 {
|
||||
d = d[:idx]
|
||||
}
|
||||
|
||||
// If we're referencing ourself, then ignore it
|
||||
found := false
|
||||
for _, s := range self {
|
||||
if d == s {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if found {
|
||||
continue
|
||||
}
|
||||
|
||||
// If this is a reference to ourself and a specific index, we keep
|
||||
// it. For example, if this resource is "foo.bar" and the reference
|
||||
// is "foo.bar.0" then we keep it exact. Otherwise, we strip it.
|
||||
if strings.HasSuffix(d, ".0") && !strings.HasPrefix(d, selfPrefix) {
|
||||
d = d[:len(d)-2]
|
||||
}
|
||||
|
||||
// This is sad. The dependencies are currently in the format of
|
||||
// "module.foo.bar" (the full field). This strips the field off.
|
||||
if strings.HasPrefix(d, "module.") {
|
||||
parts := strings.SplitN(d, ".", 3)
|
||||
d = strings.Join(parts[0:2], ".")
|
||||
}
|
||||
|
||||
deps = append(deps, d)
|
||||
}
|
||||
|
||||
return deps
|
||||
}
|
||||
|
||||
// GraphNodeProviderConsumer
|
||||
func (n *NodeAbstractResource) ProvidedBy() []string {
|
||||
// If we have a config we prefer that above all else
|
||||
|
|
|
@ -70,16 +70,8 @@ func (n *NodeApplyableResource) EvalTree() EvalNode {
|
|||
resource.CountIndex = 0
|
||||
}
|
||||
|
||||
// Determine the dependencies for the state. We use some older
|
||||
// code for this that we've used for a long time.
|
||||
var stateDeps []string
|
||||
{
|
||||
oldN := &graphNodeExpandedResource{
|
||||
Resource: n.Config,
|
||||
Index: addr.Index,
|
||||
}
|
||||
stateDeps = oldN.StateDependencies()
|
||||
}
|
||||
// Determine the dependencies for the state.
|
||||
stateDeps := n.StateReferences()
|
||||
|
||||
// Eval info is different depending on what kind of resource this is
|
||||
switch n.Config.Mode {
|
||||
|
|
|
@ -37,13 +37,8 @@ func (n *NodePlannableResourceInstance) EvalTree() EvalNode {
|
|||
resource.CountIndex = 0
|
||||
}
|
||||
|
||||
// Determine the dependencies for the state. We use some older
|
||||
// code for this that we've used for a long time.
|
||||
var stateDeps []string
|
||||
{
|
||||
oldN := &graphNodeExpandedResource{Resource: n.Config}
|
||||
stateDeps = oldN.StateDependencies()
|
||||
}
|
||||
// Determine the dependencies for the state.
|
||||
stateDeps := n.StateReferences()
|
||||
|
||||
// Eval info is different depending on what kind of resource this is
|
||||
switch n.Config.Mode {
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
package terraform
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform/config"
|
||||
)
|
||||
|
||||
type graphNodeExpandedResource struct {
|
||||
Index int
|
||||
Resource *config.Resource
|
||||
Path []string
|
||||
}
|
||||
|
||||
func (n *graphNodeExpandedResource) Name() string {
|
||||
if n.Index == -1 {
|
||||
return n.Resource.Id()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s #%d", n.Resource.Id(), n.Index)
|
||||
}
|
||||
|
||||
// GraphNodeDependent impl.
|
||||
func (n *graphNodeExpandedResource) DependentOn() []string {
|
||||
configNode := &GraphNodeConfigResource{Resource: n.Resource}
|
||||
result := configNode.DependentOn()
|
||||
|
||||
// Walk the variables to find any count-specific variables we depend on.
|
||||
configNode.VarWalk(func(v config.InterpolatedVariable) {
|
||||
rv, ok := v.(*config.ResourceVariable)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
// We only want ourselves
|
||||
if rv.ResourceId() != n.Resource.Id() {
|
||||
return
|
||||
}
|
||||
|
||||
// If this isn't a multi-access (which shouldn't be allowed but
|
||||
// is verified elsewhere), then we depend on the specific count
|
||||
// of this resource, ignoring ourself (which again should be
|
||||
// validated elsewhere).
|
||||
if rv.Index > -1 {
|
||||
id := fmt.Sprintf("%s.%d", rv.ResourceId(), rv.Index)
|
||||
if id != n.stateId() && id != n.stateId()+".0" {
|
||||
result = append(result, id)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func (n *graphNodeExpandedResource) StateDependencies() []string {
|
||||
depsRaw := n.DependentOn()
|
||||
deps := make([]string, 0, len(depsRaw))
|
||||
for _, d := range depsRaw {
|
||||
// Ignore any variable dependencies
|
||||
if strings.HasPrefix(d, "var.") {
|
||||
continue
|
||||
}
|
||||
|
||||
// This is sad. The dependencies are currently in the format of
|
||||
// "module.foo.bar" (the full field). This strips the field off.
|
||||
if strings.HasPrefix(d, "module.") {
|
||||
parts := strings.SplitN(d, ".", 3)
|
||||
d = strings.Join(parts[0:2], ".")
|
||||
}
|
||||
deps = append(deps, d)
|
||||
}
|
||||
|
||||
return deps
|
||||
}
|
||||
|
||||
// stateId is the name used for the state key
|
||||
func (n *graphNodeExpandedResource) stateId() string {
|
||||
if n.Index == -1 {
|
||||
return n.Resource.Id()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s.%d", n.Resource.Id(), n.Index)
|
||||
}
|
Loading…
Reference in New Issue