1package terraform
2
3import (
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/providers"
7)
8
9// ProviderEvalTree returns the evaluation tree for initializing and
10// configuring providers.
11func ProviderEvalTree(n *NodeApplyableProvider, config *configs.Provider) EvalNode {
12	var provider providers.Interface
13
14	addr := n.Addr
15	relAddr := addr.ProviderConfig
16
17	seq := make([]EvalNode, 0, 5)
18	seq = append(seq, &EvalInitProvider{
19		TypeName: relAddr.Type,
20		Addr:     addr.ProviderConfig,
21	})
22
23	// Input stuff
24	seq = append(seq, &EvalOpFilter{
25		Ops: []walkOperation{walkImport},
26		Node: &EvalSequence{
27			Nodes: []EvalNode{
28				&EvalGetProvider{
29					Addr:   addr,
30					Output: &provider,
31				},
32			},
33		},
34	})
35
36	seq = append(seq, &EvalOpFilter{
37		Ops: []walkOperation{walkValidate},
38		Node: &EvalSequence{
39			Nodes: []EvalNode{
40				&EvalGetProvider{
41					Addr:   addr,
42					Output: &provider,
43				},
44				&EvalValidateProvider{
45					Addr:     relAddr,
46					Provider: &provider,
47					Config:   config,
48				},
49			},
50		},
51	})
52
53	// Apply stuff
54	seq = append(seq, &EvalOpFilter{
55		Ops: []walkOperation{walkRefresh, walkPlan, walkApply, walkDestroy, walkImport},
56		Node: &EvalSequence{
57			Nodes: []EvalNode{
58				&EvalGetProvider{
59					Addr:   addr,
60					Output: &provider,
61				},
62			},
63		},
64	})
65
66	// We configure on everything but validate, since validate may
67	// not have access to all the variables.
68	seq = append(seq, &EvalOpFilter{
69		Ops: []walkOperation{walkRefresh, walkPlan, walkApply, walkDestroy, walkImport},
70		Node: &EvalSequence{
71			Nodes: []EvalNode{
72				&EvalConfigProvider{
73					Addr:     relAddr,
74					Provider: &provider,
75					Config:   config,
76				},
77			},
78		},
79	})
80
81	return &EvalSequence{Nodes: seq}
82}
83
84// CloseProviderEvalTree returns the evaluation tree for closing
85// provider connections that aren't needed anymore.
86func CloseProviderEvalTree(addr addrs.AbsProviderConfig) EvalNode {
87	return &EvalCloseProvider{Addr: addr.ProviderConfig}
88}
89