Add GraphNodeNoProvider to skip adding a providers

While the NodeDestroyResource type should not be a
GraphNodeProviderConsumer, we're going to avoid uncovering more hidden
behavior by explicitly skipping provider creation and connections in the
provider transformers.

This should be removed when more in-depth testing can be done during a
major release cycle.
This commit is contained in:
James Bardin 2020-01-10 16:22:40 -05:00
parent a6cdfad590
commit 4aa8a1cece
2 changed files with 34 additions and 3 deletions

View File

@ -277,7 +277,7 @@ func (n *NodeDestroyResourceInstance) EvalTree() EvalNode {
// leaving skeleton resource objects in state after their instances have // leaving skeleton resource objects in state after their instances have
// all been destroyed. // all been destroyed.
type NodeDestroyResource struct { type NodeDestroyResource struct {
NodeAbstractResource *NodeAbstractResource *NodeAbstractResource
} }
var ( var (
@ -285,10 +285,17 @@ var (
_ GraphNodeReferenceable = (*NodeDestroyResource)(nil) _ GraphNodeReferenceable = (*NodeDestroyResource)(nil)
_ GraphNodeReferencer = (*NodeDestroyResource)(nil) _ GraphNodeReferencer = (*NodeDestroyResource)(nil)
_ GraphNodeEvalable = (*NodeDestroyResource)(nil) _ GraphNodeEvalable = (*NodeDestroyResource)(nil)
// FIXME: this is here to document that this node is both
// GraphNodeProviderConsumer by virtue of the embedded
// NodeAbstractResource, but that behavior is not desired and we skip it by
// checking for GraphNodeNoProvider.
_ GraphNodeProviderConsumer = (*NodeDestroyResource)(nil)
_ GraphNodeNoProvider = (*NodeDestroyResource)(nil)
) )
func (n *NodeDestroyResource) Name() string { func (n *NodeDestroyResource) Name() string {
return n.NodeAbstractResource.ResourceAddr().String() + " (clean up state)" return n.ResourceAddr().String() + " (clean up state)"
} }
// GraphNodeReferenceable, overriding NodeAbstractResource // GraphNodeReferenceable, overriding NodeAbstractResource
@ -316,7 +323,7 @@ func (n *NodeDestroyResource) EvalTree() EvalNode {
// leftover husk of a resource in state after all of the child instances // leftover husk of a resource in state after all of the child instances
// and their objects were destroyed. // and their objects were destroyed.
return &EvalForgetResourceState{ return &EvalForgetResourceState{
Addr: n.NodeAbstractResource.ResourceAddr().Resource, Addr: n.ResourceAddr().Resource,
} }
} }
@ -329,3 +336,13 @@ func (n *NodeDestroyResource) ResourceAddr() addrs.AbsResource {
func (n *NodeDestroyResource) Path() addrs.ModuleInstance { func (n *NodeDestroyResource) Path() addrs.ModuleInstance {
return n.NodeAbstractResource.Path() return n.NodeAbstractResource.Path()
} }
// GraphNodeNoProvider
// FIXME: this should be removed once the node can be separated from the
// Internal NodeAbstractResource behavior.
func (n *NodeDestroyResource) NoProvider() {
}
type GraphNodeNoProvider interface {
NoProvider()
}

View File

@ -99,6 +99,13 @@ func (t *ProviderTransformer) Transform(g *Graph) error {
needConfigured := map[string]addrs.AbsProviderConfig{} needConfigured := map[string]addrs.AbsProviderConfig{}
for _, v := range g.Vertices() { for _, v := range g.Vertices() {
// FIXME: fix the type that implements this, so it's not a
// GraphNodeProviderConsumer.
// check if we want to skip connecting this to a provider
if _, ok := v.(GraphNodeNoProvider); ok {
continue
}
// Does the vertex _directly_ use a provider? // Does the vertex _directly_ use a provider?
if pv, ok := v.(GraphNodeProviderConsumer); ok { if pv, ok := v.(GraphNodeProviderConsumer); ok {
requested[v] = make(map[string]ProviderRequest) requested[v] = make(map[string]ProviderRequest)
@ -275,6 +282,13 @@ func (t *MissingProviderTransformer) Transform(g *Graph) error {
var err error var err error
m := providerVertexMap(g) m := providerVertexMap(g)
for _, v := range g.Vertices() { for _, v := range g.Vertices() {
// FIXME: fix the type that implements this, so it's not a
// GraphNodeProviderConsumer.
// check if we want to skip connecting this to a provider
if _, ok := v.(GraphNodeNoProvider); ok {
continue
}
pv, ok := v.(GraphNodeProviderConsumer) pv, ok := v.(GraphNodeProviderConsumer)
if !ok { if !ok {
continue continue