diff --git a/internal/command/testdata/validate-valid/import_defined_resource/main.tf b/internal/command/testdata/validate-valid/import_defined_resource/main.tf new file mode 100644 index 0000000000..a3b8090f51 --- /dev/null +++ b/internal/command/testdata/validate-valid/import_defined_resource/main.tf @@ -0,0 +1,11 @@ +resource "test_instance" "main" { +} + +import { + to = test_instance.main + id = test_instance.reference.ami +} + +resource "test_instance" "reference" { +} + diff --git a/internal/command/validate_test.go b/internal/command/validate_test.go index 026852c2d9..3eac3e5fb5 100644 --- a/internal/command/validate_test.go +++ b/internal/command/validate_test.go @@ -187,6 +187,13 @@ func TestUndefinedResourceAsImportTargetShouldSucceed(t *testing.T) { } } +func TestDefinedResourceAsImportTargetShouldSucceed(t *testing.T) { + output, code := setupTest(t, "validate-valid/import_defined_resource") + if code != 0 { + t.Fatalf("Should have succeeded: %d\n\n%s", code, output.Stderr()) + } +} + func TestDefinedVarAsImportIDShouldSucceed(t *testing.T) { output, code := setupTest(t, "validate-valid/import_id_defined_var") if code != 0 { diff --git a/internal/tofu/context_import.go b/internal/tofu/context_import.go index 77a07ca036..a379519104 100644 --- a/internal/tofu/context_import.go +++ b/internal/tofu/context_import.go @@ -144,12 +144,12 @@ func (ri *ImportResolver) ValidateImportIDs(ctx context.Context, importTarget *I } for _, keyData := range repetitions { - _, evalDiags = evaluateImportIdExpression(importTarget.Config.ID, evalCtx, keyData) + evalDiags = validateImportIdExpression(importTarget.Config.ID, evalCtx, keyData) diags = diags.Append(evalDiags) } } else { // The import target is singular, no need to expand - _, evalDiags := evaluateImportIdExpression(importTarget.Config.ID, evalCtx, EvalDataForNoInstanceKey) + evalDiags := validateImportIdExpression(importTarget.Config.ID, evalCtx, EvalDataForNoInstanceKey) diags = diags.Append(evalDiags) } diff --git a/internal/tofu/eval_import.go b/internal/tofu/eval_import.go index ef68c7cfce..afc2285797 100644 --- a/internal/tofu/eval_import.go +++ b/internal/tofu/eval_import.go @@ -20,6 +20,20 @@ import ( ) func evaluateImportIdExpression(expr hcl.Expression, evalCtx EvalContext, keyData instances.RepetitionData) (string, tfdiags.Diagnostics) { + return evaluateImportIdExpressionInner(expr, evalCtx, keyData, false) +} + +// Checks for any potential issues in the import id expression, allowing unknowns as this is part +// of the validate phase +func validateImportIdExpression(expr hcl.Expression, evalCtx EvalContext, keyData instances.RepetitionData) tfdiags.Diagnostics { + _, diags := evaluateImportIdExpressionInner(expr, evalCtx, keyData, true) + return diags +} + +// This should not be used directly, use one of the wrapping methods above +// Note: When allowUnknown is true, it may return "" as the import id. This is safe as the result is discarded in the validate +// function above +func evaluateImportIdExpressionInner(expr hcl.Expression, evalCtx EvalContext, keyData instances.RepetitionData, allowUnknown bool) (string, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics if expr == nil { @@ -48,18 +62,6 @@ func evaluateImportIdExpression(expr hcl.Expression, evalCtx EvalContext, keyDat }) } - if !importIdVal.IsKnown() { - return "", diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Invalid import id argument", - Detail: `The import block "id" argument depends on resource attributes that cannot be determined until apply, so OpenTofu cannot plan to import this resource.`, // FIXME and what should I do about that? - Subject: expr.Range().Ptr(), - // Expression: - // EvalContext: - Extra: evalchecks.DiagnosticCausedByUnknown(true), - }) - } - if importIdVal.HasMark(marks.Sensitive) { return "", diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, @@ -77,6 +79,21 @@ func evaluateImportIdExpression(expr hcl.Expression, evalCtx EvalContext, keyDat }) } + if !importIdVal.IsKnown() { + if allowUnknown { + return "", diags + } + return "", diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid import id argument", + Detail: `The import block "id" argument depends on resource attributes that cannot be determined until apply, so OpenTofu cannot plan to import this resource.`, // FIXME and what should I do about that? + Subject: expr.Range().Ptr(), + // Expression: + // EvalContext: + Extra: evalchecks.DiagnosticCausedByUnknown(true), + }) + } + var importId string err := gocty.FromCtyValue(importIdVal, &importId) if err != nil {