in cluster/router/script/router.go [69:141]
func (s *ScriptRouter) Process(event *config_center.ConfigChangeEvent) {
s.mu.Lock()
defer s.mu.Unlock()
rawConf, ok := event.Value.(string)
if !ok {
panic(ok)
}
cfg, err := parseRoute(rawConf)
if err != nil {
logger.Errorf("Parse route cfg failed: %v", err)
return
}
switch event.ConfigType {
case remoting.EventTypeAdd, remoting.EventTypeUpdate:
//destroy old instance
if s.enabled && s.scriptType != "" {
in, err := ins.GetInstances(s.scriptType)
if err != nil {
logger.Errorf("GetInstances failed to Destroy: %v", err)
} else {
in.Destroy(s.rawScript)
}
}
// check new config
if "" == cfg.ScriptType {
logger.Errorf("`type` field must be set in config")
return
}
if "" == cfg.Script {
logger.Errorf("`script` field must be set in config")
return
}
if "" == cfg.Key {
logger.Errorf("`applicationName` field must be set in config")
return
}
if !*cfg.Enabled {
logger.Infof("`enabled` field equiles false, this rule will be ignored :%s", cfg.Script)
}
// rewrite to ScriptRouter
s.enabled = *cfg.Enabled
s.rawScript = cfg.Script
s.scriptType = cfg.ScriptType
// compile script
in, err := ins.GetInstances(s.scriptType)
if err != nil {
logger.Errorf("GetInstances failed: %v", err)
s.enabled = false
return
}
if s.enabled {
err = in.Compile(s.rawScript)
// fail, disable rule
if err != nil {
s.enabled = false
logger.Errorf("Compile Script failed: %v", err)
}
}
case remoting.EventTypeDel:
in, _ := ins.GetInstances(s.scriptType)
if in != nil && s.enabled {
in.Destroy(s.rawScript)
}
s.enabled = false
s.rawScript = ""
s.scriptType = ""
}
}