From dc0eba33afd2927c1de26bc551d85c7382e6e721 Mon Sep 17 00:00:00 2001 From: Kevin Vu Date: Wed, 19 Nov 2025 00:51:09 -0800 Subject: [PATCH] fix: support ephemeral resources in jsonchecks (#37893) Fixes #37834 --- .changes/v1.15/BUG FIXES-20251112-033830.yaml | 5 ++ internal/command/jsonchecks/checks_test.go | 52 +++++++++++++++++++ internal/command/jsonchecks/objects.go | 2 + 3 files changed, 59 insertions(+) create mode 100644 .changes/v1.15/BUG FIXES-20251112-033830.yaml diff --git a/.changes/v1.15/BUG FIXES-20251112-033830.yaml b/.changes/v1.15/BUG FIXES-20251112-033830.yaml new file mode 100644 index 0000000000..1cafafd43a --- /dev/null +++ b/.changes/v1.15/BUG FIXES-20251112-033830.yaml @@ -0,0 +1,5 @@ +kind: BUG FIXES +body: 'cli: Fixed crash in `terraform show -json` when plan contains ephemeral resources with preconditions or postconditions' +time: 2025-11-12T03:38:30.000000-08:00 +custom: + Issue: "37834" diff --git a/internal/command/jsonchecks/checks_test.go b/internal/command/jsonchecks/checks_test.go index 4b631801ca..b4754874d2 100644 --- a/internal/command/jsonchecks/checks_test.go +++ b/internal/command/jsonchecks/checks_test.go @@ -41,6 +41,16 @@ func TestMarshalCheckStates(t *testing.T) { outputBInstAddr := addrs.Checkable(addrs.OutputValue{Name: "b"}.Absolute(moduleChildAddr)) checkBlockAAddr := addrs.ConfigCheckable(addrs.Check{Name: "a"}.InModule(addrs.RootModule)) checkBlockAInstAddr := addrs.Checkable(addrs.Check{Name: "a"}.Absolute(addrs.RootModuleInstance)) + ephemeralResourceAddr := addrs.ConfigCheckable(addrs.Resource{ + Mode: addrs.EphemeralResourceMode, + Type: "test", + Name: "ephemeral", + }.InModule(addrs.RootModule)) + ephemeralResourceInstAddr := addrs.Checkable(addrs.Resource{ + Mode: addrs.EphemeralResourceMode, + Type: "test", + Name: "ephemeral", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance)) tests := map[string]struct { Input *states.CheckResults @@ -223,6 +233,48 @@ func TestMarshalCheckStates(t *testing.T) { }, }, }, + "ephemeral_resource": { + &states.CheckResults{ + ConfigResults: addrs.MakeMap( + addrs.MakeMapElem(ephemeralResourceAddr, &states.CheckResultAggregate{ + Status: checks.StatusFail, + ObjectResults: addrs.MakeMap( + addrs.MakeMapElem(ephemeralResourceInstAddr, &states.CheckResultObject{ + Status: checks.StatusFail, + FailureMessages: []string{ + "Ephemeral resource check failed.", + }, + }), + ), + }), + ), + }, + []any{ + map[string]any{ + "address": map[string]any{ + "kind": "resource", + "mode": "ephemeral", + "name": "ephemeral", + "to_display": "ephemeral.test.ephemeral", + "type": "test", + }, + "instances": []any{ + map[string]any{ + "address": map[string]any{ + "to_display": "ephemeral.test.ephemeral", + }, + "problems": []any{ + map[string]any{ + "message": "Ephemeral resource check failed.", + }, + }, + "status": "fail", + }, + }, + "status": "fail", + }, + }, + }, } for name, test := range tests { diff --git a/internal/command/jsonchecks/objects.go b/internal/command/jsonchecks/objects.go index b2a0c94e12..61a868f0d0 100644 --- a/internal/command/jsonchecks/objects.go +++ b/internal/command/jsonchecks/objects.go @@ -29,6 +29,8 @@ func makeStaticObjectAddr(addr addrs.ConfigCheckable) staticObjectAddr { ret["mode"] = "managed" case addrs.DataResourceMode: ret["mode"] = "data" + case addrs.EphemeralResourceMode: + ret["mode"] = "ephemeral" default: panic(fmt.Sprintf("unsupported resource mode %#v", addr.Resource.Mode)) }