delete POC code, new api to get kv by id (#128)
diff --git a/server/resource/v1/kv_resource.go b/server/resource/v1/kv_resource.go
index 2c42bc5..86ef153 100644
--- a/server/resource/v1/kv_resource.go
+++ b/server/resource/v1/kv_resource.go
@@ -127,6 +127,7 @@
WriteErrResponse(rctx, http.StatusBadRequest, err.Error(), common.ContentTypeText)
return
}
+
offsetStr := rctx.ReadQueryParameter(common.QueryParamOffset)
limitStr := rctx.ReadQueryParameter(common.QueryParamLimit)
offset, limit, err := checkPagination(offsetStr, limitStr)
@@ -217,8 +218,7 @@
WriteErrResponse(context, http.StatusBadRequest, common.ErrKvIDMustNotEmpty, common.ContentTypeText)
return
}
- result, err := service.KVService.FindKV(context.Ctx, domain.(string), project,
- service.WithID(kvID))
+ result, err := service.KVService.Get(context.Ctx, domain.(string), project, kvID)
if err != nil && err != service.ErrKeyNotExists {
WriteErrResponse(context, http.StatusInternalServerError, err.Error(), common.ContentTypeText)
return
@@ -226,7 +226,7 @@
context.WriteHeader(http.StatusNoContent)
return
}
- kv := result[0].Data[0]
+ kv := result.Data[0]
err = service.KVService.Delete(context.Ctx, kvID, domain.(string), project)
if err != nil {
openlogging.Error("delete failed ,", openlogging.WithTags(openlogging.Tags{
diff --git a/server/resource/v1/kv_resource_test.go b/server/resource/v1/kv_resource_test.go
index e0450d7..fcd789e 100644
--- a/server/resource/v1/kv_resource_test.go
+++ b/server/resource/v1/kv_resource_test.go
@@ -117,7 +117,8 @@
t.Run("put kv,label is service and version", func(t *testing.T) {
kv := &model.KVDoc{
Value: "1s",
- Labels: map[string]string{"service": "utService",
+ Labels: map[string]string{
+ "service": "utService",
"version": "1.0.0"},
}
j, _ := json.Marshal(kv)
@@ -155,6 +156,7 @@
err = json.Unmarshal(body, result)
assert.NoError(t, err)
assert.Equal(t, 3, len(result.Data))
+
})
var rev string
t.Run("list kv by service label, exact match,should return 2 kv", func(t *testing.T) {
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index e169dcc..5b01e0b 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -123,19 +123,19 @@
}
return kvs[0], nil
}
- kvs, err := s.FindKV(ctx, domain, project,
+ kvs, err := s.List(ctx, domain, project,
service.WithExactLabels(),
service.WithLabels(opts.Labels),
service.WithKey(key))
if err != nil {
- openlogging.Error(err.Error())
+ openlogging.Error("check kv exist: " + err.Error())
return nil, err
}
- if len(kvs) != 1 {
+ if len(kvs.Data) != 1 {
return nil, session.ErrTooMany
}
- return kvs[0].Data[0], nil
+ return kvs.Data[0], nil
}
@@ -193,10 +193,8 @@
return result, nil
}
-//FindKV get kvs by key, labels
-//because labels has a a lot of combination,
-//you can use WithDepth(0) to return only one kv which's labels exactly match the criteria
-func (s *Service) FindKV(ctx context.Context, domain string, project string, options ...service.FindOption) ([]*model.KVResponse, error) {
+//Get get kvs by id
+func (s *Service) Get(ctx context.Context, domain, project, id string, options ...service.FindOption) (*model.KVResponse, error) {
opts := service.FindOptions{}
for _, o := range options {
o(&opts)
@@ -210,36 +208,8 @@
if project == "" {
return nil, session.ErrMissingProject
}
-
- if opts.ID != "" {
- openlogging.Debug(MsgFindOneKeyByID, openlogging.WithTags(openlogging.Tags{
- "id": opts.ID,
- "key": opts.Key,
- "labels": opts.Labels,
- }))
- return findKVByID(ctx, domain, project, opts.ID)
+ if id == "" {
+ return nil, session.ErrIDIsNil
}
-
- cur, _, err := findKV(ctx, domain, project, opts)
- if err != nil {
- return nil, err
- }
- defer cur.Close(ctx)
-
- if opts.Depth == 0 && opts.Key != "" {
- openlogging.Debug(MsgFindOneKey, openlogging.WithTags(
- map[string]interface{}{
- "key": opts.Key,
- "label": opts.Labels,
- "domain": domain,
- },
- ))
- return cursorToOneKV(ctx, cur, opts.Labels)
- }
- openlogging.Debug(MsgFindMoreKey, openlogging.WithTags(openlogging.Tags{
- "depth": opts.Depth,
- "key": opts.Key,
- "labels": opts.Labels,
- }))
- return findMoreKV(ctx, cur, &opts)
+ return findKVByID(ctx, domain, project, id)
}
diff --git a/server/service/mongo/kv/kv_test.go b/server/service/mongo/kv/kv_test.go
index b08c1c0..f43888d 100644
--- a/server/service/mongo/kv/kv_test.go
+++ b/server/service/mongo/kv/kv_test.go
@@ -72,7 +72,7 @@
assert.NotEmpty(t, oid)
})
t.Run("put kv timeout,with labels app,and update value", func(t *testing.T) {
- beforeKV, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
+ _, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
Key: "timeout",
Value: "1s",
Labels: map[string]string{
@@ -82,13 +82,6 @@
Project: "kv-test",
})
assert.NoError(t, err)
- kvs1, err := kvsvc.FindKV(context.Background(), "default", "kv-test",
- service.WithKey("timeout"),
- service.WithLabels(map[string]string{
- "app": "mall",
- }),
- service.WithExactLabels())
- assert.Equal(t, beforeKV.Value, kvs1[0].Data[0].Value)
afterKV, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
Key: "timeout",
Value: "3s",
@@ -104,39 +97,10 @@
}))
assert.NoError(t, err)
assert.Equal(t, afterKV.Value, savedKV.Value)
- kvs, err := kvsvc.FindKV(context.Background(), "default", "kv-test",
- service.WithKey("timeout"),
- service.WithLabels(map[string]string{
- "app": "mall",
- }),
- service.WithExactLabels())
- assert.Equal(t, afterKV.Value, kvs[0].Data[0].Value)
})
}
-func TestService_FindKV(t *testing.T) {
- kvsvc := &kv.Service{}
- t.Run("exact find by kv and labels with label app", func(t *testing.T) {
- kvs, err := kvsvc.FindKV(context.Background(), "default", "kv-test",
- service.WithKey("timeout"),
- service.WithLabels(map[string]string{
- "app": "mall",
- }),
- service.WithExactLabels())
- assert.NoError(t, err)
- assert.Equal(t, 1, len(kvs))
- })
- t.Run("greedy find by labels,with labels app ans service ", func(t *testing.T) {
- kvs, err := kvsvc.FindKV(context.Background(), "default", "kv-test",
- service.WithLabels(map[string]string{
- "app": "mall",
- "service": "cart",
- }))
- assert.NoError(t, err)
- assert.Equal(t, 1, len(kvs))
- })
-}
func TestService_Delete(t *testing.T) {
kvsvc := &kv.Service{}
t.Run("delete key by kvID", func(t *testing.T) {
diff --git a/server/service/mongo/kv/tool.go b/server/service/mongo/kv/tool.go
index cbeb5af..de9d0e3 100644
--- a/server/service/mongo/kv/tool.go
+++ b/server/service/mongo/kv/tool.go
@@ -19,13 +19,7 @@
import (
"context"
- "fmt"
- "reflect"
-
"github.com/apache/servicecomb-kie/pkg/model"
- "github.com/apache/servicecomb-kie/server/service"
- "github.com/go-mesh/openlogging"
- "go.mongodb.org/mongo-driver/mongo"
)
//clearAll clean attr which don't need to return to client side
@@ -38,94 +32,14 @@
kv.Domain = ""
kv.Project = ""
}
-func cursorToOneKV(ctx context.Context, cur *mongo.Cursor, labels map[string]string) ([]*model.KVResponse, error) {
- result := make([]*model.KVResponse, 0)
- //check label length to get the exact match
- for cur.Next(ctx) { //although complexity is O(n), but there won't be so much labels for one key
- if cur.Err() != nil {
- return nil, cur.Err()
- }
- curKV := &model.KVDoc{}
- err := cur.Decode(curKV)
- if err != nil {
- openlogging.Error("decode error: " + err.Error())
- return nil, err
- }
- if reflect.DeepEqual(curKV.Labels, labels) {
- openlogging.Debug(MsgHitExactLabels)
- labelGroup := &model.KVResponse{
- LabelDoc: &model.LabelDocResponse{
- Labels: labels,
- LabelID: curKV.LabelID,
- },
- Data: make([]*model.KVDoc, 0),
- }
- clearAll(curKV)
- labelGroup.Data = append(labelGroup.Data, curKV)
- result = append(result, labelGroup)
- return result, nil
- }
- }
- return nil, service.ErrKeyNotExists
-}
-
-func findKVByID(ctx context.Context, domain, project, kvID string) ([]*model.KVResponse, error) {
- kvResp := make([]*model.KVResponse, 0)
+func findKVByID(ctx context.Context, domain, project, kvID string) (*model.KVResponse, error) {
kv, err := findKVDocByID(ctx, domain, project, kvID)
if err != nil {
return nil, err
}
- kvResp = append(kvResp, &model.KVResponse{
+ return &model.KVResponse{
Total: 1,
Data: []*model.KVDoc{kv},
- })
- return kvResp, nil
-}
-
-func findMoreKV(ctx context.Context, cur *mongo.Cursor, opts *service.FindOptions) ([]*model.KVResponse, error) {
- kvResp := make([]*model.KVResponse, 0)
- for cur.Next(ctx) {
- curKV := &model.KVDoc{}
-
- if err := cur.Decode(curKV); err != nil {
- openlogging.Error("decode to KVs error: " + err.Error())
- return nil, err
- }
- if (len(curKV.Labels) - len(opts.Labels)) > opts.Depth {
- //because it is query by labels, so result can not be minus
- //so many labels,then continue
- openlogging.Debug("so deep, skip this key")
- continue
- }
- openlogging.Debug(fmt.Sprintf("%v", curKV))
- var groupExist bool
- var labelGroup *model.KVResponse
- for _, labelGroup = range kvResp {
- if reflect.DeepEqual(labelGroup.LabelDoc.Labels, curKV.Labels) {
- groupExist = true
- clearAll(curKV)
- labelGroup.Data = append(labelGroup.Data, curKV)
- break
- }
-
- }
- if !groupExist {
- labelGroup = &model.KVResponse{
- LabelDoc: &model.LabelDocResponse{
- Labels: curKV.Labels,
- LabelID: curKV.LabelID,
- },
- Data: []*model.KVDoc{curKV},
- }
- clearAll(curKV)
- openlogging.Debug("add new label group")
- kvResp = append(kvResp, labelGroup)
- }
-
- }
- if len(kvResp) == 0 {
- return nil, service.ErrKeyNotExists
- }
- return kvResp, nil
+ }, nil
}
diff --git a/server/service/service.go b/server/service/service.go
index 5720a6c..a0d238d 100644
--- a/server/service/service.go
+++ b/server/service/service.go
@@ -46,8 +46,8 @@
CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
List(ctx context.Context, domain, project string, options ...FindOption) (*model.KVResponse, error)
Delete(ctx context.Context, kvID string, domain, project string) error
- //FindKV is usually for service to pull configs
- FindKV(ctx context.Context, domain, project string, options ...FindOption) ([]*model.KVResponse, error)
+ //Get return kv by id
+ Get(ctx context.Context, domain, project, id string, options ...FindOption) (*model.KVResponse, error)
}
//History provide api of History entity