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 8f0b3c4 [Enhancement] Implement service/dep exist interface (#709)
8f0b3c4 is described below
commit 8f0b3c4ceacc9da7ce94fbcbeb4f2d6280424285
Author: xzccfzy <[email protected]>
AuthorDate: Thu Oct 15 09:25:33 2020 +0800
[Enhancement] Implement service/dep exist interface (#709)
Co-authored-by: 薛泽超 <[email protected]>
---
server/service/dep/datasource.go | 12 +-
server/service/dep/etcd/etcd.go | 181 +++++-
server/service/dep/etcd/etcd_suite_test.go | 61 ++
server/service/dep/etcd/etcd_test.go | 895 +++++++++++++++++++++++++++++
4 files changed, 1140 insertions(+), 9 deletions(-)
diff --git a/server/service/dep/datasource.go b/server/service/dep/datasource.go
index d26d969..5f9a45c 100644
--- a/server/service/dep/datasource.go
+++ b/server/service/dep/datasource.go
@@ -15,9 +15,15 @@
package dep
+import (
+ "context"
+ pb "github.com/apache/servicecomb-service-center/pkg/registry"
+)
+
type DataSource interface {
- AddDependency()
- SearchDependency()
- UpdateDependency()
+ AddDependency(ctx context.Context, request *pb.AddDependenciesRequest)
(*pb.AddDependenciesResponse, error)
+ CreateDependency(ctx context.Context, request
*pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error)
+ SearchProviderDependency(ctx context.Context, request
*pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error)
+ SearchConsumerDependency(ctx context.Context, request
*pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error)
DeleteDependency()
}
diff --git a/server/service/dep/etcd/etcd.go b/server/service/dep/etcd/etcd.go
index c2e2c02..c8e0f84 100644
--- a/server/service/dep/etcd/etcd.go
+++ b/server/service/dep/etcd/etcd.go
@@ -16,7 +16,19 @@
package etcd
import (
+ "context"
+ "encoding/json"
+ "fmt"
"github.com/apache/servicecomb-service-center/pkg/log"
+ pb "github.com/apache/servicecomb-service-center/pkg/registry"
+ "github.com/apache/servicecomb-service-center/pkg/util"
+ apt "github.com/apache/servicecomb-service-center/server/core"
+ "github.com/apache/servicecomb-service-center/server/core/backend"
+ "github.com/apache/servicecomb-service-center/server/core/proto"
+ "github.com/apache/servicecomb-service-center/server/plugin/registry"
+ scerr "github.com/apache/servicecomb-service-center/server/scerror"
+ "github.com/apache/servicecomb-service-center/server/service"
+ serviceUtil
"github.com/apache/servicecomb-service-center/server/service/util"
)
// TODO: define error with names here
@@ -45,18 +57,175 @@ func (ds *DataSource) initialize() error {
return nil
}
-func (ds *DataSource) AddDependency() {
- panic("implement me")
+func (ds *DataSource) AddDependency(ctx context.Context, request
*pb.AddDependenciesRequest) (*pb.AddDependenciesResponse, error) {
+ if err := service.Validate(request); err != nil {
+ return &pb.AddDependenciesResponse{
+ Response:
serviceUtil.BadParamsResponse(err.Error()).Response,
+ }, nil
+ }
+
+ resp, err := ds.AddOrUpdateDependencies(ctx, request.Dependencies,
false)
+ return &pb.AddDependenciesResponse{
+ Response: resp,
+ }, err
+
}
-func (ds *DataSource) SearchDependency() {
- panic("implement me")
+func (ds *DataSource) CreateDependency(ctx context.Context, request
*pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
+ if err := service.Validate(request); err != nil {
+ return &pb.CreateDependenciesResponse{
+ Response:
serviceUtil.BadParamsResponse(err.Error()).Response,
+ }, nil
+ }
+ resp, err := ds.AddOrUpdateDependencies(ctx, request.Dependencies,
false)
+ return &pb.CreateDependenciesResponse{
+ Response: resp,
+ }, err
}
-func (ds *DataSource) UpdateDependency() {
- panic("implement me")
+func (ds *DataSource) SearchProviderDependency(ctx context.Context, request
*pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
+ err := service.Validate(request)
+ if err != nil {
+ log.Errorf(err, "GetProviderDependencies failed for validating
parameters failed")
+ return &pb.GetProDependenciesResponse{
+ Response: proto.CreateResponse(scerr.ErrInvalidParams,
err.Error()),
+ }, nil
+ }
+ domainProject := util.ParseDomainProject(ctx)
+ providerServiceID := request.ServiceId
+
+ provider, err := serviceUtil.GetService(ctx, domainProject,
providerServiceID)
+ if err != nil {
+ log.Errorf(err, "GetProviderDependencies failed, provider is
%s", providerServiceID)
+ return nil, err
+ }
+ if provider == nil {
+ log.Errorf(err, "GetProviderDependencies failed for
provider[%s] does not exist", providerServiceID)
+ return &pb.GetProDependenciesResponse{
+ Response:
proto.CreateResponse(scerr.ErrServiceNotExists, "Provider does not exist"),
+ }, nil
+ }
+
+ dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject,
provider)
+ services, err :=
dr.GetDependencyConsumers(toDependencyFilterOptions(request)...)
+ if err != nil {
+ log.Errorf(err, "GetProviderDependencies failed, provider is
%s/%s/%s/%s",
+ provider.Environment, provider.AppId,
provider.ServiceName, provider.Version)
+ return &pb.GetProDependenciesResponse{
+ Response: proto.CreateResponse(scerr.ErrInternal,
err.Error()),
+ }, err
+ }
+ return &pb.GetProDependenciesResponse{
+ Response: proto.CreateResponse(proto.Response_SUCCESS, "Get
all consumers successful."),
+ Consumers: services,
+ }, nil
+}
+
+func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request
*pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error) {
+ err := service.Validate(request)
+ if err != nil {
+ log.Errorf(err, "GetConsumerDependencies failed for validating
parameters failed")
+ return &pb.GetConDependenciesResponse{
+ Response: proto.CreateResponse(scerr.ErrInvalidParams,
err.Error()),
+ }, nil
+ }
+ consumerID := request.ServiceId
+ domainProject := util.ParseDomainProject(ctx)
+
+ consumer, err := serviceUtil.GetService(ctx, domainProject, consumerID)
+ if err != nil {
+ log.Errorf(err, "GetConsumerDependencies failed, consumer is
%s", consumerID)
+ return &pb.GetConDependenciesResponse{
+ Response: proto.CreateResponse(scerr.ErrInternal,
err.Error()),
+ }, err
+ }
+ if consumer == nil {
+ log.Errorf(err, "GetConsumerDependencies failed for
consumer[%s] does not exist", consumerID)
+ return &pb.GetConDependenciesResponse{
+ Response:
proto.CreateResponse(scerr.ErrServiceNotExists, "Consumer does not exist"),
+ }, nil
+ }
+
+ dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject,
consumer)
+ services, err :=
dr.GetDependencyProviders(toDependencyFilterOptions(request)...)
+ if err != nil {
+ log.Errorf(err, "GetConsumerDependencies failed, consumer is
%s/%s/%s/%s",
+ consumer.Environment, consumer.AppId,
consumer.ServiceName, consumer.Version)
+ return &pb.GetConDependenciesResponse{
+ Response: proto.CreateResponse(scerr.ErrInternal,
err.Error()),
+ }, err
+ }
+
+ return &pb.GetConDependenciesResponse{
+ Response: proto.CreateResponse(proto.Response_SUCCESS, "Get
all providers successfully."),
+ Providers: services,
+ }, nil
}
func (ds *DataSource) DeleteDependency() {
panic("implement me")
}
+
+func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context,
dependencyInfos []*pb.ConsumerDependency, override bool) (*pb.Response, error) {
+ opts := make([]registry.PluginOp, 0, len(dependencyInfos))
+ domainProject := util.ParseDomainProject(ctx)
+ for _, dependencyInfo := range dependencyInfos {
+ consumerFlag :=
util.StringJoin([]string{dependencyInfo.Consumer.Environment,
dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName,
dependencyInfo.Consumer.Version}, "/")
+ consumerInfo :=
proto.DependenciesToKeys([]*pb.MicroServiceKey{dependencyInfo.Consumer},
domainProject)[0]
+ providersInfo :=
proto.DependenciesToKeys(dependencyInfo.Providers, domainProject)
+
+ rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
+ if rsp != nil {
+ log.Errorf(nil, "put request into dependency queue
failed, override: %t, consumer is %s, %s",
+ override, consumerFlag,
rsp.Response.GetMessage())
+ return rsp.Response, nil
+ }
+
+ consumerID, err := serviceUtil.GetServiceID(ctx, consumerInfo)
+ if err != nil {
+ log.Errorf(err, "put request into dependency queue
failed, override: %t, get consumer[%s] id failed",
+ override, consumerFlag)
+ return proto.CreateResponse(scerr.ErrInternal,
err.Error()), err
+ }
+ if len(consumerID) == 0 {
+ log.Errorf(nil, "put request into dependency queue
failed, override: %t, consumer[%s] does not exist",
+ override, consumerFlag)
+ return proto.CreateResponse(scerr.ErrServiceNotExists,
fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
+ }
+
+ dependencyInfo.Override = override
+ data, err := json.Marshal(dependencyInfo)
+ if err != nil {
+ log.Errorf(err, "put request into dependency queue
failed, override: %t, marshal consumer[%s] dependency failed",
+ override, consumerFlag)
+ return proto.CreateResponse(scerr.ErrInternal,
err.Error()), err
+ }
+
+ id := apt.DepsQueueUUID
+ if !override {
+ id = util.GenerateUUID()
+ }
+ key := apt.GenerateConsumerDependencyQueueKey(domainProject,
consumerID, id)
+ opts = append(opts, registry.OpPut(registry.WithStrKey(key),
registry.WithValue(data)))
+ }
+
+ err := backend.BatchCommit(ctx, opts)
+ if err != nil {
+ log.Errorf(err, "put request into dependency queue failed,
override: %t, %v", override, dependencyInfos)
+ return proto.CreateResponse(scerr.ErrInternal, err.Error()), err
+ }
+
+ log.Infof("put request into dependency queue successfully, override:
%t, %v, from remote %s",
+ override, dependencyInfos, util.GetIPFromContext(ctx))
+ return proto.CreateResponse(proto.Response_SUCCESS, "Create dependency
successfully."), nil
+}
+
+func toDependencyFilterOptions(in *pb.GetDependenciesRequest) (opts
[]serviceUtil.DependencyRelationFilterOption) {
+ if in.SameDomain {
+ opts = append(opts, serviceUtil.WithSameDomainProject())
+ }
+ if in.NoSelf {
+ opts = append(opts, serviceUtil.WithoutSelfDependency())
+ }
+ return opts
+}
diff --git a/server/service/dep/etcd/etcd_suite_test.go
b/server/service/dep/etcd/etcd_suite_test.go
new file mode 100644
index 0000000..45728ee
--- /dev/null
+++ b/server/service/dep/etcd/etcd_suite_test.go
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package etcd_test
+
+// initialize
+import (
+ _ "github.com/apache/servicecomb-service-center/server/bootstrap"
+ "github.com/apache/servicecomb-service-center/server/core/proto"
+ "github.com/apache/servicecomb-service-center/server/service"
+)
+import (
+ "context"
+ "github.com/apache/servicecomb-service-center/pkg/util"
+ "github.com/apache/servicecomb-service-center/server/core"
+ "github.com/astaxie/beego"
+ . "github.com/onsi/ginkgo"
+ "github.com/onsi/ginkgo/reporters"
+ . "github.com/onsi/gomega"
+ "testing"
+)
+
+var serviceResource proto.ServiceCtrlServer
+var instanceResource proto.ServiceInstanceCtrlServerEx
+
+func init() {
+ beego.AppConfig.Set("registry_plugin", "etcd")
+ testing.Init()
+ core.Initialize()
+}
+
+var _ = BeforeSuite(func() {
+ //init plugin
+ core.ServerInfo.Config.EnableCache = false
+ serviceResource, instanceResource = service.AssembleResources()
+})
+
+func getContext() context.Context {
+ return util.SetContext(
+ util.SetDomainProject(context.Background(), "default",
"default"),
+ util.CtxNocache, "1")
+}
+
+func TestGrpc(t *testing.T) {
+ RegisterFailHandler(Fail)
+ junitReporter := reporters.NewJUnitReporter("model.junit.xml")
+ RunSpecsWithDefaultAndCustomReporters(t, "model Suite",
[]Reporter{junitReporter})
+}
diff --git a/server/service/dep/etcd/etcd_test.go
b/server/service/dep/etcd/etcd_test.go
new file mode 100644
index 0000000..f7da436
--- /dev/null
+++ b/server/service/dep/etcd/etcd_test.go
@@ -0,0 +1,895 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package etcd_test
+
+import (
+ pb "github.com/apache/servicecomb-service-center/pkg/registry"
+ "github.com/apache/servicecomb-service-center/server/core/proto"
+ scerr "github.com/apache/servicecomb-service-center/server/scerror"
+ "github.com/apache/servicecomb-service-center/server/service/dep"
+ "github.com/apache/servicecomb-service-center/server/service/dep/etcd"
+ "github.com/apache/servicecomb-service-center/server/service/event"
+ "github.com/go-chassis/go-archaius"
+ "github.com/stretchr/testify/assert"
+ "strconv"
+ "testing"
+)
+
+var deh event.DependencyEventHandler
+
+func Test_Creat(t *testing.T) {
+
+ dep.Install("etcd", func(opts dep.Options) (dep.DataSource, error) {
+ return etcd.NewDataSource(), nil
+ })
+
+ err := dep.Init(dep.Options{
+ Endpoint: "",
+ PluginImplName:
dep.ImplName(archaius.GetString("servicecomb.ms.name", "etcd")),
+ })
+ assert.NoError(t, err)
+
+ var (
+ consumerId1 string
+ consumerId2 string
+ consumerId3 string
+ )
+ t.Run("should be passed", func(t *testing.T) {
+ resp, err := serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_consumer",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ consumerId1 = resp.ServiceId
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_consumer_all",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ consumerId3 = resp.ServiceId
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ Environment: pb.ENV_PROD,
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_consumer",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ consumerId2 = resp.ServiceId
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_provider",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_provider",
+ Version: "1.0.1",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ Environment: pb.ENV_PROD,
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_provider",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ })
+
+ t.Run("when request is invalid, should be failed", func(t *testing.T) {
+ consumer := &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_consumer",
+ Version: "1.0.0",
+ }
+ providers := []*pb.MicroServiceKey{
+ {
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_provider",
+ Version: "1.0.0",
+ },
+ }
+
+ // consumer does not exist
+ resp, err := dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "noexistapp",
+ ServiceName: "noexistservice",
+ Version: "1.0.0",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrServiceNotExists,
resp.Response.GetCode())
+
+ // provider version is invalid
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version:
"1.0.32768",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ // consumer version is invalid
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName:
"create_dep_consumer",
+ Version: "1.0.0+",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName:
"create_dep_consumer",
+ Version: "1.0.0-1.0.1",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName:
"create_dep_consumer",
+ Version: "latest",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName:
"create_dep_consumer",
+ Version: "",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName: "*",
+ Version: "1.0.0",
+ },
+ Providers: providers,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ // provider app is invalid
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId: "*",
+ ServiceName:
"service_name_provider",
+ Version: "2.0.0",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ // provider serviceName is invalid
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"service_group_provider",
+ ServiceName: "-",
+ Version: "2.0.0",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ // provider version is invalid
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"service_group_provider",
+ ServiceName:
"service_name_provider",
+ Version: "",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ // provider in diff env
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ Environment:
pb.ENV_PROD,
+ AppId:
"service_group_provider",
+ ServiceName:
"service_name_provider",
+ Version: "latest",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ // consumer in diff env
+ consumer.Environment = pb.ENV_PROD
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"service_group_provider",
+ ServiceName:
"service_name_provider",
+ Version: "latest",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respCon, err :=
serviceResource.GetConsumerDependencies(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respCon)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respCon.Response.GetCode())
+ assert.Equal(t, 0, len(respCon.Providers))
+
+ respCon, err =
serviceResource.GetConsumerDependencies(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId2,
+ })
+ assert.NotNil(t, respCon)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respCon.Response.GetCode())
+ assert.Equal(t, 0, len(respCon.Providers))
+
+ // dependencies is invalid
+ var deps []*pb.ConsumerDependency
+ for i := 0; i < 101; i++ {
+ deps = append(deps, &pb.ConsumerDependency{
+ Consumer: &pb.MicroServiceKey{
+ AppId: "create_dep_group",
+ ServiceName: "create_dep_consumer" +
strconv.Itoa(i),
+ Version: "1.0.0",
+ },
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"service_group_provider",
+ ServiceName:
"service_name_provider",
+ Version: "latest",
+ },
+ },
+ })
+ }
+ resp, err =
serviceResource.CreateDependenciesForMicroServices(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: deps,
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+ })
+
+ t.Run("when request is valid, should be passed", func(t *testing.T) {
+ consumer := &pb.MicroServiceKey{
+ ServiceName: "create_dep_consumer",
+ AppId: "create_dep_group",
+ Version: "1.0.0",
+ }
+
+ // add latest
+ resp, err := dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version: "latest",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respPro, err :=
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+
+ // add 1.0.0+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version: "1.0.0+",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ respPro, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+
+ // add *
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ ServiceName:
"create_dep_consumer_all",
+ AppId: "create_dep_group",
+ Version: "1.0.0",
+ },
+ Providers: []*pb.MicroServiceKey{
+ {
+ ServiceName: "*",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ respPro, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId3,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+ assert.Equal(t, 0, len(respPro.Providers))
+
+ // clean all
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: &pb.MicroServiceKey{
+ ServiceName:
"create_dep_consumer_all",
+ AppId: "create_dep_group",
+ Version: "1.0.0",
+ },
+ Providers: nil,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ // add multiple providers
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version: "1.0.0",
+ },
+ {
+ ServiceName: "*",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ // add 1.0.0-2.0.0 to override *
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version:
"1.0.0-1.0.1",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respPro, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+ assert.Equal(t, "1.0.0", respPro.Providers[0].Version)
+
+ // add not override
+ respAdd, err := dep.Dependency().AddDependency(getContext(),
&pb.AddDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId:
"create_dep_group",
+ ServiceName:
"create_dep_provider",
+ Version:
"1.0.0-3.0.0",
+ },
+ },
+ },
+ },
+ })
+ assert.NotNil(t, respAdd)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respAdd.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respPro, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+
+ // add provider is empty
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{},
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ resp, err = dep.Dependency().CreateDependency(getContext(),
&pb.CreateDependenciesRequest{
+ Dependencies: []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ },
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respPro, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respPro)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respPro.Response.GetCode())
+ //assert.Equal(t, 0, len(respPro.Providers))
+
+ })
+}
+
+func Test_Get(t *testing.T) {
+ dep.Install("etcd", func(opts dep.Options) (dep.DataSource, error) {
+ return etcd.NewDataSource(), nil
+ })
+
+ err := dep.Init(dep.Options{
+ Endpoint: "",
+ PluginImplName:
dep.ImplName(archaius.GetString("servicecomb.ms.name", "etcd")),
+ })
+ assert.NoError(t, err)
+
+ var (
+ consumerId1 string
+ providerId1 string
+ providerId2 string
+ )
+
+ t.Run("should be passed", func(t *testing.T) {
+ resp, err := serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_consumer",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ consumerId1 = resp.ServiceId
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_provider",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ providerId1 = resp.ServiceId
+
+ resp, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_provider",
+ Version: "2.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ providerId2 = resp.ServiceId
+ })
+
+ t.Run("when request is invalid, should be failed", func(t *testing.T) {
+ //service id is empty when get provider
+ resp, err :=
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: "",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ //service does not exist when get provider
+ resp, err =
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: "noneservice",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrServiceNotExists,
resp.Response.GetCode())
+
+ //service id is empty when get consumer
+ resp, err =
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: "",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+ //service does not exist when get consumer
+ resp, err =
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: "noneservice",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, scerr.ErrServiceNotExists,
resp.Response.GetCode())
+ })
+
+ t.Run("when request is valid, should be passed", func(t *testing.T) {
+ //get provider
+ resp, err :=
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: providerId1,
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ //get consumer
+ resp, err =
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+ })
+
+ t.Run("when after finding instance, should created dependencies between
C and P", func(t *testing.T) {
+ // find provider
+ resp, err := instanceResource.Find(getContext(),
&pb.FindInstancesRequest{
+ ConsumerServiceId: consumerId1,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_provider",
+ VersionRule: "1.0.0+",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ // get consumer's deps
+ respGetP, err :=
dep.Dependency().SearchProviderDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: providerId1,
+ })
+ assert.NotNil(t, respGetP)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetP.Response.GetCode())
+
+ // get provider's deps
+ respGetC, err :=
serviceResource.GetConsumerDependencies(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ })
+ assert.NotNil(t, respGetC)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetC.Response.GetCode())
+
+ // get self deps
+ resp, err = instanceResource.Find(getContext(),
&pb.FindInstancesRequest{
+ ConsumerServiceId: consumerId1,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_consumer",
+ VersionRule: "1.0.0+",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respGetC, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: consumerId1,
+ NoSelf: true,
+ })
+ assert.NotNil(t, respGetC)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetC.Response.GetCode())
+
+ // find before provider register
+ resp, err = instanceResource.Find(getContext(),
&pb.FindInstancesRequest{
+ ConsumerServiceId: providerId2,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_finder",
+ VersionRule: "1.0.0+",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ respCreateF, err := serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_finder",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, respCreateF)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respCreateF.Response.GetCode())
+ finder1 := respCreateF.ServiceId
+
+ resp, err = instanceResource.Find(getContext(),
&pb.FindInstancesRequest{
+ ConsumerServiceId: providerId2,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_finder",
+ VersionRule: "1.0.0+",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respGetC, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: providerId2,
+ })
+ assert.NotNil(t, respGetC)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetC.Response.GetCode())
+ assert.Equal(t, 1, len(respGetC.Providers))
+ assert.Equal(t, finder1, respGetC.Providers[0].ServiceId)
+
+ // find after delete micro service
+ respDelP, err := serviceResource.Delete(getContext(),
&pb.DeleteServiceRequest{
+ ServiceId: finder1, Force: true,
+ })
+ assert.NotNil(t, respDelP)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respDelP.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respGetC, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: providerId2,
+ })
+ assert.NotNil(t, respGetC)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetC.Response.GetCode())
+ assert.Equal(t, 0, len(respGetC.Providers))
+
+ respCreateF, err = serviceResource.Create(getContext(),
&pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ ServiceId: finder1,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_finder",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, respCreateF)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respCreateF.Response.GetCode())
+
+ resp, err = instanceResource.Find(getContext(),
&pb.FindInstancesRequest{
+ ConsumerServiceId: providerId2,
+ AppId: "get_dep_group",
+ ServiceName: "get_dep_finder",
+ VersionRule: "1.0.0+",
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+ assert.Equal(t, nil, deh.Handle())
+
+ respGetC, err =
dep.Dependency().SearchConsumerDependency(getContext(),
&pb.GetDependenciesRequest{
+ ServiceId: providerId2,
+ })
+ assert.NotNil(t, respGetC)
+ assert.NoError(t, err)
+ assert.Equal(t, proto.Response_SUCCESS,
respGetC.Response.GetCode())
+ assert.Equal(t, 1, len(respGetC.Providers))
+ assert.Equal(t, finder1, respGetC.Providers[0].ServiceId)
+ })
+}