Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve handling of (invalid) self-referenced module source #31557

Open
radeksimko opened this issue Aug 2, 2022 · 4 comments
Open

Improve handling of (invalid) self-referenced module source #31557

radeksimko opened this issue Aug 2, 2022 · 4 comments

Comments

@radeksimko
Copy link
Member

radeksimko commented Aug 2, 2022

Current Terraform Version

Terraform v1.2.6
on darwin_arm64

Background

Given an (invalid) config, such as the following:

module "example" {
  source = "./"
}

Terraform would produce somewhat unhelpful and verbose error message on terraform init

$ terraform init
terraform init output
Initializing modules...
- test in .
- test.test in .
- test.test.test in .
- test.test.test.test in .
- test.test.test.test.test in .
- test.test.test.test.test.test in .
- test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
- test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test in .
╷
│ Error: Failed to remove local module cache
│ 
│ Terraform tried to remove
│ .terraform/modules/test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test
│ in order to reinstall this module, but encountered an error: unlinkat
│ .terraform/modules/test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test:
│ file name too long
╵

╷
│ Error: Failed to remove local module cache
│ 
│ Terraform tried to remove
│ .terraform/modules/test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test
│ in order to reinstall this module, but encountered an error: unlinkat
│ .terraform/modules/test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test:
│ file name too long
╵

Terraform also persists the following into .terraform/modules/modules.json:

modules.json
{
    "Modules": [
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "",
            "Source": "",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        },
        {
            "Key": "test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test",
            "Source": "./.",
            "Dir": "."
        }
    ]
}

Note that similar error is also reproducible with multiple modules which eventually end up in cycle (by calling each other), so validating a module source in isolation (i.e. just checking for ./) may not be sufficient.

Use-cases

Give users more actionable and clearer feedback.

Proposal

Check whether the module source refers back to the same module and return a human-readable & actionable error early.

@radeksimko radeksimko added enhancement new new issue not yet triaged labels Aug 2, 2022
@kmoe
Copy link
Member

kmoe commented Aug 2, 2022

Thanks for this. I think a similar issue may have been opened before, but I can't find it.

@kmoe kmoe removed the new new issue not yet triaged label Aug 2, 2022
@tthakre

This comment was marked as off-topic.

@tthakre

This comment was marked as off-topic.

@radeksimko
Copy link
Member Author

@tthakre This is a helpful crash report, but it seems unrelated to the original report, so I created a separate issue to track it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants