/**
* Copyright (c) 2009--2011 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.manager.kickstart;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.validator.ValidatorError;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.kickstart.KickstartData;
import com.redhat.rhn.domain.kickstart.KickstartFactory;
import com.redhat.rhn.domain.kickstart.KickstartSession;
import com.redhat.rhn.domain.org.Org;
import com.redhat.rhn.domain.rhnpackage.profile.Profile;
import com.redhat.rhn.domain.token.ActivationKey;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserFactory;
import com.redhat.rhn.manager.profile.ProfileManager;
import org.apache.log4j.Logger;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* KickstartSessionCreateCommand - Command to create a KickstartSession object
* @version $Rev$
*/
public class KickstartSessionCreateCommand {
private static Logger log = Logger.getLogger(KickstartSessionCreateCommand.class);
private KickstartSession ksession;
/**
* Constructor
* @param owner who creates the session
* @param ksdata KickstartData profile used for this session
*/
public KickstartSessionCreateCommand(Org owner, KickstartData ksdata) {
this(owner, ksdata, null);
}
/**
* Constructor
* @param owner who creates the session
* @param ksdata KickstartData profile used for this session
* @param clientIp Client IP of the kickstarting system.
*/
public KickstartSessionCreateCommand(Org owner, KickstartData ksdata, String clientIp) {
this.ksession = new KickstartSession();
this.ksession.setKickstartMode(KickstartSession.MODE_DEFAULT_SESSION);
this.ksession.setOrg(owner);
this.ksession.setDeployConfigs(Boolean.FALSE);
this.ksession.setPackageFetchCount(new Long(0));
this.ksession.setKsdata(ksdata);
this.ksession.setVirtualizationType(ksdata
.getKickstartDefaults().getVirtualizationType());
this.ksession.setKstree(ksdata.getTree());
this.ksession.setLastAction(new Date());
this.ksession.setState(KickstartFactory.SESSION_STATE_CREATED);
this.ksession.setClientIp(clientIp);
log.debug("serverProfile on ksdata: " + ksdata.getKickstartDefaults().getProfile());
if (ksdata.getKickstartDefaults().getProfile() != null) {
Profile p = ProfileManager.
lookupByIdAndOrg(ksdata.getKickstartDefaults().getProfile().getId(),
owner);
log.debug("setting serverProfile on session: " + p.getId());
this.ksession.setServerProfile(p);
}
log.debug("Saving new KickstartSession: " + this.ksession.getId());
KickstartFactory.saveKickstartSession(this.ksession);
log.debug("Saved new KickstartSession: " + this.ksession.getId());
// Now create one time ActivationKey
User user = UserFactory.findRandomOrgAdmin(owner);
log.debug("Got random orgadmin: " + user.getLogin());
String note = LocalizationService.getInstance().
getMessage("kickstart.profile.default_session", ksdata.getLabel());
log.debug("creating one-time-activation key: " + user.getLogin());
ActivationKey key = KickstartScheduleCommand.createKickstartActivationKey(user,
ksdata, null,
this.ksession,
null, note);
log.debug("added key: " + key.getKey());
// Need to add child channels to the key so when kickstarting the
// system from bare metal we will have the proper child channel subscriptions.
if (ksdata.getKickstartDefaults().getProfile() != null) {
log.debug("Checking child channels for packages in profile.");
addChildChannelsForProfile(ksdata.getKickstartDefaults().getProfile(),
ksdata.getChannel(), key);
}
}
private void addChildChannelsForProfile(Profile profile, Channel baseChannel,
ActivationKey key) {
log.debug("** addChildChannelsForProfile");
User orgAdmin = UserFactory.findRandomOrgAdmin(this.ksession.getOrg());
List channels = ProfileManager.getChildChannelsNeededForProfile(orgAdmin,
baseChannel, profile);
Iterator i = channels.iterator();
while (i.hasNext()) {
Channel child = (Channel) i.next();
log.debug("** adding child channel for profile: " + child.getLabel());
key.addChannel(child);
}
}
/**
* Saves the kickstart session returning any validation errors if any.
* @return ValidatorError validation errors if any, can also be null.
*/
public ValidatorError store() {
KickstartFactory.saveKickstartSession(this.ksession);
return null;
}
/**
* Get the KickstartSession created
* @return KickstartSession created.
*/
public KickstartSession getKickstartSession() {
return this.ksession;
}
}