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 2020/02/03 01:25:38 UTC

[servicecomb-kie] branch master updated: [issue #67] add interface to add alias (#72)

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 21268e7  [issue #67] add interface to add alias (#72)
21268e7 is described below

commit 21268e791fb9f7fd91671d07f28654dfa0df132c
Author: GuoYL <53...@users.noreply.github.com>
AuthorDate: Mon Feb 3 09:25:30 2020 +0800

    [issue #67] add interface to add alias (#72)
    
    * add interface to add alias
    
    * delete no use code
    
    * update unit test
    
    * modify as suggestion
    
    * modify param to struct
    
    * for CI
---
 pkg/model/db_schema.go                       |  1 +
 server/resource/v1/label_resouce.go          | 81 ++++++++++++++++++++++++++++
 server/resource/v1/label_resouce_test.go     | 75 ++++++++++++++++++++++++++
 server/service/mongo/init.go                 |  2 +
 server/service/mongo/kv/kv_service.go        |  8 ++-
 server/service/mongo/label/label_dao.go      | 32 +++++++----
 server/service/mongo/label/label_dao_test.go | 11 ++--
 server/service/mongo/label/label_service.go  | 16 ++++++
 server/service/service.go                    |  6 +++
 9 files changed, 217 insertions(+), 15 deletions(-)

diff --git a/pkg/model/db_schema.go b/pkg/model/db_schema.go
index 4feaf42..535e495 100644
--- a/pkg/model/db_schema.go
+++ b/pkg/model/db_schema.go
@@ -24,6 +24,7 @@ type LabelDoc struct {
 	Format  string            `bson:"format,omitempty"`
 	Domain  string            `json:"domain,omitempty" yaml:"domain,omitempty"` //tenant info
 	Project string            `json:"project,omitempty" yaml:"project,omitempty"`
+	Alias   string            `json:"alias,omitempty" yaml:"alias,omitempty"`
 }
 
 //KVDoc is database struct to store kv
diff --git a/server/resource/v1/label_resouce.go b/server/resource/v1/label_resouce.go
new file mode 100644
index 0000000..a29a865
--- /dev/null
+++ b/server/resource/v1/label_resouce.go
@@ -0,0 +1,81 @@
+package v1
+
+import (
+	"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"
+	"net/http"
+)
+
+//LabelResource
+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, err.Error(), common.ContentTypeText)
+		return
+	}
+	entity.Project = context.ReadPathParameter("project")
+	domain := ReadDomain(context)
+	if domain == nil {
+		WriteErrResponse(context, http.StatusInternalServerError, MsgDomainMustNotBeEmpty, common.ContentTypeText)
+		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(), common.ContentTypeText)
+			return
+		}
+		WriteErrResponse(context, http.StatusInternalServerError, err.Error(), common.ContentTypeText)
+		return
+	}
+	if res == nil {
+		WriteErrResponse(context, http.StatusNotFound, "put alias fail", common.ContentTypeText)
+		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
new file mode 100644
index 0000000..6f7a567
--- /dev/null
+++ b/server/resource/v1/label_resouce_test.go
@@ -0,0 +1,75 @@
+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: "test",
+		}
+		kv, _ = service.KVService.CreateOrUpdate(context.Background(), kv)
+		j := []byte("{\"alias\":\"test\",\"id\":\"" + kv.LabelID + "\"}")
+		r, _ := http.NewRequest("PUT", "/v1/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: "test",
+		}
+		j, _ := json.Marshal(label)
+		r, _ := http.NewRequest("PUT", "/v1/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/init.go b/server/service/mongo/init.go
index 0b81c09..8f57b60 100644
--- a/server/service/mongo/init.go
+++ b/server/service/mongo/init.go
@@ -22,6 +22,7 @@ import (
 	"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"
 )
@@ -32,4 +33,5 @@ func init() {
 	service.KVService = &kv.Service{}
 	service.HistoryService = &history.Service{}
 	service.RevisionService = &counter.Service{}
+	service.LabelService = &label.Service{}
 }
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index 49bd7ef..d0b3393 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -56,8 +56,12 @@ func (s *Service) CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.K
 	labelID, err := label.Exist(ctx, kv.Domain, kv.Project, kv.Labels)
 	if err != nil {
 		if err == session.ErrLabelNotExists {
-			var l *model.LabelDoc
-			l, err = label.CreateLabel(ctx, kv.Domain, kv.Labels, kv.Project)
+			l := &model.LabelDoc{
+				Domain:  kv.Domain,
+				Labels:  kv.Labels,
+				Project: kv.Project,
+			}
+			l, err = label.CreateLabel(ctx, l)
 			if err != nil {
 				openlogging.Error("create label failed", openlogging.WithTags(openlogging.Tags{
 					"k":      kv.Key,
diff --git a/server/service/mongo/label/label_dao.go b/server/service/mongo/label/label_dao.go
index 9decc40..5a75283 100644
--- a/server/service/mongo/label/label_dao.go
+++ b/server/service/mongo/label/label_dao.go
@@ -22,10 +22,12 @@ import (
 	"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 (
@@ -84,18 +86,28 @@ func Exist(ctx context.Context, domain string, project string, labels map[string
 }
 
 //CreateLabel create a new label
-func CreateLabel(ctx context.Context, domain string, labels map[string]string, project string) (*model.LabelDoc, error) {
-	l := &model.LabelDoc{
-		Domain:  domain,
-		Labels:  labels,
-		Format:  stringutil.FormatMap(labels),
-		Project: project,
-		ID:      uuid.NewV4().String(),
-	}
+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, l)
+	_, err := collection.InsertOne(ctx, label)
 	if err != nil {
 		return nil, err
 	}
-	return l, nil
+	return label, nil
+}
+
+//UpdateLabel
+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
index 4de4909..8ca80d2 100644
--- a/server/service/mongo/label/label_dao_test.go
+++ b/server/service/mongo/label/label_dao_test.go
@@ -19,6 +19,7 @@ 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"
@@ -31,12 +32,16 @@ func TestCreateLabel(t *testing.T) {
 	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, err := label.CreateLabel(context.TODO(), "default",
-		map[string]string{
+	d := &model.LabelDoc{
+		Domain: "default",
+		Labels: map[string]string{
 			"cluster":   "a",
 			"role":      "b",
 			"component": "c",
-		}, "default")
+		},
+		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)
diff --git a/server/service/mongo/label/label_service.go b/server/service/mongo/label/label_service.go
new file mode 100644
index 0000000..1ae2904
--- /dev/null
+++ b/server/service/mongo/label/label_service.go
@@ -0,0 +1,16 @@
+package label
+
+import (
+	"context"
+	"github.com/apache/servicecomb-kie/pkg/model"
+)
+
+type Service struct {
+}
+
+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/service.go b/server/service/service.go
index 67fb9e8..60945f3 100644
--- a/server/service/service.go
+++ b/server/service/service.go
@@ -29,12 +29,14 @@ var (
 	HistoryService  History
 	RevisionService Revision
 	DBInit          Init
+	LabelService    Label
 )
 
 //db errors
 var (
 	ErrKeyNotExists     = errors.New("key with labels does not exits")
 	ErrRevisionNotExist = errors.New("revision does not exist")
+	ErrAliasNotGiven    = errors.New("label alias not given")
 )
 
 //KV provide api of KV entity
@@ -55,5 +57,9 @@ type Revision interface {
 	GetRevision(ctx context.Context, domain string) (int64, error)
 }
 
+type Label interface {
+	CreateOrUpdate(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error)
+}
+
 //Init init db session
 type Init func() error