func IsValidRule()

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
}