|
|
|
|
@ -3297,6 +3297,81 @@ resource "test" "a" {
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ephemeralResourceOpenDeferral = deferredActionsTest{
|
|
|
|
|
configs: map[string]string{
|
|
|
|
|
"main.tf": `
|
|
|
|
|
ephemeral "test" "data" {
|
|
|
|
|
name = "deferred_open"
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
stages: []deferredActionsTestStage{
|
|
|
|
|
{
|
|
|
|
|
complete: false,
|
|
|
|
|
wantActions: map[string]plans.Action{},
|
|
|
|
|
wantPlanned: map[string]cty.Value{},
|
|
|
|
|
wantDeferred: map[string]ExpectedDeferred{
|
|
|
|
|
"ephemeral.test.data": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Read},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ephemeralResourceOpenDeferralWithDependency = deferredActionsTest{
|
|
|
|
|
configs: map[string]string{
|
|
|
|
|
"main.tf": `
|
|
|
|
|
ephemeral "test" "data" {
|
|
|
|
|
name = "deferred_open"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ephemeral "test" "dep" {
|
|
|
|
|
name = ephemeral.test.data.value
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
stages: []deferredActionsTestStage{
|
|
|
|
|
{
|
|
|
|
|
complete: false,
|
|
|
|
|
wantActions: map[string]plans.Action{},
|
|
|
|
|
wantPlanned: map[string]cty.Value{},
|
|
|
|
|
wantDeferred: map[string]ExpectedDeferred{
|
|
|
|
|
"ephemeral.test.data": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Read},
|
|
|
|
|
"ephemeral.test.dep": {Reason: providers.DeferredReasonResourceConfigUnknown, Action: plans.Read},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ephemeralResourceOpenDeferralExpanded = deferredActionsTest{
|
|
|
|
|
configs: map[string]string{
|
|
|
|
|
"main.tf": `
|
|
|
|
|
|
|
|
|
|
variable "each" {
|
|
|
|
|
type = set(string)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ephemeral "test" "data" {
|
|
|
|
|
for_each = var.each
|
|
|
|
|
|
|
|
|
|
name = each.value
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
stages: []deferredActionsTestStage{
|
|
|
|
|
{
|
|
|
|
|
inputs: map[string]cty.Value{
|
|
|
|
|
"each": cty.DynamicVal,
|
|
|
|
|
},
|
|
|
|
|
complete: false,
|
|
|
|
|
wantActions: map[string]plans.Action{},
|
|
|
|
|
wantPlanned: map[string]cty.Value{},
|
|
|
|
|
wantDeferred: map[string]ExpectedDeferred{
|
|
|
|
|
"ephemeral.test.*.data": {Reason: providers.DeferredReasonInstanceCountUnknown, Action: plans.Read},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestContextApply_deferredActions(t *testing.T) {
|
|
|
|
|
@ -3346,6 +3421,9 @@ func TestContextApply_deferredActions(t *testing.T) {
|
|
|
|
|
"plan_update_external_deferral": planUpdateExternalDeferral,
|
|
|
|
|
"plan_delete_external_deferral": planDeleteExternalDeferral,
|
|
|
|
|
"plan_delete_mode_external_deferral": planDeleteModeExternalDeferral,
|
|
|
|
|
"ephemeral_open_deferral": ephemeralResourceOpenDeferral,
|
|
|
|
|
"ephemeral_open_deferral_dependencies": ephemeralResourceOpenDeferralWithDependency,
|
|
|
|
|
"ephemeral_open_deferral_expanded": ephemeralResourceOpenDeferralExpanded,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for name, test := range tests {
|
|
|
|
|
@ -3466,7 +3544,6 @@ func TestContextApply_deferredActions(t *testing.T) {
|
|
|
|
|
t.Errorf("wrong provider address in plan\n%s", diff)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if stage.wantApplied == nil {
|
|
|
|
|
@ -3590,6 +3667,22 @@ func (provider *deferredActionsProvider) Provider() providers.Interface {
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
EphemeralResourceTypes: map[string]providers.Schema{
|
|
|
|
|
"test": {
|
|
|
|
|
Block: &configschema.Block{
|
|
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
|
"name": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
Required: true,
|
|
|
|
|
},
|
|
|
|
|
"value": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
Computed: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ReadResourceFn: func(req providers.ReadResourceRequest) providers.ReadResourceResponse {
|
|
|
|
|
if key := req.PriorState.GetAttr("name"); key.IsKnown() && key.AsString() == "deferred_read" {
|
|
|
|
|
@ -3703,6 +3796,24 @@ func (provider *deferredActionsProvider) Provider() providers.Interface {
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
OpenEphemeralResourceFn: func(op providers.OpenEphemeralResourceRequest) providers.OpenEphemeralResourceResponse {
|
|
|
|
|
name := op.Config.GetAttr("name").AsString()
|
|
|
|
|
|
|
|
|
|
res := providers.OpenEphemeralResourceResponse{
|
|
|
|
|
Result: cty.ObjectVal(map[string]cty.Value{
|
|
|
|
|
"name": cty.StringVal(name),
|
|
|
|
|
"value": cty.StringVal("ephemeral_value"),
|
|
|
|
|
}),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if name == "deferred_open" {
|
|
|
|
|
res.Deferred = &providers.Deferred{
|
|
|
|
|
Reason: providers.DeferredReasonProviderConfigUnknown,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|