// flagUnprovisionedHosts is a hostFlaggingFunc to get all hosts that are // taking too long to provision func flagUnprovisionedHosts(d []distro.Distro, s *evergreen.Settings) ([]host.Host, error) { // fetch all hosts that are taking too long to provision threshold := time.Now().Add(-ProvisioningCutoff) hosts, err := host.Find(host.ByUnprovisionedSince(threshold)) if err != nil { return nil, fmt.Errorf("error finding unprovisioned hosts: %v", err) } return hosts, err }
// slowProvisioningWarnings is a notificationBuilder to build any necessary // warnings about hosts that are taking a long time to provision func slowProvisioningWarnings(settings *evergreen.Settings) ([]notification, error) { evergreen.Logger.Logf(slogger.INFO, "Building warnings for hosts taking a long"+ " time to provision...") if settings.Notify.SMTP == nil { return []notification{}, fmt.Errorf("no notification emails configured") } // fetch all hosts that are taking too long to provision threshold := time.Now().Add(-slowProvisioningThreshold) hosts, err := host.Find(host.ByUnprovisionedSince(threshold)) if err != nil { return nil, fmt.Errorf("error finding unprovisioned hosts: %v", err) } // the list of warning notifications that will be returned warnings := []notification{} for _, h := range hosts { // if a warning has been sent for the host, skip it if h.Notifications[slowProvisioningWarning] { continue } evergreen.Logger.Logf(slogger.INFO, "Slow-provisioning warning needs to"+ " be sent for host %v", h.Id) // build the notification hostNotification := notification{ recipient: settings.Notify.SMTP.AdminEmail[0], subject: fmt.Sprintf("Host %v taking a long time to provision", h.Id), message: fmt.Sprintf("See %v/ui/host/%v", settings.Ui.Url, h.Id), threshold: slowProvisioningWarning, host: h, callback: func(h host.Host, s string) error { return h.SetExpirationNotification(s) }, } // add it to the final list warnings = append(warnings, hostNotification) } evergreen.Logger.Logf(slogger.INFO, "Built %v warnings about hosts taking a"+ " long time to provision", len(warnings)) return warnings, nil }