in pkg/filter/traffic/traffic.go [96:137]
func (factory *FilterFactory) Apply() error {
var (
router string
up int
)
for _, cluster := range factory.cfg.Traffics {
up = 0
router = cluster.Router
if len(factory.rulesMap[router]) != 0 {
lastCeil := factory.rulesMap[router][len(factory.rulesMap[router])-1].weightCeil
if lastCeil != -1 {
up = lastCeil
}
}
wp := &ClusterWrapper{
Cluster: cluster,
weightCeil: -1,
weightFloor: -1,
}
if cluster.CanaryByHeader != "" {
if _, ok := factory.record[cluster.CanaryByHeader]; ok {
return errors.New("duplicate canary-by-header values")
} else {
factory.record[cluster.CanaryByHeader] = struct{}{}
wp.header = cluster.CanaryByHeader
}
}
if cluster.CanaryWeight > 0 && cluster.CanaryWeight <= 100 {
if up+cluster.CanaryWeight > 100 {
return fmt.Errorf("[dubbo-go-pixiu] clusters' weight sum more than 100 in %v service!", cluster.Router)
} else {
wp.weightFloor = up
up += cluster.CanaryWeight
wp.weightCeil = up
}
}
factory.rulesMap[router] = append(factory.rulesMap[router], wp)
}
return nil
}