Skip to content

Commit 411f18e

Browse files
authored
ephemerals: allow root ephemeral outputs in stacks and test (#37813)
* ephemerals: allow root ephemeral outputs in stacks and test * remember to set new opt for apply stage
1 parent d4e8f17 commit 411f18e

File tree

26 files changed

+353
-125
lines changed

26 files changed

+353
-125
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: BUG FIXES
2+
body: 'test: allow ephemeral outputs in root modules'
3+
time: 2025-10-24T16:44:34.197847+02:00
4+
custom:
5+
Issue: "37813"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: BUG FIXES
2+
body: 'stacks: allow ephemeral outputs in root modules'
3+
time: 2025-10-24T16:44:48.264142+02:00
4+
custom:
5+
Issue: "37813"

internal/command/test_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,9 @@ func TestTest_Runs(t *testing.T) {
409409
expectedOut: []string{"3 passed, 0 failed."},
410410
code: 0,
411411
},
412+
"ephemeral_output": {
413+
code: 0,
414+
},
412415
"no-tests": {
413416
code: 0,
414417
},
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "foo" {
2+
ephemeral = true
3+
type = string
4+
}
5+
output "value" {
6+
value = var.foo
7+
ephemeral = true
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
run "validate_ephemeral_input" {
2+
variables {
3+
foo = "whaaat"
4+
}
5+
}

internal/configs/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,9 @@ func (c *Config) EffectiveRequiredProviderConfigs() addrs.Map[addrs.RootProvider
10391039
for _, rc := range c.Module.Actions {
10401040
maybePutLocal(rc.ProviderConfigAddr(), false)
10411041
}
1042+
for _, rc := range c.Module.EphemeralResources {
1043+
maybePutLocal(rc.ProviderConfigAddr(), false)
1044+
}
10421045
for _, ic := range c.Module.Import {
10431046
if ic.ProviderConfigRef != nil {
10441047
maybePutLocal(addrs.LocalProviderConfig{

internal/moduletest/graph/apply.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,9 @@ func apply(tfCtx *terraform.Context, run *configs.TestRun, module *configs.Confi
154154
}
155155

156156
applyOpts := &terraform.ApplyOpts{
157-
SetVariables: ephemeralVariables,
158-
ExternalProviders: providers,
157+
SetVariables: ephemeralVariables,
158+
ExternalProviders: providers,
159+
AllowRootEphemeralOutputs: true,
159160
}
160161

161162
waiter.update(tfCtx, progress, created)

internal/moduletest/graph/node_state_cleanup.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,14 @@ func (n *NodeStateCleanup) restore(ctx *EvalContext, file *configs.TestFile, run
126126
setVariables, _, _ := FilterVariablesToModule(module, variables)
127127

128128
planOpts := &terraform.PlanOpts{
129-
Mode: plans.NormalMode,
130-
SetVariables: setVariables,
131-
Overrides: mocking.PackageOverrides(run, file, mocks),
132-
ExternalProviders: providers,
133-
SkipRefresh: true,
134-
OverridePreventDestroy: true,
135-
DeferralAllowed: ctx.deferralAllowed,
129+
Mode: plans.NormalMode,
130+
SetVariables: setVariables,
131+
Overrides: mocking.PackageOverrides(run, file, mocks),
132+
ExternalProviders: providers,
133+
SkipRefresh: true,
134+
OverridePreventDestroy: true,
135+
DeferralAllowed: ctx.deferralAllowed,
136+
AllowRootEphemeralOutputs: true,
136137
}
137138

138139
tfCtx, _ := terraform.NewContext(n.opts.ContextOpts)
@@ -177,13 +178,14 @@ func (n *NodeStateCleanup) destroy(ctx *EvalContext, file *configs.TestFile, run
177178
setVariables, _, _ := FilterVariablesToModule(module, variables)
178179

179180
planOpts := &terraform.PlanOpts{
180-
Mode: plans.DestroyMode,
181-
SetVariables: setVariables,
182-
Overrides: mocking.PackageOverrides(run, file, mocks),
183-
ExternalProviders: providers,
184-
SkipRefresh: true,
185-
OverridePreventDestroy: true,
186-
DeferralAllowed: ctx.deferralAllowed,
181+
Mode: plans.DestroyMode,
182+
SetVariables: setVariables,
183+
Overrides: mocking.PackageOverrides(run, file, mocks),
184+
ExternalProviders: providers,
185+
SkipRefresh: true,
186+
OverridePreventDestroy: true,
187+
DeferralAllowed: ctx.deferralAllowed,
188+
AllowRootEphemeralOutputs: true,
187189
}
188190

189191
tfCtx, _ := terraform.NewContext(n.opts.ContextOpts)

internal/moduletest/graph/node_test_run.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ func (n *NodeTestRun) testValidate(providers map[addrs.RootProviderConfig]provid
193193
}
194194
waiter.update(tfCtx, moduletest.Running, nil)
195195
validateDiags := tfCtx.Validate(config, &terraform.ValidateOpts{
196-
ExternalProviders: providers,
196+
ExternalProviders: providers,
197+
AllowRootEphemeralOutputs: true,
197198
})
198199
run.Diagnostics = run.Diagnostics.Append(validateDiags)
199200
if validateDiags.HasErrors() {

internal/moduletest/graph/plan.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,15 @@ func plan(ctx *EvalContext, tfCtx *terraform.Context, file *configs.TestFile, ru
127127
return plans.NormalMode
128128
}
129129
}(),
130-
Targets: targets,
131-
ForceReplace: replaces,
132-
SkipRefresh: !run.Options.Refresh,
133-
SetVariables: variables,
134-
ExternalReferences: references,
135-
ExternalProviders: providers,
136-
Overrides: mocking.PackageOverrides(run, file, mocks),
137-
DeferralAllowed: ctx.deferralAllowed,
130+
Targets: targets,
131+
ForceReplace: replaces,
132+
SkipRefresh: !run.Options.Refresh,
133+
SetVariables: variables,
134+
ExternalReferences: references,
135+
ExternalProviders: providers,
136+
Overrides: mocking.PackageOverrides(run, file, mocks),
137+
DeferralAllowed: ctx.deferralAllowed,
138+
AllowRootEphemeralOutputs: true,
138139
}
139140

140141
waiter.update(tfCtx, moduletest.Running, nil)

0 commit comments

Comments
 (0)