in agent/association/processor/processor.go [264:397]
func (p *Processor) runScheduledAssociation(log log.T) {
log.Debug("runScheduledAssociation starting")
lock.Lock()
defer lock.Unlock()
defer func() {
// recover in case the job panics
if msg := recover(); msg != nil {
log.Errorf("Execute association failed with message, %v", msg)
}
}()
var (
scheduledAssociation *model.InstanceAssociation
err error
)
if scheduledAssociation, err = schedulemanager.LoadNextScheduledAssociation(log); err != nil {
log.Errorf("Unable to get next scheduled association, %v, will retry later", err)
return
}
if scheduledAssociation == nil {
// if no scheduled association found at given time, get the next scheduled time and wait
nextScheduledDate := schedulemanager.LoadNextScheduledDate(log)
if nextScheduledDate != nil {
signal.ResetWaitTimerForNextScheduledAssociation(log, *nextScheduledDate)
} else {
log.Debug("No association scheduled at this time, will retry later")
}
return
}
// stop previous wait timer if there is scheduled association
signal.StopWaitTimerForNextScheduledAssociation()
if schedulemanager.IsAssociationInProgress(*scheduledAssociation.Association.AssociationId) {
log.Debug("runScheduledAssociation is InProgress")
if isAssociationTimedOut(scheduledAssociation) {
err = fmt.Errorf("Association stuck at InProgress for longer than %v hours", documentLevelTimeOutDurationHour)
log.Error(err)
p.assocSvc.UpdateInstanceAssociationStatus(
log,
*scheduledAssociation.Association.AssociationId,
*scheduledAssociation.Association.Name,
*scheduledAssociation.Association.InstanceId,
contracts.AssociationStatusFailed,
contracts.AssociationErrorCodeStuckAtInProgressError,
times.ToIso8601UTC(time.Now()),
err.Error(),
service.NoOutputUrl)
p.complianceUploader.UpdateAssociationCompliance(
*scheduledAssociation.Association.AssociationId,
*scheduledAssociation.Association.InstanceId,
*scheduledAssociation.Association.Name,
*scheduledAssociation.Association.DocumentVersion,
contracts.AssociationStatusFailed,
time.Now().UTC())
}
return
}
log.Debugf("Update association %v to pending ", *scheduledAssociation.Association.AssociationId)
// Update association status to pending
p.assocSvc.UpdateInstanceAssociationStatus(
log,
*scheduledAssociation.Association.AssociationId,
*scheduledAssociation.Association.Name,
*scheduledAssociation.Association.InstanceId,
contracts.AssociationStatusPending,
contracts.AssociationErrorCodeNoError,
times.ToIso8601UTC(time.Now()),
contracts.AssociationPendingMessage,
service.NoOutputUrl)
var docState *contracts.DocumentState
if docState, err = p.parseAssociation(scheduledAssociation); err != nil {
err = fmt.Errorf("Encountered error while parsing association %v, %v",
docState.DocumentInformation.AssociationID,
err)
log.Error(err)
p.assocSvc.UpdateInstanceAssociationStatus(
log,
*scheduledAssociation.Association.AssociationId,
*scheduledAssociation.Association.Name,
*scheduledAssociation.Association.InstanceId,
contracts.AssociationStatusFailed,
contracts.AssociationErrorCodeInvalidAssociation,
times.ToIso8601UTC(time.Now()),
err.Error(),
service.NoOutputUrl)
p.complianceUploader.UpdateAssociationCompliance(
*scheduledAssociation.Association.AssociationId,
*scheduledAssociation.Association.InstanceId,
*scheduledAssociation.Association.Name,
*scheduledAssociation.Association.DocumentVersion,
contracts.AssociationStatusFailed,
time.Now().UTC())
return
}
updatePluginAssociationInstances(*scheduledAssociation.Association.AssociationId, docState)
log = p.context.With("[associationId=" + docState.DocumentInformation.AssociationID + "]").Log()
instanceID, _ := p.context.Identity().InstanceID()
p.assocSvc.UpdateInstanceAssociationStatus(
log,
docState.DocumentInformation.AssociationID,
docState.DocumentInformation.DocumentName,
instanceID,
contracts.AssociationStatusInProgress,
contracts.AssociationErrorCodeNoError,
times.ToIso8601UTC(time.Now()),
contracts.AssociationInProgressMessage,
service.NoOutputUrl)
log.Debug("runScheduledAssociation submitting document")
p.proc.Submit(*docState)
log.Debug("runScheduledAssociation submitted document")
frequentCollector := frequentcollector.GetFrequentCollector()
if frequentCollector.IsSoftwareInventoryAssociation(docState) {
// Start the frequent collector if the association enabled it
frequentCollector.ClearTicker()
if frequentCollector.IsFrequentCollectorEnabled(p.context, docState, scheduledAssociation) {
log.Infof("This software inventory association enabled frequent collector")
frequentCollector.StartFrequentCollector(p.context, docState, scheduledAssociation)
}
}
}