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 1ae29f4  Bug: govern api return empty schemaIds (#1257)
1ae29f4 is described below

commit 1ae29f4ba254997dee74c7717d028ef5702f8955
Author: little-cui <[email protected]>
AuthorDate: Fri Feb 11 14:46:02 2022 +0800

    Bug: govern api return empty schemaIds (#1257)
---
 datasource/etcd/ms.go                 |  63 +++-----
 datasource/etcd/util.go               |  26 ----
 datasource/mongo/dao/microservice.go  |  17 ---
 datasource/mongo/microservice_util.go |  12 --
 datasource/mongo/ms.go                |  58 +++----
 datasource/ms.go                      |   2 +-
 datasource/service_test.go            |  20 ---
 server/service/disco/metadata.go      |   4 +
 server/service/govern/view.go         |  77 +++++++++-
 server/service/govern/view_test.go    | 279 +++++++++++++++-------------------
 10 files changed, 250 insertions(+), 308 deletions(-)

diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 85e64b1..d20c6ee 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -194,47 +194,6 @@ func (ds *MetadataManager) GetService(ctx context.Context, 
request *pb.GetServic
        return singleService, nil
 }
 
-func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request 
*pb.GetServiceRequest) (
-       *pb.ServiceDetail, error) {
-       domainProject := util.ParseDomainProject(ctx)
-
-       service, err := eutil.GetService(ctx, domainProject, request.ServiceId)
-       if err != nil {
-               if errors.Is(err, datasource.ErrNoData) {
-                       return nil, pb.NewError(pb.ErrServiceNotExists, 
"Service does not exist.")
-               }
-               return nil, pb.NewError(pb.ErrInternal, err.Error())
-       }
-
-       key := &pb.MicroServiceKey{
-               Tenant:      domainProject,
-               Environment: service.Environment,
-               AppId:       service.AppId,
-               ServiceName: service.ServiceName,
-               Version:     "",
-       }
-       versions, err := getServiceAllVersions(ctx, key)
-       if err != nil {
-               log.Error(fmt.Sprintf("get service[%s/%s/%s] all versions 
failed",
-                       service.Environment, service.AppId, 
service.ServiceName), err)
-               return nil, pb.NewError(pb.ErrInternal, err.Error())
-       }
-
-       options := []string{"tags", "instances", "schemas", "dependencies"}
-       serviceInfo, err := getServiceDetailUtil(ctx, ServiceDetailOpt{
-               domainProject: domainProject,
-               service:       service,
-               options:       options,
-       })
-       if err != nil {
-               return nil, pb.NewError(pb.ErrInternal, err.Error())
-       }
-
-       serviceInfo.MicroService = service
-       serviceInfo.MicroServiceVersions = versions
-       return serviceInfo, nil
-}
-
 func (ds *MetadataManager) ListServiceDetail(ctx context.Context, request 
*pb.GetServicesInfoRequest) (
        *pb.GetServicesInfoResponse, error) {
        ctx = util.WithCacheOnly(ctx)
@@ -404,6 +363,28 @@ func (ds *MetadataManager) ExistService(ctx 
context.Context, request *pb.GetExis
        return ids[0], nil
 }
 
+func (ds *MetadataManager) FindService(ctx context.Context, request 
*pb.MicroServiceKey) (*pb.GetServicesResponse, error) {
+       copyKey := *request
+       copyKey.Tenant = util.ParseDomainProject(ctx)
+       copyKey.Version = ""
+       key := path.GenerateServiceIndexKey(&copyKey)
+       opts := append(eutil.FromContext(ctx), etcdadpt.WithStrKey(key), 
etcdadpt.WithPrefix())
+
+       resp, err := sd.ServiceIndex().Search(ctx, opts...)
+       if err != nil {
+               return nil, err
+       }
+       result := &pb.GetServicesResponse{}
+       for _, kv := range resp.Kvs {
+               svc, err := ds.GetService(ctx, &pb.GetServiceRequest{ServiceId: 
kv.Value.(string)})
+               if err != nil {
+                       return nil, err
+               }
+               result.Services = append(result.Services, svc)
+       }
+       return result, nil
+}
+
 func (ds *MetadataManager) PutServiceProperties(ctx context.Context, request 
*pb.UpdateServicePropsRequest) error {
        remoteIP := util.GetIPFromContext(ctx)
        domainProject := util.ParseDomainProject(ctx)
diff --git a/datasource/etcd/util.go b/datasource/etcd/util.go
index a6267d2..2c641e0 100644
--- a/datasource/etcd/util.go
+++ b/datasource/etcd/util.go
@@ -171,32 +171,6 @@ func revokeInstance(ctx context.Context, domainProject 
string, serviceID string,
        return nil
 }
 
-// governServiceCtrl util
-func getServiceAllVersions(ctx context.Context, serviceKey 
*pb.MicroServiceKey) ([]string, error) {
-       var versions []string
-
-       copyKey := *serviceKey
-       copyKey.Version = ""
-       key := path.GenerateServiceIndexKey(&copyKey)
-
-       opts := append(serviceUtil.FromContext(ctx),
-               etcdadpt.WithStrKey(key),
-               etcdadpt.WithPrefix())
-
-       resp, err := sd.ServiceIndex().Search(ctx, opts...)
-       if err != nil {
-               return nil, err
-       }
-       if resp == nil || len(resp.Kvs) == 0 {
-               return versions, nil
-       }
-       for _, keyValue := range resp.Kvs {
-               key := path.GetInfoFromSvcIndexKV(keyValue.Key)
-               versions = append(versions, key.Version)
-       }
-       return versions, nil
-}
-
 func getServiceDetailUtil(ctx context.Context, serviceDetailOpt 
ServiceDetailOpt) (*pb.ServiceDetail, error) {
        serviceID := serviceDetailOpt.service.ServiceId
        options := serviceDetailOpt.options
diff --git a/datasource/mongo/dao/microservice.go 
b/datasource/mongo/dao/microservice.go
index 404da70..23f424c 100644
--- a/datasource/mongo/dao/microservice.go
+++ b/datasource/mongo/dao/microservice.go
@@ -128,23 +128,6 @@ func UpdateService(ctx context.Context, filter 
interface{}, update interface{},
        return nil
 }
 
-func GetServicesVersions(ctx context.Context, filter interface{}) ([]string, 
error) {
-       res, err := 
mongo.GetClient().GetDB().Collection(model.CollectionService).Find(ctx, filter)
-       if err != nil {
-               return nil, nil
-       }
-       var versions []string
-       for res.Next(ctx) {
-               var tmp model.Service
-               err := res.Decode(&tmp)
-               if err != nil {
-                       return nil, err
-               }
-               versions = append(versions, tmp.Service.Version)
-       }
-       return versions, nil
-}
-
 func CountService(ctx context.Context, filter interface{}) (int64, error) {
        count, err := 
mongo.GetClient().GetDB().Collection(model.CollectionService).CountDocuments(ctx,
 filter)
        if err != nil {
diff --git a/datasource/mongo/microservice_util.go 
b/datasource/mongo/microservice_util.go
index 7b61a34..ef1ee44 100644
--- a/datasource/mongo/microservice_util.go
+++ b/datasource/mongo/microservice_util.go
@@ -60,18 +60,6 @@ func ServiceExistID(ctx context.Context, serviceID string) 
(bool, error) {
        return num != 0, err
 }
 
-func GetAllServicesByDomainProject(ctx context.Context) ([]*model.Service, 
error) {
-       services, exist := 
cache.GetServicesByDomainProject(util.ParseDomainProject(ctx))
-       if exist {
-               return services, nil
-       }
-
-       domain := util.ParseDomain(ctx)
-       project := util.ParseProject(ctx)
-       filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: 
project}
-       return dao.GetServices(ctx, filter)
-}
-
 func GetAllMicroServicesByDomainProject(ctx context.Context) 
([]*discovery.MicroService, error) {
        services, exist := 
cache.GetMicroServicesByDomainProject(util.ParseDomainProject(ctx))
        if exist {
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index e871bbb..fd8a837 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -248,6 +248,28 @@ func (ds *MetadataManager) ExistService(ctx 
context.Context, request *discovery.
        return ids[0], nil
 }
 
+func (ds *MetadataManager) FindService(ctx context.Context, request 
*discovery.MicroServiceKey) (*discovery.GetServicesResponse, error) {
+       filter := mutil.NewBasicFilter(ctx,
+               mutil.ServiceEnv(request.Environment),
+               mutil.ServiceAppID(request.AppId),
+               mutil.ServiceServiceName(request.ServiceName),
+       )
+       res, err := 
dmongo.GetClient().GetDB().Collection(model.CollectionService).Find(ctx, filter)
+       if err != nil {
+               return nil, err
+       }
+       result := &discovery.GetServicesResponse{}
+       for res.Next(ctx) {
+               var tmp model.Service
+               err := res.Decode(&tmp)
+               if err != nil {
+                       return nil, err
+               }
+               result.Services = append(result.Services, tmp.Service)
+       }
+       return result, nil
+}
+
 func (ds *MetadataManager) UnregisterService(ctx context.Context, request 
*discovery.DeleteServiceRequest) error {
        remoteIP := util.GetIPFromContext(ctx)
        serviceID := request.ServiceId
@@ -379,42 +401,6 @@ func updateServiceTxn(ctx context.Context, request 
*discovery.UpdateServiceProps
        })
 }
 
-func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request 
*discovery.GetServiceRequest) (
-       *discovery.ServiceDetail, error) {
-       mgSvc, err := GetServiceByID(ctx, request.ServiceId)
-       if err != nil {
-               if errors.Is(err, datasource.ErrNoData) {
-                       return nil, 
discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.")
-               }
-               return nil, discovery.NewError(discovery.ErrInternal, 
err.Error())
-       }
-       svc := mgSvc.Service
-       key := &discovery.MicroServiceKey{
-               Environment: svc.Environment,
-               AppId:       svc.AppId,
-               ServiceName: svc.ServiceName,
-       }
-       filter := mutil.NewBasicFilter(ctx,
-               mutil.ServiceEnv(key.Environment),
-               mutil.ServiceAppID(key.AppId),
-               mutil.ServiceServiceName(key.ServiceName),
-       )
-       versions, err := dao.GetServicesVersions(ctx, filter)
-       if err != nil {
-               log.Error(fmt.Sprintf("get service %s %s %s all versions 
failed", svc.Environment, svc.AppId, svc.ServiceName), err)
-               return nil, discovery.NewError(discovery.ErrInternal, 
err.Error())
-       }
-       options := []string{"tags", "instances", "schemas", "dependencies"}
-       serviceInfo, err := getServiceDetailUtil(ctx, mgSvc, false, options)
-       if err != nil {
-               return nil, discovery.NewError(discovery.ErrInternal, 
err.Error())
-       }
-       serviceInfo.MicroService = svc
-       serviceInfo.MicroServiceVersions = versions
-       return serviceInfo, nil
-
-}
-
 func (ds *MetadataManager) ListServiceDetail(ctx context.Context, request 
*discovery.GetServicesInfoRequest) (*discovery.GetServicesInfoResponse, error) {
        optionMap := make(map[string]struct{}, len(request.Options))
        for _, opt := range request.Options {
diff --git a/datasource/ms.go b/datasource/ms.go
index 15a9f55..073a3dd 100644
--- a/datasource/ms.go
+++ b/datasource/ms.go
@@ -46,7 +46,6 @@ type MetadataManager interface {
        ListService(ctx context.Context, request *pb.GetServicesRequest) 
(*pb.GetServicesResponse, error)
        GetService(ctx context.Context, request *pb.GetServiceRequest) 
(*pb.MicroService, error)
 
-       GetServiceDetail(ctx context.Context, request *pb.GetServiceRequest) 
(*pb.ServiceDetail, error)
        ListServiceDetail(ctx context.Context, request 
*pb.GetServicesInfoRequest) (*pb.GetServicesInfoResponse, error)
        GetOverview(ctx context.Context, request *pb.GetServicesRequest) 
(*pb.Statistics, error)
        ListApp(ctx context.Context, request *pb.GetAppsRequest) 
(*pb.GetAppsResponse, error)
@@ -56,6 +55,7 @@ type MetadataManager interface {
        PutServiceProperties(ctx context.Context, request 
*pb.UpdateServicePropsRequest) error
        UnregisterService(ctx context.Context, request 
*pb.DeleteServiceRequest) error
        CountService(ctx context.Context, request *pb.GetServiceCountRequest) 
(*pb.GetServiceCountResponse, error)
+       FindService(ctx context.Context, request *pb.MicroServiceKey) 
(*pb.GetServicesResponse, error)
 
        // Instance management
        RegisterInstance(ctx context.Context, request 
*pb.RegisterInstanceRequest) (*pb.RegisterInstanceResponse, error)
diff --git a/datasource/service_test.go b/datasource/service_test.go
index 3be93c6..b736bfb 100644
--- a/datasource/service_test.go
+++ b/datasource/service_test.go
@@ -709,31 +709,11 @@ func TestService_Detail(t *testing.T) {
                })
                assert.NoError(t, err)
 
-               log.Info("when get invalid service detail, should be failed")
-               respD, err := 
datasource.GetMetadataManager().GetServiceDetail(ctx, &pb.GetServiceRequest{
-                       ServiceId: "",
-               })
-               assert.Error(t, err)
-               assert.Nil(t, respD)
-
-               log.Info("when get a service detail, should be passed")
-               respGetServiceDetail, err := 
datasource.GetMetadataManager().GetServiceDetail(ctx, &pb.GetServiceRequest{
-                       ServiceId: serviceId,
-               })
-               assert.NoError(t, err)
-               assert.Equal(t, serviceId, 
respGetServiceDetail.MicroService.ServiceId)
-
                err = datasource.GetMetadataManager().UnregisterService(ctx, 
&pb.DeleteServiceRequest{
                        ServiceId: serviceId,
                        Force:     true,
                })
                assert.NoError(t, err)
-
-               respGetServiceDetail, err = 
datasource.GetMetadataManager().GetServiceDetail(ctx, &pb.GetServiceRequest{
-                       ServiceId: serviceId,
-               })
-               assert.Error(t, err)
-               assert.Nil(t, respGetServiceDetail)
        })
 }
 
diff --git a/server/service/disco/metadata.go b/server/service/disco/metadata.go
index 87b801b..9fbb253 100644
--- a/server/service/disco/metadata.go
+++ b/server/service/disco/metadata.go
@@ -153,6 +153,10 @@ func ListService(ctx context.Context, in 
*pb.GetServicesRequest) (*pb.GetService
        return resp, err
 }
 
+func FindService(ctx context.Context, in *pb.MicroServiceKey) 
(*pb.GetServicesResponse, error) {
+       return datasource.GetMetadataManager().FindService(ctx, in)
+}
+
 func UnregisterManyService(ctx context.Context, request 
*pb.DelServicesRequest) (*pb.DelServicesResponse, error) {
        remoteIP := util.GetIPFromContext(ctx)
 
diff --git a/server/service/govern/view.go b/server/service/govern/view.go
index b0b165d..d519cdd 100644
--- a/server/service/govern/view.go
+++ b/server/service/govern/view.go
@@ -19,9 +19,12 @@ package govern
 
 import (
        "context"
+       "fmt"
 
        "github.com/apache/servicecomb-service-center/datasource"
+       "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
+       discosvc 
"github.com/apache/servicecomb-service-center/server/service/disco"
        "github.com/apache/servicecomb-service-center/server/service/validator"
        pb "github.com/go-chassis/cari/discovery"
 )
@@ -34,11 +37,81 @@ func ListServiceDetail(ctx context.Context, in 
*pb.GetServicesInfoRequest) (*pb.
 func GetServiceDetail(ctx context.Context, in *pb.GetServiceRequest) 
(*pb.ServiceDetail, error) {
        ctx = util.WithCacheOnly(ctx)
 
-       if len(in.ServiceId) == 0 {
+       serviceID := in.ServiceId
+       if len(serviceID) == 0 {
                return nil, pb.NewError(pb.ErrInvalidParams, "Invalid request 
for getting service detail.")
        }
 
-       return datasource.GetMetadataManager().GetServiceDetail(ctx, in)
+       service, err := discosvc.GetService(ctx, in)
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] failed", serviceID), err)
+               return nil, err
+       }
+
+       serviceInfo := new(pb.ServiceDetail)
+       serviceInfo.MicroService = service
+
+       key := &pb.MicroServiceKey{
+               Environment: service.Environment,
+               AppId:       service.AppId,
+               ServiceName: service.ServiceName,
+       }
+       versions, err := getServiceAllVersions(ctx, key)
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s/%s/%s] all versions 
failed",
+                       service.Environment, service.AppId, 
service.ServiceName), err)
+               return nil, pb.NewError(pb.ErrInternal, err.Error())
+       }
+       serviceInfo.MicroServiceVersions = versions
+
+       tagsResp, err := discosvc.ListTag(ctx, 
&pb.GetServiceTagsRequest{ServiceId: serviceID})
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] tags failed", 
serviceID), err)
+               return nil, err
+       }
+       serviceInfo.Tags = tagsResp.Tags
+
+       schemas, err := discosvc.ListSchema(ctx, 
&pb.GetAllSchemaRequest{ServiceId: serviceID, WithSchema: true})
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] schemas failed", 
serviceID), err)
+               return nil, err
+       }
+       serviceInfo.SchemaInfos = schemas
+
+       providerResp, err := discosvc.ListProviders(ctx, 
&pb.GetDependenciesRequest{ServiceId: serviceID})
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] providers failed", 
serviceID), err)
+               return nil, err
+       }
+       serviceInfo.Providers = providerResp.Providers
+
+       consumerResp, err := discosvc.ListConsumers(ctx, 
&pb.GetDependenciesRequest{ServiceId: serviceID})
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] consumers failed", 
serviceID), err)
+               return nil, err
+       }
+       serviceInfo.Consumers = consumerResp.Consumers
+
+       instResp, err := discosvc.ListInstance(ctx, 
&pb.GetInstancesRequest{ProviderServiceId: serviceID})
+       if err != nil {
+               log.Error(fmt.Sprintf("get service[%s] instances failed", 
serviceID), err)
+               return nil, err
+       }
+       serviceInfo.Instances = instResp.Instances
+
+       return serviceInfo, nil
+}
+
+func getServiceAllVersions(ctx context.Context, key *pb.MicroServiceKey) 
([]string, error) {
+       resp, err := discosvc.FindService(ctx, key)
+       if err != nil {
+               return nil, err
+       }
+       versions := make([]string, 0, len(resp.Services))
+       for _, svc := range resp.Services {
+               versions = append(versions, svc.Version)
+       }
+       return versions, nil
 }
 
 func ListApp(ctx context.Context, in *pb.GetAppsRequest) (*pb.GetAppsResponse, 
error) {
diff --git a/server/service/govern/view_test.go 
b/server/service/govern/view_test.go
index 6ac832e..70684fe 100644
--- a/server/service/govern/view_test.go
+++ b/server/service/govern/view_test.go
@@ -20,186 +20,159 @@ import (
        "context"
        "testing"
 
-       "github.com/onsi/ginkgo/reporters"
-
        _ "github.com/apache/servicecomb-service-center/test"
 
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/service/disco"
        "github.com/apache/servicecomb-service-center/server/service/govern"
        pb "github.com/go-chassis/cari/discovery"
-       . "github.com/onsi/ginkgo"
-       . "github.com/onsi/gomega"
+       "github.com/go-chassis/cari/pkg/errsvc"
+       "github.com/stretchr/testify/assert"
 )
 
-func TestGovern(t *testing.T) {
-       RegisterFailHandler(Fail)
-       junitReporter := reporters.NewJUnitReporter("model.junit.xml")
-       RunSpecsWithDefaultAndCustomReporters(t, "model Suite", 
[]Reporter{junitReporter})
-}
-
 func getContext() context.Context {
        return util.WithNoCache(util.SetDomainProject(context.Background(), 
"default", "default"))
 }
 
-var _ = Describe("'Govern' service", func() {
-       Describe("execute 'get all' operation", func() {
-               Context("when get all services", func() {
-                       It("should be passed", func() {
-                               By("all options")
-                               resp, err := 
govern.ListServiceDetail(getContext(), &pb.GetServicesInfoRequest{
-                                       Options: []string{"all"},
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(resp).ToNot(BeNil())
-
-                               By("only service metadata")
-                               resp, err = 
govern.ListServiceDetail(getContext(), &pb.GetServicesInfoRequest{
-                                       Options: []string{""},
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(resp).ToNot(BeNil())
-
-                               By("custom options")
-                               resp, err = 
govern.ListServiceDetail(getContext(), &pb.GetServicesInfoRequest{
-                                       Options: []string{"tags", "rules", 
"instances", "schemas", "statistics"},
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(resp).ToNot(BeNil())
-
-                               By("'statistics' option")
-                               resp, err = 
govern.ListServiceDetail(getContext(), &pb.GetServicesInfoRequest{
-                                       Options: []string{"statistics"},
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(resp).ToNot(BeNil())
-
-                               By("get instance count")
-                               resp, err = 
govern.ListServiceDetail(getContext(), &pb.GetServicesInfoRequest{
-                                       Options:   []string{"instances"},
-                                       CountOnly: true,
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(resp).ToNot(BeNil())
-                       })
+func TestListServiceDetail(t *testing.T) {
+       t.Run("when get all services, should be passed", func(t *testing.T) {
+               resp, err := govern.ListServiceDetail(getContext(), 
&pb.GetServicesInfoRequest{
+                       Options: []string{"all"},
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+
+               resp, err = govern.ListServiceDetail(getContext(), 
&pb.GetServicesInfoRequest{
+                       Options: []string{""},
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+
+               resp, err = govern.ListServiceDetail(getContext(), 
&pb.GetServicesInfoRequest{
+                       Options: []string{"tags", "rules", "instances", 
"schemas", "statistics"},
                })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
 
-               Context("when get top graph", func() {
-                       It("should be passed", func() {
-                               respC, err := 
disco.RegisterService(getContext(), &pb.CreateServiceRequest{
-                                       Service: &pb.MicroService{
-                                               AppId:       
"govern_service_group",
-                                               ServiceName: 
"govern_service_graph",
-                                               Version:     "1.0.0",
-                                               Level:       "FRONT",
-                                               Status:      pb.MS_UP,
-                                       },
-                               })
-                               Expect(err).To(BeNil())
-                               
Expect(respC.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-                               graph, err := govern.Draw(getContext(), false)
-                               Expect(err).To(BeNil())
-                               Expect(len(graph.Nodes)).ToNot(Equal(0))
-                       })
+               resp, err = govern.ListServiceDetail(getContext(), 
&pb.GetServicesInfoRequest{
+                       Options: []string{"statistics"},
                })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+
+               resp, err = govern.ListServiceDetail(getContext(), 
&pb.GetServicesInfoRequest{
+                       Options:   []string{"instances"},
+                       CountOnly: true,
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
        })
 
-       Describe("execute 'get detail' operation", func() {
-               var (
-                       serviceId string
-               )
-
-               It("should be passed", func() {
-                       resp, err := disco.RegisterService(getContext(), 
&pb.CreateServiceRequest{
-                               Service: &pb.MicroService{
-                                       AppId:       "govern_service_group",
-                                       ServiceName: "govern_service_name",
-                                       Version:     "3.0.0",
-                                       Level:       "FRONT",
-                                       Status:      pb.MS_UP,
-                               },
-                       })
-                       Expect(err).To(BeNil())
-                       
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-                       serviceId = resp.ServiceId
+       t.Run("when get top graph, should be passed", func(t *testing.T) {
+               respC, err := disco.RegisterService(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "govern_service_group",
+                               ServiceName: "govern_service_graph",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, respC)
 
-                       err = disco.PutSchema(getContext(), 
&pb.ModifySchemaRequest{
+               graph, err := govern.Draw(getContext(), false)
+               assert.NoError(t, err)
+               assert.NotEqual(t, 0, len(graph.Nodes))
+       })
+}
+
+func TestListApp(t *testing.T) {
+       t.Run("when request is invalid, should be failed", func(t *testing.T) {
+               resp, err := govern.ListApp(getContext(), &pb.GetAppsRequest{
+                       Environment: "non-exist-env",
+               })
+               assert.True(t, errsvc.IsErrEqualCode(err, pb.ErrInvalidParams), 
err)
+               assert.Nil(t, resp)
+       })
+
+       t.Run("when request is valid, should be passed", func(t *testing.T) {
+               resp, err := govern.ListApp(getContext(), &pb.GetAppsRequest{})
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+
+               resp, err = govern.ListApp(getContext(), &pb.GetAppsRequest{
+                       Environment: pb.ENV_ACCEPT,
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+       })
+}
+
+func TestGetServiceDetail(t *testing.T) {
+       var (
+               serviceId string
+       )
+
+       t.Run("prepare data, should be passed", func(t *testing.T) {
+               resp, err := disco.RegisterService(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "govern_service_group",
+                               ServiceName: "govern_service_name",
+                               Version:     "3.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NoError(t, err)
+               assert.NotNil(t, resp)
+               serviceId = resp.ServiceId
+
+               err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
+                       ServiceId: serviceId,
+                       SchemaId:  "schemaId",
+                       Schema:    "detail",
+               })
+               assert.NoError(t, err)
+
+               _, err = disco.RegisterInstance(getContext(), 
&pb.RegisterInstanceRequest{
+                       Instance: &pb.MicroServiceInstance{
                                ServiceId: serviceId,
-                               SchemaId:  "schemaId",
-                               Schema:    "detail",
-                       })
-                       Expect(err).To(BeNil())
-
-                       _, err = disco.RegisterInstance(getContext(), 
&pb.RegisterInstanceRequest{
-                               Instance: &pb.MicroServiceInstance{
-                                       ServiceId: serviceId,
-                                       Endpoints: []string{
-                                               "govern:127.0.0.1:8080",
-                                       },
-                                       HostName: "UT-HOST",
-                                       Status:   pb.MSI_UP,
+                               Endpoints: []string{
+                                       "govern:127.0.0.1:8080",
                                },
-                       })
-                       Expect(err).To(BeNil())
+                               HostName: "UT-HOST",
+                               Status:   pb.MSI_UP,
+                       },
                })
+               assert.NoError(t, err)
+       })
 
-               Context("when get invalid service detail", func() {
-                       It("should be failed", func() {
-                               resp, err := 
govern.GetServiceDetail(getContext(), &pb.GetServiceRequest{
-                                       ServiceId: "",
-                               })
-                               Expect(err).ToNot(BeNil())
-                               Expect(resp).To(BeNil())
-                       })
+       t.Run("when get invalid service detail, should be failed", func(t 
*testing.T) {
+               resp, err := govern.GetServiceDetail(getContext(), 
&pb.GetServiceRequest{
+                       ServiceId: "",
                })
+               assert.True(t, errsvc.IsErrEqualCode(err, pb.ErrInvalidParams), 
err)
+               assert.Nil(t, resp)
+       })
 
-               Context("when get a service detail", func() {
-                       It("should be passed", func() {
-                               respGetServiceDetail, err := 
govern.GetServiceDetail(getContext(), &pb.GetServiceRequest{
-                                       ServiceId: serviceId,
-                               })
-                               Expect(err).To(BeNil())
-                               Expect(respGetServiceDetail).ToNot(BeNil())
-
-                               err = disco.UnregisterService(getContext(), 
&pb.DeleteServiceRequest{
-                                       ServiceId: serviceId,
-                                       Force:     true,
-                               })
-                               Expect(err).To(BeNil())
-
-                               respGetServiceDetail, err = 
govern.GetServiceDetail(getContext(), &pb.GetServiceRequest{
-                                       ServiceId: serviceId,
-                               })
-                               Expect(err).ToNot(BeNil())
-                               Expect(respGetServiceDetail).To(BeNil())
-                       })
+       t.Run("when get a service detail, should be passed", func(t *testing.T) 
{
+               respGetServiceDetail, err := 
govern.GetServiceDetail(getContext(), &pb.GetServiceRequest{
+                       ServiceId: serviceId,
                })
-       })
+               assert.NoError(t, err)
+               assert.NotNil(t, respGetServiceDetail)
 
-       Describe("execute 'get apps' operation", func() {
-               Context("when request is invalid", func() {
-                       It("should be failed", func() {
-                               resp, err := govern.ListApp(getContext(), 
&pb.GetAppsRequest{
-                                       Environment: "non-exist-env",
-                               })
-                               Expect(err).ToNot(BeNil())
-                               Expect(resp).To(BeNil())
-                       })
+               err = disco.UnregisterService(getContext(), 
&pb.DeleteServiceRequest{
+                       ServiceId: serviceId,
+                       Force:     true,
                })
+               assert.NoError(t, err)
 
-               Context("when request is valid", func() {
-                       It("should be passed", func() {
-                               resp, err := govern.ListApp(getContext(), 
&pb.GetAppsRequest{})
-                               Expect(err).To(BeNil())
-                               
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-                               resp, err = govern.ListApp(getContext(), 
&pb.GetAppsRequest{
-                                       Environment: pb.ENV_ACCEPT,
-                               })
-                               Expect(err).To(BeNil())
-                               
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-                       })
+               respGetServiceDetail, err = 
govern.GetServiceDetail(getContext(), &pb.GetServiceRequest{
+                       ServiceId: serviceId,
                })
+               assert.True(t, errsvc.IsErrEqualCode(err, 
pb.ErrServiceNotExists), err)
+               assert.Nil(t, respGetServiceDetail)
        })
-})
+}

Reply via email to