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
 			})
 		})