in core/flow/rule_manager.go [591:651]
func IsValidRule(rule *Rule) error {
if rule == nil {
return errors.New("nil Rule")
}
if rule.Resource == "" {
return errors.New("empty Resource")
}
if rule.Threshold < 0 {
return errors.New("negative Threshold")
}
if int32(rule.TokenCalculateStrategy) < 0 {
return errors.New("negative TokenCalculateStrategy")
}
if int32(rule.ControlBehavior) < 0 {
return errors.New("negative ControlBehavior")
}
if !(rule.RelationStrategy >= CurrentResource && rule.RelationStrategy <= AssociatedResource) {
return errors.New("invalid RelationStrategy")
}
if rule.RelationStrategy == AssociatedResource && rule.RefResource == "" {
return errors.New("RefResource must be non empty when RelationStrategy is AssociatedResource")
}
if rule.TokenCalculateStrategy == WarmUp {
if rule.WarmUpPeriodSec <= 0 {
return errors.New("WarmUpPeriodSec must be great than 0")
}
if rule.WarmUpColdFactor == 1 {
return errors.New("WarmUpColdFactor must be great than 1")
}
}
if rule.StatIntervalInMs > 10*60*1000 {
logging.Info("StatIntervalInMs is great than 10 minutes, less than 10 minutes is recommended.")
}
if rule.TokenCalculateStrategy == MemoryAdaptive {
if rule.LowMemUsageThreshold <= 0 {
return errors.New("rule.LowMemUsageThreshold <= 0")
}
if rule.HighMemUsageThreshold <= 0 {
return errors.New("rule.HighMemUsageThreshold <= 0")
}
if rule.HighMemUsageThreshold >= rule.LowMemUsageThreshold {
return errors.New("rule.HighMemUsageThreshold >= rule.LowMemUsageThreshold")
}
if rule.MemLowWaterMarkBytes <= 0 {
return errors.New("rule.MemLowWaterMarkBytes <= 0")
}
if rule.MemHighWaterMarkBytes <= 0 {
return errors.New("rule.MemHighWaterMarkBytes <= 0")
}
if rule.MemHighWaterMarkBytes > int64(system_metric.TotalMemorySize) {
return errors.New("rule.MemHighWaterMarkBytes should not be greater than current system's total memory size")
}
if rule.MemLowWaterMarkBytes >= rule.MemHighWaterMarkBytes {
// can not be equal to defeat from zero overflow
return errors.New("rule.MemLowWaterMarkBytes >= rule.MemHighWaterMarkBytes")
}
}
return nil
}