configs: Allow looking up resources by resource addresses.

Throughout the main "terraform" package we identify resources using the
address types, and so this helper is useful to make concise transitions
between the address types and the configuration types.

As part of this, we use the address types to produce the keys used in our
resource maps. This has no visible change in behavior since the prior
implementation produced an equal result, but this change ensures that
ResourceByAddr cannot be broken by hypothetical future changes to the
key serialization.
This commit is contained in:
Martin Atkins 2018-05-02 17:51:01 -07:00
parent ccc1b6990f
commit 5cf791861f
2 changed files with 17 additions and 8 deletions

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"github.com/hashicorp/hcl2/hcl" "github.com/hashicorp/hcl2/hcl"
"github.com/hashicorp/terraform/addrs"
) )
// Module is a container for a set of configuration constructs that are // Module is a container for a set of configuration constructs that are
@ -99,6 +101,20 @@ func NewModule(primaryFiles, overrideFiles []*File) (*Module, hcl.Diagnostics) {
return mod, diags return mod, diags
} }
// ResourceByAddr returns the configuration for the resource with the given
// address, or nil if there is no such resource.
func (m *Module) ResourceByAddr(addr addrs.Resource) *Resource {
key := addr.String()
switch addr.Mode {
case addrs.ManagedResourceMode:
return m.ManagedResources[key]
case addrs.DataResourceMode:
return m.DataResources[key]
default:
return nil
}
}
func (m *Module) appendFile(file *File) hcl.Diagnostics { func (m *Module) appendFile(file *File) hcl.Diagnostics {
var diags hcl.Diagnostics var diags hcl.Diagnostics

View File

@ -47,14 +47,7 @@ type ManagedResource struct {
} }
func (r *Resource) moduleUniqueKey() string { func (r *Resource) moduleUniqueKey() string {
switch r.Mode { return r.Addr().String()
case addrs.ManagedResourceMode:
return fmt.Sprintf("%s.%s", r.Name, r.Type)
case addrs.DataResourceMode:
return fmt.Sprintf("data.%s.%s", r.Name, r.Type)
default:
panic(fmt.Errorf("Resource has invalid resource mode %s", r.Mode))
}
} }
// Addr returns a resource address for the receiver that is relative to the // Addr returns a resource address for the receiver that is relative to the