func()

in api/v1/alertrule_types.go [50:99]


func (a *AlertRuleSpec) UnmarshalJSON(data []byte) error {
	rule := make(map[string]interface{})
	if err := json.Unmarshal(data, &rule); err != nil {
		return err
	}
	a.Database = rule["database"].(string)
	if rule["interval"] != nil {
		dur := rule["interval"].(string)
		if dur != "" {
			d, err := time.ParseDuration(dur)
			if err != nil {
				return err
			}
			a.Interval = metav1.Duration{Duration: d}
		}
	}

	a.Query = rule["query"].(string)

	if rule["autoMitigateAfter"] != nil {
		mit := rule["autoMitigateAfter"].(string)
		if mit != "" {
			d, err := time.ParseDuration(mit)
			if err != nil {
				return err
			}
			a.AutoMitigateAfter = metav1.Duration{Duration: d}
		}
	}
	a.Destination = rule["destination"].(string)

	// The type for Criteria has changed to map[string][]string.  This handles backwards compatibility where
	// some existing alerts may have a string value instead of a list of strings.
	criteria := rule["criteria"]
	if s, ok := criteria.(map[string]interface{}); ok && s != nil {
		a.Criteria = make(map[string][]string)
		for k, v := range s {
			switch v.(type) {
			case string:
				a.Criteria[k] = []string{v.(string)}
			case []interface{}:
				for _, value := range v.([]interface{}) {
					a.Criteria[k] = append(a.Criteria[k], value.(string))
				}
			}
		}
	}

	return nil
}