| /* |
| * 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 datasource_test |
| |
| import ( |
| "context" |
| "testing" |
| |
| "github.com/apache/servicecomb-service-center/datasource" |
| "github.com/apache/servicecomb-service-center/pkg/util" |
| pb "github.com/go-chassis/cari/discovery" |
| "github.com/go-chassis/cari/pkg/errsvc" |
| "github.com/stretchr/testify/assert" |
| ) |
| |
| func Test_Create(t *testing.T) { |
| var ( |
| consumerId1 string |
| consumerId2 string |
| ) |
| resp, err := datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_consumer", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| consumerId1 = resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: consumerId1, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| Environment: pb.ENV_PROD, |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_consumer", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| consumerId2 = resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: consumerId2, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| providerId1 := resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: providerId1, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| Version: "1.0.1", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| providerId2 := resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: providerId2, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider_other", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| providerId3 := resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: providerId3, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| Environment: pb.ENV_PROD, |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| providerId4 := resp.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{ServiceId: providerId4, Force: true}) |
| |
| t.Run("add dep and search when request is invalid, should be failed", func(t *testing.T) { |
| consumer := &pb.MicroServiceKey{ |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_consumer", |
| Version: "1.0.0", |
| } |
| providers := []*pb.MicroServiceKey{ |
| { |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| }, |
| } |
| |
| // consumer does not exist |
| err := datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: &pb.MicroServiceKey{ |
| AppId: "noexistapp", |
| ServiceName: "noexistservice", |
| Version: "1.0.0", |
| }, |
| Providers: providers, |
| }, |
| }, false) |
| testErr := err.(*errsvc.Error) |
| assert.Error(t, testErr) |
| assert.Equal(t, pb.ErrServiceNotExists, testErr.Code) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| // provider in diff env |
| err = datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: []*pb.MicroServiceKey{ |
| { |
| Environment: pb.ENV_PROD, |
| AppId: "dep_service_group_provider", |
| ServiceName: "dep_service_name_provider", |
| }, |
| }, |
| }, |
| }, false) |
| assert.NoError(t, err) |
| |
| //consumer in diff env |
| consumer.Environment = pb.ENV_PROD |
| err = datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: []*pb.MicroServiceKey{ |
| { |
| AppId: "dep_service_group_provider", |
| ServiceName: "dep_service_name_provider", |
| }, |
| }, |
| }, |
| }, false) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respCon, err := datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respCon) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(respCon.Providers)) |
| |
| respCon, err = datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId2, |
| }) |
| assert.NotNil(t, respCon) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(respCon.Providers)) |
| }) |
| |
| t.Run("add dep and search when request is valid, should be passed", func(t *testing.T) { |
| consumer := &pb.MicroServiceKey{ |
| ServiceName: "dep_create_dep_consumer", |
| AppId: "dep_create_dep_group", |
| Version: "1.0.0", |
| } |
| |
| err := datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: []*pb.MicroServiceKey{ |
| { |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| }, |
| }, |
| }, |
| }, false) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respPro, err := datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respPro) |
| assert.NoError(t, err) |
| assert.Equal(t, 2, len(respPro.Providers)) |
| |
| // add multiple providers |
| err = datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: []*pb.MicroServiceKey{ |
| { |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| }, |
| { |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider_other", |
| }, |
| }, |
| }, |
| }, false) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respPro, err = datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respPro) |
| assert.NoError(t, err) |
| assert.Equal(t, 3, len(respPro.Providers)) |
| |
| // override |
| err = datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: []*pb.MicroServiceKey{ |
| { |
| AppId: "dep_create_dep_group", |
| ServiceName: "dep_create_dep_provider", |
| }, |
| }, |
| }, |
| }, true) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respPro, err = datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respPro) |
| assert.NoError(t, err) |
| assert.Equal(t, 2, len(respPro.Providers)) |
| |
| // clean all |
| err = datasource.GetDependencyManager().PutDependencies(depGetContext(), []*pb.ConsumerDependency{ |
| { |
| Consumer: consumer, |
| Providers: nil, |
| }, |
| }, true) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respPro, err = datasource.GetDependencyManager().ListProviders(depGetContext(), &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respPro) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(respPro.Providers)) |
| }) |
| } |
| |
| func Test_Get(t *testing.T) { |
| var ( |
| consumerId1 string |
| consumerId2 string |
| providerId1 string |
| ) |
| ctx := depGetContext() |
| defer func() { |
| datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: consumerId1, Force: true}) |
| datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: consumerId2, Force: true}) |
| datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: providerId1, Force: true}) |
| }() |
| |
| t.Run("should be passed", func(t *testing.T) { |
| resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_consumer", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| consumerId1 = resp.ServiceId |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_provider", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| providerId1 = resp.ServiceId |
| |
| resp, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_provider", |
| Version: "2.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| consumerId2 = resp.ServiceId |
| }) |
| |
| t.Run("when request is valid, should be passed", func(t *testing.T) { |
| //get provider |
| resp, err := datasource.GetDependencyManager().ListConsumers(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: providerId1, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| |
| //get consumer |
| resp, err = datasource.GetDependencyManager().ListConsumers(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| }) |
| |
| t.Run("when after finding instance, should created dependencies between C and P", func(t *testing.T) { |
| // find provider |
| resp, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{ |
| ConsumerServiceId: consumerId1, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_provider", |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| // get consumer's deps |
| respGetP, err := datasource.GetDependencyManager().ListConsumers(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: providerId1, |
| }) |
| assert.NotNil(t, respGetP) |
| assert.NoError(t, err) |
| |
| // get provider's deps |
| respGetC, err := datasource.GetDependencyManager().ListProviders(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| }) |
| assert.NotNil(t, respGetC) |
| assert.NoError(t, err) |
| |
| // get self deps |
| resp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{ |
| ConsumerServiceId: consumerId1, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_consumer", |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respGetC, err = datasource.GetDependencyManager().ListProviders(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId1, |
| NoSelf: true, |
| }) |
| assert.NotNil(t, respGetC) |
| assert.NoError(t, err) |
| |
| // find before provider register |
| resp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{ |
| ConsumerServiceId: consumerId2, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_finder", |
| }) |
| testErr := err.(*errsvc.Error) |
| assert.Error(t, testErr) |
| assert.Equal(t, pb.ErrServiceNotExists, testErr.Code) |
| |
| respCreateF, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_finder", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, respCreateF) |
| assert.NoError(t, err) |
| finder1 := respCreateF.ServiceId |
| defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: finder1, Force: true}) |
| |
| resp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{ |
| ConsumerServiceId: consumerId2, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_finder", |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respGetC, err = datasource.GetDependencyManager().ListProviders(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId2, |
| }) |
| assert.NotNil(t, respGetC) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(respGetC.Providers)) |
| assert.Equal(t, finder1, respGetC.Providers[0].ServiceId) |
| |
| // find after delete micro service |
| err = datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ |
| ServiceId: finder1, Force: true, |
| }) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respGetC, err = datasource.GetDependencyManager().ListProviders(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId2, |
| }) |
| assert.NotNil(t, respGetC) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(respGetC.Providers)) |
| |
| respCreateF, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{ |
| Service: &pb.MicroService{ |
| ServiceId: finder1, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_finder", |
| Version: "1.0.0", |
| Level: "FRONT", |
| Status: pb.MS_UP, |
| }, |
| }) |
| assert.NotNil(t, respCreateF) |
| assert.NoError(t, err) |
| |
| resp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{ |
| ConsumerServiceId: consumerId2, |
| AppId: "dep_get_dep_group", |
| ServiceName: "dep_get_dep_finder", |
| }) |
| assert.NotNil(t, resp) |
| assert.NoError(t, err) |
| |
| err = datasource.GetDependencyManager().DependencyHandle(getContext()) |
| assert.NoError(t, err) |
| |
| respGetC, err = datasource.GetDependencyManager().ListProviders(ctx, &pb.GetDependenciesRequest{ |
| ServiceId: consumerId2, |
| }) |
| assert.NotNil(t, respGetC) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(respGetC.Providers)) |
| assert.Equal(t, finder1, respGetC.Providers[0].ServiceId) |
| }) |
| } |
| |
| func depGetContext() context.Context { |
| return util.WithNoCache(util.SetDomainProject(context.Background(), "new_default", "new_default")) |
| } |
| |
| func TestParamsChecker(t *testing.T) { |
| p := datasource.ParamsChecker(nil, nil) |
| assert.Nil(t, p) |
| |
| p = datasource.ParamsChecker(&pb.MicroServiceKey{ |
| AppId: "a", |
| ServiceName: "b", |
| Version: "1.0.0", |
| }, nil) |
| assert.Nil(t, p) |
| |
| producer := &pb.MicroServiceKey{ServiceName: "*"} |
| p = datasource.ParamsChecker(&pb.MicroServiceKey{ |
| AppId: "a", |
| ServiceName: "b", |
| Version: "1.0.0", |
| }, []*pb.MicroServiceKey{ |
| producer, |
| }) |
| assert.Nil(t, p) |
| assert.Equal(t, "a", producer.AppId) |
| assert.Equal(t, "0.0.0+", producer.Version) |
| |
| producer.ServiceName = "a" |
| producer.Version = "1" |
| p = datasource.ParamsChecker(&pb.MicroServiceKey{ |
| AppId: "a", |
| ServiceName: "b", |
| Version: "1.0.0", |
| }, []*pb.MicroServiceKey{ |
| producer, |
| }) |
| assert.Nil(t, p) |
| assert.Equal(t, "0.0.0+", producer.Version) |
| |
| p = datasource.ParamsChecker(&pb.MicroServiceKey{ |
| AppId: "a", |
| ServiceName: "b", |
| Version: "1.0.0", |
| }, []*pb.MicroServiceKey{ |
| {}, |
| }) |
| testErr := p.(*errsvc.Error) |
| assert.NotNil(t, testErr) |
| assert.Equal(t, pb.ErrInvalidParams, testErr.Code) |
| |
| p = datasource.ParamsChecker(&pb.MicroServiceKey{ |
| AppId: "a", |
| ServiceName: "b", |
| Version: "1.0.0", |
| }, []*pb.MicroServiceKey{ |
| {ServiceName: "a", Version: "1"}, |
| {ServiceName: "a", Version: "1"}, |
| }) |
| testErr = p.(*errsvc.Error) |
| assert.NotNil(t, testErr) |
| assert.Equal(t, pb.ErrInvalidParams, testErr.Code) |
| } |