mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
test for configured destroy plan provider
This commit is contained in:
parent
8fed14fc59
commit
ec476af655
@ -3,6 +3,7 @@ package terraform
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -912,3 +913,140 @@ resource "test_resource" "c" {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pass an input through some expanded values, and back to a provider to make
|
||||||
|
// sure we can fully evaluate a provider configuration during a destroy plan.
|
||||||
|
func TestContext2Apply_destroyWithConfiguredProvider(t *testing.T) {
|
||||||
|
m := testModuleInline(t, map[string]string{
|
||||||
|
"main.tf": `
|
||||||
|
variable "in" {
|
||||||
|
type = map(string)
|
||||||
|
default = {
|
||||||
|
"a" = "first"
|
||||||
|
"b" = "second"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module "mod" {
|
||||||
|
source = "./mod"
|
||||||
|
for_each = var.in
|
||||||
|
in = each.value
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
config = [for each in module.mod : each.out]
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "other" {
|
||||||
|
output = [for each in module.mod : each.out]
|
||||||
|
local = local.config
|
||||||
|
var = var.in
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "other_object" "other" {
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
"./mod/main.tf": `
|
||||||
|
variable "in" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
data "test_object" "d" {
|
||||||
|
test_string = var.in
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "test_object" "a" {
|
||||||
|
test_string = var.in
|
||||||
|
}
|
||||||
|
|
||||||
|
output "out" {
|
||||||
|
value = data.test_object.d.output
|
||||||
|
}
|
||||||
|
`})
|
||||||
|
|
||||||
|
testProvider := &MockProvider{
|
||||||
|
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
||||||
|
Provider: providers.Schema{Block: simpleTestSchema()},
|
||||||
|
ResourceTypes: map[string]providers.Schema{
|
||||||
|
"test_object": providers.Schema{Block: simpleTestSchema()},
|
||||||
|
},
|
||||||
|
DataSources: map[string]providers.Schema{
|
||||||
|
"test_object": providers.Schema{
|
||||||
|
Block: &configschema.Block{
|
||||||
|
Attributes: map[string]*configschema.Attribute{
|
||||||
|
"test_string": {
|
||||||
|
Type: cty.String,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
Type: cty.String,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
testProvider.ReadDataSourceFn = func(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||||
|
cfg := req.Config.AsValueMap()
|
||||||
|
s := cfg["test_string"].AsString()
|
||||||
|
if !strings.Contains("firstsecond", s) {
|
||||||
|
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("expected 'first' or 'second', got %s", s))
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg["output"] = cty.StringVal(s + "-ok")
|
||||||
|
resp.State = cty.ObjectVal(cfg)
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
otherProvider := &MockProvider{
|
||||||
|
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
|
||||||
|
Provider: providers.Schema{
|
||||||
|
Block: &configschema.Block{
|
||||||
|
Attributes: map[string]*configschema.Attribute{
|
||||||
|
"output": {
|
||||||
|
Type: cty.List(cty.String),
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
Type: cty.List(cty.String),
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
"var": {
|
||||||
|
Type: cty.Map(cty.String),
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ResourceTypes: map[string]providers.Schema{
|
||||||
|
"other_object": providers.Schema{Block: simpleTestSchema()},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Providers: map[addrs.Provider]providers.Factory{
|
||||||
|
addrs.NewDefaultProvider("test"): testProviderFuncFixed(testProvider),
|
||||||
|
addrs.NewDefaultProvider("other"): testProviderFuncFixed(otherProvider),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
opts := SimplePlanOpts(plans.NormalMode, testInputValuesUnset(m.Module.Variables))
|
||||||
|
plan, diags := ctx.Plan(m, states.NewState(), opts)
|
||||||
|
assertNoErrors(t, diags)
|
||||||
|
|
||||||
|
state, diags := ctx.Apply(plan, m)
|
||||||
|
assertNoErrors(t, diags)
|
||||||
|
|
||||||
|
// TODO: extend this to ensure the otherProvider is always properly
|
||||||
|
// configured during the destroy plan
|
||||||
|
|
||||||
|
opts.Mode = plans.DestroyMode
|
||||||
|
// destroy only a single instance not included in the moved statements
|
||||||
|
_, diags = ctx.Plan(m, state, opts)
|
||||||
|
assertNoErrors(t, diags)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user