core: Fix MissingProviderTransformer matching existing providers

In the change to using addrs types rather than string keys directly here
I incorrectly made this use the _relative_ provider config instead of
the absolute one, causing MissingProviderTransformer to only match
providers defined in the root module (due to ambiguity in the string
representations of these address types).

The rest of this change is improved logging and test output that helped
with debugging this issue.
This commit is contained in:
Martin Atkins 2018-05-08 10:01:43 -07:00
parent 604c347128
commit e4e972db67
2 changed files with 21 additions and 7 deletions

View File

@ -81,6 +81,11 @@ func (t *ProviderTransformer) Transform(g *Graph) error {
for _, v := range g.Vertices() { for _, v := range g.Vertices() {
if pv, ok := v.(GraphNodeProviderConsumer); ok { if pv, ok := v.(GraphNodeProviderConsumer); ok {
p, exact := pv.ProvidedBy() p, exact := pv.ProvidedBy()
if exact {
log.Printf("[TRACE] ProviderTransformer: %s is provided by %s exactly", dag.VertexName(v), p)
} else {
log.Printf("[TRACE] ProviderTransformer: %s is provided by %s or inherited equivalent", dag.VertexName(v), p)
}
key := p.String() key := p.String()
target := m[key] target := m[key]
@ -92,15 +97,21 @@ func (t *ProviderTransformer) Transform(g *Graph) error {
break break
} }
if target != nil {
log.Printf("[TRACE] ProviderTransformer: exact match for %s providing %s", p, dag.VertexName(v))
}
// if we don't have a provider at this level, walk up the path looking for one, // if we don't have a provider at this level, walk up the path looking for one,
// unless we were told to be exact. // unless we were told to be exact.
if !exact { if target == nil && !exact {
for pp, ok := p.Inherited(); ok; pp, ok = pp.Inherited() { for pp, ok := p.Inherited(); ok; pp, ok = pp.Inherited() {
key := pp.String() key := pp.String()
target = m[key] target = m[key]
if target != nil { if target != nil {
log.Printf("[TRACE] ProviderTransformer: %s uses inherited configuration %s", dag.VertexName(v), pp)
break break
} }
log.Printf("[TRACE] ProviderTransformer: looking for %s to provide %s", pp, dag.VertexName(v))
} }
} }
@ -119,7 +130,7 @@ func (t *ProviderTransformer) Transform(g *Graph) error {
key = target.(GraphNodeProvider).ProviderAddr().String() key = target.(GraphNodeProvider).ProviderAddr().String()
} }
log.Printf("[DEBUG] %s handled by %s", dag.VertexName(pv), key) log.Printf("[DEBUG] %s provided by %s", dag.VertexName(pv), key)
pv.SetProvider(target.ProviderAddr()) pv.SetProvider(target.ProviderAddr())
g.Connect(dag.BasicEdge(v, target)) g.Connect(dag.BasicEdge(v, target))
} }
@ -199,8 +210,7 @@ func (t *MissingProviderTransformer) Transform(g *Graph) error {
} }
p, _ := pv.ProvidedBy() p, _ := pv.ProvidedBy()
configAddr := p.ProviderConfig key := p.String()
key := configAddr.String()
provider := m[key] provider := m[key]
// we already have it // we already have it
@ -209,7 +219,7 @@ func (t *MissingProviderTransformer) Transform(g *Graph) error {
} }
// we don't implicitly create aliased providers // we don't implicitly create aliased providers
if configAddr.Alias != "" { if p.ProviderConfig.Alias != "" {
log.Println("[DEBUG] not adding implicit aliased config for", p.String()) log.Println("[DEBUG] not adding implicit aliased config for", p.String())
continue continue
} }
@ -380,6 +390,10 @@ type graphNodeProxyProvider struct {
target GraphNodeProvider target GraphNodeProvider
} }
var (
_ GraphNodeProvider = (*graphNodeProxyProvider)(nil)
)
func (n *graphNodeProxyProvider) ProviderAddr() addrs.AbsProviderConfig { func (n *graphNodeProxyProvider) ProviderAddr() addrs.AbsProviderConfig {
return n.addr return n.addr
} }
@ -389,7 +403,7 @@ func (n *graphNodeProxyProvider) Path() addrs.ModuleInstance {
} }
func (n *graphNodeProxyProvider) Name() string { func (n *graphNodeProxyProvider) Name() string {
return n.addr.String() return n.addr.String() + " (proxy)"
} }
// find the concrete provider instance // find the concrete provider instance

View File

@ -583,7 +583,7 @@ func TestProviderConfigTransformer_implicitModule(t *testing.T) {
provider.aws.foo provider.aws.foo
provider.aws.foo`) provider.aws.foo`)
if actual != expected { if actual != expected {
t.Fatalf("expected:\n%s\n\ngot:\n%s", expected, actual) t.Fatalf("wrong result\n\nexpected:\n%s\n\ngot:\n%s", expected, actual)
} }
} }