do not evaluate module variables during import
We do not currently need to evaluate module variables in order to import a resource. This will likely change once we can select the import provider automatically, and have a more dynamic method for dispatching providers to module instances. In the meantime we can avoid the evaluation for now and prevent a certain class of import errors.
This commit is contained in:
parent
6281d4d420
commit
8049d2e028
|
@ -732,6 +732,95 @@ func TestContextImport_multiStateSame(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContextImport_noConfigModuleImport(t *testing.T) {
|
||||||
|
p := testProvider("aws")
|
||||||
|
m := testModuleInline(t, map[string]string{
|
||||||
|
"main.tf": `
|
||||||
|
locals {
|
||||||
|
xs = toset(["foo"])
|
||||||
|
}
|
||||||
|
|
||||||
|
module "a" {
|
||||||
|
for_each = local.xs
|
||||||
|
source = "./a"
|
||||||
|
}
|
||||||
|
|
||||||
|
module "b" {
|
||||||
|
for_each = local.xs
|
||||||
|
source = "./b"
|
||||||
|
y = module.a[each.key].y
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
"a/main.tf": `
|
||||||
|
output "y" {
|
||||||
|
value = "bar"
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
"b/main.tf": `
|
||||||
|
variable "y" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "test_resource" "unused" {
|
||||||
|
value = var.y
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
})
|
||||||
|
|
||||||
|
p.GetSchemaReturn = &ProviderSchema{
|
||||||
|
Provider: &configschema.Block{
|
||||||
|
Attributes: map[string]*configschema.Attribute{
|
||||||
|
"foo": {Type: cty.String, Optional: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ResourceTypes: map[string]*configschema.Block{
|
||||||
|
"test_resource": {
|
||||||
|
Attributes: map[string]*configschema.Attribute{
|
||||||
|
"id": {Type: cty.String, Computed: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
p.ImportResourceStateResponse = providers.ImportResourceStateResponse{
|
||||||
|
ImportedResources: []providers.ImportedResource{
|
||||||
|
{
|
||||||
|
TypeName: "test_resource",
|
||||||
|
State: cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"id": cty.StringVal("test"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Config: m,
|
||||||
|
Providers: map[addrs.Provider]providers.Factory{
|
||||||
|
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
state, diags := ctx.Import(&ImportOpts{
|
||||||
|
Targets: []*ImportTarget{
|
||||||
|
&ImportTarget{
|
||||||
|
Addr: addrs.RootModuleInstance.ResourceInstance(
|
||||||
|
addrs.ManagedResourceMode, "test_resource", "test", addrs.NoKey,
|
||||||
|
),
|
||||||
|
ID: "test",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if diags.HasErrors() {
|
||||||
|
t.Fatal(diags.ErrWithWarnings())
|
||||||
|
}
|
||||||
|
|
||||||
|
ri := state.ResourceInstance(mustResourceInstanceAddr("test_resource.test"))
|
||||||
|
expected := `{"id":"test"}`
|
||||||
|
if string(ri.Current.AttrsJSON) != expected {
|
||||||
|
t.Fatalf("expected %q, got %q\n", expected, ri.Current.AttrsJSON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const testImportStr = `
|
const testImportStr = `
|
||||||
aws_instance.foo:
|
aws_instance.foo:
|
||||||
ID = foo
|
ID = foo
|
||||||
|
|
|
@ -153,7 +153,7 @@ func (n *nodeModuleVariable) Execute(ctx EvalContext, op walkOperation) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
switch op {
|
switch op {
|
||||||
case walkPlan, walkApply, walkDestroy, walkImport:
|
case walkPlan, walkApply, walkDestroy:
|
||||||
vals, err = n.EvalModuleCallArgument(ctx, false)
|
vals, err = n.EvalModuleCallArgument(ctx, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue