actions: fail invoke plans when action configurations are unknown (#37793)
Some checks are pending
build / Determine intended Terraform version (push) Waiting to run
build / Determine Go toolchain version (push) Waiting to run
build / Generate release metadata (push) Blocked by required conditions
build / Build for freebsd_386 (push) Blocked by required conditions
build / Build for linux_386 (push) Blocked by required conditions
build / Build for openbsd_386 (push) Blocked by required conditions
build / Build for windows_386 (push) Blocked by required conditions
build / Build for darwin_amd64 (push) Blocked by required conditions
build / Build for freebsd_amd64 (push) Blocked by required conditions
build / Build for linux_amd64 (push) Blocked by required conditions
build / Build for openbsd_amd64 (push) Blocked by required conditions
build / Build for solaris_amd64 (push) Blocked by required conditions
build / Build for windows_amd64 (push) Blocked by required conditions
build / Build for freebsd_arm (push) Blocked by required conditions
build / Build for linux_arm (push) Blocked by required conditions
build / Build for darwin_arm64 (push) Blocked by required conditions
build / Build for linux_arm64 (push) Blocked by required conditions
build / Build for windows_arm64 (push) Blocked by required conditions
build / Build Docker image for linux_386 (push) Blocked by required conditions
build / Build Docker image for linux_amd64 (push) Blocked by required conditions
build / Build Docker image for linux_arm (push) Blocked by required conditions
build / Build Docker image for linux_arm64 (push) Blocked by required conditions
build / Build e2etest for linux_386 (push) Blocked by required conditions
build / Build e2etest for windows_386 (push) Blocked by required conditions
build / Build e2etest for darwin_amd64 (push) Blocked by required conditions
build / Build e2etest for linux_amd64 (push) Blocked by required conditions
build / Build e2etest for windows_amd64 (push) Blocked by required conditions
build / Build e2etest for linux_arm (push) Blocked by required conditions
build / Build e2etest for darwin_arm64 (push) Blocked by required conditions
build / Build e2etest for linux_arm64 (push) Blocked by required conditions
build / Run e2e test for linux_386 (push) Blocked by required conditions
build / Run e2e test for windows_386 (push) Blocked by required conditions
build / Run e2e test for darwin_amd64 (push) Blocked by required conditions
build / Run e2e test for linux_amd64 (push) Blocked by required conditions
build / Run e2e test for windows_amd64 (push) Blocked by required conditions
build / Run e2e test for linux_arm (push) Blocked by required conditions
build / Run e2e test for linux_arm64 (push) Blocked by required conditions
build / Run terraform-exec test for linux amd64 (push) Blocked by required conditions
Quick Checks / Unit Tests (push) Waiting to run
Quick Checks / Race Tests (push) Waiting to run
Quick Checks / End-to-end Tests (push) Waiting to run
Quick Checks / Code Consistency Checks (push) Waiting to run

This commit is contained in:
Liam Cervante 2025-10-21 23:13:25 +02:00 committed by GitHub
parent 88e4c9e3d3
commit edf0cd66dd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 51 additions and 0 deletions

View file

@ -2726,6 +2726,43 @@ action "test_action" "one" {
},
},
"invoke action with partially applied configuration": {
module: map[string]string{
"main.tf": `
resource "test_object" "a" {
name = "hello"
}
action "test_action" "one" {
config {
attr = test_object.a.name
}
}
`,
},
planOpts: &PlanOpts{
Mode: plans.RefreshOnlyMode,
ActionTargets: []addrs.Targetable{
addrs.AbsAction{
Action: addrs.Action{
Type: "test_action",
Name: "one",
},
},
},
},
expectPlanActionCalled: false,
assertPlanDiagnostics: func(t *testing.T, diagnostics tfdiags.Diagnostics) {
if len(diagnostics) != 1 {
t.Errorf("expected exactly one diagnostic but got %d", len(diagnostics))
}
if diagnostics[0].Description().Summary != "Partially applied configuration" {
t.Errorf("wrong diagnostic: %s", diagnostics[0].Description().Summary)
}
},
},
"non-referenced resource isn't refreshed during invoke": {
module: map[string]string{
"main.tf": `

View file

@ -165,6 +165,20 @@ func (n *nodeActionInvokeInstance) Execute(ctx EvalContext, _ walkOperation) tfd
}
unmarkedConfig, _ := actionInstance.ConfigValue.UnmarkDeepWithPaths()
if !unmarkedConfig.IsWhollyKnown() {
// we're not actually planning or applying changes from the
// configuration. if the configuration of the action has unknown values
// it means one of the resources that are referenced hasn't actually
// been created.
return diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Partially applied configuration",
Detail: fmt.Sprintf("The action %s contains unknown values while planning. This means it is referencing resources that have not yet been created, please run a complete plan/apply cycle to ensure the state matches the configuration before using the -invoke argument.", n.Target.String()),
Subject: n.Config.DeclRange.Ptr(),
})
}
resp := provider.PlanAction(providers.PlanActionRequest{
ActionType: n.Target.Action.Action.Type,
ProposedActionData: unmarkedConfig,