blob: c24e1b33a6f0b03d4a6cffddfa7c9b12b1a62504 [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"
"strconv"
"strings"
"testing"
"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/pkg/util"
"github.com/apache/servicecomb-service-center/server/config"
"github.com/apache/servicecomb-service-center/server/core"
pb "github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/pkg/errsvc"
"github.com/stretchr/testify/assert"
)
func TestInstance_Create(t *testing.T) {
var serviceID string
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("create service", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "create_instance_service_ms",
AppId: "create_instance_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID = respCreateService.ServiceId
})
t.Run("register instance", func(t *testing.T) {
respCreateInst, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID,
Endpoints: []string{
"createInstance_ms:127.0.0.1:8080",
},
HostName: "UT-HOST",
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
assert.NotEqual(t, "", respCreateInst.InstanceId)
respCreateInst, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
InstanceId: "customId_ms",
ServiceId: serviceID,
Endpoints: []string{
"createInstance_ms:127.0.0.1:8080",
},
HostName: "UT-HOST",
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
assert.Equal(t, "customId_ms", respCreateInst.InstanceId)
})
t.Run("update the same instance", func(t *testing.T) {
instance := &pb.MicroServiceInstance{
ServiceId: serviceID,
Endpoints: []string{
"sameInstance:127.0.0.1:8080",
},
HostName: "UT-HOST",
Status: pb.MSI_UP,
}
resp, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: instance,
})
assert.NoError(t, err)
resp, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: instance,
})
assert.NoError(t, err)
assert.Equal(t, instance.InstanceId, resp.InstanceId)
})
}
func TestInstance_HeartBeat(t *testing.T) {
var (
serviceID string
instanceID1 string
instanceID2 string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("register service and instance, should pass", func(t *testing.T) {
log.Info("register service")
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "heartbeat_service_ms",
AppId: "heartbeat_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID = respCreateService.ServiceId
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID,
HostName: "UT-HOST-MS",
Endpoints: []string{
"heartbeat:127.0.0.1:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID1 = respCreateInstance.InstanceId
respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID,
HostName: "UT-HOST-MS",
Endpoints: []string{
"heartbeat:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID2 = respCreateInstance.InstanceId
})
t.Run("update a lease", func(t *testing.T) {
log.Info("valid instance")
err := datasource.GetMetadataManager().SendHeartbeat(ctx, &pb.HeartbeatRequest{
ServiceId: serviceID,
InstanceId: instanceID1,
})
assert.NoError(t, err)
log.Info("serviceId does not exist")
err = datasource.GetMetadataManager().SendHeartbeat(ctx, &pb.HeartbeatRequest{
ServiceId: "100000000000",
InstanceId: instanceID1,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
log.Info("instance does not exist")
err = datasource.GetMetadataManager().SendHeartbeat(ctx, &pb.HeartbeatRequest{
ServiceId: serviceID,
InstanceId: "not-exist-ins",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
})
t.Run("batch update lease", func(t *testing.T) {
log.Info("request contains at least 1 instances")
resp, err := datasource.GetMetadataManager().SendManyHeartbeat(ctx, &pb.HeartbeatSetRequest{
Instances: []*pb.HeartbeatSetElement{
{
ServiceId: serviceID,
InstanceId: instanceID1,
},
{
ServiceId: serviceID,
InstanceId: instanceID2,
},
},
})
assert.NoError(t, err)
assert.Equal(t, 2, len(resp.Instances))
})
}
func TestInstance_Update(t *testing.T) {
var (
serviceID string
instanceID string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "update_instance_service_ms",
AppId: "update_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID = respCreateService.ServiceId
registerInstanceRequest := &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID,
Endpoints: []string{
"updateInstance:127.0.0.1:8080",
},
HostName: "UT-HOST-MS",
Status: pb.MSI_UP,
Properties: map[string]string{"nodeIP": "test"},
},
}
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, registerInstanceRequest)
assert.NoError(t, err)
instanceID = respCreateInstance.InstanceId
t.Run("update instance status", func(t *testing.T) {
log.Info("update instance status to DOWN")
err := datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Status: pb.MSI_DOWN,
})
assert.NoError(t, err)
log.Info("update instance status to OUTOFSERVICE")
err = datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Status: pb.MSI_OUTOFSERVICE,
})
assert.NoError(t, err)
log.Info("update instance status to STARTING")
err = datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Status: pb.MSI_STARTING,
})
assert.NoError(t, err)
log.Info("update instance status to TESTING")
err = datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Status: pb.MSI_TESTING,
})
assert.NoError(t, err)
log.Info("update instance status to UP")
err = datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Status: pb.MSI_UP,
})
assert.NoError(t, err)
log.Info("update instance status with a not exist instance")
err = datasource.GetMetadataManager().PutInstanceStatus(ctx, &pb.UpdateInstanceStatusRequest{
ServiceId: serviceID,
InstanceId: "notexistins",
Status: pb.MSI_STARTING,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
})
t.Run("update instance properties", func(t *testing.T) {
log.Info("update one properties")
err := datasource.GetMetadataManager().PutInstanceProperties(ctx,
&pb.UpdateInstancePropsRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Properties: map[string]string{
"test": "test",
},
})
assert.NoError(t, err)
log.Info("all max properties updated")
size := 1000
properties := make(map[string]string, size)
for i := 0; i < size; i++ {
s := strconv.Itoa(i) + strings.Repeat("x", 253)
properties[s] = s
}
err = datasource.GetMetadataManager().PutInstanceProperties(ctx,
&pb.UpdateInstancePropsRequest{
ServiceId: serviceID,
InstanceId: instanceID,
Properties: properties,
})
assert.NoError(t, err)
log.Info("update instance that does not exist")
err = datasource.GetMetadataManager().PutInstanceProperties(ctx,
&pb.UpdateInstancePropsRequest{
ServiceId: serviceID,
InstanceId: "not_exist_ins",
Properties: map[string]string{
"test": "test",
},
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
log.Info("remove properties")
err = datasource.GetMetadataManager().PutInstanceProperties(ctx,
&pb.UpdateInstancePropsRequest{
ServiceId: serviceID,
InstanceId: instanceID,
})
assert.NoError(t, err)
log.Info("update service that does not exist")
err = datasource.GetMetadataManager().PutInstanceProperties(ctx,
&pb.UpdateInstancePropsRequest{
ServiceId: "not_exist_service",
InstanceId: instanceID,
Properties: map[string]string{
"test": "test",
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
})
t.Run("update instance with valid request, should be ok", func(t *testing.T) {
registerInstanceRequest.Instance.HostName = "updated"
err := datasource.GetMetadataManager().PutInstance(ctx, registerInstanceRequest)
assert.NoError(t, err)
resp, err := datasource.GetMetadataManager().GetInstance(ctx, &pb.GetOneInstanceRequest{
ProviderServiceId: serviceID, ProviderInstanceId: instanceID,
})
assert.NoError(t, err)
assert.Equal(t, "updated", resp.Instance.HostName)
})
t.Run("update instance with invalid request, should be failed", func(t *testing.T) {
err := datasource.GetMetadataManager().PutInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: "not-exit-ms",
InstanceId: "not-exist-inst",
},
})
assert.True(t, errsvc.IsErrEqualCode(err, pb.ErrInstanceNotExists))
})
}
func TestInstance_Query(t *testing.T) {
var (
serviceID1 string
serviceID2 string
serviceID3 string
serviceID4 string
serviceID5 string
serviceID6 string
serviceID7 string
serviceID8 string
instanceID1 string
instanceID2 string
instanceID4 string
instanceID5 string
instanceID8 string
)
ctx := getContext()
defer func() {
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID1, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID2, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID3, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID4, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID5, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID6, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID7, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID8, Force: true})
}()
t.Run("register services and instances for testInstance_query", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_instance_ms",
ServiceName: "query_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID1 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_instance_ms",
ServiceName: "query_instance_service_ms",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID2 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_instance_diff_app_ms",
ServiceName: "query_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID3 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
Environment: pb.ENV_PROD,
AppId: "query_instance_ms",
ServiceName: "query_instance_diff_env_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID4 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
Environment: pb.ENV_PROD,
AppId: "default",
ServiceName: "query_instance_shared_provider_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
Properties: map[string]string{
pb.PropAllowCrossApp: "true",
},
},
})
assert.NoError(t, err)
serviceID5 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(
util.SetDomainProject(util.CloneContext(ctx), "user", "user"),
&pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "default",
ServiceName: "query_instance_diff_domain_consumer_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID6 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "default",
ServiceName: "query_instance_shared_consumer_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID7 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_instance_ms",
ServiceName: "query_instance_with_rev_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceID8 = respCreateService.ServiceId
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID1,
HostName: "UT-HOST-MS",
Endpoints: []string{
"find:127.0.0.1:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID1 = respCreateInstance.InstanceId
respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID2,
HostName: "UT-HOST-MS",
Endpoints: []string{
"find:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID2 = respCreateInstance.InstanceId
respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID4,
HostName: "UT-HOST-MS",
Endpoints: []string{
"find:127.0.0.4:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID4 = respCreateInstance.InstanceId
respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID5,
HostName: "UT-HOST-MS",
Endpoints: []string{
"find:127.0.0.5:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID5 = respCreateInstance.InstanceId
respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceID8,
HostName: "UT-HOST-MS",
Endpoints: []string{
"find:127.0.0.8:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceID8 = respCreateInstance.InstanceId
})
t.Run("query instance, should ok", func(t *testing.T) {
respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID1,
AppId: "query_instance_ms",
ServiceName: "query_instance_service_ms",
})
assert.NoError(t, err)
assertInstancesContain(t, respFind.Instances, instanceID1)
assertInstancesContain(t, respFind.Instances, instanceID2)
})
t.Run("query not exist service instance, should failed", func(t *testing.T) {
_, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID1,
AppId: "query_instance_ms",
ServiceName: "not-exist",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("query instance when with consumerID or specify env without consumerID, should ok", func(t *testing.T) {
respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID4,
AppId: "query_instance_ms",
ServiceName: "query_instance_diff_env_service_ms",
})
assert.NoError(t, err)
assert.Equal(t, 1, len(respFind.Instances))
assertInstancesContain(t, respFind.Instances, instanceID4)
respFind, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
Environment: pb.ENV_PROD,
AppId: "query_instance_ms",
ServiceName: "query_instance_diff_env_service_ms",
})
assert.NoError(t, err)
assert.Equal(t, 1, len(respFind.Instances))
assertInstancesContain(t, respFind.Instances, instanceID4)
})
t.Run("query instance with revision, should ok", func(t *testing.T) {
ctx := util.SetContext(ctx, util.CtxNocache, "")
respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID8,
AppId: "query_instance_ms",
ServiceName: "query_instance_with_rev_ms",
})
assert.NoError(t, err)
rev, _ := ctx.Value(util.CtxResponseRevision).(string)
assert.NotEqual(t, 0, len(rev))
assertInstancesContain(t, respFind.Instances, instanceID8)
util.WithRequestRev(ctx, "x")
respFind, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID8,
AppId: "query_instance_ms",
ServiceName: "query_instance_with_rev_ms",
})
assert.NoError(t, err)
assert.Equal(t, ctx.Value(util.CtxResponseRevision), rev)
assertInstancesContain(t, respFind.Instances, instanceID8)
})
t.Run("find should return 200 if consumer is diff apps, should ok", func(t *testing.T) {
respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID3,
AppId: "query_instance_ms",
ServiceName: "query_instance_service_ms",
})
assert.NoError(t, err)
assert.Equal(t, 0, len(respFind.Instances))
})
t.Run("find provider instance but specify tag does not exist, should ok", func(t *testing.T) {
respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID1,
AppId: "query_instance_ms",
ServiceName: "query_instance_service_ms",
Tags: []string{"not_exist_tag"},
})
assert.NoError(t, err)
assert.Equal(t, 0, len(respFind.Instances))
})
t.Run("find global provider instance, should ok", func(t *testing.T) {
config.Server.Config.GlobalVisible = "query_instance_shared_provider_ms"
core.RegisterGlobalServices()
core.Service.Environment = pb.ENV_PROD
respFind, err := datasource.GetMetadataManager().FindInstances(
util.SetTargetDomainProject(
util.SetDomainProject(util.CloneContext(ctx), "user", "user"),
"default", "default"),
&pb.FindInstancesRequest{
ConsumerServiceId: serviceID6,
AppId: "default",
ServiceName: "query_instance_shared_provider_ms",
})
assert.NoError(t, err)
assert.Equal(t, 1, len(respFind.Instances))
assertInstancesContain(t, respFind.Instances, instanceID5)
respFind, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: serviceID7,
AppId: "default",
ServiceName: "query_instance_shared_provider_ms",
})
assert.NoError(t, err)
assert.Equal(t, 1, len(respFind.Instances))
assertInstancesContain(t, respFind.Instances, instanceID5)
log.Info("query same domain deps")
// todo finish ut after implementing ListProviders interface
core.Service.Environment = pb.ENV_DEV
})
t.Run("query instances between diff dimensions", func(t *testing.T) {
log.Info("diff appId")
UTFunc := func(consumerId string, code int32) {
_, err := datasource.GetMetadataManager().ListInstance(ctx, &pb.GetInstancesRequest{
ConsumerServiceId: consumerId,
ProviderServiceId: serviceID2,
})
if code == pb.ResponseSuccess {
assert.NoError(t, err)
return
}
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, code, testErr.Code)
}
UTFunc(serviceID3, pb.ErrServiceNotExists)
UTFunc(serviceID1, pb.ResponseSuccess)
log.Info("diff env")
_, err := datasource.GetMetadataManager().ListInstance(ctx, &pb.GetInstancesRequest{
ConsumerServiceId: serviceID4,
ProviderServiceId: serviceID2,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
}
func assertInstancesContain(t *testing.T, instances []*pb.MicroServiceInstance, instanceId string) {
found := false
for _, instance := range instances {
if instance.InstanceId == instanceId {
found = true
break
}
}
assert.True(t, found)
}
func TestServicesStatistics_Get(t *testing.T) {
var ctx context.Context
var serviceId1 string
var serviceId2 string
t.Run("register services and instances for TestServicesStatistics_Get", func(t *testing.T) {
//service1
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_statistics1",
ServiceName: "service1",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId1 = respCreateService.ServiceId
_, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId1,
HostName: "UT-HOST-MS1",
Endpoints: []string{
"find:127.0.0.1:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
_, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId1,
HostName: "UT-HOST-MS2",
Endpoints: []string{
"find:127.0.0.1:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
//service2
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_statistics2",
ServiceName: "service2-DomainTest1",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId2 = respCreateService.ServiceId
_, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId2,
HostName: "UT-HOST-MS1",
Endpoints: []string{
"find:127.0.0.1:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
})
t.Run("query services statistics", func(t *testing.T) {
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
log.Info("query services default domain statistics")
st, err := datasource.GetMetadataManager().GetOverview(ctx, &pb.GetServicesRequest{})
assert.NoError(t, err)
assert.Equal(t, int64(2), st.Instances.CountByDomain)
log.Info("query services domain statistics")
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
st, err = datasource.GetMetadataManager().GetOverview(ctx, &pb.GetServicesRequest{})
assert.NoError(t, err)
assert.Equal(t, int64(1), st.Instances.CountByDomain)
})
t.Run("delete a service ", func(t *testing.T) {
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
err := datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{
ServiceId: serviceId1,
Force: true,
})
assert.NoError(t, err)
ctx = util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
err = datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{
ServiceId: serviceId2,
Force: true,
})
assert.NoError(t, err)
})
}
func TestInstance_GetOne(t *testing.T) {
var (
serviceId1 string
serviceId2 string
serviceId3 string
instanceId2 string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId1, Force: true})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId2, Force: true})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId3, Force: true})
t.Run("register service and instances", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_instance_ms",
ServiceName: "get_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId1 = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_instance_ms",
ServiceName: "get_instance_service_ms",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId2 = respCreateService.ServiceId
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId2,
HostName: "UT-HOST-MS",
Endpoints: []string{
"get:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceId2 = respCreateInstance.InstanceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_instance_cross_ms",
ServiceName: "get_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId3 = respCreateService.ServiceId
})
t.Run("get one instance when invalid request", func(t *testing.T) {
log.Info("find service itself")
resp, err := datasource.GetMetadataManager().GetInstance(ctx, &pb.GetOneInstanceRequest{
ConsumerServiceId: serviceId2,
ProviderServiceId: serviceId2,
ProviderInstanceId: instanceId2,
})
assert.NoError(t, err)
assert.NotNil(t, resp.Instance)
log.Info("consumer does not exist")
_, err = datasource.GetMetadataManager().GetInstance(ctx, &pb.GetOneInstanceRequest{
ConsumerServiceId: "not-exist-id-ms",
ProviderServiceId: serviceId2,
ProviderInstanceId: instanceId2,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("get between diff apps", func(t *testing.T) {
_, err := datasource.GetMetadataManager().GetInstance(ctx, &pb.GetOneInstanceRequest{
ConsumerServiceId: serviceId3,
ProviderServiceId: serviceId2,
ProviderInstanceId: instanceId2,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
_, err = datasource.GetMetadataManager().ListInstance(ctx, &pb.GetInstancesRequest{
ConsumerServiceId: serviceId3,
ProviderServiceId: serviceId2,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("get instances when request is invalid", func(t *testing.T) {
log.Info("consumer does not exist")
resp, err := datasource.GetMetadataManager().ListInstance(ctx, &pb.GetInstancesRequest{
ConsumerServiceId: "not-exist-service-ms",
ProviderServiceId: serviceId2,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
log.Info("consumer does not exist")
resp, err = datasource.GetMetadataManager().ListInstance(ctx, &pb.GetInstancesRequest{
ConsumerServiceId: serviceId1,
ProviderServiceId: serviceId2,
})
assert.NoError(t, err)
assert.NotNil(t, resp)
})
}
func TestInstance_GetAll(t *testing.T) {
t.Run("register 2 instances, get all instances count should return 2", func(t *testing.T) {
var (
serviceId1 string
serviceId2 string
)
ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "TestInstance_GetAll", "1"))
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_instance_ms",
ServiceName: "get_instance_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId1 = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId1, Force: true})
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_instance_ms",
ServiceName: "get_instance_service_ms",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId2 = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId2, Force: true})
_, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId1,
HostName: "UT-HOST-MS",
Endpoints: []string{
"get:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
_, err = datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId2,
HostName: "UT-HOST-MS",
Endpoints: []string{
"get:127.0.0.3:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
respAll, err := datasource.GetMetadataManager().ListManyInstances(ctx, &pb.GetAllInstancesRequest{})
assert.NoError(t, err)
assert.Equal(t, 2, len(respAll.Instances))
})
t.Run("domain contain no instances, get all instances should be pass, return 0 instance", func(t *testing.T) {
ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "TestInstance_GetAll", "2"))
respAll, err := datasource.GetMetadataManager().ListManyInstances(ctx, &pb.GetAllInstancesRequest{})
assert.NoError(t, err)
assert.Equal(t, 0, len(respAll.Instances))
})
}
func TestInstance_Unregister(t *testing.T) {
var (
serviceId string
instanceId string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
t.Run("register service and instances", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "unregister_instance_ms",
ServiceName: "unregister_instance_service_ms",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
Tags: map[string]string{
"test": "test",
},
})
assert.NoError(t, err)
serviceId = respCreateService.ServiceId
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId,
HostName: "UT-HOST-MS",
Endpoints: []string{
"unregister:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceId = respCreateInstance.InstanceId
})
t.Run("unregister instance", func(t *testing.T) {
err := datasource.GetMetadataManager().UnregisterInstance(ctx, &pb.UnregisterInstanceRequest{
ServiceId: serviceId,
InstanceId: instanceId,
})
assert.NoError(t, err)
})
t.Run("unregister instance when request is invalid", func(t *testing.T) {
log.Info("service id does not exist")
err := datasource.GetMetadataManager().UnregisterInstance(ctx, &pb.UnregisterInstanceRequest{
ServiceId: "not-exist-id-ms",
InstanceId: instanceId,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
log.Info("instance id does not exist")
err = datasource.GetMetadataManager().UnregisterInstance(ctx, &pb.UnregisterInstanceRequest{
ServiceId: serviceId,
InstanceId: "not-exist-id-ms",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInstanceNotExists, testErr.Code)
})
}
func TestInstance_Exist(t *testing.T) {
var (
serviceId string
instanceId string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
t.Run("register service and instance", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "check_exist_instance_ms",
ServiceName: "check_exist_instance_service_ms",
Version: "1.0.5",
Level: "FRONT",
Status: pb.MS_UP,
},
Tags: map[string]string{
"test": "test",
},
})
assert.NoError(t, err)
serviceId = respCreateService.ServiceId
respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: serviceId,
HostName: "UT-HOST-MS",
Endpoints: []string{
"checkExist:127.0.0.2:8080",
},
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
instanceId = respCreateInstance.InstanceId
})
t.Run("the check instance should exist", func(t *testing.T) {
respCheckInstance, err := datasource.GetMetadataManager().ExistInstance(ctx, &pb.MicroServiceInstanceKey{
ServiceId: serviceId,
InstanceId: instanceId,
})
assert.NoError(t, err)
assert.True(t, respCheckInstance.Exist)
})
t.Run("unregister instance", func(t *testing.T) {
err := datasource.GetMetadataManager().UnregisterInstance(ctx, &pb.UnregisterInstanceRequest{
ServiceId: serviceId,
InstanceId: instanceId,
})
assert.NoError(t, err)
})
t.Run("The check instance should not exist", func(t *testing.T) {
resp, err := datasource.GetMetadataManager().ExistInstance(ctx, &pb.MicroServiceInstanceKey{
ServiceId: serviceId,
InstanceId: instanceId,
})
assert.NoError(t, err)
assert.False(t, resp.Exist)
})
t.Run("unregister service", func(t *testing.T) {
err := datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{
ServiceId: serviceId,
})
assert.NoError(t, err)
})
}