2020-07-09 22:04:51 +00:00
package xds
import (
"testing"
2021-02-26 22:23:15 +00:00
envoy_core_v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
envoy_type_v3 "github.com/envoyproxy/go-control-plane/envoy/type/v3"
2021-02-22 21:00:15 +00:00
2020-07-09 22:04:51 +00:00
"github.com/hashicorp/go-version"
"github.com/stretchr/testify/require"
2021-02-22 21:00:15 +00:00
"github.com/hashicorp/consul/sdk/testutil"
2020-07-09 22:04:51 +00:00
)
func TestDetermineEnvoyVersionFromNode ( t * testing . T ) {
cases := map [ string ] struct {
2021-02-26 22:23:15 +00:00
node * envoy_core_v3 . Node
2020-07-09 22:04:51 +00:00
expect * version . Version
} {
"empty" : {
2021-02-26 22:23:15 +00:00
node : & envoy_core_v3 . Node { } ,
2020-07-09 22:04:51 +00:00
expect : nil ,
} ,
"user agent build version but no user agent" : {
2021-02-26 22:23:15 +00:00
node : & envoy_core_v3 . Node {
2020-07-09 22:04:51 +00:00
UserAgentName : "" ,
2021-02-26 22:23:15 +00:00
UserAgentVersionType : & envoy_core_v3 . Node_UserAgentBuildVersion {
UserAgentBuildVersion : & envoy_core_v3 . BuildVersion {
Version : & envoy_type_v3 . SemanticVersion {
2020-07-09 22:04:51 +00:00
MajorNumber : 1 ,
MinorNumber : 14 ,
Patch : 4 ,
} ,
} ,
} ,
} ,
expect : nil ,
} ,
"user agent build version with user agent" : {
2021-02-26 22:23:15 +00:00
node : & envoy_core_v3 . Node {
2020-07-09 22:04:51 +00:00
UserAgentName : "envoy" ,
2021-02-26 22:23:15 +00:00
UserAgentVersionType : & envoy_core_v3 . Node_UserAgentBuildVersion {
UserAgentBuildVersion : & envoy_core_v3 . BuildVersion {
Version : & envoy_type_v3 . SemanticVersion {
2020-07-09 22:04:51 +00:00
MajorNumber : 1 ,
MinorNumber : 14 ,
Patch : 4 ,
} ,
} ,
} ,
} ,
expect : version . Must ( version . NewVersion ( "1.14.4" ) ) ,
} ,
}
for name , tc := range cases {
tc := tc
t . Run ( name , func ( t * testing . T ) {
got := determineEnvoyVersionFromNode ( tc . node )
if tc . expect != nil {
require . Equal ( t , tc . expect , got )
} else {
require . Nil ( t , got )
}
} )
}
}
2020-10-06 22:09:13 +00:00
func TestDetermineSupportedProxyFeaturesFromString ( t * testing . T ) {
const (
err1_13 = "is too old of a point release and is not supported by Consul because it does not support RBAC rules using url_path. Please upgrade to version 1.13.1+."
errTooOld = "is too old and is not supported by Consul"
)
type testcase struct {
expect supportedProxyFeatures
expectErr string
}
// Just the bad versions
cases := map [ string ] testcase {
"1.9.0" : { expectErr : "Envoy 1.9.0 " + errTooOld } ,
"1.10.0" : { expectErr : "Envoy 1.10.0 " + errTooOld } ,
"1.11.0" : { expectErr : "Envoy 1.11.0 " + errTooOld } ,
2020-10-22 18:46:19 +00:00
"1.12.0" : { expectErr : "Envoy 1.12.0 " + errTooOld } ,
"1.12.1" : { expectErr : "Envoy 1.12.1 " + errTooOld } ,
"1.12.2" : { expectErr : "Envoy 1.12.2 " + errTooOld } ,
"1.12.3" : { expectErr : "Envoy 1.12.3 " + errTooOld } ,
"1.12.4" : { expectErr : "Envoy 1.12.4 " + errTooOld } ,
"1.12.5" : { expectErr : "Envoy 1.12.5 " + errTooOld } ,
"1.12.6" : { expectErr : "Envoy 1.12.6 " + errTooOld } ,
"1.12.7" : { expectErr : "Envoy 1.12.7 " + errTooOld } ,
2021-02-22 21:00:15 +00:00
"1.13.0" : { expectErr : "Envoy 1.13.0 " + errTooOld } ,
"1.13.1" : { expectErr : "Envoy 1.13.1 " + errTooOld } ,
"1.13.2" : { expectErr : "Envoy 1.13.2 " + errTooOld } ,
"1.13.3" : { expectErr : "Envoy 1.13.3 " + errTooOld } ,
"1.13.4" : { expectErr : "Envoy 1.13.4 " + errTooOld } ,
"1.13.5" : { expectErr : "Envoy 1.13.5 " + errTooOld } ,
"1.13.6" : { expectErr : "Envoy 1.13.6 " + errTooOld } ,
"1.13.7" : { expectErr : "Envoy 1.13.7 " + errTooOld } ,
2021-04-29 20:22:03 +00:00
"1.14.0" : { expectErr : "Envoy 1.14.0 " + errTooOld } ,
"1.14.1" : { expectErr : "Envoy 1.14.1 " + errTooOld } ,
"1.14.2" : { expectErr : "Envoy 1.14.2 " + errTooOld } ,
"1.14.3" : { expectErr : "Envoy 1.14.3 " + errTooOld } ,
"1.14.4" : { expectErr : "Envoy 1.14.4 " + errTooOld } ,
"1.14.5" : { expectErr : "Envoy 1.14.5 " + errTooOld } ,
"1.14.6" : { expectErr : "Envoy 1.14.6 " + errTooOld } ,
"1.14.7" : { expectErr : "Envoy 1.14.7 " + errTooOld } ,
2021-10-01 18:28:26 +00:00
"1.15.0" : { expectErr : "Envoy 1.15.0 " + errTooOld } ,
"1.15.1" : { expectErr : "Envoy 1.15.1 " + errTooOld } ,
"1.15.2" : { expectErr : "Envoy 1.15.2 " + errTooOld } ,
"1.15.3" : { expectErr : "Envoy 1.15.3 " + errTooOld } ,
"1.15.4" : { expectErr : "Envoy 1.15.4 " + errTooOld } ,
"1.15.5" : { expectErr : "Envoy 1.15.5 " + errTooOld } ,
2021-10-28 01:51:35 +00:00
"1.16.1" : { expectErr : "Envoy 1.16.1 " + errTooOld } ,
"1.16.2" : { expectErr : "Envoy 1.16.2 " + errTooOld } ,
"1.16.3" : { expectErr : "Envoy 1.16.3 " + errTooOld } ,
"1.16.4" : { expectErr : "Envoy 1.16.4 " + errTooOld } ,
"1.16.5" : { expectErr : "Envoy 1.16.5 " + errTooOld } ,
"1.16.6" : { expectErr : "Envoy 1.16.6 " + errTooOld } ,
2022-04-18 16:36:07 +00:00
"1.17.4" : { expectErr : "Envoy 1.17.4 " + errTooOld } ,
"1.18.6" : { expectErr : "Envoy 1.18.6 " + errTooOld } ,
2020-10-06 22:09:13 +00:00
}
// Insert a bunch of valid versions.
2021-09-22 18:48:50 +00:00
// Populate feature flags here when appropriate. See consul 1.10.x for reference.
2022-04-18 16:36:07 +00:00
/ * Example from 1.18
2021-04-29 18:54:05 +00:00
for _ , v := range [ ] string {
2022-02-25 00:59:33 +00:00
"1.18.0" , "1.18.1" , "1.18.2" , "1.18.3" , "1.18.4" , "1.18.5" , "1.18.6" ,
2022-01-25 17:24:27 +00:00
} {
cases [ v ] = testcase { expect : supportedProxyFeatures {
ForceLDSandCDSToAlwaysUseWildcardsOnReconnect : true ,
} }
}
2022-04-18 16:36:07 +00:00
* /
2022-01-25 17:24:27 +00:00
for _ , v := range [ ] string {
2022-06-14 20:19:09 +00:00
"1.19.0" , "1.19.1" , "1.19.2" , "1.19.3" , "1.19.4" , "1.19.5" ,
2022-06-14 22:29:41 +00:00
"1.20.0" , "1.20.1" , "1.20.2" , "1.20.3" , "1.20.4" ,
"1.21.0" , "1.21.1" , "1.21.2" , "1.21.3" ,
"1.22.0" , "1.22.1" , "1.22.2" ,
2020-10-06 22:09:13 +00:00
} {
cases [ v ] = testcase { expect : supportedProxyFeatures { } }
}
for name , tc := range cases {
tc := tc
t . Run ( name , func ( t * testing . T ) {
sf , err := determineSupportedProxyFeaturesFromString ( name )
if tc . expectErr == "" {
require . Equal ( t , tc . expect , sf )
} else {
testutil . RequireErrorContains ( t , err , tc . expectErr )
}
} )
}
}