fix: convert clickhouse connection string with auth info (#14566)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2022-07-02 10:13:20 +08:00
committed by GitHub
parent 7ea8d33841
commit bf781bb1db
2 changed files with 48 additions and 6 deletions
+28 -6
View File
@@ -45,6 +45,15 @@ func clickhouseSqlStrV1ToV2(sqlstr string) (string, error) {
if len(dbname) == 0 {
return "", errors.Wrap(httperrors.ErrInputParameter, "empty database")
}
uname, _ := qs.GetString("username")
pword, _ := qs.GetString("password")
if len(uname) > 0 {
if len(pword) > 0 {
hostPart = fmt.Sprintf("%s:%s@%s", uname, pword, hostPart)
} else {
hostPart = fmt.Sprintf("%s@%s", uname, hostPart)
}
}
return fmt.Sprintf("clickhouse://%s/%s?dial_timeout=200ms&max_execution_time=60", hostPart, dbname), nil
}
@@ -53,18 +62,31 @@ func clickhouseSqlStrV2ToV1(sqlstr string) (string, error) {
// already v1 format
return sqlstr, nil
}
queryPos := strings.IndexByte(sqlstr, '?')
if queryPos <= 0 {
return "", errors.Wrap(httperrors.ErrInputParameter, "no query string")
hostPart := sqlstr[len("clickhouse://"):]
queryPos := strings.IndexByte(hostPart, '?')
if queryPos > 0 {
hostPart = hostPart[:queryPos]
}
hostPart := sqlstr[len("clickhouse://"):queryPos]
slashPos := strings.IndexByte(hostPart, '/')
if slashPos <= 0 {
return "", errors.Wrap(httperrors.ErrInputParameter, "no database part")
}
dbname := hostPart[slashPos+1:]
qs := make(map[string]string)
qs["database"] = hostPart[slashPos+1:]
hostPart = hostPart[:slashPos]
return fmt.Sprintf("tcp://%s?database=%s&read_timeout=10&write_timeout=20", hostPart, dbname), nil
atPos := strings.IndexByte(hostPart, '@')
if atPos > 0 {
authPart := hostPart[:atPos]
hostPart = hostPart[atPos+1:]
colonPos := strings.IndexByte(authPart, ':')
if colonPos > 0 {
qs["username"] = authPart[:colonPos]
qs["password"] = authPart[colonPos+1:]
} else {
qs["username"] = authPart
}
}
return fmt.Sprintf("tcp://%s?%s&read_timeout=10&write_timeout=20", hostPart, jsonutils.Marshal(qs).QueryString()), nil
}
func validateClickhouseV2Str(sqlstr string) error {
+20
View File
@@ -27,6 +27,14 @@ func TestClickhouseSqlStrV1ToV2(t *testing.T) {
in: "tcp://192.168.222.4:9000?database=yunionmeter&read_timeout=10&write_timeout=20",
want: "clickhouse://192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
},
{
in: "tcp://192.168.222.4:9000?username=admin&database=yunionmeter&read_timeout=10&write_timeout=20",
want: "clickhouse://admin@192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
},
{
in: "tcp://192.168.222.4:9000?username=admin&password=pass&database=yunionmeter&read_timeout=10&write_timeout=20",
want: "clickhouse://admin:pass@192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
},
} {
got, err := clickhouseSqlStrV1ToV2(c.in)
if err != nil {
@@ -42,10 +50,22 @@ func TestClickhouseSqlStrV2ToV1(t *testing.T) {
in string
want string
}{
{
in: "clickhouse://admin:pass@192.168.222.4:9000/yunionmeter",
want: "tcp://192.168.222.4:9000?database=yunionmeter&password=pass&username=admin&read_timeout=10&write_timeout=20",
},
{
in: "clickhouse://192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
want: "tcp://192.168.222.4:9000?database=yunionmeter&read_timeout=10&write_timeout=20",
},
{
in: "clickhouse://admin@192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
want: "tcp://192.168.222.4:9000?database=yunionmeter&username=admin&read_timeout=10&write_timeout=20",
},
{
in: "clickhouse://admin:pass@192.168.222.4:9000/yunionmeter?dial_timeout=200ms&max_execution_time=60",
want: "tcp://192.168.222.4:9000?database=yunionmeter&password=pass&username=admin&read_timeout=10&write_timeout=20",
},
} {
got, err := clickhouseSqlStrV2ToV1(c.in)
if err != nil {