mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-31 11:17:25 -06:00
30204ecded
For normal provider installation we want to associate each provider with a selected version number and find a suitable package for that version that conforms to the official hashes for that release. Those requirements are very onerous for a provider developer currently testing a not-yet-released build, though. To allow for that case this new CLI configuration feature allows overriding specific providers to refer to give local filesystem directories. Any provider overridden in this way is not subject to the usual restrictions about selected versions or checksum conformance, and activating an override won't cause any changes to the selections recorded in the lock file because it's intended to be a temporary setting for one developer only. This is, in a sense, a spiritual successor of an old capability we had to override specific plugins in the CLI configuration file. There were some vestiges of that left in the main package and CLI config package but nothing has actually been honoring them for several versions now and so this commit removes them to avoid confusion with the new mechanism.
78 lines
3.0 KiB
Go
78 lines
3.0 KiB
Go
package cliconfig
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/internal/getproviders"
|
|
)
|
|
|
|
func TestLoadConfig_providerInstallation(t *testing.T) {
|
|
for _, configFile := range []string{"provider-installation", "provider-installation.json"} {
|
|
t.Run(configFile, func(t *testing.T) {
|
|
got, diags := loadConfigFile(filepath.Join(fixtureDir, configFile))
|
|
if diags.HasErrors() {
|
|
t.Errorf("unexpected diagnostics: %s", diags.Err().Error())
|
|
}
|
|
|
|
want := &Config{
|
|
ProviderInstallation: []*ProviderInstallation{
|
|
{
|
|
Methods: []*ProviderInstallationMethod{
|
|
{
|
|
Location: ProviderInstallationFilesystemMirror("/tmp/example1"),
|
|
Include: []string{"example.com/*/*"},
|
|
},
|
|
{
|
|
Location: ProviderInstallationNetworkMirror("https://tf-Mirror.example.com/"),
|
|
Include: []string{"registry.terraform.io/*/*"},
|
|
Exclude: []string{"registry.Terraform.io/foobar/*"},
|
|
},
|
|
{
|
|
Location: ProviderInstallationFilesystemMirror("/tmp/example2"),
|
|
},
|
|
{
|
|
Location: ProviderInstallationDirect,
|
|
Exclude: []string{"example.com/*/*"},
|
|
},
|
|
},
|
|
|
|
DevOverrides: map[addrs.Provider]getproviders.PackageLocalDir{
|
|
addrs.MustParseProviderSourceString("hashicorp/boop"): getproviders.PackageLocalDir(filepath.FromSlash("/tmp/boop")),
|
|
addrs.MustParseProviderSourceString("hashicorp/blorp"): getproviders.PackageLocalDir(filepath.FromSlash("/tmp/blorp")),
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("wrong result\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLoadConfig_providerInstallationErrors(t *testing.T) {
|
|
_, diags := loadConfigFile(filepath.Join(fixtureDir, "provider-installation-errors"))
|
|
want := `7 problems:
|
|
|
|
- Invalid provider_installation method block: Unknown provider installation method "not_a_thing" at 2:3.
|
|
- Invalid provider_installation method block: Invalid filesystem_mirror block at 1:1: "path" argument is required.
|
|
- Invalid provider_installation method block: Invalid network_mirror block at 1:1: "url" argument is required.
|
|
- Invalid provider_installation method block: The items inside the provider_installation block at 1:1 must all be blocks.
|
|
- Invalid provider_installation method block: The blocks inside the provider_installation block at 1:1 may not have any labels.
|
|
- Invalid provider_installation block: The provider_installation block at 9:1 must not have any labels.
|
|
- Invalid provider_installation block: The provider_installation block at 11:1 must not be introduced with an equals sign.`
|
|
|
|
// The above error messages include only line/column location information
|
|
// and not file location information because HCL 1 does not store
|
|
// information about the filename a location belongs to. (There is a field
|
|
// for it in token.Pos but it's always an empty string in practice.)
|
|
|
|
if got := diags.Err().Error(); got != want {
|
|
t.Errorf("wrong diagnostics\ngot:\n%s\nwant:\n%s", got, want)
|
|
}
|
|
}
|