github.com/hashicorp/terraform-plugin-sdk@v1.17.2/terraform/node_provider_abstract.go (about)

     1  package terraform
     2  
     3  import (
     4  	"github.com/hashicorp/terraform-plugin-sdk/internal/addrs"
     5  	"github.com/hashicorp/terraform-plugin-sdk/internal/configs"
     6  	"github.com/hashicorp/terraform-plugin-sdk/internal/configs/configschema"
     7  
     8  	"github.com/hashicorp/terraform-plugin-sdk/internal/dag"
     9  )
    10  
    11  // ConcreteProviderNodeFunc is a callback type used to convert an
    12  // abstract provider to a concrete one of some type.
    13  type ConcreteProviderNodeFunc func(*NodeAbstractProvider) dag.Vertex
    14  
    15  // NodeAbstractProvider represents a provider that has no associated operations.
    16  // It registers all the common interfaces across operations for providers.
    17  type NodeAbstractProvider struct {
    18  	Addr addrs.AbsProviderConfig
    19  
    20  	// The fields below will be automatically set using the Attach
    21  	// interfaces if you're running those transforms, but also be explicitly
    22  	// set if you already have that information.
    23  
    24  	Config *configs.Provider
    25  	Schema *configschema.Block
    26  }
    27  
    28  var (
    29  	_ GraphNodeSubPath                    = (*NodeAbstractProvider)(nil)
    30  	_ RemovableIfNotTargeted              = (*NodeAbstractProvider)(nil)
    31  	_ GraphNodeReferencer                 = (*NodeAbstractProvider)(nil)
    32  	_ GraphNodeProvider                   = (*NodeAbstractProvider)(nil)
    33  	_ GraphNodeAttachProvider             = (*NodeAbstractProvider)(nil)
    34  	_ GraphNodeAttachProviderConfigSchema = (*NodeAbstractProvider)(nil)
    35  	_ dag.GraphNodeDotter                 = (*NodeAbstractProvider)(nil)
    36  )
    37  
    38  func (n *NodeAbstractProvider) Name() string {
    39  	return n.Addr.String()
    40  }
    41  
    42  // GraphNodeSubPath
    43  func (n *NodeAbstractProvider) Path() addrs.ModuleInstance {
    44  	return n.Addr.Module
    45  }
    46  
    47  // RemovableIfNotTargeted
    48  func (n *NodeAbstractProvider) RemoveIfNotTargeted() bool {
    49  	// We need to add this so that this node will be removed if
    50  	// it isn't targeted or a dependency of a target.
    51  	return true
    52  }
    53  
    54  // GraphNodeReferencer
    55  func (n *NodeAbstractProvider) References() []*addrs.Reference {
    56  	if n.Config == nil || n.Schema == nil {
    57  		return nil
    58  	}
    59  
    60  	return ReferencesFromConfig(n.Config.Config, n.Schema)
    61  }
    62  
    63  // GraphNodeProvider
    64  func (n *NodeAbstractProvider) ProviderAddr() addrs.AbsProviderConfig {
    65  	return n.Addr
    66  }
    67  
    68  // GraphNodeProvider
    69  func (n *NodeAbstractProvider) ProviderConfig() *configs.Provider {
    70  	if n.Config == nil {
    71  		return nil
    72  	}
    73  
    74  	return n.Config
    75  }
    76  
    77  // GraphNodeAttachProvider
    78  func (n *NodeAbstractProvider) AttachProvider(c *configs.Provider) {
    79  	n.Config = c
    80  }
    81  
    82  // GraphNodeAttachProviderConfigSchema impl.
    83  func (n *NodeAbstractProvider) AttachProviderConfigSchema(schema *configschema.Block) {
    84  	n.Schema = schema
    85  }
    86  
    87  // GraphNodeDotter impl.
    88  func (n *NodeAbstractProvider) DotNode(name string, opts *dag.DotOpts) *dag.DotNode {
    89  	return &dag.DotNode{
    90  		Name: name,
    91  		Attrs: map[string]string{
    92  			"label": n.Name(),
    93  			"shape": "diamond",
    94  		},
    95  	}
    96  }