diff --git a/internal/plans/action_invocation.go b/internal/plans/action_invocation.go index 06059d818b..9b98064e19 100644 --- a/internal/plans/action_invocation.go +++ b/internal/plans/action_invocation.go @@ -34,25 +34,31 @@ type ActionInvocationInstance struct { // serialized so it can be written to a plan file. Pass the implied type of the // corresponding resource type schema for correct operation. func (ai *ActionInvocationInstance) Encode(schema *providers.ActionSchema) (*ActionInvocationInstanceSrc, error) { - ty := cty.DynamicPseudoType - if schema != nil { - ty = schema.ConfigSchema.ImpliedType() - } - - configValue, err := NewDynamicValue(ai.ConfigValue, ty) - if err != nil { - return nil, err - } - return &ActionInvocationInstanceSrc{ + ret := &ActionInvocationInstanceSrc{ Addr: ai.Addr, TriggeringResourceAddr: ai.TriggeringResourceAddr, TriggerEvent: ai.TriggerEvent, ActionTriggerBlockIndex: ai.ActionTriggerBlockIndex, ActionsListIndex: ai.ActionsListIndex, ProviderAddr: ai.ProviderAddr, - ConfigValue: configValue, - }, nil + } + + if ai.ConfigValue != cty.NilVal { + ty := cty.DynamicPseudoType + if schema != nil { + ty = schema.ConfigSchema.ImpliedType() + } + + var err error + ret.ConfigValue, err = NewDynamicValue(ai.ConfigValue, ty) + if err != nil { + return nil, err + } + } + + return ret, nil + } type ActionInvocationInstances []*ActionInvocationInstance diff --git a/internal/plans/planfile/tfplan.go b/internal/plans/planfile/tfplan.go index c71d89033a..cf29be9311 100644 --- a/internal/plans/planfile/tfplan.go +++ b/internal/plans/planfile/tfplan.go @@ -1291,11 +1291,13 @@ func actionInvocationFromTfplan(rawAction *planproto.ActionInvocationInstance) ( } ret.ProviderAddr = providerAddr - configVal, err := valueFromTfplan(rawAction.ConfigValue) - if err != nil { - return nil, fmt.Errorf("invalid config value: %s", err) + if rawAction.ConfigValue != nil { + configVal, err := valueFromTfplan(rawAction.ConfigValue) + if err != nil { + return nil, fmt.Errorf("invalid config value: %s", err) + } + ret.ConfigValue = configVal } - ret.ConfigValue = configVal return ret, nil } @@ -1320,7 +1322,6 @@ func actionInvocationToTfPlan(action *plans.ActionInvocationInstanceSrc) (*planp case configs.AfterDestroy: triggerEvent = planproto.ActionTriggerEvent_AFTER_DESTROY } - configValue := valueToTfplan(action.ConfigValue) ret := &planproto.ActionInvocationInstance{ Addr: action.Addr.String(), @@ -1329,7 +1330,11 @@ func actionInvocationToTfPlan(action *plans.ActionInvocationInstanceSrc) (*planp ActionsListIndex: int64(action.ActionsListIndex), ActionTriggerBlockIndex: int64(action.ActionTriggerBlockIndex), TriggerEvent: triggerEvent, - ConfigValue: configValue, } + + if action.ConfigValue != nil { + ret.ConfigValue = valueToTfplan(action.ConfigValue) + } + return ret, nil } diff --git a/internal/plans/planfile/tfplan_test.go b/internal/plans/planfile/tfplan_test.go index bb90709eaa..10df8f5ff7 100644 --- a/internal/plans/planfile/tfplan_test.go +++ b/internal/plans/planfile/tfplan_test.go @@ -316,6 +316,21 @@ func examplePlanForTest(t *testing.T) *plans.Plan { Name: "woot", }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), }, + { + Addr: addrs.Action{Type: "example", Name: "bar"}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: provider, + TriggerEvent: configs.BeforeCreate, + ActionTriggerBlockIndex: 2, + ActionsListIndex: 1, + TriggeringResourceAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "test_thing", + Name: "woot", + }.Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance), + ConfigValue: mustNewDynamicValue(cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("testing"), + }), objTy), + }, }, }, DriftedResources: []*plans.ResourceInstanceChangeSrc{