in agent/statemanager/statemanager.go [160:236]
func enforce(config StateConfiguration) (err error) {
var msg string
var mode = getMode(config)
log.GetLogger().WithFields(logrus.Fields{
"stateConfigurationId": config.StateConfigurationId,
"configureMode": mode,
}).Infof("start enforcing state configuration")
if mode == Skip {
return
}
content, err := LoadTemplateCache(config.TemplateName, config.TemplateVersion)
if err != nil {
log.GetLogger().WithError(err).Warn("load template from cache failed")
}
if content == nil {
resp, err2 := GetTemplate(config.TemplateName, config.TemplateVersion)
if err2 != nil {
log.GetLogger().WithError(err2).Error("GetTemplate failed")
msg = fmt.Sprintf("GetTemplate %s %s failed: %s", config.TemplateName, config.TemplateVersion, err2.Error())
reportResult(config, Failed, mode, map[string]interface{}{"message": msg})
return err2
} else {
content = []byte(resp.Result.Content)
WriteTemplateCache(config.TemplateName, config.TemplateVersion, content)
}
}
resourceStates, err := ParseResourceState(content, config.Parameters)
if err != nil {
return
}
if len(resourceStates) == 0 {
log.GetLogger().Errorf("no state definition is parsed from configuration %s", config.StateConfigurationId)
return
}
var resultStatus, singleStatus string
var extraInfo string
var notSuccessItems = make(map[string]interface{})
switch mode {
case Apply:
for index, rs := range resourceStates {
resultStatus, extraInfo, err = rs.Apply()
if resultStatus == Failed {
notSuccessItems[fmt.Sprintf("%dth state", index)] = err.Error()
break
}
if resultStatus == NotCompliant {
// apply should not return NotCompliant
resultStatus = Failed
notSuccessItems[fmt.Sprintf("%dth state", index)] = extraInfo
break
}
}
case Monitor:
resultStatus = Compliant
for index, rs := range resourceStates {
singleStatus, extraInfo, err = rs.Monitor()
if singleStatus == Failed {
notSuccessItems[fmt.Sprintf("%dth state", index)] = err.Error()
resultStatus = Failed
break
}
if singleStatus == NotCompliant {
notSuccessItems[fmt.Sprintf("%dth state", index)] = extraInfo
resultStatus = NotCompliant
}
}
}
if resultStatus == "" {
resultStatus = Failed
}
log.GetLogger().WithFields(logrus.Fields{
"stateConfigurationId": config.StateConfigurationId,
"configureMode": mode,
}).Infof("result status is %s", resultStatus)
reportResult(config, resultStatus, mode, notSuccessItems)
return
}