blob: 6dcc7e23e6493f17971214b2079291889ca89f23 [file] [log] [blame]
/*
* 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/stretchr/testify/assert"
)
func Test_Create(t *testing.T) {
var (
consumerId1 string
consumerId2 string
consumerId3 string
)
t.Run("create service, should be passed", func(t *testing.T) {
resp, err := datasource.Instance().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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
consumerId1 = resp.ServiceId
resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "dep_create_dep_group",
ServiceName: "dep_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, pb.ResponseSuccess, resp.Response.GetCode())
consumerId3 = resp.ServiceId
resp, err = datasource.Instance().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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
consumerId2 = resp.ServiceId
resp, err = datasource.Instance().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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
resp, err = datasource.Instance().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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
resp, err = datasource.Instance().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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
})
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",
Version: "1.0.0",
},
}
// consumer does not exist
resp, err := datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: &pb.MicroServiceKey{
AppId: "noexistapp",
ServiceName: "noexistservice",
Version: "1.0.0",
},
Providers: providers,
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ErrServiceNotExists, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
// provider in diff env
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
Environment: pb.ENV_PROD,
AppId: "dep_service_group_provider",
ServiceName: "dep_service_name_provider",
Version: "latest",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
//consumer in diff env
consumer.Environment = pb.ENV_PROD
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_service_group_provider",
ServiceName: "dep_service_name_provider",
Version: "latest",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respCon, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respCon)
assert.NoError(t, err)
assert.Equal(t, 0, len(respCon.Providers))
respCon, err = datasource.Instance().SearchConsumerDependency(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",
}
// add latest
resp, err := datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_create_dep_group",
ServiceName: "dep_create_dep_provider",
Version: "latest",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respPro, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
assert.NotEqual(t, 0, len(respPro.Providers))
assert.Equal(t, "1.0.1", respPro.Providers[0].Version)
// add 1.0.0+
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_create_dep_group",
ServiceName: "dep_create_dep_provider",
Version: "1.0.0+",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
assert.Equal(t, 2, len(respPro.Providers))
// add *
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: &pb.MicroServiceKey{
ServiceName: "dep_create_dep_consumer_all",
AppId: "dep_create_dep_group",
Version: "1.0.0",
},
Providers: []*pb.MicroServiceKey{
{
ServiceName: "*",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId3,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
// clean all
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: &pb.MicroServiceKey{
ServiceName: "dep_create_dep_consumer_all",
AppId: "dep_create_dep_group",
Version: "1.0.0",
},
Providers: nil,
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
// add multiple providers
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_create_dep_group",
ServiceName: "dep_create_dep_provider",
Version: "1.0.0",
},
{
ServiceName: "*",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
// add 1.0.0-2.0.0 to override *
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_create_dep_group",
ServiceName: "dep_create_dep_provider",
Version: "1.0.0-1.0.1",
},
},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
assert.Equal(t, "1.0.0", respPro.Providers[0].Version)
// add not override
respAdd, err := datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{
{
AppId: "dep_create_dep_group",
ServiceName: "dep_create_dep_provider",
Version: "1.0.0-3.0.0",
},
},
},
}, false)
assert.NotNil(t, respAdd)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respAdd.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
// add provider is empty
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
Providers: []*pb.MicroServiceKey{},
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
resp, err = datasource.Instance().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
{
Consumer: consumer,
},
}, false)
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respPro)
assert.NoError(t, err)
})
}
func Test_Get(t *testing.T) {
var (
consumerId1 string
providerId1 string
providerId2 string
)
t.Run("should be passed", func(t *testing.T) {
resp, err := datasource.Instance().RegisterService(depGetContext(), &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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
consumerId1 = resp.ServiceId
resp, err = datasource.Instance().RegisterService(depGetContext(), &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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
providerId1 = resp.ServiceId
resp, err = datasource.Instance().RegisterService(depGetContext(), &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)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
providerId2 = resp.ServiceId
})
t.Run("when request is valid, should be passed", func(t *testing.T) {
//get provider
resp, err := datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: providerId1,
})
assert.NotNil(t, resp)
assert.NoError(t, err)
//get consumer
resp, err = datasource.Instance().SearchProviderDependency(depGetContext(), &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.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
ConsumerServiceId: consumerId1,
AppId: "dep_get_dep_group",
ServiceName: "dep_get_dep_provider",
VersionRule: "1.0.0+",
})
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
// get consumer's deps
respGetP, err := datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: providerId1,
})
assert.NotNil(t, respGetP)
assert.NoError(t, err)
// get provider's deps
respGetC, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
})
assert.NotNil(t, respGetC)
assert.NoError(t, err)
// get self deps
resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
ConsumerServiceId: consumerId1,
AppId: "dep_get_dep_group",
ServiceName: "dep_get_dep_consumer",
VersionRule: "1.0.0+",
})
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: consumerId1,
NoSelf: true,
})
assert.NotNil(t, respGetC)
assert.NoError(t, err)
// find before provider register
resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
ConsumerServiceId: providerId2,
AppId: "dep_get_dep_group",
ServiceName: "dep_get_dep_finder",
VersionRule: "1.0.0+",
})
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
respCreateF, err := datasource.Instance().RegisterService(depGetContext(), &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)
assert.Equal(t, pb.ResponseSuccess, respCreateF.Response.GetCode())
finder1 := respCreateF.ServiceId
resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
ConsumerServiceId: providerId2,
AppId: "dep_get_dep_group",
ServiceName: "dep_get_dep_finder",
VersionRule: "1.0.0+",
})
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: providerId2,
})
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
respDelP, err := datasource.Instance().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{
ServiceId: finder1, Force: true,
})
assert.NotNil(t, respDelP)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respDelP.Response.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: providerId2,
})
assert.NotNil(t, respGetC)
assert.NoError(t, err)
assert.Equal(t, 0, len(respGetC.Providers))
respCreateF, err = datasource.Instance().RegisterService(depGetContext(), &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)
assert.Equal(t, pb.ResponseSuccess, respCreateF.Response.GetCode())
resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
ConsumerServiceId: providerId2,
AppId: "dep_get_dep_group",
ServiceName: "dep_get_dep_finder",
VersionRule: "1.0.0+",
})
assert.NotNil(t, resp)
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
err = datasource.Instance().DependencyHandle(getContext())
assert.NoError(t, err)
respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
ServiceId: providerId2,
})
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"))
}