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 679ce10 #87 drop view API and get pipeline API (#89)
679ce10 is described below
commit 679ce10e00d724a2a53a81cfe69fa8da98ff2f4b
Author: Shawn <[email protected]>
AuthorDate: Mon Feb 10 17:19:29 2020 +0800
#87 drop view API and get pipeline API (#89)
* #87 drop view API and get pipeline API
* #87 lint
* #87 lint
---
docs/api.yaml | 260 +++++++++++++++++++++++++
go.sum | 2 +
server/service/mongo/session/session.go | 34 ++++
server/service/mongo/session/session_test.go | 29 +++
server/service/mongo/session/struct.go | 11 ++
server/service/mongo/view/view_service.go | 6 +-
server/service/mongo/view/view_service_test.go | 16 ++
server/service/service.go | 3 +-
8 files changed, 358 insertions(+), 3 deletions(-)
diff --git a/docs/api.yaml b/docs/api.yaml
new file mode 100644
index 0000000..64f2b33
--- /dev/null
+++ b/docs/api.yaml
@@ -0,0 +1,260 @@
+swagger: '2.0'
+info:
+ title: ''
+ version: ''
+basePath: /
+paths:
+ '/v1/{project}/kie/kv':
+ get:
+ summary: list key values by labels and key
+ operationId: List
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: label
+ in: query
+ description: 'label pairs,for example
&label=service:order&label=version:1.0.0'
+ type: string
+ - name: wait
+ in: query
+ description: 'wait until any kv changed. for example wait=5s, server
will not response until 5 seconds during that time window, if any kv changed,
server will return 200 and kv list, otherwise return 304 and empty body'
+ type: string
+ consumes:
+ - '*/*'
+ produces:
+ - application/json
+ - text/yaml
+ responses:
+ '200':
+ description: ''
+ schema:
+ $ref: '#/definitions/KVResponse'
+ headers:
+ X-RateLimit-Limit:
+ type: integer
+ description: Request limit per hour.
+ '304':
+ description: empty body
+ delete:
+ summary: 'delete key by kvID and labelID. Want better performance, give
labelID'
+ operationId: Delete
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: kvID
+ in: query
+ required: true
+ type: string
+ - name: labelID
+ in: query
+ type: string
+ consumes:
+ - '*/*'
+ produces:
+ - '*/*'
+ responses:
+ '204':
+ description: Delete success
+ '400':
+ description: 'Failed,check url'
+ '500':
+ description: Server error
+ '/v1/{project}/kie/kv/{key}':
+ get:
+ summary: get key values by key and labels
+ operationId: GetByKey
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: key
+ in: path
+ required: true
+ type: string
+ - name: label
+ in: query
+ description: 'label pairs,for example
&label=service:order&label=version:1.0.0'
+ type: string
+ consumes:
+ - '*/*'
+ produces:
+ - application/json
+ - text/yaml
+ responses:
+ '200':
+ description: get key value success
+ schema:
+ type: array
+ items:
+ $ref: '#/definitions/KVResponse'
+ '304':
+ description: empty body
+ put:
+ summary: create or update key value
+ operationId: Put
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: key
+ in: path
+ required: true
+ type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/v1.KVBody'
+ consumes:
+ - application/json
+ - text/yaml
+ produces:
+ - application/json
+ - text/yaml
+ responses:
+ '200':
+ description: ''
+ schema:
+ $ref: '#/definitions/v1.KVBody'
+ '/v1/{project}/kie/revision/{label_id}':
+ get:
+ summary: get all revisions by label id
+ operationId: GetRevisions
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: label_id
+ in: path
+ required: true
+ type: string
+ - name: key
+ in: query
+ description: only return history about a specific key
+ type: string
+ consumes:
+ - application/json
+ - text/yaml
+ produces:
+ - application/json
+ - text/yaml
+ responses:
+ '200':
+ description: 'true'
+ schema:
+ type: array
+ items:
+ $ref: '#/definitions/LabelHistoryResponse'
+ '/v1/{project}/kie/summary':
+ get:
+ summary: 'search key values by labels combination, it returns multiple
labels group'
+ operationId: Search
+ parameters:
+ - name: project
+ in: path
+ required: true
+ type: string
+ - name: q
+ in: query
+ description: 'the combination format is
{label_key}:{label_value}+{label_key}:{label_value} for example:
/v1/test/kie/kv?q=app:mall&q=app:mall+service:cart, that will query key values
from 2 kinds of labels'
+ type: string
+ consumes:
+ - '*/*'
+ produces:
+ - application/json
+ - text/yaml
+ responses:
+ '200':
+ description: get key value success
+ schema:
+ type: array
+ items:
+ $ref: '#/definitions/KVResponse'
+definitions:
+ KVDoc:
+ type: object
+ properties:
+ _id:
+ type: string
+ check:
+ type: string
+ domain:
+ type: string
+ key:
+ type: string
+ label_id:
+ type: string
+ labels:
+ type: object
+ additionalProperties:
+ type: string
+ project:
+ type: string
+ revision:
+ type: integer
+ format: int32
+ value:
+ type: string
+ value_type:
+ type: string
+ KVResponse:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/definitions/KVDoc'
+ label:
+ $ref: '#/definitions/LabelDocResponse'
+ num:
+ type: integer
+ format: int32
+ size:
+ type: integer
+ format: int32
+ total:
+ type: integer
+ format: int32
+ LabelDocResponse:
+ type: object
+ properties:
+ label_id:
+ type: string
+ labels:
+ type: object
+ additionalProperties:
+ type: string
+ LabelHistoryResponse:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/definitions/KVDoc'
+ label_id:
+ type: string
+ labels:
+ type: object
+ additionalProperties:
+ type: string
+ revision:
+ type: integer
+ format: int32
+ v1.KVBody:
+ type: object
+ properties:
+ labels:
+ type: object
+ additionalProperties:
+ type: string
+ value:
+ type: string
+ valueType:
+ type: string
diff --git a/go.sum b/go.sum
index 255818c..7880f67 100644
--- a/go.sum
+++ b/go.sum
@@ -199,6 +199,8 @@ github.com/mitchellh/mapstructure
v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod
h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod
h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/parse v0.0.0-20180914084749-c4fd10affab1
h1:pLtjGOQfSDzI174jIfMFO7mPEPqaF30skLd2j2Jh99s=
+github.com/modern-go/parse v0.0.0-20180914084749-c4fd10affab1/go.mod
h1:Kti0/XV668vfZFqMe804NNTNcttRa57gzBJ79alE9E8=
github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod
h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod
h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1
h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
diff --git a/server/service/mongo/session/session.go
b/server/service/mongo/session/session.go
index 199a8bf..246e164 100644
--- a/server/service/mongo/session/session.go
+++ b/server/service/mongo/session/session.go
@@ -65,8 +65,10 @@ var (
ErrViewCreation = errors.New("can not create view")
ErrViewUpdate = errors.New("can not update view")
+ ErrViewDelete = errors.New("can not delete view")
ErrViewNotExist = errors.New("view not exists")
ErrViewFinding = errors.New("view search error")
+ ErrGetPipeline = errors.New("can not get criteria")
)
var client *mongo.Client
@@ -152,3 +154,35 @@ func CreateView(ctx context.Context, view, source string,
pipeline mongo.Pipelin
}
return nil
}
+
+//DropView deletes view
+func DropView(ctx context.Context, view string) error {
+ err := GetDB().Collection(view).Drop(ctx)
+ if err != nil {
+ openlogging.Error(err.Error())
+ return err
+ }
+ return nil
+}
+
+//GetColInfo get collection info
+func GetColInfo(ctx context.Context, name string) (*CollectionInfo, error) {
+ cur, err := GetDB().ListCollections(ctx, bson.M{"name": name, "type":
"view"})
+ if err != nil {
+ openlogging.Error(err.Error())
+ return nil, ErrGetPipeline
+ }
+ defer cur.Close(ctx)
+ for cur.Next(ctx) {
+ openlogging.Debug(cur.Current.String())
+ c := &CollectionInfo{}
+ err := cur.Decode(c)
+ if err != nil {
+ openlogging.Error(err.Error())
+ return nil, ErrGetPipeline
+ }
+ return c, nil
+ break
+ }
+ return nil, ErrGetPipeline
+}
diff --git a/server/service/mongo/session/session_test.go
b/server/service/mongo/session/session_test.go
new file mode 100644
index 0000000..e0f2e03
--- /dev/null
+++ b/server/service/mongo/session/session_test.go
@@ -0,0 +1,29 @@
+package session_test
+
+import (
+ "context"
+ "github.com/apache/servicecomb-kie/server/config"
+ "github.com/apache/servicecomb-kie/server/service/mongo/session"
+ "github.com/stretchr/testify/assert"
+ "go.mongodb.org/mongo-driver/bson"
+ "testing"
+)
+
+func TestGetColInfo(t *testing.T) {
+ var err error
+ config.Configurations = &config.Config{DB: config.DB{URI:
"mongodb://kie:[email protected]:27017/kie"}}
+ err = session.Init()
+ assert.NoError(t, err)
+ err = session.CreateView(context.Background(), "test_view",
session.CollectionKV, []bson.D{
+ {{
+ "$match",
+ bson.D{{"domain", "default"}, {"project", "default"}},
+ }},
+ })
+ assert.NoError(t, err)
+ c, err := session.GetColInfo(context.Background(), "test_view")
+ assert.NoError(t, err)
+ assert.Equal(t, "default", c.Options.Pipeline[0]["$match"]["domain"])
+ err = session.DropView(context.Background(), "test_view")
+ assert.NoError(t, err)
+}
diff --git a/server/service/mongo/session/struct.go
b/server/service/mongo/session/struct.go
new file mode 100644
index 0000000..44a5c62
--- /dev/null
+++ b/server/service/mongo/session/struct.go
@@ -0,0 +1,11 @@
+package session
+
+//CollectionInfo is struct
+type CollectionInfo struct {
+ Options Options `json:"options"`
+}
+
+//Options is struct
+type Options struct {
+ Pipeline []map[string]map[string]string `json:"pipeline"`
+}
diff --git a/server/service/mongo/view/view_service.go
b/server/service/mongo/view/view_service.go
index 98c9f9b..9b706fb 100644
--- a/server/service/mongo/view/view_service.go
+++ b/server/service/mongo/view/view_service.go
@@ -41,8 +41,10 @@ func (s *Service) Create(ctx context.Context, viewDoc
*model.ViewDoc, options ..
return nil, session.ErrMissingDomain
}
var pipeline mongo.Pipeline = []bson.D{
- {{"$match", bson.D{{"domain", viewDoc.Domain}}}},
- {{"$match", bson.D{{"project", viewDoc.Project}}}},
+ {{
+ "$match",
+ bson.D{{"domain", viewDoc.Domain}, {"project",
viewDoc.Project}},
+ }},
}
opts := service.FindOptions{}
for _, o := range options {
diff --git a/server/service/mongo/view/view_service_test.go
b/server/service/mongo/view/view_service_test.go
index 58d5937..1f1f19e 100644
--- a/server/service/mongo/view/view_service_test.go
+++ b/server/service/mongo/view/view_service_test.go
@@ -19,6 +19,7 @@ package view_test
import (
"context"
+ "encoding/json"
"github.com/apache/servicecomb-kie/pkg/model"
"github.com/apache/servicecomb-kie/server/config"
"github.com/apache/servicecomb-kie/server/service"
@@ -26,6 +27,8 @@ import (
"github.com/apache/servicecomb-kie/server/service/mongo/session"
"github.com/apache/servicecomb-kie/server/service/mongo/view"
"github.com/stretchr/testify/assert"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
"testing"
)
@@ -111,3 +114,16 @@ func TestGet(t *testing.T) {
})
}
+
+func TestService_List(t *testing.T) {
+ var pipeline mongo.Pipeline = []bson.D{
+ {{
+ "$match",
+ bson.D{{"domain", "default"}, {"project", "default"}},
+ }},
+ }
+
+ s, err := json.Marshal(pipeline)
+ assert.NoError(t, err)
+ t.Log(string(s))
+}
diff --git a/server/service/service.go b/server/service/service.go
index a26e697..8d06331 100644
--- a/server/service/service.go
+++ b/server/service/service.go
@@ -69,7 +69,8 @@ type View interface {
Create(ctx context.Context, viewDoc *model.ViewDoc, options
...FindOption) error
Update(ctx context.Context, viewDoc *model.ViewDoc) error
//TODO
- //List(ctx context.Context, domain, project string, options
...FindOption) ([]*model.ViewDoc, error)
+ List(ctx context.Context, domain, project string, options
...FindOption) ([]*model.ViewDoc, error)
+ GetCriteria(ctx context.Context, viewName, domain, project string)
(map[string]map[string]string, error)
GetContent(ctx context.Context, id, domain, project string, options
...FindOption) ([]*model.KVResponse, error)
}