func enforce()

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
}