mirror of
https://github.com/goharbor/harbor.git
synced 2025-01-30 03:21:22 +01:00
fix: handle the break change for parse external sentinel redis url (#17501)
Handle the ParseSentinelURL to resolve an incompatible modification that does not recognize the default redis database. Closes: #17483 Signed-off-by: chlins <chenyuzh@vmware.com>
This commit is contained in:
parent
a56d927143
commit
9573cd7753
22
src/lib/cache/redis/util.go
vendored
22
src/lib/cache/redis/util.go
vendored
@ -27,6 +27,11 @@ import (
|
|||||||
"github.com/goharbor/harbor/src/lib/errors"
|
"github.com/goharbor/harbor/src/lib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// defaultDBIndex defines the default redis db index
|
||||||
|
defaultDBIndex = 0
|
||||||
|
)
|
||||||
|
|
||||||
// ParseSentinelURL parses sentinel url to redis FailoverOptions.
|
// ParseSentinelURL parses sentinel url to redis FailoverOptions.
|
||||||
// It's a modified version of go-redis ParseURL(https://github.com/go-redis/redis/blob/997118894af9d4244d4a471f2b317eead9c9ca62/options.go#L222) because official version does
|
// It's a modified version of go-redis ParseURL(https://github.com/go-redis/redis/blob/997118894af9d4244d4a471f2b317eead9c9ca62/options.go#L222) because official version does
|
||||||
// not support parse sentinel mode.
|
// not support parse sentinel mode.
|
||||||
@ -45,15 +50,20 @@ func ParseSentinelURL(redisURL string) (*redis.FailoverOptions, error) {
|
|||||||
return r == '/'
|
return r == '/'
|
||||||
})
|
})
|
||||||
// expect path length is 2, example: [mymaster 1]
|
// expect path length is 2, example: [mymaster 1]
|
||||||
if len(f) != 2 {
|
// but if the db is default(0) which can be ignored, so when the path length is 1, then set db to 0
|
||||||
|
switch len(f) {
|
||||||
|
case 1:
|
||||||
|
o.MasterName = f[0]
|
||||||
|
o.DB = defaultDBIndex
|
||||||
|
case 2:
|
||||||
|
o.MasterName = f[0]
|
||||||
|
if o.DB, err = strconv.Atoi(f[1]); err != nil {
|
||||||
|
return nil, errors.Errorf("redis: invalid database number: %q", f[1])
|
||||||
|
}
|
||||||
|
default:
|
||||||
return nil, errors.Errorf("redis: invalid redis URL path: %s", u.Path)
|
return nil, errors.Errorf("redis: invalid redis URL path: %s", u.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
o.MasterName = f[0]
|
|
||||||
if o.DB, err = strconv.Atoi(f[1]); err != nil {
|
|
||||||
return nil, errors.Errorf("redis: invalid database number: %q", f[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
return setupConnParams(u, o)
|
return setupConnParams(u, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/lib/cache/redis/util_test.go
vendored
11
src/lib/cache/redis/util_test.go
vendored
@ -22,9 +22,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestParseSentinelURL(t *testing.T) {
|
func TestParseSentinelURL(t *testing.T) {
|
||||||
url := "redis+sentinel://anonymous:password@host1:26379,host2:26379/mymaster/1?idle_timeout_seconds=30&max_retries=10&min_retry_backoff=1&max_retry_backoff=10&dial_timeout=30&read_timeout=5&write_timeout=5&pool_fifo=true&pool_size=1000&min_idle_conns=100&max_conn_age=10&pool_timeout=10"
|
// db index should be set to 0 if not specified
|
||||||
|
url := "redis+sentinel://anonymous:password@host1:26379,host2:26379/mymaster/?idle_timeout_seconds=30"
|
||||||
o, err := ParseSentinelURL(url)
|
o, err := ParseSentinelURL(url)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, o.DB)
|
||||||
|
|
||||||
|
// test options from query
|
||||||
|
url = "redis+sentinel://anonymous:password@host1:26379,host2:26379/mymaster/1?idle_timeout_seconds=30&max_retries=10&min_retry_backoff=1&max_retry_backoff=10&dial_timeout=30&read_timeout=5&write_timeout=5&pool_fifo=true&pool_size=1000&min_idle_conns=100&max_conn_age=10&pool_timeout=10"
|
||||||
|
o, err = ParseSentinelURL(url)
|
||||||
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "anonymous", o.Username)
|
assert.Equal(t, "anonymous", o.Username)
|
||||||
assert.Equal(t, "password", o.Password)
|
assert.Equal(t, "password", o.Password)
|
||||||
assert.Equal(t, []string{"host1:26379", "host2:26379"}, o.SentinelAddrs)
|
assert.Equal(t, []string{"host1:26379", "host2:26379"}, o.SentinelAddrs)
|
||||||
@ -44,7 +51,7 @@ func TestParseSentinelURL(t *testing.T) {
|
|||||||
assert.Equal(t, 10*time.Second, o.PoolTimeout)
|
assert.Equal(t, 10*time.Second, o.PoolTimeout)
|
||||||
|
|
||||||
// invalid url should return err
|
// invalid url should return err
|
||||||
url = "invalid"
|
url = "###"
|
||||||
_, err = ParseSentinelURL(url)
|
_, err = ParseSentinelURL(url)
|
||||||
assert.Error(t, err, "invalid url should return err")
|
assert.Error(t, err, "invalid url should return err")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user