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-service-center.git
The following commit(s) were added to refs/heads/master by this push:
new 769aca3 Fix: Can not discovery instances by service alias (#1086)
769aca3 is described below
commit 769aca39da69f9a0627ae1daa9b6c6731583b2c4
Author: little-cui <[email protected]>
AuthorDate: Wed Jul 7 14:30:53 2021 +0800
Fix: Can not discovery instances by service alias (#1086)
---
datasource/mongo/ms.go | 14 +++--
datasource/mongo/util/db.go | 10 ++++
integration/instances_test.go | 22 +++++++
server/rest/controller/v4/instance_controller.go | 4 +-
server/service/disco/instance_test.go | 73 +++++++++++++++++++-----
5 files changed, 103 insertions(+), 20 deletions(-)
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 235452b..9b83349 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -2506,11 +2506,14 @@ func servicesBasicFilter(ctx context.Context, key
*discovery.MicroServiceKey) ([
if len(tenant) != 2 {
return nil, errors.New("invalid 'domain' or 'project'")
}
+ serviceNameOption := mutil.ServiceServiceName(key.ServiceName)
+ if len(key.Alias) > 0 {
+ serviceNameOption = mutil.Or(serviceNameOption,
mutil.ServiceAlias(key.Alias))
+ }
filter := mutil.NewDomainProjectFilter(tenant[0], tenant[1],
mutil.ServiceEnv(key.Environment),
mutil.ServiceAppID(key.AppId),
- mutil.ServiceServiceName(key.ServiceName),
- mutil.ServiceAlias(key.Alias),
+ serviceNameOption,
)
rangeIdx := strings.Index(key.Version, "-")
// if the version number is clear, need to add the version number to
query
@@ -2533,11 +2536,14 @@ func filterServices(ctx context.Context, key
*discovery.MicroServiceKey) ([]*mod
return nil, errors.New("invalid 'domain' or 'project'")
}
rangeIdx := strings.Index(key.Version, "-")
+ serviceNameOption := mutil.ServiceServiceName(key.ServiceName)
+ if len(key.Alias) > 0 {
+ serviceNameOption = mutil.Or(serviceNameOption,
mutil.ServiceAlias(key.Alias))
+ }
filter := mutil.NewDomainProjectFilter(tenant[0], tenant[1],
mutil.ServiceEnv(key.Environment),
mutil.ServiceAppID(key.AppId),
- mutil.ServiceServiceName(key.ServiceName),
- mutil.ServiceAlias(key.Alias),
+ serviceNameOption,
)
switch {
case key.Version == "latest":
diff --git a/datasource/mongo/util/db.go b/datasource/mongo/util/db.go
index 0ebb40f..ad70e29 100644
--- a/datasource/mongo/util/db.go
+++ b/datasource/mongo/util/db.go
@@ -146,6 +146,16 @@ func Nor(options ...Option) Option {
}
}
+func Or(options ...Option) Option {
+ return func(filter bson.M) {
+ var conditions bson.A
+ for _, option := range options {
+ conditions = append(conditions, NewFilter(option))
+ }
+ filter["$or"] = conditions
+ }
+}
+
func NewFilter(options ...Option) bson.M {
filter := bson.M{}
for _, option := range options {
diff --git a/integration/instances_test.go b/integration/instances_test.go
index 28634ab..5467247 100644
--- a/integration/instances_test.go
+++ b/integration/instances_test.go
@@ -47,13 +47,16 @@ var _ = Describe("MicroService Api Test", func() {
var serviceAppId = "integrationtestAppIdInstance"
var serviceVersion = "0.0.2"
var serviceInstanceID = ""
+ var alias = ""
Context("Tesing MicroService Instances API's", func() {
BeforeEach(func() {
schema := []string{"testSchema"}
properties := map[string]string{"attr1": "aa"}
serviceName = strconv.Itoa(rand.Intn(15))
+ alias = serviceAppId + ":" + serviceName
servicemap := map[string]interface{}{
"serviceName": serviceName,
+ "alias": alias,
"appId": serviceAppId,
"version": serviceVersion,
"description": "examples",
@@ -283,6 +286,25 @@ var _ = Describe("MicroService Api Test", func() {
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
})
+ It("Find Micro-service Info by alias", func() {
+ req, _ := http.NewRequest(GET,
SCURL+FINDINSTANCE+"?appId="+serviceAppId+"&serviceName="+alias+"&version="+serviceVersion,
nil)
+ 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))
+ servicesStruct :=
map[string][]map[string]interface{}{}
+ json.Unmarshal(respbody, &servicesStruct)
+ foundMicroServiceInstance := false
+ for _, services := range
servicesStruct["instances"] {
+ if services["instanceId"] ==
serviceInstanceID {
+ foundMicroServiceInstance = true
+ break
+ }
+ }
+
Expect(foundMicroServiceInstance).To(Equal(true))
+ })
+
It("Find Micro-Service Instance by ServiceID", func() {
url := strings.Replace(GETINSTANCE,
":serviceId", serviceId, 1)
req, _ := http.NewRequest(GET, SCURL+url, nil)
diff --git a/server/rest/controller/v4/instance_controller.go
b/server/rest/controller/v4/instance_controller.go
index 91aa894..999cb5e 100644
--- a/server/rest/controller/v4/instance_controller.go
+++ b/server/rest/controller/v4/instance_controller.go
@@ -125,10 +125,12 @@ func (s *MicroServiceInstanceService) FindInstances(w
http.ResponseWriter, r *ht
if len(keys) > 0 {
ids = strings.Split(keys, ",")
}
+ serviceName := query.Get("serviceName")
request := &pb.FindInstancesRequest{
ConsumerServiceId: r.Header.Get("X-ConsumerId"),
AppId: query.Get("appId"),
- ServiceName: query.Get("serviceName"),
+ ServiceName: serviceName,
+ Alias: serviceName,
VersionRule: query.Get("version"),
Environment: query.Get("env"),
Tags: ids,
diff --git a/server/service/disco/instance_test.go
b/server/service/disco/instance_test.go
index d5a787a..bb19355 100644
--- a/server/service/disco/instance_test.go
+++ b/server/service/disco/instance_test.go
@@ -819,21 +819,23 @@ var _ = Describe("'Instance' service", func() {
Describe("execute 'query' operartion", func() {
var (
- serviceId1 string
- serviceId2 string
- serviceId3 string
- serviceId4 string
- serviceId5 string
- serviceId6 string
- serviceId7 string
- serviceId8 string
- serviceId9 string
- instanceId1 string
- instanceId2 string
- instanceId4 string
- instanceId5 string
- instanceId8 string
- instanceId9 string
+ serviceId1 string
+ serviceId2 string
+ serviceId3 string
+ serviceId4 string
+ serviceId5 string
+ serviceId6 string
+ serviceId7 string
+ serviceId8 string
+ serviceId9 string
+ serviceId10 string
+ instanceId1 string
+ instanceId2 string
+ instanceId4 string
+ instanceId5 string
+ instanceId8 string
+ instanceId9 string
+ instanceId10 string
)
It("should be passed", func() {
@@ -961,6 +963,20 @@ var _ = Describe("'Instance' service", func() {
Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
serviceId9 = respCreate.ServiceId
+ respCreate, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "query_instance_alias",
+ ServiceName: "query_instance_alias",
+ Alias:
"query_instance_alias:query_instance_alias",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ Expect(err).To(BeNil())
+
Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
+ serviceId10 = respCreate.ServiceId
+
resp, err := discosvc.RegisterInstance(getContext(),
&pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId1,
@@ -1044,6 +1060,20 @@ var _ = Describe("'Instance' service", func() {
Expect(err).To(BeNil())
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
instanceId9 = resp.InstanceId
+
+ resp, err = discosvc.RegisterInstance(getContext(),
&pb.RegisterInstanceRequest{
+ Instance: &pb.MicroServiceInstance{
+ ServiceId: serviceId10,
+ HostName: "UT-HOST",
+ Endpoints: []string{
+ "find:127.0.0.9:8080",
+ },
+ Status: pb.MSI_UP,
+ },
+ })
+ Expect(err).To(BeNil())
+
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
+ instanceId10 = resp.InstanceId
})
Context("when query invalid parameters", func() {
@@ -1668,6 +1698,19 @@ var _ = Describe("'Instance' service", func() {
Expect(len(respGetC.Providers)).To(Equal(0))
core.Service.Environment = pb.ENV_DEV
+
+ By("find with alias")
+ respFind, err =
discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
+ ConsumerServiceId: serviceId10,
+ AppId:
"query_instance_alias",
+ ServiceName:
"query_instance_alias:query_instance_alias",
+ Alias:
"query_instance_alias:query_instance_alias",
+ VersionRule: "0.0.0.0+",
+ })
+ Expect(err).To(BeNil())
+
Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
+ Expect(len(respFind.Instances)).To(Equal(1))
+
Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId10))
})
})