/**
* 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.frontend.events;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.redhat.rhn.common.messaging.EventMessage;
import com.redhat.rhn.domain.action.Action;
import com.redhat.rhn.domain.action.ActionChain;
import com.redhat.rhn.domain.action.ActionChainFactory;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserFactory;
import com.redhat.rhn.manager.rhnset.RhnSetDecl;
import com.redhat.rhn.manager.ssm.SsmOperationManager;
/**
* Base functionality for responding to SSM package install/update/remove.
* Handles ordering if a remote-cmd has been specified. Subclasses are responsible
* for describing the affected servers, and the actual work of scheduling action(s)
*
* @author ggainey
*
*/
public abstract class SsmPackagesAction extends AbstractDatabaseAction {
private final Log log = LogFactory.getLog(this.getClass());
protected void doExecute(EventMessage msg) {
SsmPackageEvent event = (SsmPackageEvent) msg;
User user = UserFactory.lookupById(event.getUserId());
/*
* Comment below applies to more than just SsmPackageUpgrade. Moving here into the
* (new) base-class for all actions, since it applies generally - there are often
* systems in RhnSet.SYSTEM to which an Ssm action WILL NOT apply, since SSM
* allows for heterogeneous sets of systems -- GRG 2013-APR-3
*/
/*
* The following isn't 100% accurate. All systems in the SSM are associated with
* the operation, however only systems on which the package already exists (since
* this is an upgrade) will actually have events scheduled.
*
* The problem is that the list of servers to which the package upgrades apply is
* never stored in an RhnSet, which is used to make the impact of this call
* minimal. The correct list is showed to the user before selecting confirm, so
* the only potential issue is in viewing the SSM task log after the user has
* confirmed the operation. Again, the events themselves are correctly scheduled
* on only the systems to which they apply.
*
* For now, this small potential for logging inaccuracy is acceptable given the
* proxmity of this fix to the Satellite 5.3 release (as opposed to omitting the
* server association to the task entirely).
*
* jdobies, Aug 12, 2009
*/
long operationId = SsmOperationManager.createOperation(user,
getOperationName(), RhnSetDecl.SYSTEMS.getLabel());
// Explicitly call handle transactions here so the operation creation above
// is persisted before the potentially long running logic below
//handleTransactions(true);
try {
long actionStart = System.currentTimeMillis();
scheduleAction(event, user);
if (log.isDebugEnabled()) {
log.debug("Time to schedule all actions: " +
(System.currentTimeMillis() - actionStart));
}
}
catch (Exception e) {
log.error("Error scheduling package installations for event " + event, e);
}
finally {
// This should stay in the finally block so the operation is
// not perpetually left in an in progress state
SsmOperationManager.completeOperation(user, operationId);
}
}
protected void scheduleAction(SsmPackageEvent event, User user) {
log.debug("Scheduling package actions.");
Date earliest = event.getEarliest();
ActionChain actionChain = ActionChainFactory.getActionChain(user, event
.getActionChainId());
List<Long> sids = getAffectedServers(event, user);
log.debug("Scheduling actions.");
doSchedule(event, user, sids, earliest, actionChain);
log.debug("Done scheduling package actions.");
}
protected abstract String getOperationName();
protected abstract List<Long> getAffectedServers(SsmPackageEvent event, User u);
protected abstract List<Action> doSchedule(SsmPackageEvent event, User user,
List<Long> sid, Date earliest, ActionChain actionChain);
}