func (c *Config) ConstructRule(rule Rule) *routing.Rule { if rule.Next == "" && rule.Pool == "" { logger.Errorf("[rule %s] no pool or trie", rule.Name) return routing.DummyRule(rule.Name) } var next *routing.Trie if rule.Next != "" { next = c.Tries[rule.Next] if next == nil { logger.Errorf("[rule %s] trie %s absent", rule.Name, rule.Next) next = routing.DummyTrie(rule.Next) } } var pool *backend.Pool if rule.Pool != "" { pool = c.Pools[rule.Pool] if pool == nil { logger.Errorf("[rule %s] trie %s absent", rule.Name, rule.Pool) pool = backend.DummyPool(rule.Pool) } } matcher, err := c.MatcherFactory.Make(rule.Type, rule.Value) if err != nil { logger.Errorf("[rule %s] setting matcher false", rule.Name) matcher = routing.NewStaticMatcher("false") } return routing.NewRule(rule.Name, matcher, next, pool) }
func (c *Config) ConstructTrie(trie Trie) *routing.Trie { list := []*routing.Rule{} for _, rule := range trie.Rules { if _, ok := c.Rules[rule]; ok { list = append(list, c.Rules[rule]) } else { logger.Errorf("[trie %s] rule %s absent", trie.Name, rule) list = append(list, routing.DummyRule(rule)) } } return routing.NewTrie(trie.Name, list) }
func (c *Config) DelRule(name string) { c.Lock() defer c.Unlock() if _, ok := c.Rules[name]; !ok { logger.Errorf("no rule %s to delete", name) return } // nil references to this rule dummy := routing.DummyRule(name) for _, trie := range c.Tries { trie.UpdateRule(dummy) } delete(c.Rules, name) }