You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/08/02 12:50:25 UTC
[servicecomb-service-center] branch master updated: Change: Remove
RULE management (#1124)
This is an automated email from the ASF dual-hosted git repository.
tianxiaoliang 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 3197131 Change: Remove RULE management (#1124)
3197131 is described below
commit 31971311e7c870e1261abff14e5ecbc9f3fd8084
Author: little-cui <su...@qq.com>
AuthorDate: Mon Aug 2 20:50:18 2021 +0800
Change: Remove RULE management (#1124)
---
datasource/cache/ms_cache.go | 25 -
datasource/etcd/event/event.go | 1 -
datasource/etcd/event/instance_event_handler.go | 2 +-
datasource/etcd/event/rule_event_handler.go | 129 ----
datasource/etcd/kv/kv.go | 2 -
datasource/etcd/kv/types.go | 8 -
datasource/etcd/ms.go | 330 +--------
datasource/etcd/sd/servicecenter/aggregate.go | 2 -
datasource/etcd/sd/servicecenter/syncer.go | 8 -
datasource/etcd/system.go | 2 -
datasource/etcd/util.go | 10 -
datasource/etcd/util/dependency_test.go | 7 -
datasource/etcd/util/dependency_util.go | 70 --
datasource/etcd/util/rule_util.go | 222 +-----
datasource/etcd/util/rule_util_test.go | 200 +-----
datasource/mongo/client/dao/rule.go | 93 ---
datasource/mongo/client/dao/schema.go | 10 +
datasource/mongo/client/model/types.go | 14 -
datasource/mongo/db.go | 8 -
datasource/mongo/dep_util.go | 33 +-
datasource/mongo/event/instance_event_handler.go | 2 +-
datasource/mongo/ms.go | 328 +--------
datasource/mongo/rule_util.go | 84 ---
datasource/mongo/rule_util_test.go | 55 --
datasource/mongo/sd/rule_cache.go | 163 -----
datasource/mongo/sd/types.go | 1 -
datasource/mongo/sd/typestore.go | 1 -
datasource/mongo/util/db.go | 36 -
datasource/ms.go | 6 -
datasource/rule_test.go | 554 ---------------
docs/openapi/v4.yaml | 162 -----
etc/conf/app.yaml | 2 -
integration/rules_test.go | 527 ---------------
pkg/dump/dump.go | 45 +-
pkg/proto/service.go | 4 -
server/plugin/quota/buildin/buildin.go | 6 +-
server/plugin/quota/quota.go | 10 +-
server/rest/controller/v3/query_rule_controller.go | 37 -
server/rest/controller/v3/v3.go | 1 -
server/rest/controller/v4/query_rule_controller.go | 118 ----
server/rest/controller/v4/v4.go | 1 -
server/service/disco/microservice.go | 22 +-
server/service/disco/microservice_test.go | 9 +-
server/service/disco/rule.go | 80 ---
server/service/disco/rule_test.go | 750 ---------------------
server/service/disco/tag_test.go | 50 +-
server/service/quota/quota.go | 10 -
server/service/validator/rule_validator.go | 72 --
server/service/validator/validator.go | 8 -
49 files changed, 40 insertions(+), 4280 deletions(-)
diff --git a/datasource/cache/ms_cache.go b/datasource/cache/ms_cache.go
index d9a2f1e..5325546 100644
--- a/datasource/cache/ms_cache.go
+++ b/datasource/cache/ms_cache.go
@@ -84,31 +84,6 @@ func transCacheToInsts(cache []interface{}) ([]*discovery.MicroServiceInstance,
return res, true
}
-func GetRulesByServiceID(serviceID string) ([]*model.Rule, bool) {
- cacheRes := sd.Store().Rule().Cache().GetValue(serviceID)
- return transCacheToRules(cacheRes)
-}
-
-func transCacheToRules(cacheRules []interface{}) ([]*model.Rule, bool) {
- res := make([]*model.Rule, 0, len(cacheRules))
- for _, v := range cacheRules {
- t, ok := v.(model.Rule)
- if !ok {
- return nil, false
- }
- res = append(res, &model.Rule{
- Domain: t.Domain,
- Project: t.Project,
- ServiceID: t.ServiceID,
- Rule: t.Rule,
- })
- }
- if len(res) == 0 {
- return nil, false
- }
- return res, true
-}
-
func GetServiceByID(ctx context.Context, serviceID string) (*model.Service, bool) {
if util.NoCache(ctx) {
return nil, false
diff --git a/datasource/etcd/event/event.go b/datasource/etcd/event/event.go
index 92c00fa..30a32a2 100644
--- a/datasource/etcd/event/event.go
+++ b/datasource/etcd/event/event.go
@@ -24,7 +24,6 @@ import (
func Initialize() {
sd.AddEventHandler(NewServiceEventHandler())
sd.AddEventHandler(NewInstanceEventHandler())
- sd.AddEventHandler(NewRuleEventHandler())
sd.AddEventHandler(NewTagEventHandler())
sd.AddEventHandler(NewDependencyEventHandler())
sd.AddEventHandler(NewDependencyRuleEventHandler())
diff --git a/datasource/etcd/event/instance_event_handler.go b/datasource/etcd/event/instance_event_handler.go
index ce7f9a1..93d1bd5 100644
--- a/datasource/etcd/event/instance_event_handler.go
+++ b/datasource/etcd/event/instance_event_handler.go
@@ -95,7 +95,7 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) {
providerInstanceID, instance.Endpoints)
// 查询所有consumer
- consumerIDs, _, err := serviceUtil.GetAllConsumerIds(ctx, domainProject, ms)
+ consumerIDs, err := serviceUtil.GetConsumerIds(ctx, domainProject, ms)
if err != nil {
log.Errorf(err, "get service[%s][%s/%s/%s/%s]'s consumerIDs failed",
providerID, ms.Environment, ms.AppId, ms.ServiceName, ms.Version)
diff --git a/datasource/etcd/event/rule_event_handler.go b/datasource/etcd/event/rule_event_handler.go
deleted file mode 100644
index 9955f23..0000000
--- a/datasource/etcd/event/rule_event_handler.go
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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 event
-
-import (
- "context"
- "errors"
- "fmt"
-
- pb "github.com/go-chassis/cari/discovery"
-
- "github.com/apache/servicecomb-service-center/datasource"
- "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
- "github.com/apache/servicecomb-service-center/datasource/etcd/path"
- "github.com/apache/servicecomb-service-center/datasource/etcd/sd"
- serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util"
- "github.com/apache/servicecomb-service-center/pkg/log"
- "github.com/apache/servicecomb-service-center/pkg/task"
- "github.com/apache/servicecomb-service-center/pkg/util"
- "github.com/apache/servicecomb-service-center/server/event"
-)
-
-type RulesChangedTask struct {
- sd.KvEvent
-
- key string
- err error
-
- DomainProject string
- ProviderID string
-}
-
-func (apt *RulesChangedTask) Key() string {
- return apt.key
-}
-
-func (apt *RulesChangedTask) Do(ctx context.Context) error {
- apt.err = apt.publish(ctx, apt.DomainProject, apt.ProviderID)
- return apt.err
-}
-
-func (apt *RulesChangedTask) Err() error {
- return apt.err
-}
-
-func (apt *RulesChangedTask) publish(ctx context.Context, domainProject, providerID string) error {
- ctx = util.WithGlobal(util.WithCacheOnly(ctx))
-
- provider, err := serviceUtil.GetService(ctx, domainProject, providerID)
- if err != nil {
- if errors.Is(err, datasource.ErrNoData) {
- log.Debug(fmt.Sprintf("provider[%s] does not exist", providerID))
- } else {
- log.Error(fmt.Sprintf("get provider[%s] service file failed", providerID), err)
- }
- return err
- }
-
- consumerIds, err := serviceUtil.GetConsumerIds(ctx, domainProject, provider)
- if err != nil {
- log.Errorf(err, "get service[%s][%s/%s/%s/%s]'s consumerIds failed",
- providerID, provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
- return err
- }
- providerKey := pb.MicroServiceToKey(domainProject, provider)
-
- PublishInstanceEvent(apt.KvEvent, domainProject, providerKey, consumerIds)
- return nil
-}
-
-// RuleEventHandler is the handler to handle:
-// 1. publish the EVT_EXPIRE event to subscribers when rule is changed
-// 2. reset the find instance cache
-type RuleEventHandler struct {
-}
-
-func (h *RuleEventHandler) Type() sd.Type {
- return kv.RULE
-}
-
-func (h *RuleEventHandler) OnEvent(evt sd.KvEvent) {
- action := evt.Type
- if action == pb.EVT_INIT {
- return
- }
-
- providerID, ruleID, domainProject := path.GetInfoFromRuleKV(evt.KV.Key)
- if event.Center().Closed() {
- log.Warnf("caught [%s] service rule[%s/%s] event, but notify service is closed",
- action, providerID, ruleID)
- return
- }
- log.Infof("caught [%s] service rule[%s/%s] event", action, providerID, ruleID)
-
- err := task.GetService().Add(context.Background(),
- NewRulesChangedAsyncTask(domainProject, providerID, evt))
- if err != nil {
- log.Error("", err)
- }
-}
-
-func NewRuleEventHandler() *RuleEventHandler {
- return &RuleEventHandler{}
-}
-
-func NewRulesChangedAsyncTask(domainProject, providerID string, evt sd.KvEvent) *RulesChangedTask {
- evt.Type = pb.EVT_EXPIRE
- return &RulesChangedTask{
- KvEvent: evt,
- key: "RulesChangedAsyncTask_" + providerID,
- DomainProject: domainProject,
- ProviderID: providerID,
- }
-}
diff --git a/datasource/etcd/kv/kv.go b/datasource/etcd/kv/kv.go
index 0a22207..74884ea 100644
--- a/datasource/etcd/kv/kv.go
+++ b/datasource/etcd/kv/kv.go
@@ -183,8 +183,6 @@ func (s *TypeStore) Lease() sd.Adaptor { return s.Adaptors(LEASE) }
func (s *TypeStore) ServiceIndex() sd.Adaptor { return s.Adaptors(ServiceIndex) }
func (s *TypeStore) ServiceAlias() sd.Adaptor { return s.Adaptors(ServiceAlias) }
func (s *TypeStore) ServiceTag() sd.Adaptor { return s.Adaptors(ServiceTag) }
-func (s *TypeStore) Rule() sd.Adaptor { return s.Adaptors(RULE) }
-func (s *TypeStore) RuleIndex() sd.Adaptor { return s.Adaptors(RuleIndex) }
func (s *TypeStore) Schema() sd.Adaptor { return s.Adaptors(SCHEMA) }
func (s *TypeStore) DependencyRule() sd.Adaptor { return s.Adaptors(DependencyRule) }
func (s *TypeStore) DependencyQueue() sd.Adaptor { return s.Adaptors(DependencyQueue) }
diff --git a/datasource/etcd/kv/types.go b/datasource/etcd/kv/types.go
index 752c464..e6f0829 100644
--- a/datasource/etcd/kv/types.go
+++ b/datasource/etcd/kv/types.go
@@ -40,8 +40,6 @@ var (
ServiceIndex sd.Type
ServiceAlias sd.Type
ServiceTag sd.Type
- RULE sd.Type
- RuleIndex sd.Type
DependencyRule sd.Type
DependencyQueue sd.Type
SCHEMA sd.Type
@@ -67,9 +65,6 @@ func registerInnerTypes() {
SchemaSummary = Store().MustInstall(NewAddOn("SCHEMA_SUMMARY",
sd.Configure().WithPrefix(path.GetServiceSchemaSummaryRootKey("")).
WithInitSize(100).WithParser(value.StringParser)))
- RULE = Store().MustInstall(NewAddOn("RULE",
- sd.Configure().WithPrefix(path.GetServiceRuleRootKey("")).
- WithInitSize(100).WithParser(value.RuleParser)))
LEASE = Store().MustInstall(NewAddOn("LEASE",
sd.Configure().WithPrefix(path.GetInstanceLeaseRootKey("")).
WithInitSize(1000).WithParser(value.StringParser)))
@@ -82,9 +77,6 @@ func registerInnerTypes() {
ServiceTag = Store().MustInstall(NewAddOn("SERVICE_TAG",
sd.Configure().WithPrefix(path.GetServiceTagRootKey("")).
WithInitSize(100).WithParser(value.MapParser)))
- RuleIndex = Store().MustInstall(NewAddOn("RULE_INDEX",
- sd.Configure().WithPrefix(path.GetServiceRuleIndexRootKey("")).
- WithInitSize(100).WithParser(value.StringParser)))
DependencyRule = Store().MustInstall(NewAddOn("DEPENDENCY_RULE",
sd.Configure().WithPrefix(path.GetServiceDependencyRuleRootKey("")).
WithInitSize(100).WithParser(value.DependencyRuleParser)))
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index e2b4d52..40f112f 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -243,7 +243,7 @@ func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request *pb.Get
}, err
}
- options := []string{"tags", "rules", "instances", "schemas", "dependencies"}
+ options := []string{"tags", "instances", "schemas", "dependencies"}
serviceInfo, err := getServiceDetailUtil(ctx, ServiceDetailOpt{
domainProject: domainProject,
service: service,
@@ -275,7 +275,7 @@ func (ds *MetadataManager) GetServicesInfo(ctx context.Context, request *pb.GetS
options := make([]string, 0, len(optionMap))
if _, ok := optionMap["all"]; ok {
optionMap["statistics"] = struct{}{}
- options = []string{"tags", "rules", "instances", "schemas", "dependencies"}
+ options = []string{"tags", "instances", "schemas", "dependencies"}
} else {
for opt := range optionMap {
options = append(options, opt)
@@ -1824,332 +1824,6 @@ func (ds *MetadataManager) DeleteTags(ctx context.Context, request *pb.DeleteSer
}, nil
}
-func (ds *MetadataManager) AddRule(ctx context.Context, request *pb.AddServiceRulesRequest) (
- *pb.AddServiceRulesResponse, error) {
- remoteIP := util.GetIPFromContext(ctx)
- domainProject := util.ParseDomainProject(ctx)
-
- // service id存在性校验
- if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
- log.Errorf(nil, "add service[%s] rule failed, service does not exist, operator: %s",
- request.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInvalidParams, "Service does not exist."),
- }, nil
- }
- res := quota.NewApplyQuotaResource(quota.TypeRule, domainProject, request.ServiceId, int64(len(request.Rules)))
- errQuota := quota.Apply(ctx, res)
- if errQuota != nil {
- log.Errorf(errQuota, "add service[%s] rule failed, operator: %s", request.ServiceId, remoteIP)
- response := &pb.AddServiceRulesResponse{
- Response: pb.CreateResponseWithSCErr(errQuota),
- }
- if errQuota.InternalError() {
- return response, errQuota
- }
- return response, nil
- }
-
- ruleType, _, err := serviceUtil.GetServiceRuleType(ctx, domainProject, request.ServiceId)
- if err != nil {
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
- ruleIDs := make([]string, 0, len(request.Rules))
- opts := make([]client.PluginOp, 0, 2*len(request.Rules))
- for _, rule := range request.Rules {
- //黑白名单只能存在一种,黑名单 or 白名单
- if len(ruleType) == 0 {
- ruleType = rule.RuleType
- } else if ruleType != rule.RuleType {
- log.Errorf(nil,
- "add service[%s] rule failed, can not add different RuleType at the same time, operator: %s",
- request.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrBlackAndWhiteRule,
- "Service can only contain one rule type, BLACK or WHITE."),
- }, nil
-
- }
-
- //同一服务,attribute和pattern确定一个rule
- if serviceUtil.RuleExist(ctx, domainProject, request.ServiceId, rule.Attribute, rule.Pattern) {
- log.Infof("service[%s] rule[%s/%s] already exists, operator: %s",
- request.ServiceId, rule.Attribute, rule.Pattern, remoteIP)
- continue
- }
-
- // 产生全局rule id
- timestamp := strconv.FormatInt(time.Now().Unix(), 10)
- ruleAdd := &pb.ServiceRule{
- RuleId: util.GenerateUUID(),
- RuleType: rule.RuleType,
- Attribute: rule.Attribute,
- Pattern: rule.Pattern,
- Description: rule.Description,
- Timestamp: timestamp,
- ModTimestamp: timestamp,
- }
-
- key := path.GenerateServiceRuleKey(domainProject, request.ServiceId, ruleAdd.RuleId)
- indexKey := path.GenerateRuleIndexKey(domainProject, request.ServiceId, ruleAdd.Attribute, ruleAdd.Pattern)
- ruleIDs = append(ruleIDs, ruleAdd.RuleId)
-
- data, err := json.Marshal(ruleAdd)
- if err != nil {
- log.Errorf(err, "add service[%s] rule failed, marshal rule[%s/%s] failed, operator: %s",
- request.ServiceId, ruleAdd.Attribute, ruleAdd.Pattern, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
-
- opts = append(opts, client.OpPut(client.WithStrKey(key), client.WithValue(data)))
- opts = append(opts, client.OpPut(client.WithStrKey(indexKey), client.WithStrValue(ruleAdd.RuleId)))
- }
- if len(opts) <= 0 {
- log.Infof("add service[%s] rule successfully, no rules to add, operator: %s",
- request.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ResponseSuccess, "Service rules has been added."),
- }, nil
- }
-
- resp, err := client.BatchCommitWithCmp(ctx, opts,
- []client.CompareOp{client.OpCmp(
- client.CmpVer(util.StringToBytesWithNoCopy(path.GenerateServiceKey(domainProject, request.ServiceId))),
- client.CmpNotEqual, 0)},
- nil)
- if err != nil {
- log.Errorf(err, "add service[%s] rule failed, operator: %s", request.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()),
- }, err
- }
- if !resp.Succeeded {
- log.Errorf(nil, "add service[%s] rule failed, service does not exist, operator: %s",
- request.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- log.Infof("add service[%s] rule %v successfully, operator: %s", request.ServiceId, ruleIDs, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ResponseSuccess, "Add service rules successfully."),
- RuleIds: ruleIDs,
- }, nil
-}
-
-func (ds *MetadataManager) GetRules(ctx context.Context, request *pb.GetServiceRulesRequest) (
- *pb.GetServiceRulesResponse, error) {
- domainProject := util.ParseDomainProject(ctx)
-
- // service id存在性校验
- if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
- log.Errorf(nil, "get service[%s] rule failed, service does not exist", request.ServiceId)
- return &pb.GetServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- rules, err := serviceUtil.GetRulesUtil(ctx, domainProject, request.ServiceId)
- if err != nil {
- log.Errorf(err, "get service[%s] rule failed", request.ServiceId)
- return &pb.GetServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
-
- return &pb.GetServiceRulesResponse{
- Response: pb.CreateResponse(pb.ResponseSuccess, "Get service rules successfully."),
- Rules: rules,
- }, nil
-}
-
-func (ds *MetadataManager) UpdateRule(ctx context.Context, request *pb.UpdateServiceRuleRequest) (
- *pb.UpdateServiceRuleResponse, error) {
- remoteIP := util.GetIPFromContext(ctx)
- domainProject := util.ParseDomainProject(ctx)
-
- // service id存在性校验
- if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
- log.Errorf(nil, "update service rule[%s/%s] failed, service does not exist, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- //是否能改变ruleType
- ruleType, ruleNum, err := serviceUtil.GetServiceRuleType(ctx, domainProject, request.ServiceId)
- if err != nil {
- log.Errorf(err, "update service rule[%s/%s] failed, get rule type failed, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
- if ruleNum >= 1 && ruleType != request.Rule.RuleType {
- log.Errorf(err, "update service rule[%s/%s] failed, can only exist one type, current type is %s, operator: %s",
- request.ServiceId, request.RuleId, ruleType, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrModifyRuleNotAllow, "Exist multiple rules,can not change rule type. Rule type is "+ruleType),
- }, nil
- }
-
- rule, err := serviceUtil.GetOneRule(ctx, domainProject, request.ServiceId, request.RuleId)
- if err != nil {
- log.Errorf(err, "update service rule[%s/%s] failed, query service rule failed, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
- if rule == nil {
- log.Errorf(err, "update service rule[%s/%s] failed, service rule does not exist, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrRuleNotExists, "This rule does not exist."),
- }, nil
- }
-
- copyRuleRef := *rule
- oldRulePatten := copyRuleRef.Pattern
- oldRuleAttr := copyRuleRef.Attribute
- isChangeIndex := false
- if copyRuleRef.Attribute != request.Rule.Attribute {
- isChangeIndex = true
- copyRuleRef.Attribute = request.Rule.Attribute
- }
- if copyRuleRef.Pattern != request.Rule.Pattern {
- isChangeIndex = true
- copyRuleRef.Pattern = request.Rule.Pattern
- }
- copyRuleRef.RuleType = request.Rule.RuleType
- copyRuleRef.Description = request.Rule.Description
- copyRuleRef.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
-
- key := path.GenerateServiceRuleKey(domainProject, request.ServiceId, request.RuleId)
- data, err := json.Marshal(copyRuleRef)
- if err != nil {
- log.Errorf(err, "update service rule[%s/%s] failed, marshal service rule failed, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
- var opts []client.PluginOp
- if isChangeIndex {
- //加入新的rule index
- indexKey := path.GenerateRuleIndexKey(domainProject, request.ServiceId, copyRuleRef.Attribute, copyRuleRef.Pattern)
- opts = append(opts, client.OpPut(client.WithStrKey(indexKey), client.WithStrValue(copyRuleRef.RuleId)))
-
- //删除旧的rule index
- oldIndexKey := path.GenerateRuleIndexKey(domainProject, request.ServiceId, oldRuleAttr, oldRulePatten)
- opts = append(opts, client.OpDel(client.WithStrKey(oldIndexKey)))
- }
- opts = append(opts, client.OpPut(client.WithStrKey(key), client.WithValue(data)))
-
- resp, err := client.Instance().TxnWithCmp(ctx, opts,
- []client.CompareOp{client.OpCmp(
- client.CmpVer(util.StringToBytesWithNoCopy(path.GenerateServiceKey(domainProject, request.ServiceId))),
- client.CmpNotEqual, 0)},
- nil)
- if err != nil {
- log.Errorf(err, "update service rule[%s/%s] failed, operator: %s", request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()),
- }, err
- }
- if !resp.Succeeded {
- log.Errorf(err, "update service rule[%s/%s] failed, service does not exist, operator: %s",
- request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- log.Infof("update service rule[%s/%s] successfully, operator: %s", request.ServiceId, request.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ResponseSuccess, "Get service rules successfully."),
- }, nil
-}
-
-func (ds *MetadataManager) DeleteRule(ctx context.Context, request *pb.DeleteServiceRulesRequest) (
- *pb.DeleteServiceRulesResponse, error) {
- remoteIP := util.GetIPFromContext(ctx)
- domainProject := util.ParseDomainProject(ctx)
-
- // service id存在性校验
- if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
- log.Errorf(nil, "delete service[%s] rules %v failed, service does not exist, operator: %s",
- request.ServiceId, request.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- opts := []client.PluginOp{}
- key := ""
- indexKey := ""
- for _, ruleID := range request.RuleIds {
- key = path.GenerateServiceRuleKey(domainProject, request.ServiceId, ruleID)
- log.Debugf("start delete service rule file: %s", key)
- data, err := serviceUtil.GetOneRule(ctx, domainProject, request.ServiceId, ruleID)
- if err != nil {
- log.Errorf(err, "delete service[%s] rules %v failed, get rule[%s] failed, operator: %s",
- request.ServiceId, request.RuleIds, ruleID, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
- }, err
- }
- if data == nil {
- log.Errorf(nil, "delete service[%s] rules %v failed, rule[%s] does not exist, operator: %s",
- request.ServiceId, request.RuleIds, ruleID, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrRuleNotExists, "This rule does not exist."),
- }, nil
- }
- indexKey = path.GenerateRuleIndexKey(domainProject, request.ServiceId, data.Attribute, data.Pattern)
- opts = append(opts,
- client.OpDel(client.WithStrKey(key)),
- client.OpDel(client.WithStrKey(indexKey)))
- }
- if len(opts) <= 0 {
- log.Errorf(nil, "delete service[%s] rules %v failed, no rule has been deleted, operator: %s",
- request.ServiceId, request.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrRuleNotExists, "No service rule has been deleted."),
- }, nil
- }
-
- resp, err := client.BatchCommitWithCmp(ctx, opts,
- []client.CompareOp{client.OpCmp(
- client.CmpVer(util.StringToBytesWithNoCopy(path.GenerateServiceKey(domainProject, request.ServiceId))),
- client.CmpNotEqual, 0)},
- nil)
- if err != nil {
- log.Errorf(err, "delete service[%s] rules %v failed, operator: %s", request.ServiceId, request.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()),
- }, err
- }
- if !resp.Succeeded {
- log.Errorf(err, "delete service[%s] rules %v failed, service does not exist, operator: %s",
- request.ServiceId, request.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."),
- }, nil
- }
-
- log.Infof("delete service[%s] rules %v successfully, operator: %s", request.ServiceId, request.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ResponseSuccess, "Delete service rules successfully."),
- }, nil
-}
-
func (ds *MetadataManager) modifySchemas(ctx context.Context, domainProject string, service *pb.MicroService,
schemas []*pb.Schema) *errsvc.Error {
remoteIP := util.GetIPFromContext(ctx)
diff --git a/datasource/etcd/sd/servicecenter/aggregate.go b/datasource/etcd/sd/servicecenter/aggregate.go
index c6d580f..164d100 100644
--- a/datasource/etcd/sd/servicecenter/aggregate.go
+++ b/datasource/etcd/sd/servicecenter/aggregate.go
@@ -68,8 +68,6 @@ func (c *SCClientAggregate) GetScCache(ctx context.Context) (*dump.Cache, map[st
c.cacheAppend(client.Cfg.Name, &caches.Indexes, &cache.Indexes)
c.cacheAppend(client.Cfg.Name, &caches.Aliases, &cache.Aliases)
c.cacheAppend(client.Cfg.Name, &caches.Tags, &cache.Tags)
- c.cacheAppend(client.Cfg.Name, &caches.Rules, &cache.Rules)
- c.cacheAppend(client.Cfg.Name, &caches.RuleIndexes, &cache.RuleIndexes)
c.cacheAppend(client.Cfg.Name, &caches.DependencyRules, &cache.DependencyRules)
c.cacheAppend(client.Cfg.Name, &caches.Summaries, &cache.Summaries)
c.cacheAppend(client.Cfg.Name, &caches.Instances, &cache.Instances)
diff --git a/datasource/etcd/sd/servicecenter/syncer.go b/datasource/etcd/sd/servicecenter/syncer.go
index 19a4099..ca6f413 100644
--- a/datasource/etcd/sd/servicecenter/syncer.go
+++ b/datasource/etcd/sd/servicecenter/syncer.go
@@ -86,14 +86,6 @@ func (c *Syncer) Sync(ctx context.Context) {
if ok {
c.check(tagCacher, &cache.Tags, errs)
}
- ruleCacher, ok := c.cachers[kv.RULE]
- if ok {
- c.check(ruleCacher, &cache.Rules, errs)
- }
- ruleIndexCacher, ok := c.cachers[kv.RuleIndex]
- if ok {
- c.check(ruleIndexCacher, &cache.RuleIndexes, errs)
- }
depRuleCacher, ok := c.cachers[kv.DependencyRule]
if ok {
c.check(depRuleCacher, &cache.DependencyRules, errs)
diff --git a/datasource/etcd/system.go b/datasource/etcd/system.go
index 8cebe98..5b18aef 100644
--- a/datasource/etcd/system.go
+++ b/datasource/etcd/system.go
@@ -45,8 +45,6 @@ func (sm *SysManager) DumpCache(ctx context.Context) *dump.Cache {
Do(func(_ context.Context) { setValue(kv.Store().ServiceIndex(), &cache.Indexes) }).
Do(func(_ context.Context) { setValue(kv.Store().ServiceAlias(), &cache.Aliases) }).
Do(func(_ context.Context) { setValue(kv.Store().ServiceTag(), &cache.Tags) }).
- Do(func(_ context.Context) { setValue(kv.Store().RuleIndex(), &cache.RuleIndexes) }).
- Do(func(_ context.Context) { setValue(kv.Store().Rule(), &cache.Rules) }).
Do(func(_ context.Context) { setValue(kv.Store().DependencyRule(), &cache.DependencyRules) }).
Do(func(_ context.Context) { setValue(kv.Store().SchemaSummary(), &cache.Summaries) }).
Do(func(_ context.Context) { setValue(kv.Store().Instance(), &cache.Instances) }).
diff --git a/datasource/etcd/util.go b/datasource/etcd/util.go
index a8393d9..88d7e9a 100644
--- a/datasource/etcd/util.go
+++ b/datasource/etcd/util.go
@@ -279,16 +279,6 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
return nil, err
}
serviceDetail.Tags = tags
- case "rules":
- rules, err := serviceUtil.GetRulesUtil(ctx, domainProject, serviceID)
- if err != nil {
- log.Errorf(err, "get service[%s]'s all rules failed", serviceID)
- return nil, err
- }
- for _, rule := range rules {
- rule.Timestamp = rule.ModTimestamp
- }
- serviceDetail.Rules = rules
case "instances":
if serviceDetailOpt.countOnly {
instanceCount, err := serviceUtil.GetInstanceCountOfOneService(ctx, domainProject, serviceID)
diff --git a/datasource/etcd/util/dependency_test.go b/datasource/etcd/util/dependency_test.go
index 1ce2b06..6e03a4a 100644
--- a/datasource/etcd/util/dependency_test.go
+++ b/datasource/etcd/util/dependency_test.go
@@ -279,10 +279,3 @@ func TestDependencyRelationFilterOpt(t *testing.T) {
t.Fatalf(`ToDependencyRelationFilterOpt failed`)
}
}
-
-func TestGetConsumerIdsWithFilter(t *testing.T) {
- _, _, err := GetConsumerIdsWithFilter(context.Background(), "", &discovery.MicroService{}, nil)
- if err != nil {
- t.Fatalf(`TestGetConsumerIdsWithFilter failed`)
- }
-}
diff --git a/datasource/etcd/util/dependency_util.go b/datasource/etcd/util/dependency_util.go
index 3813e9c..dd00d02 100644
--- a/datasource/etcd/util/dependency_util.go
+++ b/datasource/etcd/util/dependency_util.go
@@ -54,76 +54,6 @@ func GetProviderIds(ctx context.Context, domainProject string, consumer *pb.Micr
return providerIDs, nil
}
-// GetAllConsumerIds is the function get from dependency rule and filter with service rules
-func GetAllConsumerIds(ctx context.Context, domainProject string, provider *pb.MicroService) (allow []string, deny []string, _ error) {
- if provider == nil || len(provider.ServiceId) == 0 {
- return nil, nil, fmt.Errorf("invalid provider")
- }
-
- //todo 删除服务,最后实例推送有误差
- providerRules, err := GetRulesUtil(ctx, domainProject, provider.ServiceId)
- if err != nil {
- return nil, nil, err
- }
-
- rf := &RuleFilter{
- DomainProject: domainProject,
- ProviderRules: providerRules,
- }
-
- allow, deny, err = GetConsumerIdsWithFilter(ctx, domainProject, provider, rf)
- if err != nil {
- return nil, nil, err
- }
- return allow, deny, nil
-}
-
-func GetConsumerIdsWithFilter(ctx context.Context, domainProject string, provider *pb.MicroService, rf *RuleFilter) (allow []string, deny []string, err error) {
- consumerIds, err := GetConsumerIds(ctx, domainProject, provider)
- if err != nil {
- return nil, nil, err
- }
- return rf.FilterAll(ctx, consumerIds)
-}
-
-func GetAllProviderIds(ctx context.Context, domainProject string, service *pb.MicroService) (allow []string, deny []string, _ error) {
- providerIDsInCache, err := GetProviderIds(ctx, domainProject, service)
- if err != nil {
- return nil, nil, err
- }
- l := len(providerIDsInCache)
- rf := RuleFilter{
- DomainProject: domainProject,
- }
- allowIdx, denyIdx := 0, l
- providerIDs := make([]string, l)
- copyCtx := util.WithCacheOnly(util.CloneContext(ctx))
- for _, providerID := range providerIDsInCache {
- providerRules, err := GetRulesUtil(copyCtx, domainProject, providerID)
- if err != nil {
- return nil, nil, err
- }
- if len(providerRules) == 0 {
- providerIDs[allowIdx] = providerID
- allowIdx++
- continue
- }
- rf.ProviderRules = providerRules
- ok, err := rf.Filter(ctx, service.ServiceId)
- if err != nil {
- return nil, nil, err
- }
- if ok {
- providerIDs[allowIdx] = providerID
- allowIdx++
- } else {
- denyIdx--
- providerIDs[denyIdx] = providerID
- }
- }
- return providerIDs[:allowIdx], providerIDs[denyIdx:], nil
-}
-
func DependencyRuleExist(ctx context.Context, provider *pb.MicroServiceKey, consumer *pb.MicroServiceKey) (bool, error) {
targetDomainProject := provider.Tenant
if len(targetDomainProject) == 0 {
diff --git a/datasource/etcd/util/rule_util.go b/datasource/etcd/util/rule_util.go
index 8ebff79..6f59fcc 100644
--- a/datasource/etcd/util/rule_util.go
+++ b/datasource/etcd/util/rule_util.go
@@ -21,137 +21,15 @@ import (
"context"
"errors"
"fmt"
- "reflect"
- "regexp"
"strings"
"github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/pkg/errsvc"
"github.com/apache/servicecomb-service-center/datasource"
- "github.com/apache/servicecomb-service-center/datasource/etcd/client"
- "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
- "github.com/apache/servicecomb-service-center/datasource/etcd/path"
- "github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/pkg/util"
)
-type RuleFilter struct {
- DomainProject string
- ProviderRules []*discovery.ServiceRule
-}
-
-func (rf *RuleFilter) Filter(ctx context.Context, consumerID string) (bool, error) {
- copyCtx := util.WithCacheOnly(util.CloneContext(ctx))
- consumer, err := GetService(copyCtx, rf.DomainProject, consumerID)
- if err != nil {
- return false, err
- }
-
- if len(rf.ProviderRules) == 0 {
- return true, nil
- }
-
- tags, err := GetTagsUtils(copyCtx, rf.DomainProject, consumerID)
- if err != nil {
- return false, err
- }
- matchErr := MatchRules(rf.ProviderRules, consumer, tags)
- if matchErr != nil {
- if matchErr.Code == discovery.ErrPermissionDeny {
- return false, nil
- }
- return false, matchErr
- }
- return true, nil
-}
-
-func (rf *RuleFilter) FilterAll(ctx context.Context, consumerIDs []string) (allow []string, deny []string, err error) {
- l := len(consumerIDs)
- if l == 0 || len(rf.ProviderRules) == 0 {
- return consumerIDs, nil, nil
- }
-
- allowIdx, denyIdx := 0, l
- consumers := make([]string, l)
- for _, consumerID := range consumerIDs {
- ok, err := rf.Filter(ctx, consumerID)
- if err != nil {
- return nil, nil, err
- }
- if ok {
- consumers[allowIdx] = consumerID
- allowIdx++
- } else {
- denyIdx--
- consumers[denyIdx] = consumerID
- }
- }
- return consumers[:allowIdx], consumers[denyIdx:], nil
-}
-
-func GetRulesUtil(ctx context.Context, domainProject string, serviceID string) ([]*discovery.ServiceRule, error) {
- key := util.StringJoin([]string{
- path.GetServiceRuleRootKey(domainProject),
- serviceID,
- "",
- }, "/")
-
- opts := append(FromContext(ctx), client.WithStrKey(key), client.WithPrefix())
- resp, err := kv.Store().Rule().Search(ctx, opts...)
- if err != nil {
- return nil, err
- }
-
- rules := []*discovery.ServiceRule{}
- for _, kv := range resp.Kvs {
- rules = append(rules, kv.Value.(*discovery.ServiceRule))
- }
- return rules, nil
-}
-
-func RuleExist(ctx context.Context, domainProject string, serviceID string, attr string, pattern string) bool {
- opts := append(FromContext(ctx),
- client.WithStrKey(path.GenerateRuleIndexKey(domainProject, serviceID, attr, pattern)),
- client.WithCountOnly())
- resp, err := kv.Store().RuleIndex().Search(ctx, opts...)
- if err != nil || resp.Count == 0 {
- return false
- }
- return true
-}
-
-func GetServiceRuleType(ctx context.Context, domainProject string, serviceID string) (string, int, error) {
- key := path.GenerateServiceRuleKey(domainProject, serviceID, "")
- opts := append(FromContext(ctx),
- client.WithStrKey(key),
- client.WithPrefix())
- resp, err := kv.Store().Rule().Search(ctx, opts...)
- if err != nil {
- log.Errorf(err, "get service[%s] rule failed", serviceID)
- return "", 0, err
- }
- if len(resp.Kvs) == 0 {
- return "", 0, nil
- }
- return resp.Kvs[0].Value.(*discovery.ServiceRule).RuleType, len(resp.Kvs), nil
-}
-
-func GetOneRule(ctx context.Context, domainProject, serviceID, ruleID string) (*discovery.ServiceRule, error) {
- opts := append(FromContext(ctx),
- client.WithStrKey(path.GenerateServiceRuleKey(domainProject, serviceID, ruleID)))
- resp, err := kv.Store().Rule().Search(ctx, opts...)
- if err != nil {
- log.Errorf(err, "get service rule[%s/%s]", serviceID, ruleID)
- return nil, err
- }
- if len(resp.Kvs) == 0 {
- log.Errorf(nil, "get service rule[%s/%s] failed", serviceID, ruleID)
- return nil, nil
- }
- return resp.Kvs[0].Value.(*discovery.ServiceRule), nil
-}
-
func AllowAcrossDimension(ctx context.Context, providerService *discovery.MicroService, consumerService *discovery.MicroService) error {
if providerService.AppId != consumerService.AppId {
if len(providerService.Properties) == 0 {
@@ -171,86 +49,6 @@ func AllowAcrossDimension(ctx context.Context, providerService *discovery.MicroS
return nil
}
-func MatchRules(rulesOfProvider []*discovery.ServiceRule, consumer *discovery.MicroService, tagsOfConsumer map[string]string) *errsvc.Error {
- if consumer == nil {
- return discovery.NewError(discovery.ErrInvalidParams, "consumer is nil")
- }
-
- if len(rulesOfProvider) <= 0 {
- return nil
- }
- if rulesOfProvider[0].RuleType == "WHITE" {
- return patternWhiteList(rulesOfProvider, tagsOfConsumer, consumer)
- }
- return patternBlackList(rulesOfProvider, tagsOfConsumer, consumer)
-}
-
-func patternWhiteList(rulesOfProvider []*discovery.ServiceRule, tagsOfConsumer map[string]string, consumer *discovery.MicroService) *errsvc.Error {
- v := reflect.Indirect(reflect.ValueOf(consumer))
- consumerID := consumer.ServiceId
- for _, rule := range rulesOfProvider {
- value, err := parsePattern(v, rule, tagsOfConsumer, consumerID)
- if err != nil {
- return err
- }
- if len(value) == 0 {
- continue
- }
-
- match, _ := regexp.MatchString(rule.Pattern, value)
- if match {
- log.Infof("consumer[%s][%s/%s/%s/%s] match white list, rule.Pattern is %s, value is %s",
- consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
- rule.Pattern, value)
- return nil
- }
- }
- return discovery.NewError(discovery.ErrPermissionDeny, "Not found in white list")
-}
-
-func parsePattern(v reflect.Value, rule *discovery.ServiceRule, tagsOfConsumer map[string]string, consumerID string) (string, *errsvc.Error) {
- if strings.HasPrefix(rule.Attribute, "tag_") {
- key := rule.Attribute[4:]
- value := tagsOfConsumer[key]
- if len(value) == 0 {
- log.Infof("can not find service[%s] tag[%s]", consumerID, key)
- }
- return value, nil
- }
- key := v.FieldByName(rule.Attribute)
- if !key.IsValid() {
- log.Errorf(nil, "can not find service[%] field[%s], ruleID is %s",
- consumerID, rule.Attribute, rule.RuleId)
- return "", discovery.NewError(discovery.ErrInternal, fmt.Sprintf("Can not find field '%s'", rule.Attribute))
- }
- return key.String(), nil
-
-}
-
-func patternBlackList(rulesOfProvider []*discovery.ServiceRule, tagsOfConsumer map[string]string, consumer *discovery.MicroService) *errsvc.Error {
- v := reflect.Indirect(reflect.ValueOf(consumer))
- consumerID := consumer.ServiceId
- for _, rule := range rulesOfProvider {
- var value string
- value, err := parsePattern(v, rule, tagsOfConsumer, consumerID)
- if err != nil {
- return err
- }
- if len(value) == 0 {
- continue
- }
-
- match, _ := regexp.MatchString(rule.Pattern, value)
- if match {
- log.Warnf("no permission to access, consumer[%s][%s/%s/%s/%s] match black list, rule.Pattern is %s, value is %s",
- consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
- rule.Pattern, value)
- return discovery.NewError(discovery.ErrPermissionDeny, "Found in black list")
- }
- }
- return nil
-}
-
func Accessible(ctx context.Context, consumerID string, providerID string) *errsvc.Error {
if len(consumerID) == 0 {
return nil
@@ -280,23 +78,5 @@ func Accessible(ctx context.Context, consumerID string, providerID string) *errs
if err != nil {
return discovery.NewError(discovery.ErrPermissionDeny, err.Error())
}
-
- ctx = util.WithCacheOnly(util.CloneContext(ctx))
-
- // 黑白名单
- rules, err := GetRulesUtil(ctx, targetDomainProject, providerID)
- if err != nil {
- return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("An error occurred in query provider rules(%s)", err.Error()))
- }
-
- if len(rules) == 0 {
- return nil
- }
-
- validateTags, err := GetTagsUtils(ctx, domainProject, consumerService.ServiceId)
- if err != nil {
- return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("An error occurred in query consumer tags(%s)", err.Error()))
- }
-
- return MatchRules(rules, consumerService, validateTags)
+ return nil
}
diff --git a/datasource/etcd/util/rule_util_test.go b/datasource/etcd/util/rule_util_test.go
index 39529cc..d0a550e 100644
--- a/datasource/etcd/util/rule_util_test.go
+++ b/datasource/etcd/util/rule_util_test.go
@@ -19,79 +19,13 @@ package util_test
import (
"context"
- "errors"
"net/http"
"testing"
- "github.com/stretchr/testify/assert"
-
- "github.com/apache/servicecomb-service-center/datasource"
. "github.com/apache/servicecomb-service-center/datasource/etcd/util"
- "github.com/apache/servicecomb-service-center/pkg/util"
"github.com/go-chassis/cari/discovery"
)
-func TestRuleFilter_Filter(t *testing.T) {
- rf := RuleFilter{
- DomainProject: "",
- ProviderRules: []*discovery.ServiceRule{},
- }
- var err error
- t.Run("when there is no such a customer in db", func(t *testing.T) {
- _, err = rf.Filter(context.Background(), "")
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter Filter failed")
- }
- assert.Equal(t, datasource.ErrNoData, err, "no data found")
- })
- t.Run("FilterAll when customer not exist", func(t *testing.T) {
- _, _, err = rf.FilterAll(context.Background(), []string{""})
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter FilterAll failed")
- }
- assert.Equal(t, nil, err, "no customer found err is nil")
- })
- rf.ProviderRules = []*discovery.ServiceRule{
- {},
- }
- t.Run("FilterAll when ProviderRules not nil and service not exist", func(t *testing.T) {
- _, _, err = rf.FilterAll(context.Background(), []string{""})
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter FilterAll failed")
- }
- assert.Equal(t, datasource.ErrNoData, err, "no customer found when FilterAll")
- })
-}
-
-func TestGetRulesUtil(t *testing.T) {
- _, err := GetRulesUtil(context.Background(), "", "")
- if err != nil {
- t.Fatalf("GetRulesUtil failed")
- }
-
- _, err = GetOneRule(context.Background(), "", "", "")
- if err != nil {
- t.Fatalf("GetOneRule failed")
- }
-}
-
-func TestRuleExist(t *testing.T) {
- defer func() {
- if r := recover(); r != nil {
- t.Fatalf("TestRuleExist panic")
- }
- }()
- RuleExist(util.WithCacheOnly(context.Background()), "", "", "", "")
- RuleExist(context.Background(), "", "", "", "")
-}
-
-func TestGetServiceRuleType(t *testing.T) {
- _, _, err := GetServiceRuleType(context.Background(), "", "")
- if err != nil {
- t.Fatalf("GetServiceRuleType failed")
- }
-}
-
func TestAllowAcrossApp(t *testing.T) {
err := AllowAcrossDimension(context.Background(), &discovery.MicroService{
AppId: "a",
@@ -160,135 +94,8 @@ func TestAllowAcrossApp(t *testing.T) {
}
}
-func TestMatchRules(t *testing.T) {
- err := MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "",
- Pattern: "",
- },
- }, nil, nil)
- if err == nil {
- t.Fatalf("MatchRules nil failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "",
- Pattern: "",
- },
- }, &discovery.MicroService{}, nil)
- if err == nil {
- t.Fatalf("MatchRules invalid WHITE failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "ServiceName",
- Pattern: "^a.*",
- },
- }, &discovery.MicroService{
- ServiceName: "a",
- }, nil)
- if err != nil {
- t.Fatalf("MatchRules WHITE with field ServiceName failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "tag_a",
- Pattern: "^b.*",
- },
- }, &discovery.MicroService{}, map[string]string{
- "a": "b",
- })
- if err != nil {
- t.Fatalf("MatchRules WHITE with tag b failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "tag_a",
- Pattern: "^b.*",
- },
- }, &discovery.MicroService{}, map[string]string{
- "a": "c",
- })
- if err == nil {
- t.Fatalf("MatchRules WHITE with tag c failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "tag_a",
- Pattern: "^b.*",
- },
- }, &discovery.MicroService{}, map[string]string{
- "a": "b",
- })
- if err == nil {
- t.Fatalf("MatchRules BLACK with tag b failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "^a.*",
- },
- }, &discovery.MicroService{
- ServiceName: "a",
- }, nil)
- if err == nil {
- t.Fatalf("MatchRules BLACK with field ServiceName failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "tag_a",
- Pattern: "^b.*",
- },
- }, &discovery.MicroService{}, map[string]string{
- "a": "c",
- })
- if err != nil {
- t.Fatalf("MatchRules BLACK with tag c failed")
- }
-
- err = MatchRules([]*discovery.ServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "tag_a",
- Pattern: "^b.*",
- },
- }, &discovery.MicroService{}, map[string]string{
- "b": "b",
- })
- if err != nil {
- t.Fatalf("MatchRules with not exist tag failed")
- }
-}
-
func TestGetConsumer(t *testing.T) {
- _, _, err := GetAllProviderIds(context.Background(), "", &discovery.MicroService{})
- if err != nil {
- t.Fatalf("GetConsumerIdsByProvider invalid failed")
- }
-
- _, _, err = GetAllConsumerIds(context.Background(), "", &discovery.MicroService{
- ServiceId: "a",
- })
- if err != nil {
- t.Fatalf("GetConsumerIdsByProvider WithCacheOnly not exist service failed")
- }
-
- _, err = GetConsumerIds(context.Background(), "",
+ _, err := GetConsumerIds(context.Background(), "",
&discovery.MicroService{
ServiceId: "a",
})
@@ -305,11 +112,6 @@ func TestGetProvider(t *testing.T) {
if err != nil {
t.Fatalf("GetProviderIds WithCacheOnly failed")
}
-
- _, _, err = GetAllProviderIds(context.Background(), "", &discovery.MicroService{})
- if err != nil {
- t.Fatalf("GetAllProviderIds WithCacheOnly failed")
- }
}
func TestAccessible(t *testing.T) {
diff --git a/datasource/mongo/client/dao/rule.go b/datasource/mongo/client/dao/rule.go
deleted file mode 100644
index 4179ae6..0000000
--- a/datasource/mongo/client/dao/rule.go
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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 dao
-
-import (
- "context"
-
- mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
- "github.com/apache/servicecomb-service-center/pkg/util"
-
- "github.com/go-chassis/cari/discovery"
- "go.mongodb.org/mongo-driver/bson"
- "go.mongodb.org/mongo-driver/mongo/options"
-
- "github.com/apache/servicecomb-service-center/datasource/mongo/client"
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
- "github.com/apache/servicecomb-service-center/pkg/log"
-)
-
-func GetRulesByServiceID(ctx context.Context, serviceID string) ([]*model.Rule, error) {
- filter := mutil.NewDomainProjectFilter(util.ParseDomain(ctx), util.ParseDomain(ctx), mutil.ServiceID(serviceID))
- return GetRules(ctx, filter)
-}
-
-func GetRules(ctx context.Context, filter interface{}) ([]*model.Rule, error) {
- cursor, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter)
- if err != nil {
- return nil, err
- }
- if cursor.Err() != nil {
- return nil, cursor.Err()
- }
- var rules []*model.Rule
- defer cursor.Close(ctx)
- for cursor.Next(ctx) {
- var rule model.Rule
- err := cursor.Decode(&rule)
- if err != nil {
- log.Error("type conversion error", err)
- return nil, err
- }
- rules = append(rules, &rule)
- }
- return rules, nil
-}
-
-func GetServiceRules(ctx context.Context, filter interface{}, opts ...*options.FindOptions) ([]*discovery.ServiceRule, error) {
- ruleRes, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter, opts...)
- if err != nil {
- return nil, err
- }
- var rules []*discovery.ServiceRule
- for ruleRes.Next(ctx) {
- var tempRule *model.Rule
- err := ruleRes.Decode(&tempRule)
- if err != nil {
- return nil, err
- }
- rules = append(rules, tempRule.Rule)
- }
- return rules, nil
-}
-
-func RuleExist(ctx context.Context, filter interface{}) (bool, error) {
- return client.GetMongoClient().DocExist(ctx, model.CollectionRule, filter)
-}
-
-func UpdateRule(ctx context.Context, filter interface{}, m bson.M) error {
- return client.GetMongoClient().DocUpdate(ctx, model.CollectionRule, filter, m)
-}
-
-func UpdateSchema(ctx context.Context, filter interface{}, update interface{}, opts ...*options.FindOneAndUpdateOptions) error {
- _, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionSchema, filter, update, opts...)
- if err != nil {
- return err
- }
- return nil
-}
diff --git a/datasource/mongo/client/dao/schema.go b/datasource/mongo/client/dao/schema.go
index 6cf10ea..0aa61bf 100644
--- a/datasource/mongo/client/dao/schema.go
+++ b/datasource/mongo/client/dao/schema.go
@@ -20,6 +20,8 @@ package dao
import (
"context"
+ "go.mongodb.org/mongo-driver/mongo/options"
+
"github.com/apache/servicecomb-service-center/datasource/mongo/client"
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
@@ -85,3 +87,11 @@ func CountSchema(ctx context.Context, serviceID string) (int64, error) {
filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(serviceID))
return client.Count(ctx, model.CollectionSchema, filter)
}
+
+func UpdateSchema(ctx context.Context, filter interface{}, update interface{}, opts ...*options.FindOneAndUpdateOptions) error {
+ _, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionSchema, filter, update, opts...)
+ if err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/datasource/mongo/client/model/types.go b/datasource/mongo/client/model/types.go
index f92f3b2..fd9e5ea 100644
--- a/datasource/mongo/client/model/types.go
+++ b/datasource/mongo/client/model/types.go
@@ -28,7 +28,6 @@ const (
CollectionAccountLock = "account_lock"
CollectionService = "service"
CollectionSchema = "schema"
- CollectionRule = "rule"
CollectionInstance = "instance"
CollectionDep = "dependency"
CollectionRole = "role"
@@ -42,7 +41,6 @@ const (
ColumnTag = "tags"
ColumnSchemaID = "schema_id"
ColumnServiceID = "service_id"
- ColumnRuleID = "rule_id"
ColumnService = "service"
ColumnProperty = "properties"
ColumnModTime = "mod_timestamp"
@@ -52,15 +50,10 @@ const (
ColumnAlias = "alias"
ColumnVersion = "version"
ColumnSchemas = "schemas"
- ColumnAttribute = "attribute"
- ColumnPattern = "pattern"
- ColumnDescription = "description"
- ColumnRuleType = "rule_type"
ColumnSchema = "schema"
ColumnSchemaSummary = "schema_summary"
ColumnDep = "dep"
ColumnDependency = "dependency"
- ColumnRule = "rule"
ColumnInstance = "instance"
ColumnInstanceID = "instance_id"
ColumnTenant = "tenant"
@@ -99,13 +92,6 @@ type Schema struct {
SchemaSummary string `json:"schemaSummary,omitempty" bson:"schema_summary"`
}
-type Rule struct {
- Domain string `json:"domain,omitempty"`
- Project string `json:"project,omitempty"`
- ServiceID string `json:"serviceID,omitempty" bson:"service_id"`
- Rule *pb.ServiceRule `json:"rule,omitempty"`
-}
-
type Instance struct {
Domain string `json:"domain,omitempty"`
Project string `json:"project,omitempty"`
diff --git a/datasource/mongo/db.go b/datasource/mongo/db.go
index 0d0fdb6..dbc7f08 100644
--- a/datasource/mongo/db.go
+++ b/datasource/mongo/db.go
@@ -33,7 +33,6 @@ import (
func EnsureDB() {
EnsureService()
EnsureInstance()
- EnsureRule()
EnsureSchema()
EnsureDep()
EnsureAccountLock()
@@ -80,13 +79,6 @@ func EnsureSchema() {
model.ColumnServiceID)})
}
-func EnsureRule() {
- EnsureCollection(model.CollectionRule, []mongo.IndexModel{mutil.BuildIndexDoc(
- model.ColumnDomain,
- model.ColumnProject,
- model.ColumnServiceID)})
-}
-
func EnsureDep() {
EnsureCollection(model.CollectionDep, []mongo.IndexModel{mutil.BuildIndexDoc(
model.ColumnDomain,
diff --git a/datasource/mongo/dep_util.go b/datasource/mongo/dep_util.go
index 52c766a..3d3e1ce 100644
--- a/datasource/mongo/dep_util.go
+++ b/datasource/mongo/dep_util.go
@@ -19,56 +19,37 @@ package mongo
import (
"context"
- "errors"
"fmt"
pb "github.com/go-chassis/cari/discovery"
- "github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/cache"
"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
)
-func GetAllConsumerIds(ctx context.Context, provider *pb.MicroService) (allow []string, deny []string, err error) {
+func GetConsumerIDs(ctx context.Context, provider *pb.MicroService) ([]string, error) {
if provider == nil || len(provider.ServiceId) == 0 {
- return nil, nil, fmt.Errorf("invalid provider")
+ return nil, fmt.Errorf("invalid provider")
}
- //todo 删除服务,最后实例推送有误差
- providerRules, ok := cache.GetRulesByServiceID(provider.ServiceId)
- if !ok {
- providerRules, err = dao.GetRulesByServiceID(ctx, provider.ServiceId)
- if err != nil {
- return nil, nil, err
- }
- }
-
- allow, deny, err = GetConsumerIDsWithFilter(ctx, provider, providerRules)
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- return nil, nil, err
- }
- return allow, deny, nil
-}
-
-func GetConsumerIDsWithFilter(ctx context.Context, provider *pb.MicroService, rules []*model.Rule) (allow []string, deny []string, err error) {
+ var err error
serviceDeps, ok := cache.GetProviderServiceOfDeps(provider)
if !ok {
serviceDeps, err = dao.GetProviderDeps(ctx, provider)
if err != nil {
- return nil, nil, err
+ return nil, err
}
}
- consumerIDs := make([]string, len(serviceDeps.Dependency))
+ consumerIDs := make([]string, 0, len(serviceDeps.Dependency))
for _, serviceKeys := range serviceDeps.Dependency {
id, ok := cache.GetServiceID(ctx, serviceKeys)
if !ok {
id, err = dao.GetServiceID(ctx, serviceKeys)
if err != nil {
- return nil, nil, err
+ return nil, err
}
}
consumerIDs = append(consumerIDs, id)
}
- return FilterAll(ctx, consumerIDs, rules)
+ return consumerIDs, nil
}
diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go
index 6e2ceb1..fe80ba7 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -77,7 +77,7 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
if !syncernotify.GetSyncerNotifyCenter().Closed() {
NotifySyncerInstanceEvent(evt, microService)
}
- consumerIDS, _, err := mongo.GetAllConsumerIds(ctx, microService)
+ consumerIDS, err := mongo.GetConsumerIDs(ctx, microService)
if err != nil {
log.Error(fmt.Sprintf("get service[%s][%s/%s/%s/%s]'s consumerIDs failed",
providerID, microService.Environment, microService.AppId, microService.ServiceName, microService.Version), err)
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 7420779..69ed850 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -23,8 +23,6 @@ import (
"encoding/json"
"errors"
"fmt"
- "reflect"
- "regexp"
"sort"
"strconv"
"strings"
@@ -343,11 +341,10 @@ func (ds *MetadataManager) DelServicePri(ctx context.Context, serviceID string,
}
schemaOps := client.MongoOperation{Table: model.CollectionSchema, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{model.ColumnServiceID: serviceID})}}
- rulesOps := client.MongoOperation{Table: model.CollectionRule, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{model.ColumnServiceID: serviceID})}}
instanceOps := client.MongoOperation{Table: model.CollectionInstance, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID})}}
serviceOps := client.MongoOperation{Table: model.CollectionService, Models: []mongo.WriteModel{mongo.NewDeleteOneModel().SetFilter(bson.M{mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceID}): serviceID})}}
- err = client.GetMongoClient().MultiTableBatchUpdate(ctx, []client.MongoOperation{schemaOps, rulesOps, instanceOps, serviceOps})
+ err = client.GetMongoClient().MultiTableBatchUpdate(ctx, []client.MongoOperation{schemaOps, instanceOps, serviceOps})
if err != nil {
log.Error(fmt.Sprintf("micro-service[%s] failed, operator: %s", serviceID, remoteIP), err)
return discovery.CreateResponse(discovery.ErrUnavailableBackend, err.Error()), err
@@ -441,7 +438,7 @@ func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request *discov
Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
}, err
}
- options := []string{"tags", "rules", "instances", "schemas", "dependencies"}
+ options := []string{"tags", "instances", "schemas", "dependencies"}
serviceInfo, err := getServiceDetailUtil(ctx, mgSvc, false, options)
if err != nil {
return &discovery.GetServiceDetailResponse{
@@ -466,7 +463,7 @@ func (ds *MetadataManager) GetServicesInfo(ctx context.Context, request *discove
options := make([]string, 0, len(optionMap))
if _, ok := optionMap["all"]; ok {
optionMap["statistics"] = struct{}{}
- options = []string{"tags", "rules", "instances", "schemas", "dependencies"}
+ options = []string{"tags", "instances", "schemas", "dependencies"}
} else {
for opt := range optionMap {
options = append(options, opt)
@@ -1113,222 +1110,6 @@ func (ds *MetadataManager) modifySchema(ctx context.Context, serviceID string, s
return nil
}
-func (ds *MetadataManager) AddRule(ctx context.Context, request *discovery.AddServiceRulesRequest) (*discovery.AddServiceRulesResponse, error) {
- remoteIP := util.GetIPFromContext(ctx)
- domain := util.ParseDomain(ctx)
- project := util.ParseProject(ctx)
- exist, err := ServiceExistID(ctx, request.ServiceId)
- if err != nil {
- log.Error(fmt.Sprintf("failed to add rules for service %s for get service failed", request.ServiceId), err)
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, "Failed to check service exist"),
- }, nil
- }
- if !exist {
- return &discovery.AddServiceRulesResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist")}, nil
- }
- res := quota.NewApplyQuotaResource(quota.TypeRule, util.ParseDomainProject(ctx), request.ServiceId, int64(len(request.Rules)))
- errQuota := quota.Apply(ctx, res)
- if errQuota != nil {
- log.Error(fmt.Sprintf("add service[%s] rule failed, operator: %s", request.ServiceId, remoteIP), errQuota)
- response := &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponseWithSCErr(errQuota),
- }
- if errQuota.InternalError() {
- return response, errQuota
- }
- return response, nil
- }
- filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId))
- rules, err := dao.GetServiceRules(ctx, filter)
- if err != nil {
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, err
- }
- var ruleType string
- if len(rules) != 0 {
- ruleType = rules[0].RuleType
- }
- ruleIDs := make([]string, 0, len(request.Rules))
- for _, rule := range request.Rules {
- if len(ruleType) == 0 {
- ruleType = rule.RuleType
- } else if ruleType != rule.RuleType {
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrBlackAndWhiteRule, "Service can only contain one rule type,Black or white."),
- }, nil
- }
- //the rule unique index is (serviceid,attribute,pattern)
- filter = mutil.NewFilter(
- mutil.ServiceID(request.ServiceId),
- mutil.RuleAttribute(rule.Attribute),
- mutil.RulePattern(rule.Pattern),
- )
- exist, err := dao.RuleExist(ctx, filter)
- if err != nil {
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrUnavailableBackend, "Can not check rule if exist."),
- }, nil
- }
- if exist {
- continue
- }
- timestamp := strconv.FormatInt(time.Now().Unix(), 10)
- ruleAdd := &model.Rule{
- Domain: util.ParseDomain(ctx),
- Project: util.ParseProject(ctx),
- ServiceID: request.ServiceId,
- Rule: &discovery.ServiceRule{
- RuleId: util.GenerateUUID(),
- RuleType: rule.RuleType,
- Attribute: rule.Attribute,
- Pattern: rule.Pattern,
- Description: rule.Description,
- Timestamp: timestamp,
- ModTimestamp: timestamp,
- },
- }
- ruleIDs = append(ruleIDs, ruleAdd.Rule.RuleId)
- _, err = client.GetMongoClient().Insert(ctx, model.CollectionRule, ruleAdd)
- if err != nil {
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, err
- }
- }
- return &discovery.AddServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ResponseSuccess, "Add service rules successfully."),
- RuleIds: ruleIDs,
- }, nil
-}
-
-func (ds *MetadataManager) GetRules(ctx context.Context, request *discovery.GetServiceRulesRequest) (*discovery.GetServiceRulesResponse, error) {
- exist, err := ServiceExistID(ctx, request.ServiceId)
- if err != nil {
- return &discovery.GetServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetRules failed for get service failed."),
- }, nil
- }
- if !exist {
- return &discovery.GetServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetRules failed for service not exist."),
- }, nil
- }
- filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(request.ServiceId))
- rules, err := dao.GetServiceRules(ctx, filter)
- if err != nil {
- return &discovery.GetServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, nil
- }
- return &discovery.GetServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get service rules successfully."),
- Rules: rules,
- }, nil
-}
-
-func (ds *MetadataManager) DeleteRule(ctx context.Context, request *discovery.DeleteServiceRulesRequest) (*discovery.DeleteServiceRulesResponse, error) {
- exist, err := ServiceExistID(ctx, request.ServiceId)
- domain := util.ParseDomain(ctx)
- project := util.ParseProject(ctx)
- if err != nil {
- log.Error(fmt.Sprintf("failed to add tags for service %s for get service failed", request.ServiceId), err)
- return &discovery.DeleteServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, "Failed to check service exist"),
- }, err
- }
- if !exist {
- return &discovery.DeleteServiceRulesResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil
- }
- var delRules []mongo.WriteModel
- for _, ruleID := range request.RuleIds {
- filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(ruleID))
- exist, err := dao.RuleExist(ctx, filter)
- if err != nil {
- return &discovery.DeleteServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, err
- }
- if !exist {
- return &discovery.DeleteServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrRuleNotExists, "This rule does not exist."),
- }, nil
- }
- filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(ruleID))
- delRules = append(delRules, mongo.NewDeleteOneModel().SetFilter(filter))
- }
- if len(delRules) > 0 {
- _, err := client.GetMongoClient().BatchDelete(ctx, model.CollectionRule, delRules)
- if err != nil {
- return &discovery.DeleteServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, err
- }
- }
- return &discovery.DeleteServiceRulesResponse{
- Response: discovery.CreateResponse(discovery.ResponseSuccess, "Delete service rules successfully."),
- }, nil
-}
-
-func (ds *MetadataManager) UpdateRule(ctx context.Context, request *discovery.UpdateServiceRuleRequest) (*discovery.UpdateServiceRuleResponse, error) {
- domain := util.ParseDomain(ctx)
- project := util.ParseProject(ctx)
- exist, err := ServiceExistID(ctx, request.ServiceId)
- if err != nil {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "UpdateRule failed for get service failed."),
- }, nil
- }
- if !exist {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "UpdateRule failed for service not exist."),
- }, nil
- }
- filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId))
- rules, err := dao.GetServiceRules(ctx, filter)
- if err != nil {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrUnavailableBackend, "UpdateRule failed for get rule."),
- }, nil
- }
- if len(rules) >= 1 && rules[0].RuleType != request.Rule.RuleType {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrModifyRuleNotAllow, "Exist multiple rules, can not change rule type. Rule type is ."+rules[0].RuleType),
- }, nil
- }
- filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(request.RuleId))
- exist, err = dao.RuleExist(ctx, filter)
- if err != nil {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, nil
- }
- if !exist {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrRuleNotExists, "This rule does not exist."),
- }, nil
- }
- filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(request.RuleId))
- setFilter := mutil.NewFilter(
- mutil.RuleRuleType(request.Rule.RuleType),
- mutil.RulePattern(request.Rule.Pattern),
- mutil.RuleAttribute(request.Rule.Attribute),
- mutil.RuleDescription(request.Rule.Description),
- mutil.RuleModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
- )
- updateFilter := mutil.NewFilter(mutil.Set(setFilter))
- err = dao.UpdateRule(ctx, filter, updateFilter)
- if err != nil {
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
- }, err
- }
- return &discovery.UpdateServiceRuleResponse{
- Response: discovery.CreateResponse(discovery.ResponseSuccess, "Update service rules succesfully."),
- }, nil
-}
-
func (ds *MetadataManager) isSchemaEditable() bool {
return !ds.SchemaNotEditable
}
@@ -1352,17 +1133,6 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
switch expr {
case "tags":
serviceDetail.Tags = mgs.Tags
- case "rules":
- filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(mgs.Service.ServiceId))
- rules, err := dao.GetServiceRules(ctx, filter)
- if err != nil {
- log.Error(fmt.Sprintf("get service %s's all rules failed", mgs.Service.ServiceId), err)
- return nil, err
- }
- for _, rule := range rules {
- rule.Timestamp = rule.ModTimestamp
- }
- serviceDetail.Rules = rules
case "instances":
if countOnly {
filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(serviceID))
@@ -2638,99 +2408,9 @@ func accessible(ctx context.Context, consumerID string, providerID string) *errs
if err != nil {
return discovery.NewError(discovery.ErrPermissionDeny, err.Error())
}
-
- // 黑白名单
- filter = mutil.NewDomainProjectFilter(providerDomain, providerProject, mutil.ServiceID(providerID))
- rules, err := dao.GetRules(ctx, filter)
- if err != nil {
- return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query provider rules(%s)", err.Error()))
- }
-
- if len(rules) == 0 {
- return nil
- }
- return MatchRules(rules, consumerService.Service, consumerService.Tags)
-}
-
-func MatchRules(rulesOfProvider []*model.Rule, consumer *discovery.MicroService, tagsOfConsumer map[string]string) *errsvc.Error {
- if consumer == nil {
- return discovery.NewError(discovery.ErrInvalidParams, "consumer is nil")
- }
-
- if len(rulesOfProvider) <= 0 {
- return nil
- }
- if rulesOfProvider[0].Rule.RuleType == "WHITE" {
- return patternWhiteList(rulesOfProvider, tagsOfConsumer, consumer)
- }
- return patternBlackList(rulesOfProvider, tagsOfConsumer, consumer)
-}
-
-func parsePattern(v reflect.Value, rule *discovery.ServiceRule, tagsOfConsumer map[string]string, consumerID string) (string, *errsvc.Error) {
- if strings.HasPrefix(rule.Attribute, "tag_") {
- key := rule.Attribute[4:]
- value := tagsOfConsumer[key]
- if len(value) == 0 {
- log.Info(fmt.Sprintf("can not find service[%s] tag[%s]", consumerID, key))
- }
- return value, nil
- }
- key := v.FieldByName(rule.Attribute)
- if !key.IsValid() {
- log.Error(fmt.Sprintf("can not find service[%s] field[%s], ruleID is %s",
- consumerID, rule.Attribute, rule.RuleId), nil)
- return "", discovery.NewError(discovery.ErrInternal, fmt.Sprintf("can not find field '%s'", rule.Attribute))
- }
- return key.String(), nil
-
-}
-
-func patternWhiteList(rulesOfProvider []*model.Rule, tagsOfConsumer map[string]string, consumer *discovery.MicroService) *errsvc.Error {
- v := reflect.Indirect(reflect.ValueOf(consumer))
- consumerID := consumer.ServiceId
- for _, rule := range rulesOfProvider {
- value, err := parsePattern(v, rule.Rule, tagsOfConsumer, consumerID)
- if err != nil {
- return err
- }
- if len(value) == 0 {
- continue
- }
-
- match, _ := regexp.MatchString(rule.Rule.Pattern, value)
- if match {
- log.Info(fmt.Sprintf("consumer[%s][%s/%s/%s/%s] match white list, rule.Pattern is %s, value is %s",
- consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
- rule.Rule.Pattern, value))
- return nil
- }
- }
- return discovery.NewError(discovery.ErrPermissionDeny, "not found in white list")
-}
-
-func patternBlackList(rulesOfProvider []*model.Rule, tagsOfConsumer map[string]string, consumer *discovery.MicroService) *errsvc.Error {
- v := reflect.Indirect(reflect.ValueOf(consumer))
- consumerID := consumer.ServiceId
- for _, rule := range rulesOfProvider {
- var value string
- value, err := parsePattern(v, rule.Rule, tagsOfConsumer, consumerID)
- if err != nil {
- return err
- }
- if len(value) == 0 {
- continue
- }
-
- match, _ := regexp.MatchString(rule.Rule.Pattern, value)
- if match {
- log.Warn(fmt.Sprintf("no permission to access, consumer[%s][%s/%s/%s/%s] match black list, rule.Pattern is %s, value is %s",
- consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
- rule.Rule.Pattern, value))
- return discovery.NewError(discovery.ErrPermissionDeny, "found in black list")
- }
- }
return nil
}
+
func allowAcrossDimension(ctx context.Context, providerService *model.Service, consumerService *model.Service) error {
if providerService.Service.AppId != consumerService.Service.AppId {
if len(providerService.Service.Properties) == 0 {
diff --git a/datasource/mongo/rule_util.go b/datasource/mongo/rule_util.go
deleted file mode 100644
index 5a9bc97..0000000
--- a/datasource/mongo/rule_util.go
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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 mongo
-
-import (
- "context"
-
- "github.com/apache/servicecomb-service-center/datasource/cache"
- "github.com/go-chassis/cari/discovery"
-
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
- mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
- "github.com/apache/servicecomb-service-center/pkg/util"
-)
-
-func Filter(ctx context.Context, rules []*model.Rule, consumerID string) (bool, error) {
- consumer, ok := cache.GetServiceByID(ctx, consumerID)
- if !ok {
- var err error
- consumer, err = dao.GetServiceByID(ctx, consumerID)
- if err != nil {
- return false, err
- }
- }
-
- if len(rules) == 0 {
- return true, nil
- }
- domain := util.ParseDomainProject(ctx)
- project := util.ParseProject(ctx)
- filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(consumerID))
- tags, err := dao.GetTags(ctx, filter)
- if err != nil {
- return false, err
- }
- matchErr := MatchRules(rules, consumer.Service, tags)
- if matchErr != nil {
- if matchErr.Code == discovery.ErrPermissionDeny {
- return false, nil
- }
- return false, matchErr
- }
- return true, nil
-}
-
-func FilterAll(ctx context.Context, consumerIDs []string, rules []*model.Rule) (allow []string, deny []string, err error) {
- l := len(consumerIDs)
- if l == 0 || len(rules) == 0 {
- return consumerIDs, nil, nil
- }
-
- allowIdx, denyIdx := 0, l
- consumers := make([]string, l)
- for _, consumerID := range consumerIDs {
- ok, err := Filter(ctx, rules, consumerID)
- if err != nil {
- return nil, nil, err
- }
- if ok {
- consumers[allowIdx] = consumerID
- allowIdx++
- } else {
- denyIdx--
- consumers[denyIdx] = consumerID
- }
- }
- return consumers[:allowIdx], consumers[denyIdx:], nil
-}
diff --git a/datasource/mongo/rule_util_test.go b/datasource/mongo/rule_util_test.go
deleted file mode 100644
index f0e5bd4..0000000
--- a/datasource/mongo/rule_util_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 mongo_test
-
-import (
- "context"
- "errors"
- "testing"
-
- "github.com/stretchr/testify/assert"
-
- "github.com/apache/servicecomb-service-center/datasource"
- "github.com/apache/servicecomb-service-center/datasource/mongo"
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
-)
-
-func TestRuleFilter_Filter(t *testing.T) {
- var err error
- t.Run("when there is no such a customer in db", func(t *testing.T) {
- _, err = mongo.Filter(context.Background(), []*model.Rule{}, "")
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter Filter failed")
- }
- assert.Equal(t, datasource.ErrNoData, err, "no data found")
- })
- t.Run("FilterAll when customer not exist", func(t *testing.T) {
- _, _, err = mongo.FilterAll(context.Background(), []string{""}, []*model.Rule{})
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter FilterAll failed")
- }
- assert.Equal(t, nil, err, "no customer found err is nil")
- })
- t.Run("FilterAll when ProviderRules not nil and service not exist", func(t *testing.T) {
- _, _, err = mongo.FilterAll(context.Background(), []string{""}, []*model.Rule{{}})
- if err != nil && !errors.Is(err, datasource.ErrNoData) {
- t.Fatalf("RuleFilter FilterAll failed")
- }
- assert.Equal(t, datasource.ErrNoData, err, "no customer found when FilterAll")
- })
-}
diff --git a/datasource/mongo/sd/rule_cache.go b/datasource/mongo/sd/rule_cache.go
deleted file mode 100644
index 8e669c6..0000000
--- a/datasource/mongo/sd/rule_cache.go
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
-* 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 sd
-
-import (
- "reflect"
-
- cmap "github.com/orcaman/concurrent-map"
-
- "github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
- "github.com/apache/servicecomb-service-center/datasource/sdcommon"
- "go.mongodb.org/mongo-driver/bson"
-)
-
-type ruleStore struct {
- dirty bool
- // the key is documentID, is value is mongo document.
- concurrentMap cmap.ConcurrentMap
- // the key is generated by indexFuncs,the value is a set of documentID.
- indexSets IndexCache
-}
-
-func init() {
- RegisterCacher(rule, newRuleStore)
- RuleIndexCols = NewIndexCols()
- RuleIndexCols.AddIndexFunc(RuleServiceIDIndex)
-}
-
-func newRuleStore() *MongoCacher {
- options := DefaultOptions().SetTable(rule)
- cache := &ruleStore{
- dirty: false,
- concurrentMap: cmap.New(),
- indexSets: NewIndexCache(),
- }
- ruleUnmarshal := func(doc bson.Raw) (resource sdcommon.Resource) {
- docID := MongoDocument{}
- err := bson.Unmarshal(doc, &docID)
- if err != nil {
- return
- }
- rule := model.Rule{}
- err = bson.Unmarshal(doc, &rule)
- if err != nil {
- return
- }
- resource.Value = rule
- resource.Key = docID.ID.Hex()
- return
- }
- return NewMongoCacher(options, cache, ruleUnmarshal)
-}
-
-func (s *ruleStore) Name() string {
- return rule
-}
-
-func (s *ruleStore) Size() int {
- return s.concurrentMap.Count()
-}
-
-func (s *ruleStore) Get(key string) interface{} {
- if v, exist := s.concurrentMap.Get(key); exist {
- return v
- }
- return nil
-}
-
-func (s *ruleStore) ForEach(iter func(k string, v interface{}) (next bool)) {
- for k, v := range s.concurrentMap.Items() {
- if !iter(k, v) {
- break
- }
- }
-}
-
-func (s *ruleStore) GetValue(index string) []interface{} {
- docs := s.indexSets.Get(index)
- res := make([]interface{}, 0, len(docs))
- for _, id := range docs {
- if doc, exist := s.concurrentMap.Get(id); exist {
- res = append(res, doc)
- }
- }
- return res
-}
-
-func (s *ruleStore) Dirty() bool {
- return s.dirty
-}
-
-func (s *ruleStore) MarkDirty() {
- s.dirty = true
-}
-
-func (s *ruleStore) Clear() {
- s.dirty = false
- s.concurrentMap.Clear()
- s.indexSets.Clear()
-}
-
-func (s *ruleStore) ProcessUpdate(event MongoEvent) {
- ruleData, ok := event.Value.(model.Rule)
- if !ok {
- return
- }
- if ruleData.Rule == nil {
- return
- }
- // set the document data.
- s.concurrentMap.Set(event.DocumentID, event.Value)
- for _, index := range RuleIndexCols.GetIndexes(ruleData) {
- // set the index sets.
- s.indexSets.Put(index, event.DocumentID)
- }
-}
-
-func (s *ruleStore) ProcessDelete(event MongoEvent) {
- ruleData, ok := s.concurrentMap.Get(event.DocumentID)
- if !ok {
- return
- }
- ruleMongo := ruleData.(model.Rule)
- if ruleMongo.Rule == nil {
- return
- }
- s.concurrentMap.Remove(event.DocumentID)
- for _, index := range RuleIndexCols.GetIndexes(ruleData) {
- s.indexSets.Delete(index, event.DocumentID)
- }
-}
-
-func (s *ruleStore) isValueNotUpdated(value interface{}, newValue interface{}) bool {
- newRule, ok := newValue.(model.Rule)
- if !ok {
- return true
- }
- oldRule, ok := value.(model.Rule)
- if !ok {
- return true
- }
- return reflect.DeepEqual(newRule, oldRule)
-}
-
-func RuleServiceIDIndex(data interface{}) string {
- rule := data.(model.Rule)
- return rule.ServiceID
-}
diff --git a/datasource/mongo/sd/types.go b/datasource/mongo/sd/types.go
index d596cb3..1f53ccd 100644
--- a/datasource/mongo/sd/types.go
+++ b/datasource/mongo/sd/types.go
@@ -30,7 +30,6 @@ import (
const (
service = "service"
instance = "instance"
- rule = "rule"
dep = "dependency"
)
diff --git a/datasource/mongo/sd/typestore.go b/datasource/mongo/sd/typestore.go
index cc55619..d7b3a52 100644
--- a/datasource/mongo/sd/typestore.go
+++ b/datasource/mongo/sd/typestore.go
@@ -123,7 +123,6 @@ func (s *TypeStore) Ready() <-chan struct{} {
func (s *TypeStore) TypeCacher(id string) *MongoCacher { return s.getOrCreateCache(id) }
func (s *TypeStore) Service() *MongoCacher { return s.TypeCacher(service) }
func (s *TypeStore) Instance() *MongoCacher { return s.TypeCacher(instance) }
-func (s *TypeStore) Rule() *MongoCacher { return s.TypeCacher(rule) }
func (s *TypeStore) Dep() *MongoCacher { return s.TypeCacher(dep) }
func Store() *TypeStore {
diff --git a/datasource/mongo/util/db.go b/datasource/mongo/util/db.go
index 8d02367..f87f4fa 100644
--- a/datasource/mongo/util/db.go
+++ b/datasource/mongo/util/db.go
@@ -316,42 +316,6 @@ func SchemaID(schemaID string) Option {
}
}
-func RuleAttribute(attribute string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnAttribute})] = attribute
- }
-}
-
-func RuleRuleID(ruleID string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnRuleID})] = ruleID
- }
-}
-
-func RuleRuleType(ruleType string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnRuleType})] = ruleType
- }
-}
-
-func RulePattern(pattern string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnPattern})] = pattern
- }
-}
-
-func RuleDescription(description string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnDescription})] = description
- }
-}
-
-func RuleModTime(modTime string) Option {
- return func(filter bson.M) {
- filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnModTime})] = modTime
- }
-}
-
func SchemaSummary(schemaSummary string) Option {
return func(filter bson.M) {
filter[model.ColumnSchemaSummary] = schemaSummary
diff --git a/datasource/ms.go b/datasource/ms.go
index 309ce88..a2751a9 100644
--- a/datasource/ms.go
+++ b/datasource/ms.go
@@ -98,10 +98,4 @@ type MetadataManager interface {
GetTags(ctx context.Context, request *pb.GetServiceTagsRequest) (*pb.GetServiceTagsResponse, error)
UpdateTag(ctx context.Context, request *pb.UpdateServiceTagRequest) (*pb.UpdateServiceTagResponse, error)
DeleteTags(ctx context.Context, request *pb.DeleteServiceTagsRequest) (*pb.DeleteServiceTagsResponse, error)
-
- // White/black list management
- AddRule(ctx context.Context, request *pb.AddServiceRulesRequest) (*pb.AddServiceRulesResponse, error)
- GetRules(ctx context.Context, request *pb.GetServiceRulesRequest) (*pb.GetServiceRulesResponse, error)
- UpdateRule(ctx context.Context, request *pb.UpdateServiceRuleRequest) (*pb.UpdateServiceRuleResponse, error)
- DeleteRule(ctx context.Context, request *pb.DeleteServiceRulesRequest) (*pb.DeleteServiceRulesResponse, error)
}
diff --git a/datasource/rule_test.go b/datasource/rule_test.go
deleted file mode 100644
index 9388c5c..0000000
--- a/datasource/rule_test.go
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- * 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"
- "testing"
-
- "github.com/apache/servicecomb-service-center/datasource"
- "github.com/apache/servicecomb-service-center/pkg/log"
- "github.com/apache/servicecomb-service-center/server/plugin/quota"
- pb "github.com/go-chassis/cari/discovery"
- "github.com/stretchr/testify/assert"
-)
-
-func TestRule_Add(t *testing.T) {
- var (
- serviceId1 string
- serviceId2 string
- )
-
- t.Run("register service and instance", func(t *testing.T) {
- respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "create_rule_group_ms",
- ServiceName: "create_rule_service_ms",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- serviceId1 = respCreateService.ServiceId
-
- respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "create_rule_group_ms",
- ServiceName: "create_rule_service_ms",
- Version: "1.0.1",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- serviceId2 = respCreateService.ServiceId
- })
-
- t.Run("invalid request", func(t *testing.T) {
- log.Info("service does not exist")
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: "not_exist_service_ms",
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white",
- },
- },
- })
- assert.NoError(t, err)
- assert.NotEqual(t, pb.ResponseSuccess, respAddRule)
- })
-
- t.Run("request is valid", func(t *testing.T) {
- log.Info("create a new black list")
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test black",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- ruleId := respAddRule.RuleIds[0]
- assert.NotEqual(t, "", ruleId)
-
- log.Info("create the black list again")
- respAddRule, err = datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test change black",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- assert.Equal(t, 0, len(respAddRule.RuleIds))
-
- log.Info("create a new white list when black list already exists")
- respAddRule, err = datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white",
- },
- },
- })
- assert.NoError(t, err)
- assert.NotEqual(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- })
-
- t.Run("create rule out of gaugue", func(t *testing.T) {
- size := quota.DefaultRuleQuota + 1
- rules := make([]*pb.AddOrUpdateServiceRule, 0, size)
- for i := 0; i < size; i++ {
- rules = append(rules, &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: strconv.Itoa(i),
- Description: "test white",
- })
- }
-
- resp, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId2,
- Rules: rules[:size-1],
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- resp, err = datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId2,
- Rules: rules[size-1:],
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrNotEnoughQuota, resp.Response.GetCode())
- })
-}
-
-func TestRule_Get(t *testing.T) {
- var (
- serviceId string
- ruleId string
- )
-
- t.Run("register service and rules", func(t *testing.T) {
- respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "get_rule_group_ms",
- ServiceName: "get_rule_service_ms",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- ruleId = respAddRule.RuleIds[0]
- assert.NotEqual(t, "", ruleId)
- })
-
- t.Run("get when request is invalid", func(t *testing.T) {
- log.Info("service not exists")
- respGetRule, err := datasource.GetMetadataManager().GetRules(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: "not_exist_service_ms",
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrServiceNotExists, respGetRule.Response.GetCode())
- })
-
- t.Run("get when request is valid", func(t *testing.T) {
- respGetRule, err := datasource.GetMetadataManager().GetRules(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: serviceId,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respGetRule.Response.GetCode())
- assert.Equal(t, ruleId, respGetRule.Rules[0].RuleId)
- })
-}
-
-func TestRule_Update(t *testing.T) {
- var (
- serviceId string
- ruleId string
- )
-
- t.Run("create service and rules", func(t *testing.T) {
- respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "update_rule_group_ms",
- ServiceName: "update_rule_service_ms",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- ruleId = respAddRule.RuleIds[0]
- assert.NotEqual(t, "", ruleId)
- })
-
- t.Run("update when request is invalid", func(t *testing.T) {
- rule := &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK update",
- }
- log.Info("service does not exist")
- resp, err := datasource.GetMetadataManager().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: "not_exist_service_ms",
- RuleId: ruleId,
- Rule: rule,
- })
- assert.NoError(t, err)
- assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- log.Info("rule not exists")
- resp, err = datasource.GetMetadataManager().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: "not_exist_rule_ms",
- Rule: rule,
- })
- assert.NoError(t, err)
- assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- log.Info("change rule type")
- resp, err = datasource.GetMetadataManager().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "WHITE",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white update",
- },
- })
- assert.NoError(t, err)
- assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
- })
-
- t.Run("update when request is valid", func(t *testing.T) {
- resp, err := datasource.GetMetadataManager().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "AppId",
- Pattern: "Test*",
- Description: "test white update",
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
- })
-}
-
-func TestRule_Delete(t *testing.T) {
- var (
- serviceId string
- ruleId string
- )
- t.Run("register service and rules", func(t *testing.T) {
- respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "delete_rule_group_ms",
- ServiceName: "delete_rule_service_ms",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
- ruleId = respAddRule.RuleIds[0]
- assert.NotEqual(t, "", ruleId)
- })
-
- t.Run("delete when request is invalid", func(t *testing.T) {
- log.Info("service not exist")
- resp, err := datasource.GetMetadataManager().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: "not_exist_service_ms",
- RuleIds: []string{"1000000"},
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
-
- log.Info("rule not exist")
- resp, err = datasource.GetMetadataManager().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- RuleIds: []string{"not_exist_rule"},
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrRuleNotExists, resp.Response.GetCode())
- })
-
- t.Run("delete when request is valid", func(t *testing.T) {
- resp, err := datasource.GetMetadataManager().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- RuleIds: []string{ruleId},
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- respGetRule, err := datasource.GetMetadataManager().GetRules(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: serviceId,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
- assert.Equal(t, 0, len(respGetRule.Rules))
- })
-}
-
-func TestRule_Permission(t *testing.T) {
- var (
- consumerVersion string
- consumerTag string
- providerBlack string
- providerWhite string
- )
- t.Run("register service and rules", func(t *testing.T) {
- respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_version_consumer_ms",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- consumerVersion = respCreateService.ServiceId
-
- respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_tag_service_ms",
- Version: "1.0.2",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- providerBlack = respCreateService.ServiceId
-
- respAddRule, err := datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: providerBlack,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "Version",
- Pattern: "1.0.0",
- },
- {
- RuleType: "BLACK",
- Attribute: "tag_a",
- Pattern: "b",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
-
- respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_tag_service_ms",
- Version: "1.0.3",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- providerWhite = respCreateService.ServiceId
-
- respAddRule, err = datasource.GetMetadataManager().AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: providerWhite,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "Version",
- Pattern: "1.0.0",
- },
- {
- RuleType: "WHITE",
- Attribute: "tag_a",
- Pattern: "b",
- },
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddRule.Response.GetCode())
-
- respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_tag_consumer_ms",
- Version: "1.0.4",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
- consumerTag = respCreateService.ServiceId
-
- respAddTag, err := datasource.GetMetadataManager().AddTags(getContext(), &pb.AddServiceTagsRequest{
- ServiceId: consumerTag,
- Tags: map[string]string{"a": "b"},
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respAddTag.Response.GetCode())
- })
-
- t.Run("when query instances", func(t *testing.T) {
- log.Info("consumer version in black list")
- resp, err := datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerVersion,
- ProviderServiceId: providerBlack,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
-
- log.Info("consumer tag in black list")
- resp, err = datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerTag,
- ProviderServiceId: providerBlack,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
-
- log.Info("find should return 200 even if consumer permission deny")
- respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerVersion,
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_tag_service_ms",
- VersionRule: "0+",
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
- assert.Equal(t, 0, len(respFind.Instances))
-
- respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerTag,
- AppId: "query_instance_tag_ms",
- ServiceName: "query_instance_tag_service_ms",
- VersionRule: "0+",
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
- assert.Equal(t, 0, len(respFind.Instances))
-
- log.Info("consumer not in black list")
- resp, err = datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: providerWhite,
- ProviderServiceId: providerBlack,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- log.Info("consumer not in white list")
- resp, err = datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: providerBlack,
- ProviderServiceId: providerWhite,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
-
- log.Info("consumer version in white list")
- resp, err = datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerVersion,
- ProviderServiceId: providerWhite,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
- log.Info("consumer tag in white list")
- resp, err = datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerTag,
- ProviderServiceId: providerWhite,
- })
- assert.NoError(t, err)
- assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
- })
-}
diff --git a/docs/openapi/v4.yaml b/docs/openapi/v4.yaml
index a84242c..beb610a 100644
--- a/docs/openapi/v4.yaml
+++ b/docs/openapi/v4.yaml
@@ -440,168 +440,6 @@ paths:
description: 内部错误
schema:
$ref: '#/definitions/Error'
- /v4/{project}/registry/microservices/{serviceId}/rules:
- post:
- description: |
- 为serviceId的服务新增黑白名单,同一服务,attribute和pattern唯一标识一份黑白名单。
- operationId: addRule
- parameters:
- - name: x-domain-name
- in: header
- type: string
- default: default
- - name: project
- in: path
- required: true
- type: string
- - name: serviceId
- in: path
- description: 微服务唯一标识。
- required: true
- type: string
- - name: rules
- in: body
- description: 新增黑白名单。
- required: true
- schema:
- $ref: '#/definitions/AddRules'
- tags:
- - microservices
- - rules
- responses:
- 200:
- description: 创建成功
- schema:
- $ref: '#/definitions/AddRuleResponse'
- 400:
- description: 错误的请求
- schema:
- $ref: '#/definitions/Error'
- 500:
- description: 内部错误
- schema:
- $ref: '#/definitions/Error'
- get:
- description: |
- 获取serviceId的服务的黑白名单信息。
- operationId: getRule
- parameters:
- - name: x-domain-name
- in: header
- required: true
- type: string
- default: default
- - name: project
- in: path
- required: true
- type: string
- - name: serviceId
- in: path
- description: 微服务唯一标识。
- required: true
- type: string
- tags:
- - microservices
- - rules
- responses:
- 200:
- description: 查询成功
- schema:
- $ref: '#/definitions/Rules'
- 400:
- description: 错误的请求
- schema:
- $ref: '#/definitions/Error'
- 500:
- description: 内部错误
- schema:
- $ref: '#/definitions/Error'
- /v4/{project}/registry/microservices/{serviceId}/rules/{ruleId}:
- put:
- description: |
- 为serviceId的服务更新黑白名单。
- operationId: updateRule
- parameters:
- - name: x-domain-name
- in: header
- type: string
- default: default
- - name: project
- in: path
- required: true
- type: string
- - name: serviceId
- in: path
- description: 微服务唯一标识。
- required: true
- type: string
- - name: ruleId
- in: path
- description: ruleId。
- required: true
- type: string
- - name: rule
- in: body
- description: 要更新的rule
- required: true
- schema:
- $ref: "#/definitions/AddOrUpdateRule"
- tags:
- - microservices
- - rules
- responses:
- 200:
- description: 修改成功
- schema:
- type: string
- 400:
- description: 错误的请求
- schema:
- $ref: '#/definitions/Error'
- 500:
- description: 内部错误
- schema:
- $ref: '#/definitions/Error'
- delete:
- description: |
- 为serviceId的服务删除黑白名单。
- operationId: deleteRule
- parameters:
- - name: x-domain-name
- in: header
- required: true
- type: string
- default: default
- - name: project
- in: path
- required: true
- type: string
- - name: serviceId
- in: path
- description: 微服务唯一标识。
- required: true
- type: string
- - name: ruleId
- in: path
- description: ruleId。
- required: true
- type: string
- tags:
- - microservices
- - rules
- responses:
- 200:
- description: 删除成功
- schema:
- type: string
- 400:
- description: 错误的请求
- schema:
- $ref: '#/definitions/Error'
- 500:
- description: 内部错误
- schema:
- $ref: '#/definitions/Error'
/v4/{project}/registry/microservices/{serviceId}/schemas/{schemaId}:
get:
description: |
diff --git a/etc/conf/app.yaml b/etc/conf/app.yaml
index 995eafc..5964b41 100644
--- a/etc/conf/app.yaml
+++ b/etc/conf/app.yaml
@@ -180,8 +180,6 @@ quota:
limit: 150000
schema:
limit: 100
- rule:
- limit: 100
tag:
limit: 100
account:
diff --git a/integration/rules_test.go b/integration/rules_test.go
deleted file mode 100644
index a031950..0000000
--- a/integration/rules_test.go
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * 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 integrationtest_test
-
-import (
- "bytes"
- "encoding/json"
- "io/ioutil"
- "math/rand"
- "net/http"
- "strconv"
- "strings"
- "time"
-
- . "github.com/apache/servicecomb-service-center/integration"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
- "github.com/widuu/gojson"
-)
-
-var _ = Describe("MicroService Api Test", func() {
- var serviceName = "integrationtestInstances"
- var serviceId = ""
- var serviceAppId = "integrationtestAppIdInstance"
- var serviceVersion = "0.0.2"
- var ruleID = ""
- Context("Tesing MicroService Rules API's", func() {
- BeforeEach(func() {
- schema := []string{"testSchema"}
- properties := map[string]string{"attr1": "aa"}
- servicemap := map[string]interface{}{
- "serviceName": serviceName + strconv.Itoa(rand.Int()),
- "appId": serviceAppId,
- "version": serviceVersion,
- "description": "examples",
- "level": "FRONT",
- "schemas": schema,
- "status": "UP",
- "properties": properties,
- }
- bodyParams := map[string]interface{}{
- "service": servicemap,
- }
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+REGISTERMICROSERVICE, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- // Validate the service creation
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- respbody, _ := ioutil.ReadAll(resp.Body)
- serviceId = gojson.Json(string(respbody)).Get("serviceId").Tostring()
- Expect(len(serviceId)).Should(BeNumerically("==", LengthUUID))
- })
-
- AfterEach(func() {
- if serviceId != "" {
- url := strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", serviceId, 1)
- req, _ := http.NewRequest(DELETE, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- resp, _ := scclient.Do(req)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- }
-
- })
-
- By("Create Micro-Service Rules API", func() {
- It("Create MicroService Rules", func() {
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- })
-
- It("Create MicroService Rules with empty rules", func() {
- rules := map[string]interface{}{}
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- It("Create MicroService Rules with wrong Rule Type", func() {
- rules := map[string]interface{}{
- "ruleType": "UKNOWN",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- It("Create MicroService Rules with worng service ID", func() {
- rules := map[string]interface{}{}
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", "XXXXXX", 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- It("Create MicroService Rules with duplicate rules", func() {
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
- //Duplicate Request
- <-time.After(time.Second)
- bodyBuf = bytes.NewReader(body)
- req, _ = http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(strings.TrimSpace(string(respbody))).To(Equal("{}"))
- })
- })
-
- By("Get Micro-Service Rules API", func() {
- It("Get Rules for MicroService", func() {
- //Add Rules
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
- //Get Rules
- <-time.After(time.Second)
- url = strings.Replace(GETRULES, ":serviceId", serviceId, 1)
- req, _ = http.NewRequest(GET, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- req.Header.Set("X-ConsumerId", serviceId)
- resp, _ = scclient.Do(req)
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- rulesStruct := map[string][]map[string]interface{}{}
- json.Unmarshal(respbody, &rulesStruct)
- for _, rule := range rulesStruct["rules"] {
- Expect(rule["ruleType"]).To(Equal("WHITE"))
- Expect(rule["attribute"]).To(Equal("tag_a"))
- Expect(rule["pattern"]).To(Equal("a+"))
- }
- })
-
- It("Get Empty Rules for MicroService", func() {
- //Get Rules
- url := strings.Replace(GETRULES, ":serviceId", serviceId, 1)
- req, _ := http.NewRequest(GET, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- req.Header.Set("X-ConsumerId", serviceId)
- resp, _ := scclient.Do(req)
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- Expect(strings.TrimSpace(string(respbody))).To(Equal("{}"))
- })
-
- It("Get Rules for Invalid MicroService", func() {
- //Get Rules
- url := strings.Replace(GETRULES, ":serviceId", "XXXX", 1)
- req, _ := http.NewRequest(GET, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- resp, _ := scclient.Do(req)
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- })
- By("Update Micro-Service Rules API", func() {
- It("Update MicroService rules with proper value", func() {
- //Add Rules
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- //Get the rule ID
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- rulesCreateRespStruct := map[string][]string{}
- json.Unmarshal(respbody, &rulesCreateRespStruct)
- for _, rule := range rulesCreateRespStruct["RuleIds"] {
- ruleID = rule
- break
- }
-
- //Update Rules
- <-time.After(time.Second)
- updateParams := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_b",
- "pattern": "a+",
- "description": "test ",
- }
- url = strings.Replace(UPDATERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- body, _ = json.Marshal(updateParams)
- bodyBuf = bytes.NewReader(body)
- req, _ = http.NewRequest(UPDATE, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- respbody, _ = ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
- //Get Rules
- <-time.After(time.Second)
- url = strings.Replace(GETRULES, ":serviceId", serviceId, 1)
- req, _ = http.NewRequest(GET, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- req.Header.Set("X-ConsumerId", serviceId)
- resp, _ = scclient.Do(req)
- respbody, _ = ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- rulesStruct := map[string][]map[string]interface{}{}
- json.Unmarshal(respbody, &rulesStruct)
- for _, rule := range rulesStruct["rules"] {
- Expect(rule["ruleType"]).To(Equal("WHITE"))
- Expect(rule["attribute"]).To(Equal("tag_b"))
- Expect(rule["pattern"]).To(Equal("a+"))
- }
- })
-
- It("Update MicroService tag with invalid Rules", func() {
- //Add Rules
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- //Get the rule ID
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- rulesCreateRespStruct := map[string][]string{}
- json.Unmarshal(respbody, &rulesCreateRespStruct)
- for _, rule := range rulesCreateRespStruct["RuleIds"] {
- ruleID = rule
- break
- }
-
- //Update Rules with invalid RuleType
- <-time.After(time.Second)
- updateParams := map[string]interface{}{
- "ruleType": "UNKNOWN",
- "attribute": "tag_b",
- "pattern": "a+",
- "description": "test ",
- }
- url = strings.Replace(UPDATERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- body, _ = json.Marshal(updateParams)
- bodyBuf = bytes.NewReader(body)
- req, _ = http.NewRequest(UPDATE, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
-
- //Update Rules with invalid pattern
- <-time.After(time.Second)
- updateParams = map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_b",
- "pattern": "",
- "description": "test ",
- }
- url = strings.Replace(UPDATERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- body, _ = json.Marshal(updateParams)
- bodyBuf = bytes.NewReader(body)
- req, _ = http.NewRequest(UPDATE, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
-
- //Update Rules with invalid different ruleType
- <-time.After(time.Second)
- updateParams = map[string]interface{}{
- "ruleType": "BLACK",
- "attribute": "tag_b",
- "pattern": "a+",
- "description": "test ",
- }
- url = strings.Replace(UPDATERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- body, _ = json.Marshal(updateParams)
- bodyBuf = bytes.NewReader(body)
- req, _ = http.NewRequest(UPDATE, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
-
- })
-
- It("Update MicroService Rule with non-exsisting RuleID", func() {
- updateParams := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_b",
- "pattern": "a+",
- "description": "test ",
- }
- url := strings.Replace(UPDATERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", "XXXX", 1)
- body, _ := json.Marshal(updateParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(UPDATE, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- })
- By("Delete Micro-Service Rules API", func() {
- It("Delete MicroService Rules with proper value", func() {
- //Add Rules
- rules := map[string]interface{}{
- "ruleType": "WHITE",
- "attribute": "tag_a",
- "pattern": "a+",
- "description": "test ",
- }
- rulesArray := []interface{}{rules}
- bodyParams := map[string][]interface{}{
- "rules": rulesArray,
- }
- url := strings.Replace(ADDRULE, ":serviceId", serviceId, 1)
- body, _ := json.Marshal(bodyParams)
- bodyBuf := bytes.NewReader(body)
- req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
-
- //Get the rule ID
- respbody, _ := ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- rulesCreateRespStruct := map[string][]string{}
- json.Unmarshal(respbody, &rulesCreateRespStruct)
- for _, rule := range rulesCreateRespStruct["RuleIds"] {
- ruleID = rule
- break
- }
-
- //Delete the Rules
- <-time.After(time.Second)
- url = strings.Replace(DELETERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- req, _ = http.NewRequest(DELETE, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- resp, err = scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
- //verify Delete
- <-time.After(time.Second)
- url = strings.Replace(GETTAGS, ":serviceId", serviceId, 1)
- req, _ = http.NewRequest(GET, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- req.Header.Set("X-ConsumerId", serviceId)
- resp, _ = scclient.Do(req)
- respbody, _ = ioutil.ReadAll(resp.Body)
- Expect(resp.StatusCode).To(Equal(http.StatusOK))
- Expect(strings.TrimSpace(string(respbody))).To(Equal("{}"))
- })
-
- It("Delete MicroService rules with non-exsisting ruleID", func() {
- url := strings.Replace(DELETERULES, ":serviceId", serviceId, 1)
- url = strings.Replace(url, ":rule_id", "XX", 1)
- req, _ := http.NewRequest(DELETE, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
-
- It("Delete MicroService rules with non-exsiting service id", func() {
- url := strings.Replace(DELETERULES, ":serviceId", "XX", 1)
- url = strings.Replace(url, ":rule_id", ruleID, 1)
- req, _ := http.NewRequest(DELETE, SCURL+url, nil)
- req.Header.Set("X-Domain-Name", "default")
- resp, err := scclient.Do(req)
- Expect(err).To(BeNil())
- defer resp.Body.Close()
- Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
- })
- })
- })
-})
diff --git a/pkg/dump/dump.go b/pkg/dump/dump.go
index 5acf129..f85988b 100644
--- a/pkg/dump/dump.go
+++ b/pkg/dump/dump.go
@@ -34,8 +34,6 @@ type MicroserviceSlice []*Microservice
type MicroserviceIndexSlice []*MicroserviceIndex
type MicroserviceAliasSlice []*MicroserviceAlias
type TagSlice []*Tag
-type MicroServiceRuleSlice []*MicroServiceRule
-type MicroServiceRuleIndexSlice []*MicroServiceRuleIndex
type MicroServiceDependencyRuleSlice []*MicroServiceDependencyRule
type SummarySlice []*Summary
type InstanceSlice []*Instance
@@ -72,22 +70,6 @@ func (s *TagSlice) ForEach(f func(i int, v *KV) bool) {
}
}
}
-func (s *MicroServiceRuleIndexSlice) ForEach(f func(i int, v *KV) bool) {
- for i, v := range *s {
- v.KV.Value = v.Value
- if !f(i, v.KV) {
- break
- }
- }
-}
-func (s *MicroServiceRuleSlice) ForEach(f func(i int, v *KV) bool) {
- for i, v := range *s {
- v.KV.Value = v.Value
- if !f(i, v.KV) {
- break
- }
- }
-}
func (s *MicroServiceDependencyRuleSlice) ForEach(f func(i int, v *KV) bool) {
for i, v := range *s {
v.KV.Value = v.Value
@@ -113,12 +95,10 @@ func (s *InstanceSlice) ForEach(f func(i int, v *KV) bool) {
}
}
-func (s *MicroserviceSlice) SetValue(v *KV) { *s = append(*s, NewMicroservice(v)) }
-func (s *MicroserviceIndexSlice) SetValue(v *KV) { *s = append(*s, NewMicroserviceIndex(v)) }
-func (s *MicroserviceAliasSlice) SetValue(v *KV) { *s = append(*s, NewMicroserviceAlias(v)) }
-func (s *TagSlice) SetValue(v *KV) { *s = append(*s, NewTag(v)) }
-func (s *MicroServiceRuleIndexSlice) SetValue(v *KV) { *s = append(*s, NewMicroServiceRuleIndex(v)) }
-func (s *MicroServiceRuleSlice) SetValue(v *KV) { *s = append(*s, NewMicroServiceRule(v)) }
+func (s *MicroserviceSlice) SetValue(v *KV) { *s = append(*s, NewMicroservice(v)) }
+func (s *MicroserviceIndexSlice) SetValue(v *KV) { *s = append(*s, NewMicroserviceIndex(v)) }
+func (s *MicroserviceAliasSlice) SetValue(v *KV) { *s = append(*s, NewMicroserviceAlias(v)) }
+func (s *TagSlice) SetValue(v *KV) { *s = append(*s, NewTag(v)) }
func (s *MicroServiceDependencyRuleSlice) SetValue(v *KV) {
*s = append(*s, NewMicroServiceDependencyRule(v))
}
@@ -135,12 +115,6 @@ func NewMicroserviceAlias(kv *KV) *MicroserviceAlias {
return &MicroserviceAlias{kv, kv.Value.(string)}
}
func NewTag(kv *KV) *Tag { return &Tag{kv, kv.Value.(map[string]string)} }
-func NewMicroServiceRuleIndex(kv *KV) *MicroServiceRuleIndex {
- return &MicroServiceRuleIndex{kv, kv.Value.(string)}
-}
-func NewMicroServiceRule(kv *KV) *MicroServiceRule {
- return &MicroServiceRule{kv, kv.Value.(*discovery.ServiceRule)}
-}
func NewMicroServiceDependencyRule(kv *KV) *MicroServiceDependencyRule {
return &MicroServiceDependencyRule{kv, kv.Value.(*discovery.MicroServiceDependency)}
}
@@ -154,8 +128,6 @@ type Cache struct {
Indexes MicroserviceIndexSlice `json:"serviceIndexes,omitempty"`
Aliases MicroserviceAliasSlice `json:"serviceAliases,omitempty"`
Tags TagSlice `json:"serviceTags,omitempty"`
- Rules MicroServiceRuleSlice `json:"serviceRules,omitempty"`
- RuleIndexes MicroServiceRuleIndexSlice `json:"serviceRuleIndexes,omitempty"`
DependencyRules MicroServiceDependencyRuleSlice `json:"dependencyRules,omitempty"`
Summaries SummarySlice `json:"summaries,omitempty"`
Instances InstanceSlice `json:"instances,omitempty"`
@@ -188,15 +160,6 @@ type MicroServiceDependencyRule struct {
Value *discovery.MicroServiceDependency `json:"value,omitempty"`
}
-type MicroServiceRuleIndex struct {
- *KV
- Value string `json:"value,omitempty"`
-}
-
-type MicroServiceRule struct {
- *KV
- Value *discovery.ServiceRule `json:"value,omitempty"`
-}
type Summary struct {
*KV
Value string `json:"value,omitempty"`
diff --git a/pkg/proto/service.go b/pkg/proto/service.go
index a38e005..1cf5faf 100644
--- a/pkg/proto/service.go
+++ b/pkg/proto/service.go
@@ -33,10 +33,6 @@ type ServiceCtrlServer interface {
GetOne(context.Context, *discovery.GetServiceRequest) (*discovery.GetServiceResponse, error)
GetServices(context.Context, *discovery.GetServicesRequest) (*discovery.GetServicesResponse, error)
UpdateProperties(context.Context, *discovery.UpdateServicePropsRequest) (*discovery.UpdateServicePropsResponse, error)
- AddRule(context.Context, *discovery.AddServiceRulesRequest) (*discovery.AddServiceRulesResponse, error)
- GetRule(context.Context, *discovery.GetServiceRulesRequest) (*discovery.GetServiceRulesResponse, error)
- UpdateRule(context.Context, *discovery.UpdateServiceRuleRequest) (*discovery.UpdateServiceRuleResponse, error)
- DeleteRule(context.Context, *discovery.DeleteServiceRulesRequest) (*discovery.DeleteServiceRulesResponse, error)
AddTags(context.Context, *discovery.AddServiceTagsRequest) (*discovery.AddServiceTagsResponse, error)
GetTags(context.Context, *discovery.GetServiceTagsRequest) (*discovery.GetServiceTagsResponse, error)
UpdateTag(context.Context, *discovery.UpdateServiceTagRequest) (*discovery.UpdateServiceTagResponse, error)
diff --git a/server/plugin/quota/buildin/buildin.go b/server/plugin/quota/buildin/buildin.go
index 5bc8e01..e448c8f 100644
--- a/server/plugin/quota/buildin/buildin.go
+++ b/server/plugin/quota/buildin/buildin.go
@@ -31,10 +31,10 @@ func init() {
func New() plugin.Instance {
quota.Init()
- log.Infof("quota init, service: %d, instance: %d, schema: %d/service, tag: %d/service, rule: %d/service"+
+ log.Infof("quota init, service: %d, instance: %d, schema: %d/service, tag: %d/service"+
", account: %d, role: %d",
quota.DefaultServiceQuota, quota.DefaultInstanceQuota,
- quota.DefaultSchemaQuota, quota.DefaultTagQuota, quota.DefaultRuleQuota,
+ quota.DefaultSchemaQuota, quota.DefaultTagQuota,
quota.DefaultAccountQuota, quota.DefaultRoleQuota)
return &Quota{}
}
@@ -48,8 +48,6 @@ func (q *Quota) GetQuota(ctx context.Context, t quota.ResourceType) int64 {
return int64(quota.DefaultInstanceQuota)
case quota.TypeService:
return int64(quota.DefaultServiceQuota)
- case quota.TypeRule:
- return int64(quota.DefaultRuleQuota)
case quota.TypeSchema:
return int64(quota.DefaultSchemaQuota)
case quota.TypeTag:
diff --git a/server/plugin/quota/quota.go b/server/plugin/quota/quota.go
index 1e114ef..d088149 100644
--- a/server/plugin/quota/quota.go
+++ b/server/plugin/quota/quota.go
@@ -38,15 +38,13 @@ const (
defaultServiceLimit = 50000
defaultInstanceLimit = 150000
defaultSchemaLimit = 100
- defaultRuleLimit = 100
defaultTagLimit = 100
defaultAccountLimit = 1000
defaultRoleLimit = 100
)
const (
- TypeRule ResourceType = iota
- TypeSchema
+ TypeSchema ResourceType = iota
TypeTag
TypeService
TypeInstance
@@ -59,7 +57,6 @@ var (
DefaultInstanceQuota = defaultInstanceLimit
DefaultSchemaQuota = defaultSchemaLimit
DefaultTagQuota = defaultTagLimit
- DefaultRuleQuota = defaultRuleLimit
DefaultAccountQuota = defaultAccountLimit
DefaultRoleQuota = defaultRoleLimit
)
@@ -69,7 +66,6 @@ func Init() {
DefaultInstanceQuota = config.GetInt("quota.cap.instance.limit", defaultInstanceLimit, config.WithENV("QUOTA_INSTANCE"))
DefaultSchemaQuota = config.GetInt("quota.cap.schema.limit", defaultSchemaLimit, config.WithENV("QUOTA_SCHEMA"))
DefaultTagQuota = config.GetInt("quota.cap.tag.limit", defaultTagLimit, config.WithENV("QUOTA_TAG"))
- DefaultRuleQuota = config.GetInt("quota.cap.rule.limit", defaultRuleLimit, config.WithENV("QUOTA_RULE"))
DefaultAccountQuota = config.GetInt("quota.cap.account.limit", defaultAccountLimit, config.WithENV("QUOTA_ACCOUNT"))
DefaultRoleQuota = config.GetInt("quota.cap.role.limit", defaultRoleLimit, config.WithENV("QUOTA_ROLE"))
}
@@ -99,8 +95,6 @@ type ResourceType int
func (r ResourceType) String() string {
switch r {
- case TypeRule:
- return "RULE"
case TypeSchema:
return "SCHEMA"
case TypeTag:
@@ -157,8 +151,6 @@ func GetResourceUsage(ctx context.Context, res *ApplyQuotaResource) (int64, erro
Domain: util.ParseDomain(ctx),
Project: util.ParseProject(ctx),
})
- case TypeRule:
- return quota.RuleUsage(ctx, serviceID)
case TypeSchema:
return quota.SchemaUsage(ctx, serviceID)
case TypeTag:
diff --git a/server/rest/controller/v3/query_rule_controller.go b/server/rest/controller/v3/query_rule_controller.go
deleted file mode 100644
index aa53eeb..0000000
--- a/server/rest/controller/v3/query_rule_controller.go
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 v3
-
-import (
- "net/http"
-
- "github.com/apache/servicecomb-service-center/pkg/rest"
- v4 "github.com/apache/servicecomb-service-center/server/rest/controller/v4"
-)
-
-type RuleService struct {
- v4.RuleService
-}
-
-func (this *RuleService) URLPatterns() []rest.Route {
- return []rest.Route{
- {http.MethodPost, "/registry/v3/microservices/:serviceId/rules", this.AddRule},
- {http.MethodGet, "/registry/v3/microservices/:serviceId/rules", this.GetRules},
- {http.MethodPut, "/registry/v3/microservices/:serviceId/rules/:rule_id", this.UpdateRule},
- {http.MethodDelete, "/registry/v3/microservices/:serviceId/rules/:rule_id", this.DeleteRule},
- }
-}
diff --git a/server/rest/controller/v3/v3.go b/server/rest/controller/v3/v3.go
index ec2fdc8..62e8691 100644
--- a/server/rest/controller/v3/v3.go
+++ b/server/rest/controller/v3/v3.go
@@ -30,7 +30,6 @@ func initRouter() {
roa.RegisterServant(&SchemaService{})
roa.RegisterServant(&DependencyService{})
roa.RegisterServant(&TagService{})
- roa.RegisterServant(&RuleService{})
roa.RegisterServant(&MicroServiceInstanceService{})
roa.RegisterServant(&WatchService{})
}
diff --git a/server/rest/controller/v4/query_rule_controller.go b/server/rest/controller/v4/query_rule_controller.go
deleted file mode 100644
index 1dc3b9c..0000000
--- a/server/rest/controller/v4/query_rule_controller.go
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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 v4
-
-import (
- "encoding/json"
- "io/ioutil"
- "net/http"
- "strings"
-
- "github.com/apache/servicecomb-service-center/pkg/log"
- "github.com/apache/servicecomb-service-center/pkg/rest"
- "github.com/apache/servicecomb-service-center/pkg/util"
- "github.com/apache/servicecomb-service-center/server/core"
- pb "github.com/go-chassis/cari/discovery"
-)
-
-type RuleService struct {
- //
-}
-
-func (s *RuleService) URLPatterns() []rest.Route {
- return []rest.Route{
- {Method: http.MethodPost, Path: "/v4/:project/registry/microservices/:serviceId/rules", Func: s.AddRule},
- {Method: http.MethodGet, Path: "/v4/:project/registry/microservices/:serviceId/rules", Func: s.GetRules},
- {Method: http.MethodPut, Path: "/v4/:project/registry/microservices/:serviceId/rules/:rule_id", Func: s.UpdateRule},
- {Method: http.MethodDelete, Path: "/v4/:project/registry/microservices/:serviceId/rules/:rule_id", Func: s.DeleteRule},
- }
-}
-func (s *RuleService) AddRule(w http.ResponseWriter, r *http.Request) {
- message, err := ioutil.ReadAll(r.Body)
- if err != nil {
- log.Error("read body failed", err)
- rest.WriteError(w, pb.ErrInvalidParams, err.Error())
- return
- }
- rule := map[string][]*pb.AddOrUpdateServiceRule{}
- err = json.Unmarshal(message, &rule)
- if err != nil {
- log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
- rest.WriteError(w, pb.ErrInvalidParams, err.Error())
- return
- }
-
- resp, err := core.ServiceAPI.AddRule(r.Context(), &pb.AddServiceRulesRequest{
- ServiceId: r.URL.Query().Get(":serviceId"),
- Rules: rule["rules"],
- })
- if err != nil {
- log.Errorf(err, "add rule failed")
- rest.WriteError(w, pb.ErrInternal, "add rule failed")
- return
- }
- rest.WriteResponse(w, r, resp.Response, resp)
-}
-
-func (s *RuleService) DeleteRule(w http.ResponseWriter, r *http.Request) {
- query := r.URL.Query()
- id := query.Get(":rule_id")
- ids := strings.Split(id, ",")
-
- resp, _ := core.ServiceAPI.DeleteRule(r.Context(), &pb.DeleteServiceRulesRequest{
- ServiceId: query.Get(":serviceId"),
- RuleIds: ids,
- })
- rest.WriteResponse(w, r, resp.Response, nil)
-}
-
-func (s *RuleService) UpdateRule(w http.ResponseWriter, r *http.Request) {
- message, err := ioutil.ReadAll(r.Body)
- if err != nil {
- log.Error("read body failed", err)
- rest.WriteError(w, pb.ErrInvalidParams, err.Error())
- return
- }
-
- rule := pb.AddOrUpdateServiceRule{}
- err = json.Unmarshal(message, &rule)
- if err != nil {
- log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(message))
- rest.WriteError(w, pb.ErrInvalidParams, err.Error())
- return
- }
- query := r.URL.Query()
- resp, err := core.ServiceAPI.UpdateRule(r.Context(), &pb.UpdateServiceRuleRequest{
- ServiceId: query.Get(":serviceId"),
- RuleId: query.Get(":rule_id"),
- Rule: &rule,
- })
- if err != nil {
- log.Errorf(err, "update rule failed")
- rest.WriteError(w, pb.ErrInternal, "update rule failed")
- return
- }
- rest.WriteResponse(w, r, resp.Response, nil)
-}
-
-func (s *RuleService) GetRules(w http.ResponseWriter, r *http.Request) {
- resp, _ := core.ServiceAPI.GetRule(r.Context(), &pb.GetServiceRulesRequest{
- ServiceId: r.URL.Query().Get(":serviceId"),
- })
- rest.WriteResponse(w, r, resp.Response, resp)
-}
diff --git a/server/rest/controller/v4/v4.go b/server/rest/controller/v4/v4.go
index 4944ff8..2c3e022 100644
--- a/server/rest/controller/v4/v4.go
+++ b/server/rest/controller/v4/v4.go
@@ -31,7 +31,6 @@ func initRouter() {
roa.RegisterServant(&SchemaService{})
roa.RegisterServant(&DependencyService{})
roa.RegisterServant(&TagService{})
- roa.RegisterServant(&RuleService{})
roa.RegisterServant(&MicroServiceInstanceService{})
roa.RegisterServant(&WatchService{})
}
diff --git a/server/service/disco/microservice.go b/server/service/disco/microservice.go
index 0145453..f014681 100644
--- a/server/service/disco/microservice.go
+++ b/server/service/disco/microservice.go
@@ -261,28 +261,8 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
ServiceId: serviceID,
Response: &pb.Response{},
}
- var chanLen int = 0
+ var chanLen = 0
createRespChan := make(chan *pb.Response, 10)
- //create rules
- if in.Rules != nil && len(in.Rules) != 0 {
- chanLen++
- gopool.Go(func(_ context.Context) {
- req := &pb.AddServiceRulesRequest{
- ServiceId: serviceID,
- Rules: in.Rules,
- }
- chanRsp := &pb.Response{}
- rsp, err := s.AddRule(ctx, req)
- if err != nil {
- chanRsp.Message = err.Error()
- }
-
- if rsp.Response.GetCode() != pb.ResponseSuccess {
- chanRsp.Message = rsp.Response.GetMessage()
- }
- createRespChan <- chanRsp
- })
- }
//create tags
if in.Tags != nil && len(in.Tags) != 0 {
chanLen++
diff --git a/server/service/disco/microservice_test.go b/server/service/disco/microservice_test.go
index 85142c3..8badaad 100644
--- a/server/service/disco/microservice_test.go
+++ b/server/service/disco/microservice_test.go
@@ -148,7 +148,7 @@ var _ = Describe("'Micro-service' service", func() {
Expect(err).To(BeNil())
Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- By("check the tags/rules/instances")
+ By("check the tags/instances")
respGetTags, err := serviceResource.GetTags(getContext(), &pb.GetServiceTagsRequest{
ServiceId: resp.ServiceId,
})
@@ -156,13 +156,6 @@ var _ = Describe("'Micro-service' service", func() {
Expect(respGetTags.Response.GetCode()).To(Equal(pb.ResponseSuccess))
Expect(respGetTags.Tags["second"]).To(Equal("second"))
- respGetRules, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: resp.ServiceId,
- })
- Expect(err).To(BeNil())
- Expect(respGetRules.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(respGetRules.Rules[0].Attribute).To(Equal("ServiceName"))
-
respGetInsts, err := disco.GetInstances(getContext(), &pb.GetInstancesRequest{
ConsumerServiceId: resp.ServiceId,
ProviderServiceId: resp.ServiceId,
diff --git a/server/service/disco/rule.go b/server/service/disco/rule.go
deleted file mode 100644
index 13a4f68..0000000
--- a/server/service/disco/rule.go
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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 disco
-
-import (
- "context"
-
- pb "github.com/go-chassis/cari/discovery"
-
- "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/service/validator"
-)
-
-func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRulesRequest) (*pb.AddServiceRulesResponse, error) {
- err := validator.Validate(in)
- if err != nil {
- remoteIP := util.GetIPFromContext(ctx)
- log.Errorf(err, "add service[%s] rule failed, operator: %s", in.ServiceId, remoteIP)
- return &pb.AddServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInvalidParams, err.Error()),
- }, nil
- }
-
- return datasource.GetMetadataManager().AddRule(ctx, in)
-}
-
-func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServiceRuleRequest) (*pb.UpdateServiceRuleResponse, error) {
- err := validator.Validate(in)
- if err != nil {
- remoteIP := util.GetIPFromContext(ctx)
- log.Errorf(err, "update service rule[%s/%s] failed, operator: %s", in.ServiceId, in.RuleId, remoteIP)
- return &pb.UpdateServiceRuleResponse{
- Response: pb.CreateResponse(pb.ErrInvalidParams, err.Error()),
- }, nil
- }
-
- return datasource.GetMetadataManager().UpdateRule(ctx, in)
-}
-
-func (s *MicroServiceService) GetRule(ctx context.Context, in *pb.GetServiceRulesRequest) (*pb.GetServiceRulesResponse, error) {
- err := validator.Validate(in)
- if err != nil {
- log.Errorf(err, "get service[%s] rule failed", in.ServiceId)
- return &pb.GetServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInvalidParams, err.Error()),
- }, nil
- }
-
- return datasource.GetMetadataManager().GetRules(ctx, in)
-}
-
-func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServiceRulesRequest) (*pb.DeleteServiceRulesResponse, error) {
- err := validator.Validate(in)
- if err != nil {
- remoteIP := util.GetIPFromContext(ctx)
- log.Errorf(err, "delete service[%s] rules %v failed, operator: %s", in.ServiceId, in.RuleIds, remoteIP)
- return &pb.DeleteServiceRulesResponse{
- Response: pb.CreateResponse(pb.ErrInvalidParams, err.Error()),
- }, nil
- }
-
- return datasource.GetMetadataManager().DeleteRule(ctx, in)
-}
diff --git a/server/service/disco/rule_test.go b/server/service/disco/rule_test.go
deleted file mode 100644
index 6348a27..0000000
--- a/server/service/disco/rule_test.go
+++ /dev/null
@@ -1,750 +0,0 @@
-/*
- * 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 disco_test
-
-import (
- "strconv"
-
- discosvc "github.com/apache/servicecomb-service-center/server/service/disco"
-
- "github.com/apache/servicecomb-service-center/server/plugin/quota"
- pb "github.com/go-chassis/cari/discovery"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("'Rule' service", func() {
- Describe("execute 'create' operartion", func() {
- var (
- serviceId1 string
- serviceId2 string
- )
-
- It("should be passed", func() {
- respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "create_rule_group",
- ServiceName: "create_rule_service",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- serviceId1 = respCreateService.ServiceId
-
- respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "create_rule_group",
- ServiceName: "create_rule_service",
- Version: "1.0.1",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- serviceId2 = respCreateService.ServiceId
- })
-
- Context("when request is invalid", func() {
- It("should be failed", func() {
- By("attribute is empty")
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("attribute is tag but name is invalid")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "tag_@34",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("attribute is a invalid field name")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "xxx",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("service does not exist")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: "notexistservice",
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("service id is empty")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: "",
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "",
- Pattern: "Test*",
- Description: "test white",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("rules is nil")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
- })
- })
-
- Context("when request is valid", func() {
- It("should be passed", func() {
- By("create a new black list")
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test black",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- ruleId := respAddRule.RuleIds[0]
- Expect(ruleId).ToNot(Equal(""))
-
- By("create the black list again")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test change black",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(len(respAddRule.RuleIds)).To(Equal(0)) // no changed
-
- By("create a new white list when black list already exists")
- respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId1,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
- })
- })
-
- Context("when create rule out of gauge", func() {
- It("should be failed", func() {
- size := quota.DefaultRuleQuota + 1
- rules := make([]*pb.AddOrUpdateServiceRule, 0, size)
- for i := 0; i < size; i++ {
- rules = append(rules, &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: strconv.Itoa(i),
- Description: "test white",
- })
- }
- resp, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId2,
- Rules: rules,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId2,
- Rules: rules[:size-1],
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId2,
- Rules: rules[size-1:],
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ErrNotEnoughQuota))
- })
- })
- })
-
- Describe("execute 'get' operartion", func() {
- var (
- serviceId string
- ruleId string
- )
-
- It("should be passed", func() {
- respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "get_rule_group",
- ServiceName: "get_rule_service",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- ruleId = respAddRule.RuleIds[0]
- Expect(ruleId).ToNot(Equal(""))
- })
-
- Context("when request is invalid", func() {
- It("should be failed", func() {
- By("service id is invalid")
- respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: "",
- })
- Expect(err).To(BeNil())
- Expect(respGetRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- respGetRule, err = serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: TOO_LONG_SERVICEID,
- })
- Expect(err).To(BeNil())
- Expect(respGetRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- By("service does not exist")
- respGetRule, err = serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: "notexist",
- })
- Expect(err).To(BeNil())
- Expect(respGetRule.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
- })
- })
-
- Context("when request is valid", func() {
- It("should be passed", func() {
- respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: serviceId,
- })
- Expect(err).To(BeNil())
- Expect(respGetRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(respGetRule.Rules[0].RuleId).To(Equal(ruleId))
- })
- })
- })
-
- Describe("execute 'update' operartion", func() {
- var (
- serviceId string
- ruleId string
- )
-
- It("should be passed", func() {
- respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "update_rule_group",
- ServiceName: "update_rule_service",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- ruleId = respAddRule.RuleIds[0]
- Expect(ruleId).ToNot(Equal(""))
- })
-
- Context("when request is invalid", func() {
- It("should be failed", func() {
- rule := &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK update",
- }
- By("service id is empty")
- respAddRule, err := serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: "",
- RuleId: ruleId,
- Rule: rule,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("service does not exist")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: "notexistservice",
- RuleId: ruleId,
- Rule: rule,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("rule id is empty")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: "",
- Rule: rule,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("rule does not exist")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: "notexistrule",
- Rule: rule,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("rule type is invalid")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "notType",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK update",
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("attribute is a invalid field name")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "noattribute",
- Pattern: "Test*",
- Description: "test BLACK update",
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("attribute is tag but name is invalid")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "tag_@34",
- Pattern: "Test*",
- Description: "test BLACK update",
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
- By("change rule type")
- respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "WHITE",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test white update",
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
- })
- })
-
- Context("when request is valid", func() {
- It("should be passed", func() {
- respAddRule, err := serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
- ServiceId: serviceId,
- RuleId: ruleId,
- Rule: &pb.AddOrUpdateServiceRule{
- RuleType: "BLACK",
- Attribute: "AppId",
- Pattern: "Test*",
- Description: "test white update",
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- })
- })
- })
-
- Describe("execute 'delete' operartion", func() {
- var (
- serviceId string
- ruleId string
- )
-
- It("should be passed", func() {
- respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "delete_rule_group",
- ServiceName: "delete_rule_service",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- serviceId = respCreateService.ServiceId
-
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: serviceId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "ServiceName",
- Pattern: "Test*",
- Description: "test BLACK",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- ruleId = respAddRule.RuleIds[0]
- Expect(ruleId).ToNot(Equal(""))
- })
-
- Context("when request is invalid", func() {
- It("should be failed", func() {
- By("service id is empty")
- respAddRule, err := serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: "",
- RuleIds: []string{"1000000"},
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- By("service does not exist")
- respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: "notexistservice",
- RuleIds: []string{"1000000"},
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
- By("rule does not exist")
- respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- RuleIds: []string{"notexistrule"},
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrRuleNotExists))
-
- By("rules is empty")
- respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- By("rules is invalid")
- var arr []string
- for i := 0; i < quota.DefaultRuleQuota+1; i++ {
- arr = append(arr, strconv.Itoa(i))
- }
- respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- RuleIds: arr,
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
- })
- })
-
- Context("when request is valid", func() {
- It("should be passed", func() {
- respAddRule, err := serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
- ServiceId: serviceId,
- RuleIds: []string{ruleId},
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
- ServiceId: serviceId,
- })
- Expect(err).To(BeNil())
- Expect(respGetRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(len(respGetRule.Rules)).To(Equal(0))
- })
- })
- })
-
- Describe("execute 'permission' operartion", func() {
- var (
- consumerVersion string
- consumerTag string
- providerBlack string
- providerWhite string
- )
-
- It("should be passed", func() {
- respCreate, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag",
- ServiceName: "query_instance_version_consumer",
- Version: "1.0.0",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- consumerVersion = respCreate.ServiceId
-
- respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag",
- ServiceName: "query_instance_tag_service",
- Version: "1.0.2",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- providerBlack = respCreate.ServiceId
-
- resp, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: providerBlack,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "BLACK",
- Attribute: "Version",
- Pattern: "1.0.0",
- },
- {
- RuleType: "BLACK",
- Attribute: "tag_a",
- Pattern: "b",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag",
- ServiceName: "query_instance_tag_service",
- Version: "1.0.3",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- providerWhite = respCreate.ServiceId
-
- resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: providerWhite,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "Version",
- Pattern: "1.0.0",
- },
- {
- RuleType: "WHITE",
- Attribute: "tag_a",
- Pattern: "b",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
- Service: &pb.MicroService{
- AppId: "query_instance_tag",
- ServiceName: "query_instance_tag_consumer",
- Version: "1.0.4",
- Level: "FRONT",
- Status: pb.MS_UP,
- },
- })
- Expect(err).To(BeNil())
- Expect(respCreate.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- consumerTag = respCreate.ServiceId
-
- resp1, err := serviceResource.AddTags(getContext(), &pb.AddServiceTagsRequest{
- ServiceId: consumerTag,
- Tags: map[string]string{"a": "b"},
- })
- Expect(err).To(BeNil())
- Expect(resp1.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- })
-
- Context("when query instances", func() {
- It("should be failed", func() {
- By("consumer version in black list")
- resp, err := discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerVersion,
- ProviderServiceId: providerBlack,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
- By("consumer tag in black list")
- resp, err = discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerTag,
- ProviderServiceId: providerBlack,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
- By("find should return 200 even if consumer permission deny")
- respFind, err := discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerVersion,
- AppId: "query_instance_tag",
- ServiceName: "query_instance_tag_service",
- VersionRule: "0+",
- })
- Expect(err).To(BeNil())
- Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(len(respFind.Instances)).To(Equal(0))
- respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerTag,
- AppId: "query_instance_tag",
- ServiceName: "query_instance_tag_service",
- VersionRule: "0+",
- })
- Expect(err).To(BeNil())
- Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(len(respFind.Instances)).To(Equal(0))
-
- By("consumer not in black list")
- resp, err = discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: providerWhite,
- ProviderServiceId: providerBlack,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- By("consumer not in white list")
- resp, err = discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: providerBlack,
- ProviderServiceId: providerWhite,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
- By("consumer version in white list")
- resp, err = discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerVersion,
- ProviderServiceId: providerWhite,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- By("consumer tag in white list")
- resp, err = discosvc.GetInstances(getContext(), &pb.GetInstancesRequest{
- ConsumerServiceId: consumerTag,
- ProviderServiceId: providerWhite,
- })
- Expect(err).To(BeNil())
- Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- })
- })
- })
-})
diff --git a/server/service/disco/tag_test.go b/server/service/disco/tag_test.go
index 92b63df..7483d50 100644
--- a/server/service/disco/tag_test.go
+++ b/server/service/disco/tag_test.go
@@ -102,7 +102,7 @@ var _ = Describe("'Tag' service", func() {
Context("when request is valid", func() {
It("should be passed", func() {
By("all max")
- size := quota.DefaultRuleQuota
+ size := quota.DefaultTagQuota
tags := make(map[string]string, size)
for i := 0; i < size; i++ {
s := "tag" + strconv.Itoa(i)
@@ -128,7 +128,7 @@ var _ = Describe("'Tag' service", func() {
Context("when create tag out of gauge", func() {
It("should be failed", func() {
- size := quota.DefaultRuleQuota + 1
+ size := quota.DefaultTagQuota + 1
tags := make(map[string]string, size)
for i := 0; i < size; i++ {
s := "tag" + strconv.Itoa(i)
@@ -141,7 +141,7 @@ var _ = Describe("'Tag' service", func() {
Expect(err).To(BeNil())
Expect(respAddTags.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
- size = quota.DefaultRuleQuota
+ size = quota.DefaultTagQuota
tags = make(map[string]string, size)
for i := 0; i < size; i++ {
s := "tag" + strconv.Itoa(i)
@@ -385,48 +385,6 @@ var _ = Describe("'Tag' service", func() {
Expect(err).To(BeNil())
Expect(findResp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
Expect(findResp.Instances[0].InstanceId).To(Equal(instanceResp.InstanceId))
-
- respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
- ServiceId: providerId,
- Rules: []*pb.AddOrUpdateServiceRule{
- {
- RuleType: "WHITE",
- Attribute: "tag_consumer_tag",
- Pattern: "f*",
- Description: "test white",
- },
- },
- })
- Expect(err).To(BeNil())
- Expect(respAddRule.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- findResp, err = disco.FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerId,
- AppId: "find_inst_tag_group",
- ServiceName: "find_inst_tag_provider",
- VersionRule: "1.0.0+",
- Tags: []string{"filter_tag"},
- })
- Expect(err).To(BeNil())
- Expect(findResp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(len(findResp.Instances)).To(Equal(0))
-
- addTagResp, err = serviceResource.AddTags(getContext(), &pb.AddServiceTagsRequest{
- ServiceId: consumerId,
- Tags: map[string]string{"consumer_tag": "filter"},
- })
- Expect(err).To(BeNil())
- Expect(addTagResp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
- findResp, err = disco.FindInstances(getContext(), &pb.FindInstancesRequest{
- ConsumerServiceId: consumerId,
- AppId: "find_inst_tag_group",
- ServiceName: "find_inst_tag_provider",
- VersionRule: "1.0.0+",
- Tags: []string{"filter_tag"},
- })
- Expect(findResp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
- Expect(findResp.Instances[0].InstanceId).To(Equal(instanceResp.InstanceId))
})
})
@@ -512,7 +470,7 @@ var _ = Describe("'Tag' service", func() {
Expect(respAddTags.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
var arr []string
- for i := 0; i < quota.DefaultRuleQuota+1; i++ {
+ for i := 0; i < quota.DefaultTagQuota+1; i++ {
arr = append(arr, strconv.Itoa(i))
}
respAddTags, err = serviceResource.DeleteTags(getContext(), &pb.DeleteServiceTagsRequest{
diff --git a/server/service/quota/quota.go b/server/service/quota/quota.go
index 9074e74..036b0ff 100644
--- a/server/service/quota/quota.go
+++ b/server/service/quota/quota.go
@@ -40,16 +40,6 @@ func InstanceUsage(ctx context.Context, request *discovery.GetServiceCountReques
return resp.Count, nil
}
-func RuleUsage(ctx context.Context, serviceID string) (int64, error) {
- resp, err := datasource.GetMetadataManager().GetRules(ctx, &discovery.GetServiceRulesRequest{
- ServiceId: serviceID,
- })
- if err != nil {
- return 0, err
- }
- return int64(len(resp.Rules)), nil
-}
-
func SchemaUsage(ctx context.Context, serviceID string) (int64, error) {
resp, err := datasource.GetMetadataManager().GetAllSchemas(ctx, &discovery.GetAllSchemaRequest{
ServiceId: serviceID,
diff --git a/server/service/validator/rule_validator.go b/server/service/validator/rule_validator.go
deleted file mode 100644
index 6f7c7d4..0000000
--- a/server/service/validator/rule_validator.go
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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 validator
-
-import (
- "regexp"
-
- "github.com/apache/servicecomb-service-center/pkg/validate"
- "github.com/apache/servicecomb-service-center/server/plugin/quota"
-)
-
-var (
- getRulesReqValidator validate.Validator
- updateRuleReqValidator validate.Validator
- addRulesReqValidator validate.Validator
- deleteRulesReqValidator validate.Validator
-)
-
-var (
- ruleRegex, _ = regexp.Compile(`^(WHITE|BLACK)$`)
- ruleAttrRegex, _ = regexp.Compile(`((^tag_[a-zA-Z][a-zA-Z0-9_\-.]{0,63}$)|(^ServiceId$)|(^AppId$)|(^ServiceName$)|(^Version$)|(^Description$)|(^Level$)|(^Status$))`)
-)
-
-func GetRulesReqValidator() *validate.Validator {
- return getRulesReqValidator.Init(func(v *validate.Validator) {
- v.AddRule("ServiceId", GetServiceReqValidator().GetRule("ServiceId"))
- })
-}
-
-func UpdateRuleReqValidator() *validate.Validator {
- return updateRuleReqValidator.Init(func(v *validate.Validator) {
- var ruleValidator validate.Validator
- ruleValidator.AddRule("RuleType", &validate.Rule{Regexp: ruleRegex})
- ruleValidator.AddRule("Attribute", &validate.Rule{Regexp: ruleAttrRegex})
- ruleValidator.AddRule("Pattern", &validate.Rule{Min: 1, Max: 64})
- ruleValidator.AddRule("Description", CreateServiceReqValidator().GetSub("Service").GetRule("Description"))
-
- v.AddRule("ServiceId", GetServiceReqValidator().GetRule("ServiceId"))
- v.AddRule("RuleId", GetServiceReqValidator().GetRule("ServiceId"))
- v.AddSub("Rule", &ruleValidator)
- })
-}
-
-func AddRulesReqValidator() *validate.Validator {
- return addRulesReqValidator.Init(func(v *validate.Validator) {
- v.AddRule("ServiceId", GetServiceReqValidator().GetRule("ServiceId"))
- v.AddRule("Rules", &validate.Rule{Min: 1, Max: quota.DefaultRuleQuota})
- v.AddSub("Rules", UpdateRuleReqValidator().GetSub("Rule"))
- })
-}
-
-func DeleteRulesReqValidator() *validate.Validator {
- return deleteRulesReqValidator.Init(func(v *validate.Validator) {
- v.AddRule("ServiceId", GetServiceReqValidator().GetRule("ServiceId"))
- v.AddRule("RuleIds", &validate.Rule{Min: 1, Max: quota.DefaultRuleQuota})
- })
-}
diff --git a/server/service/validator/validator.go b/server/service/validator/validator.go
index b00ea98..02cf2c3 100644
--- a/server/service/validator/validator.go
+++ b/server/service/validator/validator.go
@@ -101,14 +101,6 @@ func Validate(v interface{}) error {
return HeartbeatReqValidator().Validate(v)
case *pb.UpdateInstancePropsRequest:
return UpdateInstancePropsReqValidator().Validate(v)
- case *pb.GetServiceRulesRequest:
- return GetRulesReqValidator().Validate(v)
- case *pb.AddServiceRulesRequest:
- return AddRulesReqValidator().Validate(v)
- case *pb.UpdateServiceRuleRequest:
- return UpdateRuleReqValidator().Validate(v)
- case *pb.DeleteServiceRulesRequest:
- return DeleteRulesReqValidator().Validate(v)
case *pb.GetAppsRequest:
return MicroServiceKeyValidator().Validate(v)
default: