in pkg/admin/services/traffic/region.go [56:104]
func (tm *RegionService) Search(r *model.Region) ([]*model.Region, error) {
result := make([]*model.Region, 0)
var con string
if r.Service != "" && r.Service != "*" {
con = util.ColonSeparatedKey(r.Service, r.Group, r.Version)
}
list, err := services.GetRules(con, constant.ConditionRuleSuffix)
if err != nil {
return result, err
}
for k, v := range list {
k, _ = strings.CutSuffix(k, constant.ConditionRuleSuffix)
split := strings.Split(k, ":")
region := &model.Region{
Service: split[0],
}
if len(split) >= 2 {
region.Version = split[1]
}
if len(split) >= 3 {
region.Group = split[2]
}
route := &model.ConditionRoute{}
err = yaml.Unmarshal([]byte(v), route)
if err != nil {
return result, err
}
for _, c := range route.Conditions {
// fixme, regex match
if strings.Contains(c, model.RegionAdminIdentifier) {
i := strings.Index(c, "=$")
if i > 3 {
region.Rule = strings.TrimSpace(c[3:i])
break
}
}
}
if region.Rule != "" {
result = append(result, region)
}
}
return result, nil
}