in spinnaker/fromjson.go [93:179]
func fromJSON(js []byte) (*chaosmonkey.AppConfig, error) {
parsed := new(parsedJSON)
err := json.Unmarshal(js, parsed)
if err != nil {
return nil, errors.Wrap(err, "json unmarshal failed")
}
if parsed.Attributes == nil {
return nil, errors.New("'attributes' field missing")
}
if parsed.Attributes.ChaosMonkey == nil {
return nil, errors.New("'attributes.chaosMonkey' field missing")
}
cm := parsed.Attributes.ChaosMonkey
if cm.Enabled == nil {
return nil, errors.New("'attributes.chaosMonkey.enabled' field missing")
}
// Check if mean time between kills is missing.
// If not enabled, it's ok if it's missing
if *cm.Enabled && cm.MeanTimeBetweenKillsInWorkDays == nil {
return nil, errors.New("attributes.chaosMonkey.meanTimeBetweenKillsInWorkDays missing")
}
if *cm.Enabled && cm.MinTimeBetweenKillsInWorkDays == nil {
return nil, errors.New("attributes.chaosMonkey.minTimeBetweenKillsInWorkDays missing")
}
if *cm.Enabled && (*cm.MeanTimeBetweenKillsInWorkDays <= 0) {
return nil, fmt.Errorf("invalid attributes.chaosMonkey.meanTimeBetweenKillsInWorkDays: %d", cm.MeanTimeBetweenKillsInWorkDays)
}
grouping := chaosmonkey.Cluster
switch cm.Grouping {
case "app":
grouping = chaosmonkey.App
case "stack":
grouping = chaosmonkey.Stack
case "cluster":
grouping = chaosmonkey.Cluster
default:
// If not enabled, the user may not have specified a grouping at all,
// in which case we stick with the default
if *cm.Enabled {
return nil, errors.Errorf("Unknown grouping: %s", cm.Grouping)
}
}
var meanTime int
var minTime int
if cm.MeanTimeBetweenKillsInWorkDays != nil {
meanTime = *cm.MeanTimeBetweenKillsInWorkDays
}
if cm.MinTimeBetweenKillsInWorkDays != nil {
minTime = *cm.MinTimeBetweenKillsInWorkDays
}
// Exceptions must have a non-blank region field
for _, exception := range cm.Exceptions {
if exception.Account == "" {
return nil, errors.New("missing account field in exception")
}
if exception.Region == "" {
return nil, errors.New("missing region field in exception")
}
}
cfg := chaosmonkey.AppConfig{
Enabled: *cm.Enabled,
RegionsAreIndependent: cm.RegionsAreIndependent,
Grouping: grouping,
MeanTimeBetweenKillsInWorkDays: meanTime,
MinTimeBetweenKillsInWorkDays: minTime,
Exceptions: cm.Exceptions,
Whitelist: cm.Whitelist,
}
return &cfg, nil
}