/** * Copyright (c) 2009--2014 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.taskomatic.task; import com.redhat.rhn.common.conf.Config; import com.redhat.rhn.common.conf.ConfigDefaults; import com.redhat.rhn.common.db.datasource.DataResult; import com.redhat.rhn.common.db.datasource.ModeFactory; import com.redhat.rhn.common.db.datasource.SelectMode; import com.redhat.rhn.common.db.datasource.WriteMode; import com.redhat.rhn.frontend.dto.OrgIdWrapper; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * SummaryPopulation figures out what orgs might be candidates for sending * daily summary email * @version $Rev$ */ public class SummaryPopulation extends RhnJavaJob { /** * {@inheritDoc} */ public void execute(JobExecutionContext ctx) throws JobExecutionException { try { // don't want duplicates otherwise we risk violating the // RHN_DSQUEUE_OID_UQ unique constraint on org_id Set orgSet = new LinkedHashSet(); log.debug("Finding orgs with awol servers"); List orgs = awolServerOrgs(); orgSet.addAll(orgs); if (log.isDebugEnabled()) { int orgCount = 0; if (orgs != null) { orgCount = orgs.size(); } else { log.debug("awolServerOrgs() returned null"); } log.debug("Found " + orgCount + " awol servers"); } log.debug("Finding orgs w/ recent action activity"); orgSet.addAll(orgsWithRecentActions()); log.debug("Done finding orgs w/ recent action activity"); log.debug("Enqueing orgs"); for (Iterator itr = orgSet.iterator(); itr.hasNext();) { OrgIdWrapper bdw = (OrgIdWrapper) itr.next(); enqueueOrg(bdw.toLong()); } log.debug("Finished enqueing orgs"); log.debug("finished queueing orgs for daily summary emails"); } catch (Exception e) { log.error(e.getMessage(), e); throw new JobExecutionException(e); } } private List awolServerOrgs() { SelectMode m = ModeFactory.getMode(TaskConstants.MODE_NAME, TaskConstants.TASK_QUERY_SUMMARYPOP_AWOL_SERVER_IN_ORGS); Map<String, Object> params = new HashMap<String, Object>(); int checkin = Config.get().getInt(ConfigDefaults.SYSTEM_CHECKIN_THRESHOLD); if (log.isDebugEnabled()) { log.debug("Server checkin threshold for AWOL servers: " + checkin); } params.put("checkin_threshold", new Integer(checkin)); return m.execute(params); } private List orgsWithRecentActions() { SelectMode m = ModeFactory.getMode(TaskConstants.MODE_NAME, TaskConstants.TASK_QUERY_SUMMARYPOP_ORGS_RECENT_ACTIONS); return m.execute(); } private int enqueueOrg(Long orgId) { Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", orgId); SelectMode select = ModeFactory.getMode(TaskConstants.MODE_NAME, TaskConstants.TASK_QUERY_VERIFY_SUMMARY_QUEUE); WriteMode m = ModeFactory.getWriteMode( TaskConstants.MODE_NAME, TaskConstants.TASK_QUERY_INSERT_SUMMARY_QUEUE); try { DataResult result = select.execute(params); Map row = (Map) result.get(0); Long count = (Long) row.get("queued"); if (count.intValue() == 0) { return m.executeUpdate(params); } log.warn("Skipping " + orgId + " because it's already queued"); return 0; } catch (RuntimeException e) { log.warn(e.getMessage(), e); return -1; } } }