func()

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
}