improvement: remove useless label collection (#136)
diff --git a/deployments/db.js b/deployments/db.js
index 9f11118..d150b41 100644
--- a/deployments/db.js
+++ b/deployments/db.js
@@ -32,7 +32,7 @@
db.createCollection( "kv", {
validator: { $jsonSchema: {
bsonType: "object",
- required: [ "key","domain","project","id","value","create_revision","update_revision","value_type","label_id" ],
+ required: [ "key","domain","project","id","value","create_revision","update_revision","value_type","label_format" ],
properties: {
key: {
bsonType: "string",
@@ -56,26 +56,6 @@
} }
} );
db.createCollection("kv_revision");
-db.createCollection( "label", {
- validator: { $jsonSchema: {
- bsonType: "object",
- required: [ "id","domain","project","format" ],
- properties: {
- label_id: {
- bsonType: "string",
- },
- domain: {
- bsonType: "string"
- },
- project: {
- bsonType: "string"
- },
- alias: {
- bsonType: "string"
- }
- }
- } }
-} );
db.createCollection( "view", {
validator: { $jsonSchema: {
bsonType: "object",
@@ -134,7 +114,7 @@
//index
db.kv.createIndex({"id": 1}, { unique: true } );
-db.kv.createIndex({key: 1, label_id: 1,domain:1,project:1},{ unique: true });
+db.kv.createIndex({key: 1, label_format: 1,domain:1,project:1},{ unique: true });
db.kv_revision.createIndex( { "delete_time": 1 }, { expireAfterSeconds: 7 * 24 * 3600 } );
db.label.createIndex({"id": 1}, { unique: true } );
db.label.createIndex({format: 1,domain:1,project:1},{ unique: true });
diff --git a/docs/getstarted/verify.md b/docs/getstarted/verify.md
index 44a5efc..1801cf6 100644
--- a/docs/getstarted/verify.md
+++ b/docs/getstarted/verify.md
@@ -15,7 +15,6 @@
```json
{
"id": "05529229-efc3-49ca-a765-05759b23ab28",
- "label_id": "e7faac8e-053e-4906-99ab-989f61febe74",
"key": "ingressRule",
"value": "some rule",
"value_type": "text",
diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md
index 7f391fe..480867b 100644
--- a/docs/intro/concepts.md
+++ b/docs/intro/concepts.md
@@ -20,7 +20,6 @@
```json
{
"id": "05529229-efc3-49ca-a765-05759b23ab28",
- "label_id": "e7faac8e-053e-4906-99ab-989f61febe74",
"key": "enable_a_function",
"value": "true",
"value_type": "text",
diff --git a/pkg/model/db_schema.go b/pkg/model/db_schema.go
index d28a191..f44b646 100644
--- a/pkg/model/db_schema.go
+++ b/pkg/model/db_schema.go
@@ -30,7 +30,7 @@
//KVDoc is database struct to store kv
type KVDoc struct {
ID string `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" swag:"string"`
- LabelID string `json:"label_id,omitempty" bson:"label_id,omitempty" yaml:"label_id,omitempty"`
+ LabelFormat string `json:"label_format,omitempty" bson:"label_format,omitempty" yaml:"label_format,omitempty"`
Key string `json:"key" yaml:"key" validate:"commonName"`
Value string `json:"value" yaml:"value" validate:"ascii,min=1,max=2097152"`
ValueType string `json:"value_type,omitempty" bson:"value_type,omitempty" yaml:"value_type,omitempty" validate:"valueType"` //ini,json,text,yaml,properties
diff --git a/pkg/model/kv.go b/pkg/model/kv.go
index 5d87baa..79d5a55 100644
--- a/pkg/model/kv.go
+++ b/pkg/model/kv.go
@@ -35,13 +35,11 @@
//LabelDocResponse is label struct
type LabelDocResponse struct {
- LabelID string `json:"label_id,omitempty"`
- Labels map[string]string `json:"labels,omitempty"`
+ Labels map[string]string `json:"labels,omitempty"`
}
//LabelHistoryResponse is label history revision struct
type LabelHistoryResponse struct {
- LabelID string `json:"label_id,omitempty" bson:"label_id,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
KVs []*KVDoc `json:"data,omitempty"`
Revision int `json:"revision"`
@@ -59,7 +57,7 @@
CreateTime string `json:"create_time"`
ID string `json:"id"`
Key string `json:"key"`
- LabelID string `json:"label_id"`
+ LabelFormat string `json:"label_format"`
Labels map[string]string `json:"labels"`
UpdateRevision int64 `json:"update_revision"`
UpdateTime string `json:"update_time"`
diff --git a/server/resource/v1/history_resource_test.go b/server/resource/v1/history_resource_test.go
index 84e84a8..44becb8 100644
--- a/server/resource/v1/history_resource_test.go
+++ b/server/resource/v1/history_resource_test.go
@@ -47,7 +47,7 @@
Domain: "default",
Project: "history_test",
}
- kv, _ = service.KVService.CreateOrUpdate(context.Background(), kv)
+ kv, _ = service.KVService.Create(context.Background(), kv)
path := fmt.Sprintf("/v1/history_test/kie/revision/%s", kv.ID)
r, _ := http.NewRequest("GET", path, nil)
revision := &v1.HistoryResource{}
@@ -67,7 +67,7 @@
t.Run("put again, should has 2 revision", func(t *testing.T) {
kv.Domain = "default"
kv.Project = "history_test"
- kv, err = service.KVService.CreateOrUpdate(context.Background(), kv)
+ kv, err = service.KVService.Update(context.Background(), kv)
assert.NoError(t, err)
path := fmt.Sprintf("/v1/history_test/kie/revision/%s", kv.ID)
r, _ := http.NewRequest("GET", path, nil)
diff --git a/server/resource/v1/label_resouce.go b/server/resource/v1/label_resouce.go
deleted file mode 100644
index 23905bf..0000000
--- a/server/resource/v1/label_resouce.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package v1
-
-import (
- "fmt"
- "net/http"
-
- "github.com/apache/servicecomb-kie/pkg/common"
- "github.com/apache/servicecomb-kie/pkg/model"
- "github.com/apache/servicecomb-kie/server/service"
- goRestful "github.com/emicklei/go-restful"
- "github.com/go-chassis/go-chassis/server/restful"
- "github.com/go-mesh/openlogging"
-)
-
-//LabelResource is label API
-type LabelResource struct {
-}
-
-//PutLabel update by label_id , only can modify alias
-// create return 201 / update return 200
-func (r *LabelResource) PutLabel(context *restful.Context) {
- var err error
- entity := new(model.LabelDoc)
- if err = readRequest(context, entity); err != nil {
- WriteErrResponse(context, http.StatusBadRequest, fmt.Sprintf(FmtReadRequestError, err))
- return
- }
- entity.Project = context.ReadPathParameter("project")
- domain := ReadDomain(context)
- if domain == nil {
- WriteErrResponse(context, http.StatusInternalServerError, common.MsgDomainMustNotBeEmpty)
- return
- }
- entity.Domain = domain.(string)
- res, err := service.LabelService.CreateOrUpdate(context.Ctx, entity)
- if err != nil {
- if err == service.ErrRevisionNotExist {
- WriteErrResponse(context, http.StatusNotFound, err.Error())
- return
- }
- WriteErrResponse(context, http.StatusInternalServerError, err.Error())
- return
- }
- if res == nil {
- WriteErrResponse(context, http.StatusNotFound, "put alias fail")
- return
- }
- if entity.ID == "" {
- context.WriteHeader(http.StatusCreated)
- }
- err = writeResponse(context, res)
- if err != nil {
- openlogging.Error(err.Error())
- }
-}
-
-//URLPatterns defined config operations
-func (r *LabelResource) URLPatterns() []restful.Route {
- return []restful.Route{
- {
- Method: http.MethodPut,
- Path: "/v1/{project}/kie/label",
- ResourceFunc: r.PutLabel,
- FuncDesc: "put alias for label or create new label",
- Parameters: []*restful.Parameters{
- DocPathProject, DocPathKeyID,
- },
- Returns: []*restful.Returns{
- {
- Code: http.StatusOK,
- Message: "update success",
- },
- {
- Code: http.StatusCreated,
- Message: "create success",
- },
- },
- Consumes: []string{goRestful.MIME_JSON, common.ContentTypeYaml},
- Produces: []string{goRestful.MIME_JSON, common.ContentTypeYaml},
- },
- }
-}
diff --git a/server/resource/v1/label_resouce_test.go b/server/resource/v1/label_resouce_test.go
deleted file mode 100644
index 411197d..0000000
--- a/server/resource/v1/label_resouce_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package v1_test
-
-import (
- "bytes"
- "context"
- "encoding/json"
- "github.com/apache/servicecomb-kie/pkg/model"
- handler2 "github.com/apache/servicecomb-kie/server/handler"
- v1 "github.com/apache/servicecomb-kie/server/resource/v1"
- "github.com/apache/servicecomb-kie/server/service"
- "github.com/go-chassis/go-chassis/core/common"
- "github.com/go-chassis/go-chassis/core/handler"
- "github.com/go-chassis/go-chassis/server/restful/restfultest"
- "github.com/stretchr/testify/assert"
- "io/ioutil"
- "net/http"
- "net/http/httptest"
- "testing"
-)
-
-func TestLabelResource_PutLabel(t *testing.T) {
- t.Run("update label alias", func(t *testing.T) {
- kv := &model.KVDoc{
- Key: "test",
- Value: "revisions",
- Labels: map[string]string{
- "test": "revisions",
- },
- Domain: "default",
- Project: "label_test",
- }
- kv, _ = service.KVService.CreateOrUpdate(context.Background(), kv)
- j := []byte("{\"alias\":\"test\",\"id\":\"" + kv.LabelID + "\"}")
- r, _ := http.NewRequest("PUT", "/v1/label_test/kie/label", bytes.NewBuffer(j))
- r.Header.Add("Content-Type", "application/json")
- revision := &v1.LabelResource{}
- noopH := &handler2.NoopAuthHandler{}
- chain, _ := handler.CreateChain(common.Provider, "testchain2", noopH.Name())
- c, err := restfultest.New(revision, chain)
- assert.NoError(t, err)
- resp := httptest.NewRecorder()
- c.ServeHTTP(resp, r)
- body, err := ioutil.ReadAll(resp.Body)
- assert.NoError(t, err)
- data := &model.LabelDoc{}
- err = json.Unmarshal(body, &data)
- assert.NoError(t, err)
- assert.Equal(t, data.Alias, "test")
- })
- t.Run("put label", func(t *testing.T) {
- label := &model.LabelDoc{
- Labels: map[string]string{
- "test": "revisions",
- },
- Domain: "default",
- Project: "label_test",
- }
- j, _ := json.Marshal(label)
- r, _ := http.NewRequest("PUT", "/v1/label_test/kie/label", bytes.NewBuffer(j))
- r.Header.Add("Content-Type", "application/json")
- revision := &v1.LabelResource{}
- noopH := &handler2.NoopAuthHandler{}
- chain, _ := handler.CreateChain(common.Provider, "testchain2", noopH.Name())
- c, err := restfultest.New(revision, chain)
- assert.NoError(t, err)
- resp := httptest.NewRecorder()
- c.ServeHTTP(resp, r)
- body, err := ioutil.ReadAll(resp.Body)
- assert.NoError(t, err)
- data := &model.LabelDoc{}
- err = json.Unmarshal(body, &data)
- assert.NoError(t, err)
- // assert.NotEmpty(t, data.ID)
- })
-}
diff --git a/server/service/mongo/history/service_test.go b/server/service/mongo/history/service_test.go
index ea0aa77..24af89d 100644
--- a/server/service/mongo/history/service_test.go
+++ b/server/service/mongo/history/service_test.go
@@ -37,8 +37,8 @@
cur, err := coll.Find(
context.Background(),
bson.M{
- "label_id": "5dbc079183ff1a09242376e7",
- "data.key": "lb",
+ "label_format": "5dbc079183ff1a09242376e7",
+ "data.key": "lb",
})
assert.NoError(t, err)
for cur.Next(ctx) {
diff --git a/server/service/mongo/init.go b/server/service/mongo/init.go
index 8f57b60..0b81c09 100644
--- a/server/service/mongo/init.go
+++ b/server/service/mongo/init.go
@@ -22,7 +22,6 @@
"github.com/apache/servicecomb-kie/server/service/mongo/counter"
"github.com/apache/servicecomb-kie/server/service/mongo/history"
"github.com/apache/servicecomb-kie/server/service/mongo/kv"
- "github.com/apache/servicecomb-kie/server/service/mongo/label"
"github.com/apache/servicecomb-kie/server/service/mongo/session"
"github.com/go-mesh/openlogging"
)
@@ -33,5 +32,4 @@
service.KVService = &kv.Service{}
service.HistoryService = &history.Service{}
service.RevisionService = &counter.Service{}
- service.LabelService = &label.Service{}
}
diff --git a/server/service/mongo/kv/kv_dao.go b/server/service/mongo/kv/kv_dao.go
index a776d0c..1c4f90f 100644
--- a/server/service/mongo/kv/kv_dao.go
+++ b/server/service/mongo/kv/kv_dao.go
@@ -80,7 +80,7 @@
return err
}
collection := session.GetDB().Collection(session.CollectionKV)
- ur, err := collection.UpdateOne(ctx, bson.M{"key": kv.Key, "label_id": kv.LabelID}, bson.D{
+ ur, err := collection.UpdateOne(ctx, bson.M{"key": kv.Key, "label_format": kv.LabelFormat}, bson.D{
{"$set", bson.D{
{"value", kv.Value},
{"status", kv.Status},
@@ -263,11 +263,11 @@
return kvs, nil
}
-//findKVByLabelID get kvs by key and label id
+//findKVByLabel get kvs by key and label
//key can be empty, then it will return all key values
//if key is given, will return 0-1 key value
-func findKVByLabelID(ctx context.Context, domain, labelID, key string, project string) ([]*model.KVDoc, error) {
- filter := bson.M{"label_id": labelID, "domain": domain, "project": project}
+func findKVByLabel(ctx context.Context, domain, labelFormat, key string, project string) ([]*model.KVDoc, error) {
+ filter := bson.M{"label_format": labelFormat, "domain": domain, "project": project}
if key != "" {
filter["key"] = key
return findOneKey(ctx, filter)
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index 1a2526f..3d121ee 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -19,12 +19,12 @@
import (
"context"
+ "github.com/apache/servicecomb-kie/pkg/stringutil"
"time"
"github.com/apache/servicecomb-kie/pkg/model"
"github.com/apache/servicecomb-kie/pkg/util"
"github.com/apache/servicecomb-kie/server/service"
- "github.com/apache/servicecomb-kie/server/service/mongo/label"
"github.com/apache/servicecomb-kie/server/service/mongo/session"
"github.com/go-mesh/openlogging"
)
@@ -49,32 +49,11 @@
kv.Labels = map[string]string{}
}
//check whether the project has certain labels or not
- labelID, err := label.Exist(ctx, kv.Domain, kv.Project, kv.Labels)
- if err != nil {
- if err == session.ErrLabelNotExists {
- l := &model.LabelDoc{
- Domain: kv.Domain,
- Labels: kv.Labels,
- Project: kv.Project,
- }
- l, err = label.CreateLabel(ctx, l)
- if err != nil {
- openlogging.Error(MsgCreateLabelFailed, openlogging.WithTags(openlogging.Tags{
- "k": kv.Key,
- "domain": kv.Domain,
- }))
- return nil, err
- }
- labelID = l.ID
- } else {
- return nil, err
- }
- }
- kv.LabelID = labelID
+ kv.LabelFormat = stringutil.FormatMap(kv.Labels)
if kv.ValueType == "" {
kv.ValueType = session.DefaultValueType
}
- _, err = s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelID(kv.LabelID))
+ _, err := s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelFormat(kv.LabelFormat))
if err == nil {
return nil, session.ErrKVAlreadyExists
}
@@ -109,69 +88,6 @@
}
-//CreateOrUpdate will create or update a key value record
-//it first check label exists or not, and create labels if labels is first posted.
-//if label exists, then get its latest revision, and update current revision,
-//save the current label and its all key values to history collection
-//then check key exists or not, then create or update it
-func (s *Service) CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error) {
- ctx, _ = context.WithTimeout(ctx, session.Timeout)
- if kv.Domain == "" {
- return nil, session.ErrMissingDomain
- }
- //check whether the project has certain labels or not
- labelID, err := label.Exist(ctx, kv.Domain, kv.Project, kv.Labels)
- if err != nil {
- if err == session.ErrLabelNotExists {
- l := &model.LabelDoc{
- Domain: kv.Domain,
- Labels: kv.Labels,
- Project: kv.Project,
- }
- l, err = label.CreateLabel(ctx, l)
- if err != nil {
- openlogging.Error(MsgCreateLabelFailed, openlogging.WithTags(openlogging.Tags{
- "k": kv.Key,
- "domain": kv.Domain,
- }))
- return nil, err
- }
- labelID = l.ID
- } else {
- return nil, err
- }
- }
- kv.LabelID = labelID
- if kv.ValueType == "" {
- kv.ValueType = session.DefaultValueType
- }
- oldKV, err := s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelID(kv.LabelID))
- if err != nil {
- if err != service.ErrKeyNotExists {
- openlogging.Error(err.Error())
- return nil, err
- }
- kv, err := createKey(ctx, kv)
- if err != nil {
- openlogging.Error(err.Error())
- return nil, err
- }
- kv.Domain = ""
- kv.Project = ""
- return kv, nil
- }
- kv.ID = oldKV.ID
- kv.CreateRevision = oldKV.CreateRevision
- err = updateKeyValue(ctx, kv)
- if err != nil {
- return nil, err
- }
- kv.Domain = ""
- kv.Project = ""
- return kv, nil
-
-}
-
//Exist supports you query a key value by label map or labels id
func (s *Service) Exist(ctx context.Context, domain, key string, project string, options ...service.FindOption) (*model.KVDoc, error) {
ctx, _ = context.WithTimeout(context.Background(), session.Timeout)
@@ -179,8 +95,8 @@
for _, o := range options {
o(&opts)
}
- if opts.LabelID != "" {
- kvs, err := findKVByLabelID(ctx, domain, opts.LabelID, key, project)
+ if opts.LabelFormat != "" {
+ kvs, err := findKVByLabel(ctx, domain, opts.LabelFormat, key, project)
if err != nil {
if err != service.ErrKeyNotExists {
openlogging.Error(err.Error())
diff --git a/server/service/mongo/kv/kv_test.go b/server/service/mongo/kv/kv_service_test.go
similarity index 89%
rename from server/service/mongo/kv/kv_test.go
rename to server/service/mongo/kv/kv_service_test.go
index 7283ce3..9f8de37 100644
--- a/server/service/mongo/kv/kv_test.go
+++ b/server/service/mongo/kv/kv_service_test.go
@@ -24,12 +24,24 @@
"github.com/apache/servicecomb-kie/server/service"
"github.com/apache/servicecomb-kie/server/service/mongo/kv"
"github.com/apache/servicecomb-kie/server/service/mongo/session"
+ log "github.com/go-chassis/paas-lager"
+ "github.com/go-mesh/openlogging"
"github.com/stretchr/testify/assert"
"testing"
)
var id string
+func init() {
+ log.Init(log.Config{
+ Writers: []string{"stdout"},
+ LoggerLevel: "DEBUG",
+ })
+
+ logger := log.NewLogger("ut")
+ openlogging.SetLogger(logger)
+}
+
func TestService_CreateOrUpdate(t *testing.T) {
var err error
config.Configurations = &config.Config{DB: config.DB{URI: "mongodb://kie:123@127.0.0.1:27017/kie"}}
@@ -37,7 +49,7 @@
assert.NoError(t, err)
kvsvc := &kv.Service{}
t.Run("put kv timeout,with labels app and service", func(t *testing.T) {
- kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+ kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
Key: "timeout",
Value: "2s",
Labels: map[string]string{
@@ -51,7 +63,7 @@
assert.NotEmpty(t, kv.ID)
})
t.Run("put kv timeout,with labels app, service and version", func(t *testing.T) {
- kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+ kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
Key: "timeout",
Value: "2s",
Labels: map[string]string{
@@ -73,7 +85,7 @@
assert.NotEmpty(t, oid)
})
t.Run("put kv timeout,with labels app,and update value", func(t *testing.T) {
- _, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
+ beforeKV, err := kvsvc.Create(context.Background(), &model.KVDoc{
Key: "timeout",
Value: "1s",
Labels: map[string]string{
@@ -83,7 +95,8 @@
Project: "kv-test",
})
assert.NoError(t, err)
- afterKV, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
+ afterKV, err := kvsvc.Update(context.Background(), &model.KVDoc{
+ ID: beforeKV.ID,
Key: "timeout",
Value: "3s",
Labels: map[string]string{
diff --git a/server/service/mongo/kv/kv_suite_test.go b/server/service/mongo/kv/kv_suite_test.go
deleted file mode 100644
index e744c46..0000000
--- a/server/service/mongo/kv/kv_suite_test.go
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package kv_test
-
-import (
- "github.com/go-chassis/paas-lager"
- "github.com/go-mesh/openlogging"
-)
-
-func init() {
-
- log.Init(log.Config{
- Writers: []string{"stdout"},
- LoggerLevel: "DEBUG",
- })
-
- logger := log.NewLogger("ut")
- openlogging.SetLogger(logger)
-}
diff --git a/server/service/mongo/kv/tool.go b/server/service/mongo/kv/tool.go
index 776eea6..01957c3 100644
--- a/server/service/mongo/kv/tool.go
+++ b/server/service/mongo/kv/tool.go
@@ -25,4 +25,5 @@
func clearPart(kv *model.KVDoc) {
kv.Domain = ""
kv.Project = ""
+ kv.LabelFormat = ""
}
diff --git a/server/service/mongo/label/label_dao.go b/server/service/mongo/label/label_dao.go
deleted file mode 100644
index eff2821..0000000
--- a/server/service/mongo/label/label_dao.go
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package label
-
-import (
- "context"
- "fmt"
-
- "github.com/apache/servicecomb-kie/pkg/model"
- "github.com/apache/servicecomb-kie/pkg/stringutil"
- "github.com/apache/servicecomb-kie/server/service"
- "github.com/apache/servicecomb-kie/server/service/mongo/session"
- "github.com/go-mesh/openlogging"
- uuid "github.com/satori/go.uuid"
- "go.mongodb.org/mongo-driver/bson"
- "go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-//const of label dao
-const (
- defaultLabels = "default"
- MsgHitExactLabels = "hit exact labels"
-)
-
-//FindLabels find label doc by labels and project, check if the project has certain labels
-//if map is empty. will return default labels doc which has no labels
-func FindLabels(ctx context.Context, domain, project string, labels map[string]string) (*model.LabelDoc, error) {
- collection := session.GetDB().Collection(session.CollectionLabel)
- filter := bson.M{"domain": domain, "project": project}
- filter["format"] = stringutil.FormatMap(labels) //allow key without labels
- cur, err := collection.Find(ctx, filter)
- if err != nil {
- return nil, err
- }
- defer cur.Close(ctx)
- if cur.Err() != nil {
- return nil, err
- }
- openlogging.Debug(fmt.Sprintf("find labels [%s] in [%s]", labels, domain))
- curLabel := &model.LabelDoc{} //reuse this pointer to reduce GC, only clear label
- //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
- curLabel.Labels = nil
- err := cur.Decode(curLabel)
- if err != nil {
- openlogging.Error("decode error: " + err.Error())
- return nil, err
- }
- if len(curLabel.Labels) == len(labels) {
- openlogging.Debug(MsgHitExactLabels)
- curLabel.Labels = nil //exact match don't need to return labels
- return curLabel, nil
- }
-
- }
- return nil, session.ErrLabelNotExists
-}
-
-//Exist check whether the project has certain label or not and return label ID
-func Exist(ctx context.Context, domain string, project string, labels map[string]string) (string, error) {
- l, err := FindLabels(ctx, domain, project, labels)
- if err != nil {
- if err.Error() == context.DeadlineExceeded.Error() {
- openlogging.Error("find label failed, dead line exceeded", openlogging.WithTags(openlogging.Tags{
- "timeout": session.Timeout,
- }))
- return "", fmt.Errorf("operation timout %s", session.Timeout)
- }
- return "", err
- }
-
- return l.ID, nil
-
-}
-
-//CreateLabel create a new label
-func CreateLabel(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
- label.ID = uuid.NewV4().String()
- label.Format = stringutil.FormatMap(label.Labels)
- collection := session.GetDB().Collection(session.CollectionLabel)
- _, err := collection.InsertOne(ctx, label)
- if err != nil {
- return nil, err
- }
- return label, nil
-}
-
-//UpdateLabel update alias
-func UpdateLabel(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
- collection := session.GetDB().Collection(session.CollectionLabel)
- queryFilter := bson.M{"id": label.ID}
- if label.Alias == "" {
- return nil, service.ErrAliasNotGiven
- }
- updateFilter := bson.D{primitive.E{Key: "$set", Value: bson.M{"alias": label.Alias}}}
- cur := collection.FindOneAndUpdate(ctx, queryFilter, updateFilter)
- if cur.Err() != nil {
- return nil, cur.Err()
- }
- return label, nil
-}
diff --git a/server/service/mongo/label/label_dao_test.go b/server/service/mongo/label/label_dao_test.go
deleted file mode 100644
index 8ca80d2..0000000
--- a/server/service/mongo/label/label_dao_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package label_test
-
-import (
- "context"
- "github.com/apache/servicecomb-kie/pkg/model"
- "github.com/apache/servicecomb-kie/server/config"
- "github.com/apache/servicecomb-kie/server/service/mongo/label"
- "github.com/apache/servicecomb-kie/server/service/mongo/session"
- "github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestCreateLabel(t *testing.T) {
- var err error
- config.Configurations = &config.Config{DB: config.DB{URI: "mongodb://kie:123@127.0.0.1:27017/kie"}}
- err = session.Init()
- assert.NoError(t, err)
- d := &model.LabelDoc{
- Domain: "default",
- Labels: map[string]string{
- "cluster": "a",
- "role": "b",
- "component": "c",
- },
- Project: "default",
- }
- d, err = label.CreateLabel(context.TODO(), d)
- assert.NoError(t, err)
- assert.NotEmpty(t, d.ID)
- assert.Equal(t, "cluster=a::component=c::role=b", d.Format)
- t.Log(d)
-
- id, err := label.Exist(context.TODO(), "default", "default", map[string]string{
- "cluster": "a",
- "role": "b",
- "component": "c",
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, id)
-}
diff --git a/server/service/mongo/label/label_service.go b/server/service/mongo/label/label_service.go
deleted file mode 100644
index 5b0d934..0000000
--- a/server/service/mongo/label/label_service.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package label
-
-import (
- "context"
- "github.com/apache/servicecomb-kie/pkg/model"
-)
-
-//Service is db service
-type Service struct {
-}
-
-//CreateOrUpdate create or update labels
-func (s *Service) CreateOrUpdate(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
- if label.ID != "" {
- return UpdateLabel(ctx, label)
- }
- return CreateLabel(ctx, label)
-}
diff --git a/server/service/mongo/session/session.go b/server/service/mongo/session/session.go
index 0446c30..ab9db6e 100644
--- a/server/service/mongo/session/session.go
+++ b/server/service/mongo/session/session.go
@@ -61,11 +61,10 @@
ErrTooMany = errors.New("key with labels should be only one")
ErrKeyMustNotEmpty = errors.New("must supply key if you want to get exact one result")
- ErrIDIsNil = errors.New("id is empty")
- ErrKeyIsNil = errors.New("key must not be empty")
- ErrKvIDAndLabelIDNotMatch = errors.New("kvID and labelID do not match")
- ErrRootCAMissing = errors.New("rootCAFile is empty in config file")
- ErrKVAlreadyExists = errors.New("kv already exists")
+ ErrIDIsNil = errors.New("id is empty")
+ ErrKeyIsNil = errors.New("key must not be empty")
+ ErrRootCAMissing = errors.New("rootCAFile is empty in config file")
+ ErrKVAlreadyExists = errors.New("kv already exists")
ErrViewCreation = errors.New("can not create view")
ErrViewUpdate = errors.New("can not update view")
@@ -223,7 +222,7 @@
panic(err)
}
err = c.EnsureIndex(mgo.Index{
- Key: []string{"key", "label_id", "domain", "project"},
+ Key: []string{"key", "label_format", "domain", "project"},
Unique: true,
})
if err != nil {
@@ -238,28 +237,6 @@
if err != nil {
panic(err)
}
- //label
- c = session.DB(DBName).C(CollectionLabel)
- err = c.Create(&mgo.CollectionInfo{Validator: bson.M{
- "id": bson.M{"$exists": true},
- "domain": bson.M{"$exists": true},
- "project": bson.M{"$exists": true},
- "format": bson.M{"$exists": true},
- }})
- err = c.EnsureIndex(mgo.Index{
- Key: []string{"id"},
- Unique: true,
- })
- if err != nil {
- panic(err)
- }
- err = c.EnsureIndex(mgo.Index{
- Key: []string{"format", "domain", "project"},
- Unique: true,
- })
- if err != nil {
- panic(err)
- }
//view
c = session.DB(DBName).C(CollectionView)
err = c.Create(&mgo.CollectionInfo{Validator: bson.M{
diff --git a/server/service/mongo/view/view_service_test.go b/server/service/mongo/view/view_service_test.go
index 1f1f19e..c43fce0 100644
--- a/server/service/mongo/view/view_service_test.go
+++ b/server/service/mongo/view/view_service_test.go
@@ -39,7 +39,7 @@
assert.NoError(t, err)
kvsvc := &kv.Service{}
t.Run("put view data", func(t *testing.T) {
- kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+ kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
Key: "timeout",
Value: "2s",
Labels: map[string]string{
@@ -53,7 +53,7 @@
assert.NoError(t, err)
assert.NotEmpty(t, kv.ID)
- kv, err = kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+ kv, err = kvsvc.Create(context.TODO(), &model.KVDoc{
Key: "timeout",
Value: "2s",
Labels: map[string]string{
@@ -65,7 +65,7 @@
assert.NoError(t, err)
assert.NotEmpty(t, kv.ID)
- kv, err = kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+ kv, err = kvsvc.Create(context.TODO(), &model.KVDoc{
Key: "retry",
Value: "2",
Labels: map[string]string{
diff --git a/server/service/options.go b/server/service/options.go
index 55c2e53..1293691 100644
--- a/server/service/options.go
+++ b/server/service/options.go
@@ -37,7 +37,7 @@
ID string
Key string
Labels map[string]string
- LabelID string
+ LabelFormat string
ClearLabel bool
Timeout time.Duration
Offset int64
@@ -89,10 +89,10 @@
}
}
-//WithLabelID find kv by labelID
-func WithLabelID(label string) FindOption {
+//WithLabelFormat find kv by label string
+func WithLabelFormat(label string) FindOption {
return func(o *FindOptions) {
- o.LabelID = label
+ o.LabelFormat = label
}
}
diff --git a/server/service/service.go b/server/service/service.go
index e899468..51552f3 100644
--- a/server/service/service.go
+++ b/server/service/service.go
@@ -28,7 +28,6 @@
KVService KV
HistoryService History
RevisionService Revision
- LabelService Label
DBInit Init
)
@@ -45,7 +44,6 @@
//below 3 methods is usually for admin console
Create(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
Update(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
- CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
List(ctx context.Context, domain, project string, options ...FindOption) (*model.KVResponse, error)
//FindOneAndDelete deletes one kv by id and return the deleted kv as these appeared before deletion
FindOneAndDelete(ctx context.Context, kvID string, domain, project string) (*model.KVDoc, error)
@@ -67,11 +65,6 @@
GetRevision(ctx context.Context, domain string) (int64, error)
}
-//Label manages labels data
-type Label interface {
- CreateOrUpdate(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error)
-}
-
//View create update and get view data
type View interface {
Create(ctx context.Context, viewDoc *model.ViewDoc, options ...FindOption) error