You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/12/23 00:58:58 UTC
[servicecomb-service-center] branch master updated: SCB-1053 Update
the batch find API (#517)
This is an automated email from the ASF dual-hosted git repository.
littlecui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git
The following commit(s) were added to refs/heads/master by this push:
new 557f39a SCB-1053 Update the batch find API (#517)
557f39a is described below
commit 557f39a19034b6393d2eef1f4b7916117bd7a307
Author: little-cui <su...@qq.com>
AuthorDate: Sun Dec 23 08:58:53 2018 +0800
SCB-1053 Update the batch find API (#517)
* SCB-1053 Update the batch find API
* SCB-1053 Bug fix
---
integration/apis.go | 1 +
integration/instances_test.go | 12 +++++-
server/core/swagger/v4.yaml | 8 +++-
server/rest/controller/v4/dependency_controller.go | 4 +-
server/rest/controller/v4/instance_controller.go | 45 +++++++++++++---------
.../rest/controller/v4/microservice_controller.go | 6 +--
server/rest/controller/v4/query_rule_controller.go | 4 +-
server/rest/controller/v4/schema_controller.go | 4 +-
server/rest/controller/v4/tag_controller.go | 2 +-
server/service/instance.go | 16 +++++---
server/service/instance_test.go | 35 +++++++++++++++++
11 files changed, 100 insertions(+), 37 deletions(-)
diff --git a/integration/apis.go b/integration/apis.go
index ef65212..d263a6b 100644
--- a/integration/apis.go
+++ b/integration/apis.go
@@ -38,6 +38,7 @@ var GETPROCONDEPENDENCY = "/v4/default/registry/microservices/:providerId/consum
// Instance API's
var FINDINSTANCE = "/v4/default/registry/instances"
+var INSTANCEACTION = "/v4/default/registry/instances/action"
var GETINSTANCE = "/v4/default/registry/microservices/:serviceId/instances"
var GETINSTANCEBYINSTANCEID = "/v4/default/registry/microservices/:serviceId/instances/:instanceId"
var REGISTERINSTANCE = "/v4/default/registry/microservices/:serviceId/instances"
diff --git a/integration/instances_test.go b/integration/instances_test.go
index 2f1dbaa..6f49e5a 100644
--- a/integration/instances_test.go
+++ b/integration/instances_test.go
@@ -387,11 +387,19 @@ var _ = Describe("MicroService Api Test", func() {
},
}
body, _ := json.Marshal(findRequest)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+FINDINSTANCE, bodyBuf)
+
+ req, _ := http.NewRequest(POST, SCURL+INSTANCEACTION, bytes.NewReader(body))
req.Header.Set("X-Domain-Name", "default")
req.Header.Set("X-ConsumerId", serviceId)
resp, _ := scclient.Do(req)
+ ioutil.ReadAll(resp.Body)
+ Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
+
+ bodyBuf := bytes.NewReader(body)
+ req, _ = http.NewRequest(POST, SCURL+INSTANCEACTION+"?type=query", bodyBuf)
+ req.Header.Set("X-Domain-Name", "default")
+ req.Header.Set("X-ConsumerId", serviceId)
+ resp, _ = scclient.Do(req)
respbody, _ := ioutil.ReadAll(resp.Body)
Expect(resp.StatusCode).To(Equal(http.StatusOK))
respStruct := map[string]map[string][]map[string]interface{}{}
diff --git a/server/core/swagger/v4.yaml b/server/core/swagger/v4.yaml
index e55a380..f70b63d 100644
--- a/server/core/swagger/v4.yaml
+++ b/server/core/swagger/v4.yaml
@@ -1462,6 +1462,7 @@ paths:
description: 内部错误
schema:
$ref: '#/definitions/Error'
+ /v4/{project}/registry/instances/action:
post:
description: |
批量微服务实例发现接口
@@ -1479,7 +1480,12 @@ paths:
in: path
required: true
type: string
- - name: services
+ - name: type
+ in: query
+ required: true
+ type: string
+ description: 操作
+ - name: request
in: body
description: 查询微服务的请求结构体
required: true
diff --git a/server/rest/controller/v4/dependency_controller.go b/server/rest/controller/v4/dependency_controller.go
index 40a2923..408c308 100644
--- a/server/rest/controller/v4/dependency_controller.go
+++ b/server/rest/controller/v4/dependency_controller.go
@@ -52,7 +52,7 @@ func (this *DependencyService) AddDependenciesForMicroServices(w http.ResponseWr
request := &pb.AddDependenciesRequest{}
err = json.Unmarshal(requestBody, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
@@ -71,7 +71,7 @@ func (this *DependencyService) CreateDependenciesForMicroServices(w http.Respons
request := &pb.CreateDependenciesRequest{}
err = json.Unmarshal(requestBody, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
diff --git a/server/rest/controller/v4/instance_controller.go b/server/rest/controller/v4/instance_controller.go
index 5124a59..df79bef 100644
--- a/server/rest/controller/v4/instance_controller.go
+++ b/server/rest/controller/v4/instance_controller.go
@@ -18,6 +18,7 @@ package v4
import (
"encoding/json"
+ "fmt"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/pkg/rest"
"github.com/apache/servicecomb-service-center/pkg/util"
@@ -38,7 +39,7 @@ type MicroServiceInstanceService struct {
func (this *MicroServiceInstanceService) URLPatterns() []rest.Route {
return []rest.Route{
{rest.HTTP_METHOD_GET, "/v4/:project/registry/instances", this.FindInstances},
- {rest.HTTP_METHOD_POST, "/v4/:project/registry/instances", this.BatchFindInstances},
+ {rest.HTTP_METHOD_POST, "/v4/:project/registry/instances/action", this.InstancesAction},
{rest.HTTP_METHOD_GET, "/v4/:project/registry/microservices/:serviceId/instances", this.GetInstances},
{rest.HTTP_METHOD_GET, "/v4/:project/registry/microservices/:serviceId/instances/:instanceId", this.GetOneInstance},
{rest.HTTP_METHOD_POST, "/v4/:project/registry/microservices/:serviceId/instances", this.RegisterInstance},
@@ -60,7 +61,7 @@ func (this *MicroServiceInstanceService) RegisterInstance(w http.ResponseWriter,
request := &pb.RegisterInstanceRequest{}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
return
}
@@ -96,7 +97,7 @@ func (this *MicroServiceInstanceService) HeartbeatSet(w http.ResponseWriter, r *
request := &pb.HeartbeatSetRequest{}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
return
}
@@ -155,27 +156,35 @@ func (this *MicroServiceInstanceService) FindInstances(w http.ResponseWriter, r
controller.WriteResponse(w, respInternal, resp)
}
-func (this *MicroServiceInstanceService) BatchFindInstances(w http.ResponseWriter, r *http.Request) {
+func (this *MicroServiceInstanceService) InstancesAction(w http.ResponseWriter, r *http.Request) {
message, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Error("read body failed", err)
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
-
- request := &pb.BatchFindInstancesRequest{}
- err = json.Unmarshal(message, request)
- if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
- controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
- return
+ query := r.URL.Query()
+ action := query.Get("type")
+ switch action {
+ case "query":
+ request := &pb.BatchFindInstancesRequest{}
+ err = json.Unmarshal(message, request)
+ if err != nil {
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
+ controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
+ return
+ }
+ request.ConsumerServiceId = r.Header.Get("X-ConsumerId")
+ ctx := util.SetTargetDomainProject(r.Context(), r.Header.Get("X-Domain-Name"), r.URL.Query().Get(":project"))
+ resp, _ := core.InstanceAPI.BatchFind(ctx, request)
+ respInternal := resp.Response
+ resp.Response = nil
+ controller.WriteResponse(w, respInternal, resp)
+ default:
+ err = fmt.Errorf("Invalid action: %s", action)
+ log.Errorf(err, "invalid request")
+ controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
}
- request.ConsumerServiceId = r.Header.Get("X-ConsumerId")
- ctx := util.SetTargetDomainProject(r.Context(), r.Header.Get("X-Domain-Name"), r.URL.Query().Get(":project"))
- resp, _ := core.InstanceAPI.BatchFind(ctx, request)
- respInternal := resp.Response
- resp.Response = nil
- controller.WriteResponse(w, respInternal, resp)
}
func (this *MicroServiceInstanceService) GetOneInstance(w http.ResponseWriter, r *http.Request) {
@@ -258,7 +267,7 @@ func (this *MicroServiceInstanceService) UpdateMetadata(w http.ResponseWriter, r
}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
return
}
diff --git a/server/rest/controller/v4/microservice_controller.go b/server/rest/controller/v4/microservice_controller.go
index 0c03e8a..ff8a43c 100644
--- a/server/rest/controller/v4/microservice_controller.go
+++ b/server/rest/controller/v4/microservice_controller.go
@@ -57,7 +57,7 @@ func (this *MicroServiceService) Register(w http.ResponseWriter, r *http.Request
var request pb.CreateServiceRequest
err = json.Unmarshal(message, &request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
@@ -79,7 +79,7 @@ func (this *MicroServiceService) Update(w http.ResponseWriter, r *http.Request)
}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
@@ -155,7 +155,7 @@ func (this *MicroServiceService) UnregisterServices(w http.ResponseWriter, r *ht
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
diff --git a/server/rest/controller/v4/query_rule_controller.go b/server/rest/controller/v4/query_rule_controller.go
index ced26da..71b8753 100644
--- a/server/rest/controller/v4/query_rule_controller.go
+++ b/server/rest/controller/v4/query_rule_controller.go
@@ -52,7 +52,7 @@ func (this *RuleService) AddRule(w http.ResponseWriter, r *http.Request) {
rule := map[string][]*pb.AddOrUpdateServiceRule{}
err = json.Unmarshal(message, &rule)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
@@ -89,7 +89,7 @@ func (this *RuleService) UpdateRule(w http.ResponseWriter, r *http.Request) {
rule := pb.AddOrUpdateServiceRule{}
err = json.Unmarshal(message, &rule)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
diff --git a/server/rest/controller/v4/schema_controller.go b/server/rest/controller/v4/schema_controller.go
index 6689568..e38615c 100644
--- a/server/rest/controller/v4/schema_controller.go
+++ b/server/rest/controller/v4/schema_controller.go
@@ -69,7 +69,7 @@ func (this *SchemaService) ModifySchema(w http.ResponseWriter, r *http.Request)
request := &pb.ModifySchemaRequest{}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
@@ -91,7 +91,7 @@ func (this *SchemaService) ModifySchemas(w http.ResponseWriter, r *http.Request)
request := &pb.ModifySchemasRequest{}
err = json.Unmarshal(message, request)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
diff --git a/server/rest/controller/v4/tag_controller.go b/server/rest/controller/v4/tag_controller.go
index bfef2f2..47edf52 100644
--- a/server/rest/controller/v4/tag_controller.go
+++ b/server/rest/controller/v4/tag_controller.go
@@ -53,7 +53,7 @@ func (this *TagService) AddTags(w http.ResponseWriter, r *http.Request) {
var tags map[string]map[string]string
err = json.Unmarshal(message, &tags)
if err != nil {
- log.Errorf(err, "Invalid json: %s", util.BytesToStringWithNoCopy(message))
+ log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
return
}
diff --git a/server/service/instance.go b/server/service/instance.go
index eb98146..cd95050 100644
--- a/server/service/instance.go
+++ b/server/service/instance.go
@@ -715,12 +715,13 @@ func (s *InstanceService) batchFindServices(ctx context.Context, in *pb.BatchFin
if len(in.Services) == 0 {
return nil, nil
}
+ cloneCtx := util.CloneContext(ctx)
services := &pb.BatchFindResult{}
failedResult := make(map[int32]*pb.FindFailedResult)
for index, key := range in.Services {
- cloneCtx := util.SetContext(ctx, serviceUtil.CTX_REQUEST_REVISION, key.Rev)
- resp, err := s.Find(cloneCtx, &pb.FindInstancesRequest{
+ findCtx := util.SetContext(cloneCtx, serviceUtil.CTX_REQUEST_REVISION, key.Rev)
+ resp, err := s.Find(findCtx, &pb.FindInstancesRequest{
ConsumerServiceId: in.ConsumerServiceId,
AppId: key.Service.AppId,
ServiceName: key.Service.ServiceName,
@@ -731,7 +732,7 @@ func (s *InstanceService) batchFindServices(ctx context.Context, in *pb.BatchFin
return nil, err
}
failed, ok := failedResult[resp.GetResponse().GetCode()]
- serviceUtil.AppendFindResponse(cloneCtx, int64(index), resp.GetResponse(), resp.GetInstances(),
+ serviceUtil.AppendFindResponse(findCtx, int64(index), resp.GetResponse(), resp.GetInstances(),
&services.Updated, &services.NotModified, &failed)
if !ok && failed != nil {
failedResult[resp.GetResponse().GetCode()] = failed
@@ -747,12 +748,15 @@ func (s *InstanceService) batchFindInstances(ctx context.Context, in *pb.BatchFi
if len(in.Instances) == 0 {
return nil, nil
}
+ cloneCtx := util.CloneContext(ctx)
+ // can not find the shared provider instances
+ cloneCtx = util.SetTargetDomainProject(cloneCtx, util.ParseDomain(ctx), util.ParseProject(ctx))
instances := &pb.BatchFindResult{}
failedResult := make(map[int32]*pb.FindFailedResult)
for index, key := range in.Instances {
- cloneCtx := util.SetContext(ctx, serviceUtil.CTX_REQUEST_REVISION, key.Rev)
- resp, err := s.GetOneInstance(cloneCtx, &pb.GetOneInstanceRequest{
+ getCtx := util.SetContext(cloneCtx, serviceUtil.CTX_REQUEST_REVISION, key.Rev)
+ resp, err := s.GetOneInstance(getCtx, &pb.GetOneInstanceRequest{
ConsumerServiceId: in.ConsumerServiceId,
ProviderServiceId: key.Instance.ServiceId,
ProviderInstanceId: key.Instance.InstanceId,
@@ -761,7 +765,7 @@ func (s *InstanceService) batchFindInstances(ctx context.Context, in *pb.BatchFi
return nil, err
}
failed, ok := failedResult[resp.GetResponse().GetCode()]
- serviceUtil.AppendFindResponse(cloneCtx, int64(index), resp.GetResponse(), []*pb.MicroServiceInstance{resp.GetInstance()},
+ serviceUtil.AppendFindResponse(getCtx, int64(index), resp.GetResponse(), []*pb.MicroServiceInstance{resp.GetInstance()},
&instances.Updated, &instances.NotModified, &failed)
if !ok && failed != nil {
failedResult[resp.GetResponse().GetCode()] = failed
diff --git a/server/service/instance_test.go b/server/service/instance_test.go
index df493b6..3ccc136 100644
--- a/server/service/instance_test.go
+++ b/server/service/instance_test.go
@@ -1927,6 +1927,41 @@ var _ = Describe("'Instance' service", func() {
Expect(len(respFind.Services.Updated[0].Instances)).To(Equal(1))
Expect(respFind.Services.Updated[0].Instances[0].InstanceId).To(Equal(instanceId5))
+ respFind, err = instanceResource.BatchFind(
+ util.SetTargetDomainProject(
+ util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
+ "default", "default"),
+ &pb.BatchFindInstancesRequest{
+ ConsumerServiceId: serviceId6,
+ Instances: []*pb.FindInstance{
+ {
+ Instance: &pb.HeartbeatSetElement{
+ ServiceId: serviceId5,
+ InstanceId: instanceId5,
+ },
+ },
+ },
+ })
+ Expect(err).To(BeNil())
+ Expect(respFind.Response.Code).To(Equal(pb.Response_SUCCESS))
+ Expect(respFind.Instances.Failed[0].Error.Code).To(Equal(scerr.ErrServiceNotExists))
+
+ respFind, err = instanceResource.BatchFind(getContext(), &pb.BatchFindInstancesRequest{
+ ConsumerServiceId: serviceId7,
+ Instances: []*pb.FindInstance{
+ {
+ Instance: &pb.HeartbeatSetElement{
+ ServiceId: serviceId5,
+ InstanceId: instanceId5,
+ },
+ },
+ },
+ })
+ Expect(err).To(BeNil())
+ Expect(respFind.Response.Code).To(Equal(pb.Response_SUCCESS))
+ Expect(len(respFind.Instances.Updated[0].Instances)).To(Equal(1))
+ Expect(respFind.Instances.Updated[0].Instances[0].InstanceId).To(Equal(instanceId5))
+
core.Service.Environment = pb.ENV_DEV
})
})