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 <[email protected]>
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
                        })
                })

Reply via email to