NewNodeAbstractResource accepts a ResourceConfig
Use the new addrs type here. Also remove the uniqueMap from the config transformer. We enforce uniqueness during config loading, and this is more likely to have false positives due to stringification than anything.
This commit is contained in:
parent
23cebc5205
commit
0b85eeab38
|
@ -84,13 +84,9 @@ func (n *NodeAbstractResource) addr() addrs.AbsResource {
|
||||||
|
|
||||||
// NewNodeAbstractResource creates an abstract resource graph node for
|
// NewNodeAbstractResource creates an abstract resource graph node for
|
||||||
// the given absolute resource address.
|
// the given absolute resource address.
|
||||||
func NewNodeAbstractResource(addr addrs.AbsResource) *NodeAbstractResource {
|
func NewNodeAbstractResource(addr addrs.ConfigResource) *NodeAbstractResource {
|
||||||
// FIXME: this should probably accept a ConfigResource
|
|
||||||
return &NodeAbstractResource{
|
return &NodeAbstractResource{
|
||||||
Addr: addrs.ConfigResource{
|
Addr: addr,
|
||||||
Resource: addr.Resource,
|
|
||||||
Module: addr.Module.Module(),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -278,7 +278,7 @@ func (n *NodeDestroyResourceInstance) EvalTree() EvalNode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeDestroyResourceInstance represents a resource that is to be destroyed.
|
// NodeDestroyResource represents a resource that is to be destroyed.
|
||||||
//
|
//
|
||||||
// Destroying a resource is a state-only operation: it is the individual
|
// Destroying a resource is a state-only operation: it is the individual
|
||||||
// instances being destroyed that affects remote objects. During graph
|
// instances being destroyed that affects remote objects. During graph
|
||||||
|
|
|
@ -2,7 +2,6 @@ package terraform
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/addrs"
|
"github.com/hashicorp/terraform/addrs"
|
||||||
"github.com/hashicorp/terraform/configs"
|
"github.com/hashicorp/terraform/configs"
|
||||||
|
@ -32,38 +31,14 @@ type ConfigTransformer struct {
|
||||||
// Mode will only add resources that match the given mode
|
// Mode will only add resources that match the given mode
|
||||||
ModeFilter bool
|
ModeFilter bool
|
||||||
Mode addrs.ResourceMode
|
Mode addrs.ResourceMode
|
||||||
|
|
||||||
l sync.Mutex
|
|
||||||
uniqueMap map[string]struct{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: should we have an addr.Module + addr.Resource type?
|
|
||||||
type configName interface {
|
|
||||||
Name() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ConfigTransformer) Transform(g *Graph) error {
|
func (t *ConfigTransformer) Transform(g *Graph) error {
|
||||||
// Lock since we use some internal state
|
|
||||||
t.l.Lock()
|
|
||||||
defer t.l.Unlock()
|
|
||||||
|
|
||||||
// If no configuration is available, we don't do anything
|
// If no configuration is available, we don't do anything
|
||||||
if t.Config == nil {
|
if t.Config == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the uniqueness map. If we're tracking uniques, then populate
|
|
||||||
// it with addresses.
|
|
||||||
t.uniqueMap = make(map[string]struct{})
|
|
||||||
defer func() { t.uniqueMap = nil }()
|
|
||||||
if t.Unique {
|
|
||||||
for _, v := range g.Vertices() {
|
|
||||||
if rn, ok := v.(configName); ok {
|
|
||||||
t.uniqueMap[rn.Name()] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the transformation process
|
// Start the transformation process
|
||||||
return t.transform(g, t.Config)
|
return t.transform(g, t.Config)
|
||||||
}
|
}
|
||||||
|
@ -117,12 +92,6 @@ func (t *ConfigTransformer) transformSingle(g *Graph, config *configs.Config) er
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := t.uniqueMap[abstract.Name()]; ok {
|
|
||||||
// We've already seen a resource with this address. This should
|
|
||||||
// never happen, because we enforce uniqueness in the config loader.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var node dag.Vertex = abstract
|
var node dag.Vertex = abstract
|
||||||
if f := t.Concrete; f != nil {
|
if f := t.Concrete; f != nil {
|
||||||
node = f(abstract)
|
node = f(abstract)
|
||||||
|
|
|
@ -56,7 +56,7 @@ data.aws_ami.foo
|
||||||
func TestConfigTransformer_nonUnique(t *testing.T) {
|
func TestConfigTransformer_nonUnique(t *testing.T) {
|
||||||
g := Graph{Path: addrs.RootModuleInstance}
|
g := Graph{Path: addrs.RootModuleInstance}
|
||||||
g.Add(NewNodeAbstractResource(
|
g.Add(NewNodeAbstractResource(
|
||||||
addrs.RootModuleInstance.Resource(
|
addrs.RootModule.Resource(
|
||||||
addrs.ManagedResourceMode, "aws_instance", "web",
|
addrs.ManagedResourceMode, "aws_instance", "web",
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
|
@ -78,33 +78,6 @@ openstack_floating_ip.random
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigTransformer_unique(t *testing.T) {
|
|
||||||
g := Graph{Path: addrs.RootModuleInstance}
|
|
||||||
g.Add(NewNodeAbstractResource(
|
|
||||||
addrs.RootModuleInstance.Resource(
|
|
||||||
addrs.ManagedResourceMode, "aws_instance", "web",
|
|
||||||
),
|
|
||||||
))
|
|
||||||
tf := &ConfigTransformer{
|
|
||||||
Config: testModule(t, "graph-basic"),
|
|
||||||
Unique: true,
|
|
||||||
}
|
|
||||||
if err := tf.Transform(&g); err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
actual := strings.TrimSpace(g.String())
|
|
||||||
expected := strings.TrimSpace(`
|
|
||||||
aws_instance.web
|
|
||||||
aws_load_balancer.weblb
|
|
||||||
aws_security_group.firewall
|
|
||||||
openstack_floating_ip.random
|
|
||||||
`)
|
|
||||||
if actual != expected {
|
|
||||||
t.Fatalf("bad:\n\n%s", actual)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const testConfigTransformerGraphBasicStr = `
|
const testConfigTransformerGraphBasicStr = `
|
||||||
aws_instance.web
|
aws_instance.web
|
||||||
aws_load_balancer.weblb
|
aws_load_balancer.weblb
|
||||||
|
|
|
@ -237,7 +237,7 @@ module.child.test_object.c (destroy)
|
||||||
func testDestroyNode(addrString string) GraphNodeDestroyer {
|
func testDestroyNode(addrString string) GraphNodeDestroyer {
|
||||||
instAddr := mustResourceInstanceAddr(addrString)
|
instAddr := mustResourceInstanceAddr(addrString)
|
||||||
|
|
||||||
abs := NewNodeAbstractResource(instAddr.ContainingResource())
|
abs := NewNodeAbstractResource(instAddr.ContainingResource().Config())
|
||||||
|
|
||||||
inst := &NodeAbstractResourceInstance{
|
inst := &NodeAbstractResourceInstance{
|
||||||
NodeAbstractResource: *abs,
|
NodeAbstractResource: *abs,
|
||||||
|
|
|
@ -160,7 +160,7 @@ func (t *OrphanResourceTransformer) Transform(g *Graph) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
addr := rs.Addr
|
addr := rs.Addr
|
||||||
abstract := NewNodeAbstractResource(addr)
|
abstract := NewNodeAbstractResource(addr.Config())
|
||||||
var node dag.Vertex = abstract
|
var node dag.Vertex = abstract
|
||||||
if f := t.Concrete; f != nil {
|
if f := t.Concrete; f != nil {
|
||||||
node = f(abstract)
|
node = f(abstract)
|
||||||
|
|
Loading…
Reference in New Issue