Remove metadata from feature manager (#3046)

pull/3047/head
Todd 3 years ago
parent 54aad4d292
commit 4d19d1cfc4

@ -4,20 +4,10 @@
package version
import (
"strings"
gvers "github.com/hashicorp/go-version"
)
type Metadata int
const (
OSS Metadata = iota
HCP
)
type MetadataConstraint struct {
MetaInfo []Metadata
Constraints gvers.Constraints
}
@ -59,11 +49,9 @@ func init() {
}
*/
featureMap[IncludeStatusInCli] = MetadataConstraint{
MetaInfo: []Metadata{OSS, HCP},
Constraints: mustNewConstraints("< 0.14.0"),
}
featureMap[CredentialLibraryVaultSubtype] = MetadataConstraint{
MetaInfo: []Metadata{OSS, HCP},
Constraints: mustNewConstraints("< 0.14.0"),
}
@ -72,19 +60,10 @@ func init() {
// and the SessionAuthroizationData so the CLI can properly build the ssh command
// when calling "boundary connect ssh..."
featureMap[UseTargetIdForHostId] = MetadataConstraint{
MetaInfo: []Metadata{OSS, HCP},
Constraints: mustNewConstraints("< 0.14.0"),
}
}
func metadataStringToMetadata(m string) Metadata {
if strings.Contains(strings.ToLower(m), "hcp") {
return HCP
}
return OSS
}
func mustNewConstraints(v string) gvers.Constraints {
c, err := gvers.NewConstraint(v)
if err != nil {
@ -93,29 +72,18 @@ func mustNewConstraints(v string) gvers.Constraints {
return c
}
// Check returns a bool indicating if a version meets the metadata constraint
// Check returns a bool indicating if a version meets the constraints
// for a feature. Check returns false if version is nil.
func (m MetadataConstraint) Check(version *gvers.Version) bool {
if version == nil {
return false
}
binaryMeta := metadataStringToMetadata(version.Metadata())
for _, v := range m.MetaInfo {
if v == binaryMeta {
return true
}
}
return false
return m.Constraints.Check(version)
}
// Check returns a bool indicating if a version satisfies the feature constraints
func Check(binaryVersion *gvers.Version, featureConstraint MetadataConstraint) bool {
if !featureConstraint.Check(binaryVersion) {
return false
}
return featureConstraint.Constraints.Check(binaryVersion)
return featureConstraint.Check(binaryVersion)
}
// SupportsFeature return a bool indicating whether or not this version supports the given feature

@ -11,21 +11,27 @@ import (
"github.com/stretchr/testify/require"
)
func TestHasFeature(t *testing.T) {
func TestHasFeature_AllMetaData(t *testing.T) {
DeprecatedFeature := Feature(999)
HCPOnlyFeature := Feature(998)
ActiveFeature := Feature(998)
deprecatedFeatureConstraint, _ := gvers.NewConstraint(">= 0.10.0, < 0.10.1")
featureMap[DeprecatedFeature] = MetadataConstraint{
MetaInfo: []Metadata{OSS, HCP},
Constraints: deprecatedFeatureConstraint,
}
hcpOnlyFeature, _ := gvers.NewConstraint(">= 0.12.0+hcp")
featureMap[HCPOnlyFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: hcpOnlyFeature,
activeFeatureConstraint, _ := gvers.NewConstraint("> 0.10.0")
featureMap[ActiveFeature] = MetadataConstraint{
Constraints: activeFeatureConstraint,
}
t.Cleanup(func() {
delete(featureMap, DeprecatedFeature)
_, ok := featureMap[DeprecatedFeature]
require.False(t, ok)
delete(featureMap, ActiveFeature)
_, ok = featureMap[ActiveFeature]
require.False(t, ok)
})
tests := []struct {
name string
@ -34,28 +40,16 @@ func TestHasFeature(t *testing.T) {
wantResult bool
}{
{
name: "does-not-have-multihop-ENT",
version: "0.11.1+hcp",
feature: HCPOnlyFeature,
name: "active-feature-before-active",
version: "0.10.0",
feature: ActiveFeature,
wantResult: false,
},
{
name: "has-multihop-ENT",
version: "0.12.0+hcp",
feature: HCPOnlyFeature,
wantResult: true,
},
{
name: "has-multihop-worker-ENT",
version: "0.12.0+hcp.int",
feature: HCPOnlyFeature,
wantResult: true,
},
{
name: "does-not-have-multihop-OSS",
name: "active-feature-after-active",
version: "0.12.0",
feature: HCPOnlyFeature,
wantResult: false,
feature: ActiveFeature,
wantResult: true,
},
{
name: "deprecated-feature-before-deprecation",
@ -85,23 +79,20 @@ func TestHasFeature(t *testing.T) {
require.Equal(tt.wantResult, got)
})
}
delete(featureMap, DeprecatedFeature)
_, ok := featureMap[DeprecatedFeature]
require.False(t, ok)
delete(featureMap, HCPOnlyFeature)
_, ok = featureMap[HCPOnlyFeature]
require.False(t, ok)
}
func TestEnableFeatureOnVersionForTest(t *testing.T) {
func TestEnableFeatureOnVersionForTest_AllMetaData(t *testing.T) {
FutureFeature := Feature(997)
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99+hcp")
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99")
featureMap[FutureFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: futureVersionFeature,
}
t.Cleanup(func() {
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
})
tests := []struct {
name string
@ -112,7 +103,7 @@ func TestEnableFeatureOnVersionForTest(t *testing.T) {
}{
{
name: "has-future-feature",
version: "0.11.1+hcp",
version: "0.11.1",
feature: FutureFeature,
wantResult: true,
},
@ -133,37 +124,31 @@ func TestEnableFeatureOnVersionForTest(t *testing.T) {
require.Equal(tt.wantResult, got)
})
}
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
}
func TestEnableFeatureForTest(t *testing.T) {
func TestEnableFeatureForTest_AllMetaData(t *testing.T) {
FutureFeature := Feature(997)
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99+hcp")
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99")
featureMap[FutureFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: futureVersionFeature,
}
t.Cleanup(func() {
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
})
// modify the globals that set which version the current binary is
prevVer := Version
prevMd := VersionMetadata
defer func() {
Version = prevVer
VersionMetadata = prevMd
}()
Version = "0.11.0"
VersionMetadata = "hcp"
EnableFeatureForTest(t, FutureFeature)
semVer, err := gvers.NewVersion("0.11.0+hcp")
semVer, err := gvers.NewVersion("0.11.0")
require.NoError(t, err)
assert.True(t, SupportsFeature(semVer, FutureFeature))
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
}

@ -33,14 +33,11 @@ func EnableFeatureOnVersionForTest(t *testing.T, version *gvers.Version, feature
newConstraint, err := gvers.NewConstraint(fmt.Sprintf(">= %s", versionNumber))
require.NoError(err)
meta := metadataStringToMetadata(version.Metadata())
featureMap[feature] = MetadataConstraint{
MetaInfo: []Metadata{meta},
Constraints: newConstraint,
}
resetFunc := func() {
t.Cleanup(func() {
featureMap[feature] = featConstraint
}
t.Cleanup(resetFunc)
})
}

Loading…
Cancel
Save