configs: Helper methods to integrate with "addrs" package

Our new "addrs" package gives us some nice representations of various
kinds of "address" within Terraform. To talk to APIs that use these, it's
convenient to be able to easily derive such addresses from the
configuration objects.

These new methods, along with a recasting of the existing
Resource.ProviderConfigKey method to Resource.ProviderConfigAddr, give us
some key integration points to support the configuration graph transforms
in the main "terraform" package.
This commit is contained in:
Martin Atkins 2018-04-30 10:15:27 -07:00
parent 072322336e
commit 24dce0c624
3 changed files with 52 additions and 11 deletions

View File

@ -9,6 +9,8 @@ import (
"github.com/hashicorp/hcl2/hcl/hclsyntax" "github.com/hashicorp/hcl2/hcl/hclsyntax"
"github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/convert" "github.com/zclconf/go-cty/cty/convert"
"github.com/hashicorp/terraform/addrs"
) )
// A consistent detail message for all "not a valid identifier" diagnostics. // A consistent detail message for all "not a valid identifier" diagnostics.
@ -311,6 +313,14 @@ func decodeLocalsBlock(block *hcl.Block) ([]*Local, hcl.Diagnostics) {
return locals, diags return locals, diags
} }
// Addr returns the address of the local value declared by the receiver,
// relative to its containing module.
func (l *Local) Addr() addrs.LocalValue {
return addrs.LocalValue{
Name: l.Name,
}
}
var variableBlockSchema = &hcl.BodySchema{ var variableBlockSchema = &hcl.BodySchema{
Attributes: []hcl.AttributeSchema{ Attributes: []hcl.AttributeSchema{
{ {

View File

@ -6,6 +6,8 @@ import (
"github.com/hashicorp/hcl2/gohcl" "github.com/hashicorp/hcl2/gohcl"
"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"
) )
// Provider represents a "provider" block in a module or file. A provider // Provider represents a "provider" block in a module or file. A provider
@ -57,6 +59,15 @@ func decodeProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) {
return provider, diags return provider, diags
} }
// Addr returns the address of the receiving provider configuration, relative
// to its containing module.
func (p *Provider) Addr() addrs.ProviderConfig {
return addrs.ProviderConfig{
Type: p.Name,
Alias: p.Alias,
}
}
func (p *Provider) moduleUniqueKey() string { func (p *Provider) moduleUniqueKey() string {
if p.Alias != "" { if p.Alias != "" {
return fmt.Sprintf("%s.%s", p.Name, p.Alias) return fmt.Sprintf("%s.%s", p.Name, p.Alias)

View File

@ -2,13 +2,12 @@ package configs
import ( import (
"fmt" "fmt"
"strings"
"github.com/hashicorp/terraform/addrs"
"github.com/hashicorp/hcl2/gohcl" "github.com/hashicorp/hcl2/gohcl"
"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"
) )
// Resource represents a "resource" or "data" block in a module or file. // Resource represents a "resource" or "data" block in a module or file.
@ -58,20 +57,29 @@ func (r *Resource) moduleUniqueKey() string {
} }
} }
// ProviderConfigKey returns a string key for the provider configuration // Addr returns a resource address for the receiver that is relative to the
// resource's containing module.
func (r *Resource) Addr() addrs.Resource {
return addrs.Resource{
Mode: r.Mode,
Type: r.Type,
Name: r.Name,
}
}
// ProviderConfigAddr returns the address for the provider configuration
// that should be used for this resource. This function implements the // that should be used for this resource. This function implements the
// default behavior of extracting the type from the resource type name if // default behavior of extracting the type from the resource type name if
// an explicit "provider" argument was not provided. // an explicit "provider" argument was not provided.
func (r *Resource) ProviderConfigKey() string { func (r *Resource) ProviderConfigAddr() addrs.ProviderConfig {
if r.ProviderConfigRef == nil { if r.ProviderConfigRef == nil {
typeName := r.Type return r.Addr().DefaultProviderConfig()
if under := strings.Index(typeName, "_"); under != -1 {
return typeName[:under]
}
return typeName
} }
return r.ProviderConfigRef.String() return addrs.ProviderConfig{
Type: r.ProviderConfigRef.Name,
Alias: r.ProviderConfigRef.Alias,
}
} }
func decodeResourceBlock(block *hcl.Block) (*Resource, hcl.Diagnostics) { func decodeResourceBlock(block *hcl.Block) (*Resource, hcl.Diagnostics) {
@ -389,6 +397,18 @@ func decodeProviderConfigRef(expr hcl.Expression, argName string) (*ProviderConf
return ret, diags return ret, diags
} }
// Addr returns the provider config address corresponding to the receiving
// config reference.
//
// This is a trivial conversion, essentially just discarding the source
// location information and keeping just the addressing information.
func (r *ProviderConfigRef) Addr() addrs.ProviderConfig {
return addrs.ProviderConfig{
Type: r.Name,
Alias: r.Alias,
}
}
func (r *ProviderConfigRef) String() string { func (r *ProviderConfigRef) String() string {
if r == nil { if r == nil {
return "<nil>" return "<nil>"