Skip to content

Commit 4322ab2

Browse files
refactor: add abstract action trigger
1 parent 0031dcc commit 4322ab2

File tree

4 files changed

+112
-75
lines changed

4 files changed

+112
-75
lines changed

internal/terraform/graph_builder_plan.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ func (b *PlanGraphBuilder) Steps() []GraphTransformer {
170170
Operation: b.Operation,
171171
ActionTargets: b.ActionTargets,
172172
queryPlanMode: b.queryPlan,
173+
174+
ConcreteActionTriggerNodeFunc: func(node *nodeAbstractActionTriggerExpand) dag.Vertex {
175+
return &nodeActionTriggerPlanExpand{
176+
nodeAbstractActionTriggerExpand: node,
177+
}
178+
},
173179
},
174180

175181
&ActionInvokeTransformer{
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: BUSL-1.1
3+
4+
package terraform
5+
6+
import (
7+
"fmt"
8+
9+
"github.com/hashicorp/hcl/v2"
10+
11+
"github.com/hashicorp/terraform/internal/addrs"
12+
"github.com/hashicorp/terraform/internal/configs"
13+
"github.com/hashicorp/terraform/internal/dag"
14+
"github.com/hashicorp/terraform/internal/lang/langrefs"
15+
)
16+
17+
// ConcreteActionTriggerNodeFunc is a callback type used to convert an
18+
// abstract action trigger to a concrete one of some type.
19+
type ConcreteActionTriggerNodeFunc func(*nodeAbstractActionTriggerExpand) dag.Vertex
20+
21+
type nodeAbstractActionTriggerExpand struct {
22+
Addr addrs.ConfigAction
23+
resolvedProvider addrs.AbsProviderConfig
24+
Config *configs.Action
25+
26+
lifecycleActionTrigger *lifecycleActionTrigger
27+
}
28+
29+
type lifecycleActionTrigger struct {
30+
resourceAddress addrs.ConfigResource
31+
events []configs.ActionTriggerEvent
32+
actionTriggerBlockIndex int
33+
actionListIndex int
34+
invokingSubject *hcl.Range
35+
actionExpr hcl.Expression
36+
conditionExpr hcl.Expression
37+
}
38+
39+
func (at *lifecycleActionTrigger) Name() string {
40+
return fmt.Sprintf("%s.lifecycle.action_trigger[%d].actions[%d]", at.resourceAddress.String(), at.actionTriggerBlockIndex, at.actionListIndex)
41+
}
42+
43+
var (
44+
_ GraphNodeReferencer = (*nodeAbstractActionTriggerExpand)(nil)
45+
)
46+
47+
func (n *nodeAbstractActionTriggerExpand) Name() string {
48+
triggeredBy := "triggered by "
49+
if n.lifecycleActionTrigger != nil {
50+
triggeredBy += n.lifecycleActionTrigger.resourceAddress.String()
51+
} else {
52+
triggeredBy += "unknown"
53+
}
54+
55+
return fmt.Sprintf("%s %s", n.Addr.String(), triggeredBy)
56+
}
57+
58+
func (n *nodeAbstractActionTriggerExpand) ModulePath() addrs.Module {
59+
return n.Addr.Module
60+
}
61+
62+
func (n *nodeAbstractActionTriggerExpand) References() []*addrs.Reference {
63+
var refs []*addrs.Reference
64+
refs = append(refs, &addrs.Reference{
65+
Subject: n.Addr.Action,
66+
})
67+
68+
if n.lifecycleActionTrigger != nil {
69+
refs = append(refs, &addrs.Reference{
70+
Subject: n.lifecycleActionTrigger.resourceAddress.Resource,
71+
})
72+
73+
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.lifecycleActionTrigger.conditionExpr)
74+
refs = append(refs, conditionRefs...)
75+
}
76+
77+
return refs
78+
}
79+
80+
func (n *nodeAbstractActionTriggerExpand) ProvidedBy() (addr addrs.ProviderConfig, exact bool) {
81+
if n.resolvedProvider.Provider.Type != "" {
82+
return n.resolvedProvider, true
83+
}
84+
85+
// Since we always have a config, we can use it
86+
relAddr := n.Config.ProviderConfigAddr()
87+
return addrs.LocalProviderConfig{
88+
LocalName: relAddr.LocalName,
89+
Alias: relAddr.Alias,
90+
}, false
91+
}
92+
93+
func (n *nodeAbstractActionTriggerExpand) Provider() (provider addrs.Provider) {
94+
return n.Config.Provider
95+
}
96+
97+
func (n *nodeAbstractActionTriggerExpand) SetProvider(config addrs.AbsProviderConfig) {
98+
n.resolvedProvider = config
99+
}

internal/terraform/node_action_trigger_plan.go

Lines changed: 2 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,15 @@ package terraform
66
import (
77
"fmt"
88

9-
"github.com/hashicorp/hcl/v2"
109
"github.com/zclconf/go-cty/cty"
1110

1211
"github.com/hashicorp/terraform/internal/addrs"
13-
"github.com/hashicorp/terraform/internal/configs"
1412
"github.com/hashicorp/terraform/internal/instances"
15-
"github.com/hashicorp/terraform/internal/lang/langrefs"
1613
"github.com/hashicorp/terraform/internal/tfdiags"
1714
)
1815

1916
type nodeActionTriggerPlanExpand struct {
20-
Addr addrs.ConfigAction
21-
resolvedProvider addrs.AbsProviderConfig
22-
Config *configs.Action
23-
24-
lifecycleActionTrigger *lifecycleActionTrigger
25-
}
26-
27-
type lifecycleActionTrigger struct {
28-
resourceAddress addrs.ConfigResource
29-
events []configs.ActionTriggerEvent
30-
actionTriggerBlockIndex int
31-
actionListIndex int
32-
invokingSubject *hcl.Range
33-
actionExpr hcl.Expression
34-
conditionExpr hcl.Expression
35-
}
36-
37-
func (at *lifecycleActionTrigger) Name() string {
38-
return fmt.Sprintf("%s.lifecycle.action_trigger[%d].actions[%d]", at.resourceAddress.String(), at.actionTriggerBlockIndex, at.actionListIndex)
17+
*nodeAbstractActionTriggerExpand
3918
}
4019

4120
var (
@@ -44,14 +23,7 @@ var (
4423
)
4524

4625
func (n *nodeActionTriggerPlanExpand) Name() string {
47-
triggeredBy := "triggered by "
48-
if n.lifecycleActionTrigger != nil {
49-
triggeredBy += n.lifecycleActionTrigger.resourceAddress.String()
50-
} else {
51-
triggeredBy += "unknown"
52-
}
53-
54-
return fmt.Sprintf("%s %s", n.Addr.String(), triggeredBy)
26+
return fmt.Sprintf("%s (plan)", n.nodeAbstractActionTriggerExpand.Name())
5527
}
5628

5729
func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tfdiags.Diagnostics) {
@@ -148,46 +120,3 @@ func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tf
148120
addRootNodeToGraph(&g)
149121
return &g, diags
150122
}
151-
152-
func (n *nodeActionTriggerPlanExpand) ModulePath() addrs.Module {
153-
return n.Addr.Module
154-
}
155-
156-
func (n *nodeActionTriggerPlanExpand) References() []*addrs.Reference {
157-
var refs []*addrs.Reference
158-
refs = append(refs, &addrs.Reference{
159-
Subject: n.Addr.Action,
160-
})
161-
162-
if n.lifecycleActionTrigger != nil {
163-
refs = append(refs, &addrs.Reference{
164-
Subject: n.lifecycleActionTrigger.resourceAddress.Resource,
165-
})
166-
167-
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.lifecycleActionTrigger.conditionExpr)
168-
refs = append(refs, conditionRefs...)
169-
}
170-
171-
return refs
172-
}
173-
174-
func (n *nodeActionTriggerPlanExpand) ProvidedBy() (addr addrs.ProviderConfig, exact bool) {
175-
if n.resolvedProvider.Provider.Type != "" {
176-
return n.resolvedProvider, true
177-
}
178-
179-
// Since we always have a config, we can use it
180-
relAddr := n.Config.ProviderConfigAddr()
181-
return addrs.LocalProviderConfig{
182-
LocalName: relAddr.LocalName,
183-
Alias: relAddr.Alias,
184-
}, false
185-
}
186-
187-
func (n *nodeActionTriggerPlanExpand) Provider() (provider addrs.Provider) {
188-
return n.Config.Provider
189-
}
190-
191-
func (n *nodeActionTriggerPlanExpand) SetProvider(config addrs.AbsProviderConfig) {
192-
n.resolvedProvider = config
193-
}

internal/terraform/transform_action_trigger_config.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ type ActionTriggerConfigTransformer struct {
1818
Operation walkOperation
1919

2020
queryPlanMode bool
21+
22+
ConcreteActionTriggerNodeFunc ConcreteActionTriggerNodeFunc
2123
}
2224

2325
func (t *ActionTriggerConfigTransformer) Transform(g *Graph) error {
@@ -69,7 +71,7 @@ func (t *ActionTriggerConfigTransformer) transformSingle(g *Graph, config *confi
6971
}
7072

7173
for _, r := range config.Module.ManagedResources {
72-
priorNodes := []*nodeActionTriggerPlanExpand{}
74+
priorNodes := []dag.Vertex{}
7375
for i, at := range r.Managed.ActionTriggers {
7476
for j, action := range at.Actions {
7577
refs, parseRefDiags := langrefs.ReferencesInExpr(addrs.ParseRef, action.Expr)
@@ -105,7 +107,7 @@ func (t *ActionTriggerConfigTransformer) transformSingle(g *Graph, config *confi
105107
panic(fmt.Sprintf("Could not find node for %s", resourceAddr))
106108
}
107109

108-
nat := &nodeActionTriggerPlanExpand{
110+
abstract := &nodeAbstractActionTriggerExpand{
109111
Addr: configAction,
110112
Config: actionConfig,
111113
lifecycleActionTrigger: &lifecycleActionTrigger{
@@ -119,6 +121,7 @@ func (t *ActionTriggerConfigTransformer) transformSingle(g *Graph, config *confi
119121
},
120122
}
121123

124+
nat := t.ConcreteActionTriggerNodeFunc(abstract)
122125
g.Add(nat)
123126

124127
// We always want to plan after the resource is done planning

0 commit comments

Comments
 (0)