Skip to content

Commit

Permalink
Fix module calls command for remote modules (#872)
Browse files Browse the repository at this point in the history
* use HasPrefix instead of ParseRawProviderSourceString to check for remote module sources

* strip registry prefix for docs links

* account for older terraform versions

* new test case for terraform 1.1.0 module sources
  • Loading branch information
dbanck authored Apr 14, 2022
1 parent c30f329 commit 94aa1d8
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 2 deletions.
3 changes: 2 additions & 1 deletion internal/langserver/handlers/command/module_calls.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,5 +129,6 @@ func getModuleDocumentationLink(record datadir.ModuleRecord) string {
return ""
}

return fmt.Sprintf(`https://registry.terraform.io/modules/%s/%s`, record.SourceAddr, record.VersionStr)
shortName := strings.TrimPrefix(record.SourceAddr, "registry.terraform.io/")
return fmt.Sprintf(`https://registry.terraform.io/modules/%s/%s`, shortName, record.VersionStr)
}
39 changes: 39 additions & 0 deletions internal/langserver/handlers/command/module_calls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,42 @@ func Test_parseModuleRecords(t *testing.T) {
})
}
}

// With the release of Terraform 1.1.0 module source addresses are now stored normalized
func Test_parseModuleRecords_v1_1(t *testing.T) {
tests := []struct {
name string
records []datadir.ModuleRecord
want []moduleCall
}{
{
name: "detects terraform module types",
records: []datadir.ModuleRecord{
{
Key: "ec2_instances",
SourceAddr: "registry.terraform.io/terraform-aws-modules/ec2-instance/aws",
VersionStr: "2.12.0",
Dir: ".terraform\\modules\\ec2_instances",
},
},
want: []moduleCall{
{
Name: "ec2_instances",
SourceAddr: "registry.terraform.io/terraform-aws-modules/ec2-instance/aws",
Version: "2.12.0",
SourceType: "tfregistry",
DocsLink: "https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/2.12.0",
DependentModules: []moduleCall{},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := parseModuleRecords(tt.records)
if diff := cmp.Diff(tt.want, got); diff != "" {
t.Fatalf("module mismatch: %s", diff)
}
})
}
}
4 changes: 3 additions & 1 deletion internal/terraform/datadir/module_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ func (r *ModuleRecord) GetModuleType() ModuleType {
// the authorative source: hashicorp/terraform/internal/addrs/module_source.go.
// However this works enough for now to identify module types for display in vscode-terraform.
// Example: terraform-aws-modules/ec2-instance/aws
if _, err := tfregistry.ParseRawProviderSourceString(r.SourceAddr); err == nil {
_, err := tfregistry.ParseRawProviderSourceString(r.SourceAddr)
// Example: registry.terraform.io/terraform-aws-modules/vpc/aws
if err == nil || strings.HasPrefix(r.SourceAddr, "registry.terraform.io/") {
return TFREGISTRY
}

Expand Down

0 comments on commit 94aa1d8

Please sign in to comment.