From f75d83c1cda68d68d91cae1151087d5d1b0e30c4 Mon Sep 17 00:00:00 2001 From: findkim Date: Fri, 11 Jan 2019 12:47:45 -0600 Subject: [PATCH] Prerelease versions are filtered for plugin protocol mismatches --- plugin/discovery/get.go | 8 ++++- plugin/discovery/get_test.go | 57 ++++++++++++++++++++++++++++++++++++ plugin/discovery/version.go | 5 ++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/plugin/discovery/get.go b/plugin/discovery/get.go index 9c095c574..03d253dd6 100644 --- a/plugin/discovery/get.go +++ b/plugin/discovery/get.go @@ -416,12 +416,18 @@ func (i *ProviderInstaller) listProviderDownloadURLs(name, version string) (*res } // findClosestProtocolCompatibleVersion searches for the provider version with the closest protocol match. -// +// Prerelease versions are filtered. func (i *ProviderInstaller) findClosestProtocolCompatibleVersion(versions []*response.TerraformProviderVersion) (*response.TerraformProviderVersion, error) { // Loop through all the provider versions to find the earliest and latest // versions that match the installer protocol to then select the closest of the two var latest, earliest *response.TerraformProviderVersion for _, version := range versions { + // Prereleases are filtered and will not be suggested + v, err := VersionStr(version.Version).Parse() + if err != nil || v.IsPrerelease() { + continue + } + if err := i.checkPluginProtocol(version); err == nil { if earliest == nil { // Found the first provider version with compatible protocol diff --git a/plugin/discovery/get_test.go b/plugin/discovery/get_test.go index ee9d59cbf..84dd68650 100644 --- a/plugin/discovery/get_test.go +++ b/plugin/discovery/get_test.go @@ -314,6 +314,63 @@ func TestFindClosestProtocolCompatibleVersion(t *testing.T) { }, "2.5.0", false, + }, { + "compatible prereleses are filtered", + 5, + []*response.TerraformProviderVersion{ + &response.TerraformProviderVersion{ + Version: "2.0.0-alpha", + Protocols: []string{"4.0", "5.0"}, + }, + }, + "", + true, + }, { + "suggests latest non-prerelease", + 4, + []*response.TerraformProviderVersion{ + &response.TerraformProviderVersion{ + Version: "2.0.0-alpha", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "2.0.0", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "2.5.0-pre", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "2.5.0", + Protocols: []string{"4.0", "5.0"}, + }, + }, + "2.5.0", + false, + }, { + "suggests earliest non-prerelease", + 5, + []*response.TerraformProviderVersion{ + &response.TerraformProviderVersion{ + Version: "2.0.0-alpha", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "2.0.0", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "2.6.0", + Protocols: []string{"4.0", "5.0"}, + }, + &response.TerraformProviderVersion{ + Version: "3.0.0", + Protocols: []string{"5.0"}, + }, + }, + "2.0.0", + false, }, } diff --git a/plugin/discovery/version.go b/plugin/discovery/version.go index 8fad58d67..4311d5107 100644 --- a/plugin/discovery/version.go +++ b/plugin/discovery/version.go @@ -55,6 +55,11 @@ func (v Version) Equal(other Version) bool { return v.raw.Equal(other.raw) } +// IsPrerelease determines if version is a prerelease +func (v Version) IsPrerelease() bool { + return v.raw.Prerelease() != "" +} + // MinorUpgradeConstraintStr returns a ConstraintStr that would permit // minor upgrades relative to the receiving version. func (v Version) MinorUpgradeConstraintStr() ConstraintStr {