You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/08/24 10:28:43 UTC
[servicecomb-kie] branch master updated: Fix: Can not page the kvs
(#211)
This is an automated email from the ASF dual-hosted git repository.
tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-kie.git
The following commit(s) were added to refs/heads/master by this push:
new f3527b9 Fix: Can not page the kvs (#211)
f3527b9 is described below
commit f3527b9c2ace866fac2553a314e38eeb6b109d75
Author: little-cui <su...@qq.com>
AuthorDate: Tue Aug 24 18:28:39 2021 +0800
Fix: Can not page the kvs (#211)
---
pkg/validator/rule.go | 2 +-
server/datasource/etcd/kv/kv_dao.go | 38 ++++++++++++++--------------
server/datasource/mongo/kv/kv_dao.go | 4 +--
server/resource/v1/kv_resource_test.go | 45 +++++++++++++++++++++++++++++++++-
4 files changed, 65 insertions(+), 24 deletions(-)
diff --git a/pkg/validator/rule.go b/pkg/validator/rule.go
index 401c1b7..eb32ba3 100644
--- a/pkg/validator/rule.go
+++ b/pkg/validator/rule.go
@@ -24,7 +24,7 @@ const (
commonNameRegexString = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$`
labelKeyRegexString = `^[a-zA-Z0-9]{1,32}$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]{1,30}[a-zA-Z0-9]$`
labelValueRegexString = `^[a-zA-Z0-9]{0,160}$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]{0,158}[a-zA-Z0-9]$`
- getKeyRegexString = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$|^beginWith\([a-zA-Z0-9][a-zA-Z0-9_\-.]*\)$|^wildcard\([a-zA-Z0-9][a-zA-Z0-9_\-.*]*\)$`
+ getKeyRegexString = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$|^beginWith\([a-zA-Z0-9][a-zA-Z0-9_\-.]*\)$|^wildcard\([a-zA-Z0-9*][a-zA-Z0-9_\-.*]*\)$`
asciiRegexString = `^[\x00-\x7F]*$`
allCharString = `.*`
)
diff --git a/server/datasource/etcd/kv/kv_dao.go b/server/datasource/etcd/kv/kv_dao.go
index 67a639d..48c2eb0 100644
--- a/server/datasource/etcd/kv/kv_dao.go
+++ b/server/datasource/etcd/kv/kv_dao.go
@@ -251,26 +251,24 @@ func IsUniqueFind(opts datasource.FindOptions) bool {
}
func toRegex(opts datasource.FindOptions) (*regexp.Regexp, error) {
- var (
- regex *regexp.Regexp
- value string
- )
- if opts.Key != "" {
- switch {
- case strings.HasPrefix(opts.Key, "beginWith("):
- value = "^" + strings.ReplaceAll(getValue(opts.Key), ".", "\\.") + ".*"
- case strings.HasPrefix(opts.Key, "wildcard("):
- value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
- value = strings.ReplaceAll(value, "*", ".*")
- default:
- value = "^" + strings.ReplaceAll(opts.Key, ".", "\\.") + "$"
- }
- var err error
- regex, err = regexp.Compile(value)
- if err != nil {
- openlog.Error("invalid wildcard expr: " + err.Error())
- return nil, err
- }
+ var value string
+ if opts.Key == "" {
+ return nil, nil
+ }
+ switch {
+ case strings.HasPrefix(opts.Key, "beginWith("):
+ value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.") + ".*"
+ case strings.HasPrefix(opts.Key, "wildcard("):
+ value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
+ value = strings.ReplaceAll(value, "*", ".*")
+ default:
+ value = strings.ReplaceAll(opts.Key, ".", "\\.")
+ }
+ value = "(?i)^" + value + "$"
+ regex, err := regexp.Compile(value)
+ if err != nil {
+ openlog.Error("invalid wildcard expr: " + value + ", error: " + err.Error())
+ return nil, err
}
return regex, nil
}
diff --git a/server/datasource/mongo/kv/kv_dao.go b/server/datasource/mongo/kv/kv_dao.go
index 45060f6..554243e 100644
--- a/server/datasource/mongo/kv/kv_dao.go
+++ b/server/datasource/mongo/kv/kv_dao.go
@@ -94,11 +94,11 @@ func findKV(ctx context.Context, domain string, project string, opts datasource.
switch {
case strings.HasPrefix(opts.Key, "beginWith("):
value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
- filter["key"] = bson.M{"$regex": value, "$options": "$i"}
+ filter["key"] = bson.M{"$regex": "^" + value + ".*$", "$options": "$i"}
case strings.HasPrefix(opts.Key, "wildcard("):
value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
value = strings.ReplaceAll(value, "*", ".*")
- filter["key"] = bson.M{"$regex": value, "$options": "$i"}
+ filter["key"] = bson.M{"$regex": "^" + value + "$", "$options": "$i"}
}
}
if len(opts.Labels) != 0 {
diff --git a/server/resource/v1/kv_resource_test.go b/server/resource/v1/kv_resource_test.go
index b11ffe0..bd44725 100644
--- a/server/resource/v1/kv_resource_test.go
+++ b/server/resource/v1/kv_resource_test.go
@@ -429,7 +429,7 @@ func TestKVResource_List(t *testing.T) {
assert.Equal(t, 1, len(result.Data))
})
t.Run("get one key, fuzzy match,should return 2 kv", func(t *testing.T) {
- r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(time)", nil)
+ r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(TIME)", nil)
r.Header.Set("Content-Type", "application/json")
kvr := &v1.KVResource{}
c, err := restfultest.New(kvr, nil)
@@ -442,6 +442,49 @@ func TestKVResource_List(t *testing.T) {
err = json.Unmarshal(body, result)
assert.NoError(t, err)
assert.Equal(t, 2, len(result.Data))
+
+ r, _ = http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(IME)", nil)
+ r.Header.Set("Content-Type", "application/json")
+ kvr = &v1.KVResource{}
+ c, err = restfultest.New(kvr, nil)
+ assert.NoError(t, err)
+ resp = httptest.NewRecorder()
+ c.ServeHTTP(resp, r)
+ body, err = ioutil.ReadAll(resp.Body)
+ assert.NoError(t, err)
+ result = &model.KVResponse{}
+ err = json.Unmarshal(body, result)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(result.Data))
+ })
+ t.Run("get one key, wildcard match,should return 2 kv", func(t *testing.T) {
+ r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=wildcard(*IME*)", nil)
+ r.Header.Set("Content-Type", "application/json")
+ kvr := &v1.KVResource{}
+ c, err := restfultest.New(kvr, nil)
+ assert.NoError(t, err)
+ resp := httptest.NewRecorder()
+ c.ServeHTTP(resp, r)
+ body, err := ioutil.ReadAll(resp.Body)
+ assert.NoError(t, err)
+ result := &model.KVResponse{}
+ err = json.Unmarshal(body, result)
+ assert.NoError(t, err)
+ assert.Equal(t, 2, len(result.Data))
+
+ r, _ = http.NewRequest("GET", "/v1/kv_test/kie/kv?key=wildcard(TIME)", nil)
+ r.Header.Set("Content-Type", "application/json")
+ kvr = &v1.KVResource{}
+ c, err = restfultest.New(kvr, nil)
+ assert.NoError(t, err)
+ resp = httptest.NewRecorder()
+ c.ServeHTTP(resp, r)
+ body, err = ioutil.ReadAll(resp.Body)
+ assert.NoError(t, err)
+ result = &model.KVResponse{}
+ err = json.Unmarshal(body, result)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(result.Data))
})
t.Run("get one key by service label should return 2 kv,delete one", func(t *testing.T) {
r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=timeout&label=service:utService", nil)