]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package terraform |
2 | ||
3 | import ( | |
107c1cdb ND |
4 | "github.com/hashicorp/terraform/addrs" |
5 | "github.com/hashicorp/terraform/configs" | |
6 | "github.com/hashicorp/terraform/configs/configschema" | |
bae9f6d2 | 7 | |
bae9f6d2 JC |
8 | "github.com/hashicorp/terraform/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 { | |
107c1cdb | 18 | Addr addrs.AbsProviderConfig |
bae9f6d2 JC |
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 | ||
107c1cdb ND |
24 | Config *configs.Provider |
25 | Schema *configschema.Block | |
bae9f6d2 JC |
26 | } |
27 | ||
107c1cdb ND |
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 | ) | |
15c0b25d AP |
37 | |
38 | func (n *NodeAbstractProvider) Name() string { | |
107c1cdb | 39 | return n.Addr.String() |
bae9f6d2 JC |
40 | } |
41 | ||
42 | // GraphNodeSubPath | |
107c1cdb ND |
43 | func (n *NodeAbstractProvider) Path() addrs.ModuleInstance { |
44 | return n.Addr.Module | |
bae9f6d2 JC |
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 | |
107c1cdb ND |
55 | func (n *NodeAbstractProvider) References() []*addrs.Reference { |
56 | if n.Config == nil || n.Schema == nil { | |
bae9f6d2 JC |
57 | return nil |
58 | } | |
59 | ||
107c1cdb | 60 | return ReferencesFromConfig(n.Config.Config, n.Schema) |
bae9f6d2 JC |
61 | } |
62 | ||
63 | // GraphNodeProvider | |
107c1cdb ND |
64 | func (n *NodeAbstractProvider) ProviderAddr() addrs.AbsProviderConfig { |
65 | return n.Addr | |
bae9f6d2 JC |
66 | } |
67 | ||
68 | // GraphNodeProvider | |
107c1cdb | 69 | func (n *NodeAbstractProvider) ProviderConfig() *configs.Provider { |
bae9f6d2 JC |
70 | if n.Config == nil { |
71 | return nil | |
72 | } | |
73 | ||
15c0b25d | 74 | return n.Config |
bae9f6d2 JC |
75 | } |
76 | ||
77 | // GraphNodeAttachProvider | |
107c1cdb | 78 | func (n *NodeAbstractProvider) AttachProvider(c *configs.Provider) { |
bae9f6d2 JC |
79 | n.Config = c |
80 | } | |
81 | ||
107c1cdb ND |
82 | // GraphNodeAttachProviderConfigSchema impl. |
83 | func (n *NodeAbstractProvider) AttachProviderConfigSchema(schema *configschema.Block) { | |
84 | n.Schema = schema | |
85 | } | |
86 | ||
bae9f6d2 JC |
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 | } |