blob: 44a6cfd31f99f648f43b5634d523d966b062e460 [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 (
"strconv"
"strings"
"testing"
"github.com/apache/servicecomb-service-center/datasource"
quotasvc "github.com/apache/servicecomb-service-center/server/service/quota"
"github.com/go-chassis/cari/pkg/errsvc"
"github.com/apache/servicecomb-service-center/pkg/log"
pb "github.com/go-chassis/cari/discovery"
"github.com/stretchr/testify/assert"
)
func TestTags_Add(t *testing.T) {
var (
serviceId1 string
)
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId1, Force: true})
// create service
t.Run("create service", func(t *testing.T) {
svc1 := &pb.MicroService{
AppId: "create_tag_group_ms",
ServiceName: "create_tag_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc1,
})
assert.NoError(t, err)
assert.NotEqual(t, "", resp.ServiceId)
serviceId1 = resp.ServiceId
})
t.Run("the request is invalid", func(t *testing.T) {
err := datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: "noServiceTest",
Tags: map[string]string{
"a": "test",
},
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("the request is valid", func(t *testing.T) {
log.Info("tag quota is equal to the default value and should be paas")
defaultQuota := int(quotasvc.TagQuota())
tags := make(map[string]string, defaultQuota)
for i := 0; i < defaultQuota; i++ {
s := "tag" + strconv.Itoa(i)
tags[s] = s
}
err := datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: serviceId1,
Tags: tags,
})
assert.NoError(t, err)
})
}
func TestTags_Get(t *testing.T) {
var serviceId string
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
t.Run("create service and add tags", func(t *testing.T) {
svc := &pb.MicroService{
AppId: "get_tag_group_ms",
ServiceName: "get_tag_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
serviceId = resp.ServiceId
log.Info("add tags should be passed")
err = datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: serviceId,
Tags: map[string]string{
"a": "test",
"b": "b",
},
})
assert.NoError(t, err)
})
t.Run("the request is invalid", func(t *testing.T) {
log.Info("service does not exists")
_, err := datasource.GetMetadataManager().ListTag(ctx, &pb.GetServiceTagsRequest{
ServiceId: "noThisService",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
log.Info("service's id is empty")
_, err = datasource.GetMetadataManager().ListTag(ctx, &pb.GetServiceTagsRequest{
ServiceId: "",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
log.Info("service's id is invalid")
_, err = datasource.GetMetadataManager().ListTag(ctx, &pb.GetServiceTagsRequest{
ServiceId: strings.Repeat("x", 65),
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("the request is valid", func(t *testing.T) {
resp, err := datasource.GetMetadataManager().ListTag(ctx, &pb.GetServiceTagsRequest{
ServiceId: serviceId,
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
assert.Equal(t, "test", resp.Tags["a"])
})
}
func TestTag_Update(t *testing.T) {
var serviceId string
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
t.Run("add service and add tags", func(t *testing.T) {
svc := &pb.MicroService{
AppId: "update_tag_group_ms",
ServiceName: "update_tag_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
serviceId = resp.ServiceId
log.Info("add tags")
err = datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: serviceId,
Tags: map[string]string{
"a": "test",
"b": "b",
},
})
assert.NoError(t, err)
})
t.Run("the request is invalid", func(t *testing.T) {
log.Info("service does not exists")
err := datasource.GetMetadataManager().PutTag(ctx, &pb.UpdateServiceTagRequest{
ServiceId: "noneservice",
Key: "a",
Value: "update",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
log.Info("tag key does not exist")
err = datasource.GetMetadataManager().PutTag(ctx, &pb.UpdateServiceTagRequest{
ServiceId: serviceId,
Key: "notexisttag",
Value: "update",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrTagNotExists, testErr.Code)
log.Info("tag key is invalid")
err = datasource.GetMetadataManager().PutTag(ctx, &pb.UpdateServiceTagRequest{
ServiceId: serviceId,
Key: strings.Repeat("x", 65),
Value: "v",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrTagNotExists, testErr.Code)
})
t.Run("the request is valid", func(t *testing.T) {
err := datasource.GetMetadataManager().PutTag(ctx, &pb.UpdateServiceTagRequest{
ServiceId: serviceId,
Key: "a",
Value: "update",
})
assert.NoError(t, err)
})
t.Run("find instance, contain tag", func(t *testing.T) {
log.Info("create consumer")
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "find_inst_tag_group_ms",
ServiceName: "find_inst_tag_consumer_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
consumerId := resp.ServiceId
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: consumerId, Force: true})
log.Info("create provider")
resp, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "find_inst_tag_group_ms",
ServiceName: "find_inst_tag_provider_ms",
Version: "1.0.1",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
providerId := resp.ServiceId
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: providerId, Force: true})
log.Info("tag the provider")
err = datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: providerId,
Tags: map[string]string{"filter_tag": "filter"},
})
assert.NoError(t, err)
log.Info("add instance to provider")
instanceResp, err := datasource.GetMetadataManager().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
Instance: &pb.MicroServiceInstance{
ServiceId: providerId,
Endpoints: []string{
"findInstanceForTagFilter:127.0.0.1:8080",
},
HostName: "UT-HOST",
Status: pb.MSI_UP,
},
})
assert.NoError(t, err)
log.Info("find instance")
findResp, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: consumerId,
AppId: "find_inst_tag_group_ms",
ServiceName: "find_inst_tag_provider_ms",
Tags: []string{"not-exist-tag"},
})
assert.NoError(t, err)
assert.Equal(t, 0, len(findResp.Instances))
findResp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: consumerId,
AppId: "find_inst_tag_group_ms",
ServiceName: "find_inst_tag_provider_ms",
Tags: []string{"filter_tag"},
})
assert.NoError(t, err)
assert.Equal(t, instanceResp.InstanceId, findResp.Instances[0].InstanceId)
// no add rules
log.Info("add tags")
err = datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: consumerId,
Tags: map[string]string{"consumer_tag": "filter"},
})
assert.NoError(t, err)
findResp, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
ConsumerServiceId: consumerId,
AppId: "find_inst_tag_group_ms",
ServiceName: "find_inst_tag_provider_ms",
Tags: []string{"filter_tag"},
})
assert.NoError(t, err)
})
}
func TestTags_Delete(t *testing.T) {
var serviceId string
ctx := getContext()
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
t.Run("create service and add tags", func(t *testing.T) {
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "delete_tag_group_ms",
ServiceName: "delete_tag_service_ms",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
serviceId = resp.ServiceId
err = datasource.GetMetadataManager().PutManyTags(ctx, &pb.AddServiceTagsRequest{
ServiceId: serviceId,
Tags: map[string]string{
"a": "test",
"b": "b",
},
})
assert.NoError(t, err)
})
t.Run("the request is invalid", func(t *testing.T) {
log.Info("service does not exits")
err := datasource.GetMetadataManager().DeleteManyTags(ctx, &pb.DeleteServiceTagsRequest{
ServiceId: "noneservice",
Keys: []string{"a", "b"},
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
log.Info("tag key does not exits")
err = datasource.GetMetadataManager().DeleteManyTags(ctx, &pb.DeleteServiceTagsRequest{
ServiceId: serviceId,
Keys: []string{"c"},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrTagNotExists, testErr.Code)
})
t.Run("the request is valid", func(t *testing.T) {
err := datasource.GetMetadataManager().DeleteManyTags(ctx, &pb.DeleteServiceTagsRequest{
ServiceId: serviceId,
Keys: []string{"a", "b"},
})
assert.NoError(t, err)
respGetTags, err := datasource.GetMetadataManager().ListTag(ctx, &pb.GetServiceTagsRequest{
ServiceId: serviceId,
})
assert.NoError(t, err)
assert.Equal(t, "", respGetTags.Tags["a"])
})
}