plugin/discovery: use new addrs.ProviderType in place of a provider typeName string (#22724)
This is a relatively small change meant to lay the foundation for future enhancements to providers' address.
This commit is contained in:
parent
dcad6239c5
commit
120bb0a66c
|
@ -0,0 +1,7 @@
|
||||||
|
package addrs
|
||||||
|
|
||||||
|
// ProviderType encapsulates a single provider type. In the future this will be
|
||||||
|
// extended to include additional fields including Namespace and SourceHost
|
||||||
|
type ProviderType struct {
|
||||||
|
Name string
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
"github.com/hashicorp/terraform/backend"
|
"github.com/hashicorp/terraform/backend"
|
||||||
backendInit "github.com/hashicorp/terraform/backend/init"
|
backendInit "github.com/hashicorp/terraform/backend/init"
|
||||||
"github.com/hashicorp/terraform/configs"
|
"github.com/hashicorp/terraform/configs"
|
||||||
|
@ -516,7 +517,8 @@ func (c *InitCommand) getProviders(earlyConfig *earlyconfig.Config, state *state
|
||||||
}
|
}
|
||||||
|
|
||||||
for provider, reqd := range missing {
|
for provider, reqd := range missing {
|
||||||
_, providerDiags, err := c.providerInstaller.Get(provider, reqd.Versions)
|
pty := addrs.ProviderType{Name: provider}
|
||||||
|
_, providerDiags, err := c.providerInstaller.Get(pty, reqd.Versions)
|
||||||
diags = diags.Append(providerDiags)
|
diags = diags.Append(providerDiags)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
"github.com/hashicorp/terraform/configs/configschema"
|
"github.com/hashicorp/terraform/configs/configschema"
|
||||||
"github.com/hashicorp/terraform/plugin/discovery"
|
"github.com/hashicorp/terraform/plugin/discovery"
|
||||||
"github.com/hashicorp/terraform/providers"
|
"github.com/hashicorp/terraform/providers"
|
||||||
|
@ -147,10 +148,10 @@ func (i *mockProviderInstaller) FileName(provider, version string) string {
|
||||||
return fmt.Sprintf("terraform-provider-%s_v%s_x4", provider, version)
|
return fmt.Sprintf("terraform-provider-%s_v%s_x4", provider, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *mockProviderInstaller) Get(provider string, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error) {
|
func (i *mockProviderInstaller) Get(provider addrs.ProviderType, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error) {
|
||||||
var diags tfdiags.Diagnostics
|
var diags tfdiags.Diagnostics
|
||||||
noMeta := discovery.PluginMeta{}
|
noMeta := discovery.PluginMeta{}
|
||||||
versions := i.Providers[provider]
|
versions := i.Providers[provider.Name]
|
||||||
if len(versions) == 0 {
|
if len(versions) == 0 {
|
||||||
return noMeta, diags, fmt.Errorf("provider %q not found", provider)
|
return noMeta, diags, fmt.Errorf("provider %q not found", provider)
|
||||||
}
|
}
|
||||||
|
@ -168,7 +169,7 @@ func (i *mockProviderInstaller) Get(provider string, req discovery.Constraints)
|
||||||
|
|
||||||
if req.Allows(version) {
|
if req.Allows(version) {
|
||||||
// provider filename
|
// provider filename
|
||||||
name := i.FileName(provider, v)
|
name := i.FileName(provider.Name, v)
|
||||||
path := filepath.Join(i.Dir, name)
|
path := filepath.Join(i.Dir, name)
|
||||||
f, err := os.Create(path)
|
f, err := os.Create(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -176,7 +177,7 @@ func (i *mockProviderInstaller) Get(provider string, req discovery.Constraints)
|
||||||
}
|
}
|
||||||
f.Close()
|
f.Close()
|
||||||
return discovery.PluginMeta{
|
return discovery.PluginMeta{
|
||||||
Name: provider,
|
Name: provider.Name,
|
||||||
Version: discovery.VersionStr(v),
|
Version: discovery.VersionStr(v),
|
||||||
Path: path,
|
Path: path,
|
||||||
}, diags, nil
|
}, diags, nil
|
||||||
|
@ -199,8 +200,8 @@ func (i *mockProviderInstaller) PurgeUnused(map[string]discovery.PluginMeta) (di
|
||||||
|
|
||||||
type callbackPluginInstaller func(provider string, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error)
|
type callbackPluginInstaller func(provider string, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error)
|
||||||
|
|
||||||
func (cb callbackPluginInstaller) Get(provider string, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error) {
|
func (cb callbackPluginInstaller) Get(provider addrs.ProviderType, req discovery.Constraints) (discovery.PluginMeta, tfdiags.Diagnostics, error) {
|
||||||
return cb(provider, req)
|
return cb(provider.Name, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cb callbackPluginInstaller) PurgeUnused(map[string]discovery.PluginMeta) (discovery.PluginMetaSet, error) {
|
func (cb callbackPluginInstaller) PurgeUnused(map[string]discovery.PluginMeta) (discovery.PluginMetaSet, error) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
getter "github.com/hashicorp/go-getter"
|
getter "github.com/hashicorp/go-getter"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
"github.com/hashicorp/terraform/httpclient"
|
"github.com/hashicorp/terraform/httpclient"
|
||||||
"github.com/hashicorp/terraform/registry"
|
"github.com/hashicorp/terraform/registry"
|
||||||
"github.com/hashicorp/terraform/registry/regsrc"
|
"github.com/hashicorp/terraform/registry/regsrc"
|
||||||
|
@ -49,7 +50,7 @@ func init() {
|
||||||
// An Installer maintains a local cache of plugins by downloading plugins
|
// An Installer maintains a local cache of plugins by downloading plugins
|
||||||
// from an online repository.
|
// from an online repository.
|
||||||
type Installer interface {
|
type Installer interface {
|
||||||
Get(name string, req Constraints) (PluginMeta, tfdiags.Diagnostics, error)
|
Get(provider addrs.ProviderType, req Constraints) (PluginMeta, tfdiags.Diagnostics, error)
|
||||||
PurgeUnused(used map[string]PluginMeta) (removed PluginMetaSet, err error)
|
PurgeUnused(used map[string]PluginMeta) (removed PluginMetaSet, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +107,7 @@ type ProviderInstaller struct {
|
||||||
// are produced under the assumption that if presented to the user they will
|
// are produced under the assumption that if presented to the user they will
|
||||||
// be presented alongside context about what is being installed, and thus the
|
// be presented alongside context about what is being installed, and thus the
|
||||||
// error messages do not redundantly include such information.
|
// error messages do not redundantly include such information.
|
||||||
func (i *ProviderInstaller) Get(provider string, req Constraints) (PluginMeta, tfdiags.Diagnostics, error) {
|
func (i *ProviderInstaller) Get(provider addrs.ProviderType, req Constraints) (PluginMeta, tfdiags.Diagnostics, error) {
|
||||||
var diags tfdiags.Diagnostics
|
var diags tfdiags.Diagnostics
|
||||||
|
|
||||||
// a little bit of initialization.
|
// a little bit of initialization.
|
||||||
|
@ -231,7 +232,7 @@ func (i *ProviderInstaller) Get(provider string, req Constraints) (PluginMeta, t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printedProviderName := fmt.Sprintf("%q (%s)", provider, providerSource)
|
printedProviderName := fmt.Sprintf("%q (%s)", provider.Name, providerSource)
|
||||||
i.Ui.Info(fmt.Sprintf("- Downloading plugin for provider %s %s...", printedProviderName, versionMeta.Version))
|
i.Ui.Info(fmt.Sprintf("- Downloading plugin for provider %s %s...", printedProviderName, versionMeta.Version))
|
||||||
log.Printf("[DEBUG] getting provider %s version %q", printedProviderName, versionMeta.Version)
|
log.Printf("[DEBUG] getting provider %s version %q", printedProviderName, versionMeta.Version)
|
||||||
err = i.install(provider, v, providerURL)
|
err = i.install(provider, v, providerURL)
|
||||||
|
@ -243,11 +244,11 @@ func (i *ProviderInstaller) Get(provider string, req Constraints) (PluginMeta, t
|
||||||
// (This is weird, because go-getter doesn't directly return
|
// (This is weird, because go-getter doesn't directly return
|
||||||
// information about what was extracted, and we just extracted
|
// information about what was extracted, and we just extracted
|
||||||
// the archive directly into a shared dir here.)
|
// the archive directly into a shared dir here.)
|
||||||
log.Printf("[DEBUG] looking for the %s %s plugin we just installed", provider, versionMeta.Version)
|
log.Printf("[DEBUG] looking for the %s %s plugin we just installed", provider.Name, versionMeta.Version)
|
||||||
metas := FindPlugins("provider", []string{i.Dir})
|
metas := FindPlugins("provider", []string{i.Dir})
|
||||||
log.Printf("[DEBUG] all plugins found %#v", metas)
|
log.Printf("[DEBUG] all plugins found %#v", metas)
|
||||||
metas, _ = metas.ValidateVersions()
|
metas, _ = metas.ValidateVersions()
|
||||||
metas = metas.WithName(provider).WithVersion(v)
|
metas = metas.WithName(provider.Name).WithVersion(v)
|
||||||
log.Printf("[DEBUG] filtered plugins %#v", metas)
|
log.Printf("[DEBUG] filtered plugins %#v", metas)
|
||||||
if metas.Count() == 0 {
|
if metas.Count() == 0 {
|
||||||
// This should never happen. Suggests that the release archive
|
// This should never happen. Suggests that the release archive
|
||||||
|
@ -275,18 +276,18 @@ func (i *ProviderInstaller) Get(provider string, req Constraints) (PluginMeta, t
|
||||||
return metas.Newest(), diags, nil
|
return metas.Newest(), diags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *ProviderInstaller) install(provider string, version Version, url string) error {
|
func (i *ProviderInstaller) install(provider addrs.ProviderType, version Version, url string) error {
|
||||||
if i.Cache != nil {
|
if i.Cache != nil {
|
||||||
log.Printf("[DEBUG] looking for provider %s %s in plugin cache", provider, version)
|
log.Printf("[DEBUG] looking for provider %s %s in plugin cache", provider.Name, version)
|
||||||
cached := i.Cache.CachedPluginPath("provider", provider, version)
|
cached := i.Cache.CachedPluginPath("provider", provider.Name, version)
|
||||||
if cached == "" {
|
if cached == "" {
|
||||||
log.Printf("[DEBUG] %s %s not yet in cache, so downloading %s", provider, version, url)
|
log.Printf("[DEBUG] %s %s not yet in cache, so downloading %s", provider.Name, version, url)
|
||||||
err := getter.Get(i.Cache.InstallDir(), url)
|
err := getter.Get(i.Cache.InstallDir(), url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// should now be in cache
|
// should now be in cache
|
||||||
cached = i.Cache.CachedPluginPath("provider", provider, version)
|
cached = i.Cache.CachedPluginPath("provider", provider.Name, version)
|
||||||
if cached == "" {
|
if cached == "" {
|
||||||
// should never happen if the getter is behaving properly
|
// should never happen if the getter is behaving properly
|
||||||
// and the plugins are packaged properly.
|
// and the plugins are packaged properly.
|
||||||
|
@ -307,7 +308,7 @@ func (i *ProviderInstaller) install(provider string, version Version, url string
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("[DEBUG] installing %s %s to %s from local cache %s", provider, version, targetPath, cached)
|
log.Printf("[DEBUG] installing %s %s to %s from local cache %s", provider.Name, version, targetPath, cached)
|
||||||
|
|
||||||
// Delete if we can. If there's nothing there already then no harm done.
|
// Delete if we can. If there's nothing there already then no harm done.
|
||||||
// This is important because we can't create a link if there's
|
// This is important because we can't create a link if there's
|
||||||
|
@ -365,7 +366,7 @@ func (i *ProviderInstaller) install(provider string, version Version, url string
|
||||||
// One way or another, by the time we get here we should have either
|
// One way or another, by the time we get here we should have either
|
||||||
// a link or a copy of the cached plugin within i.Dir, as expected.
|
// a link or a copy of the cached plugin within i.Dir, as expected.
|
||||||
} else {
|
} else {
|
||||||
log.Printf("[DEBUG] plugin cache is disabled, so downloading %s %s from %s", provider, version, url)
|
log.Printf("[DEBUG] plugin cache is disabled, so downloading %s %s from %s", provider.Name, version, url)
|
||||||
err := getter.Get(i.Dir, url)
|
err := getter.Get(i.Dir, url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -471,9 +472,9 @@ func (i *ProviderInstaller) hostname() (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// list all versions available for the named provider
|
// list all versions available for the named provider
|
||||||
func (i *ProviderInstaller) listProviderVersions(name string) (*response.TerraformProviderVersions, error) {
|
func (i *ProviderInstaller) listProviderVersions(provider addrs.ProviderType) (*response.TerraformProviderVersions, error) {
|
||||||
provider := regsrc.NewTerraformProvider(name, i.OS, i.Arch)
|
req := regsrc.NewTerraformProvider(provider.Name, i.OS, i.Arch)
|
||||||
versions, err := i.registry.TerraformProviderVersions(provider)
|
versions, err := i.registry.TerraformProviderVersions(req)
|
||||||
return versions, err
|
return versions, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
"github.com/hashicorp/terraform/registry"
|
"github.com/hashicorp/terraform/registry"
|
||||||
"github.com/hashicorp/terraform/registry/response"
|
"github.com/hashicorp/terraform/registry/response"
|
||||||
"github.com/hashicorp/terraform/svchost"
|
"github.com/hashicorp/terraform/svchost"
|
||||||
|
@ -149,7 +150,7 @@ func TestVersionListing(t *testing.T) {
|
||||||
|
|
||||||
i := newProviderInstaller(server)
|
i := newProviderInstaller(server)
|
||||||
|
|
||||||
allVersions, err := i.listProviderVersions("test")
|
allVersions, err := i.listProviderVersions(addrs.ProviderType{Name: "test"})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -415,7 +416,8 @@ func TestProviderInstallerGet(t *testing.T) {
|
||||||
Ui: cli.NewMockUi(),
|
Ui: cli.NewMockUi(),
|
||||||
registry: registry.NewClient(Disco(server), nil),
|
registry: registry.NewClient(Disco(server), nil),
|
||||||
}
|
}
|
||||||
_, _, err = i.Get("test", AllVersions)
|
|
||||||
|
_, _, err = i.Get(addrs.ProviderType{Name: "test"}, AllVersions)
|
||||||
|
|
||||||
if err != ErrorNoVersionCompatibleWithPlatform {
|
if err != ErrorNoVersionCompatibleWithPlatform {
|
||||||
t.Fatal("want error for incompatible version")
|
t.Fatal("want error for incompatible version")
|
||||||
|
@ -432,20 +434,21 @@ func TestProviderInstallerGet(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
_, _, err := i.Get("test", ConstraintStr(">9.0.0").MustParse())
|
_, _, err := i.Get(addrs.ProviderType{Name: "test"}, ConstraintStr(">9.0.0").MustParse())
|
||||||
if err != ErrorNoSuitableVersion {
|
if err != ErrorNoSuitableVersion {
|
||||||
t.Fatal("want error for mismatching constraints")
|
t.Fatal("want error for mismatching constraints")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
_, _, err := i.Get("nonexist", AllVersions)
|
provider := addrs.ProviderType{Name: "nonexist"}
|
||||||
|
_, _, err := i.Get(provider, AllVersions)
|
||||||
if err != ErrorNoSuchProvider {
|
if err != ErrorNoSuchProvider {
|
||||||
t.Fatal("want error for no such provider")
|
t.Fatal("want error for no such provider")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gotMeta, _, err := i.Get("test", AllVersions)
|
gotMeta, _, err := i.Get(addrs.ProviderType{Name: "test"}, AllVersions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -503,7 +506,7 @@ func TestProviderInstallerGet_cache(t *testing.T) {
|
||||||
Arch: "mockarch",
|
Arch: "mockarch",
|
||||||
}
|
}
|
||||||
|
|
||||||
gotMeta, _, err := i.Get("test", AllVersions)
|
gotMeta, _, err := i.Get(addrs.ProviderType{Name: "test"}, AllVersions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
getter "github.com/hashicorp/go-getter"
|
getter "github.com/hashicorp/go-getter"
|
||||||
|
"github.com/hashicorp/terraform/addrs"
|
||||||
discovery "github.com/hashicorp/terraform/plugin/discovery"
|
discovery "github.com/hashicorp/terraform/plugin/discovery"
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
@ -181,7 +182,7 @@ func (c *PackageCommand) Run(args []string) int {
|
||||||
} else { //attempt to get from the public registry if not found locally
|
} else { //attempt to get from the public registry if not found locally
|
||||||
c.ui.Output(fmt.Sprintf("- Checking for provider plugin on %s...",
|
c.ui.Output(fmt.Sprintf("- Checking for provider plugin on %s...",
|
||||||
releaseHost))
|
releaseHost))
|
||||||
_, _, err := installer.Get(name, constraint)
|
_, _, err := installer.Get(addrs.ProviderType{Name: name}, constraint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.ui.Error(fmt.Sprintf("- Failed to resolve %s provider %s: %s", name, constraint, err))
|
c.ui.Error(fmt.Sprintf("- Failed to resolve %s provider %s: %s", name, constraint, err))
|
||||||
return 1
|
return 1
|
||||||
|
|
Loading…
Reference in New Issue