little-cui closed pull request #517: SCB-1053 Update the batch find API
URL: https://github.com/apache/servicecomb-service-center/pull/517
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/integration/apis.go b/integration/apis.go
index ef652125..d263a6bd 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 2f1dbaab..6f49e5ae 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 e55a3800..f70b63df 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 40a29233..408c308c 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 5124a59d..df79bef6 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 0c03e8ab..ff8a43c4 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 ced26da6..71b87536 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 66895686..e38615c4 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 bfef2f20..47edf52e 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 eb981462..cd950504 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 df493b68..3ccc1364 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
                        })
                })


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to