/**
* 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.xmlrpc.activationkey;
import com.redhat.rhn.FaultException;
import com.redhat.rhn.common.hibernate.LookupException;
import com.redhat.rhn.common.validator.ValidatorError;
import com.redhat.rhn.common.validator.ValidatorException;
import com.redhat.rhn.common.validator.ValidatorResult;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.config.ConfigChannel;
import com.redhat.rhn.domain.config.ConfigChannelListProcessor;
import com.redhat.rhn.domain.rhnpackage.PackageArch;
import com.redhat.rhn.domain.rhnpackage.PackageFactory;
import com.redhat.rhn.domain.rhnpackage.PackageName;
import com.redhat.rhn.domain.server.ManagedServerGroup;
import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.server.ServerGroup;
import com.redhat.rhn.domain.token.ActivationKey;
import com.redhat.rhn.domain.token.ActivationKeyFactory;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.struts.RhnValidationHelper;
import com.redhat.rhn.frontend.xmlrpc.BaseHandler;
import com.redhat.rhn.frontend.xmlrpc.InvalidArgsException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelException;
import com.redhat.rhn.frontend.xmlrpc.InvalidPackageException;
import com.redhat.rhn.frontend.xmlrpc.InvalidServerGroupException;
import com.redhat.rhn.frontend.xmlrpc.ValidationException;
import com.redhat.rhn.frontend.xmlrpc.configchannel.XmlRpcConfigChannelHelper;
import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.rhnpackage.PackageManager;
import com.redhat.rhn.manager.system.ServerGroupManager;
import com.redhat.rhn.manager.token.ActivationKeyCloneCommand;
import com.redhat.rhn.manager.token.ActivationKeyManager;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.NonUniqueObjectException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* ActivationKeyHandler
*
* @version $Rev$
*
* @xmlrpc.namespace activationkey
* @xmlrpc.doc Contains methods to access common activation key functions
* available from the web interface.
*/
public class ActivationKeyHandler extends BaseHandler {
private static Logger log = Logger.getLogger(ActivationKeyHandler.class);
private static final String VALIDATION_XSD =
"/com/redhat/rhn/frontend/action/token/validation/activationKeyForm.xsd";
/**
* Creates a new activation key.
* @param loggedInUser The current user
* @param key Key for the activation key, or empty string to have one
* autogenerated.
* @param description A note or description.
* @param baseChannelLabel label of this key's base channel.
* @param usageLimit Usage limit for this key.
* @param entitlements List of string entitlement labels for the activation key.
* @param universalDefault Whether or not this key should be set as the
* default for the user's organization.
* @return Key of the newly created activation key.
* @throws FaultException A FaultException is thrown if the loggedInUser
* doesn't have permissions to create new activation keys.
*
* @xmlrpc.doc Create a new activation key.
* The activation key parameter passed
* in will be prefixed with the organization ID, and this value will be
* returned from the create call.
*
* Eg. If the caller passes in the key "foo" and belong to an organization with
* the ID 100, the actual activation key will be "100-foo".
*
* This call allows for the setting of a usage limit on this activation key.
* If unlimited usage is desired see the similarly named API method with no
* usage limit argument.
*
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param_desc("string", "key",
* "Leave empty to have new key autogenerated.")
* @xmlrpc.param #param("string", "description")
* @xmlrpc.param #param_desc("string", "baseChannelLabel", "Leave empty to accept
* default.")
* @xmlrpc.param #param_desc("int", "usageLimit", "If unlimited usage is desired,
* use the create API that does not include the parameter.")
* @xmlrpc.param #array_desc("string", "Add-on entitlement label to associate with the
* key.")
* #options()
* #item("virtualization_host")
* #options_end()
* #array_desc_end()
* @xmlrpc.param #param("boolean", "universalDefault")
* @xmlrpc.returntype string - The new activation key.
*/
public String create(User loggedInUser, String key, String description,
String baseChannelLabel, Integer usageLimit, List entitlements,
Boolean universalDefault) throws FaultException {
Channel baseChannel = null;
try {
if (!StringUtils.isBlank(baseChannelLabel)) {
baseChannel = ChannelManager.lookupByLabelAndUser(baseChannelLabel,
loggedInUser);
// Verify the channel given is actually a base channel:
if (!baseChannel.isBaseChannel()) {
throw new InvalidChannelException(baseChannel.getName() +
" is not a base channel.");
}
}
}
catch (LookupException e) {
throw new InvalidChannelException(e);
}
// Validate the input parameters. We will use the RhnValidationHelper
// for this which is also used to validate input if user entered it from the UI.
Map<String, String> values = new HashMap<String, String>();
values.put("description", description);
values.put("key", key);
if (usageLimit != null) {
values.put("usageLimit", usageLimit.toString());
}
ValidatorResult result = RhnValidationHelper.validate(this.getClass(),
values, new LinkedList<String>(values.keySet()), VALIDATION_XSD);
if (!result.isEmpty()) {
log.error("Validation errors:");
for (ValidatorError error : result.getErrors()) {
log.error(" " + error.getMessage());
}
// Multiple errors could return here, but we'll have to just throw an
// exception for the first one and return that to the user.
ValidatorError e = result.getErrors().get(0);
throw new ValidationException(e.getMessage());
}
try {
ActivationKeyManager akm = ActivationKeyManager.getInstance();
// validate the entitlements BEFORE creating a key
akm.validateAddOnEntitlements(entitlements, true);
Long limit = null;
if (usageLimit != null && Long.valueOf(usageLimit) >= 0) {
limit = Long.valueOf(usageLimit);
}
ActivationKey newKey = akm.createNewActivationKey(
loggedInUser, key, description, limit,
baseChannel, universalDefault.booleanValue());
akm.addEntitlements(newKey, entitlements);
return newKey.getKey();
}
catch (ValidatorException ve) {
throw FaultException.create(1091, "activationkey", ve.getResult());
}
catch (NonUniqueObjectException e) {
throw new ActivationKeyAlreadyExistsException();
}
}
/**
* Clones activation key
* @param loggedInUser The current user
* @param key Actication Key to be cloned
* @param cloneDescription Description for the new activation key.
* @return Key of the newly created activation key.
* @throws FaultException A FaultException is thrown if the loggedInUser
* doesn't have permissions to create new activation keys.
* @xmlrpc.doc Clone an existing activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param_desc("string", "key", "Key to be cloned.")
* @xmlrpc.param #param_desc("string", "cloneDescription",
* "Description of the cloned key.")
* @xmlrpc.returntype string - The new activation key.
*/
public String clone(User loggedInUser, String key, String cloneDescription)
throws FaultException {
ActivationKeyCloneCommand cak = new ActivationKeyCloneCommand(
loggedInUser, key, cloneDescription);
return cak.getclonedkey();
}
/**
* Creates a new activation key with unlimited usage..
* @param loggedInUser The current user
* @param key Key for the activation key, or empty string to have one
* autogenerated.
* @param description A note or description.
* @param baseChannelLabel label of this key's base channel.
* @param entitlements List of string entitlement labels for the activation key.
* @param universalDefault Whether or not this key should be set as the
* default for the user's organization.
* @return Key of the newly created activation key.
* @throws FaultException A FaultException is thrown if the loggedInUser
* doesn't have permissions to create new activation keys.
*
* @xmlrpc.doc Create a new activation key with unlimited usage.
* The activation key parameter passed
* in will be prefixed with the organization ID, and this value will be
* returned from the create call.
*
* Eg. If the caller passes in the key "foo" and belong to an organization with
* the ID 100, the actual activation key will be "100-foo".
*
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param_desc("string", "key",
* "Leave empty to have new key autogenerated.")
* @xmlrpc.param #param("string", "description")
* @xmlrpc.param #param_desc("string", "baseChannelLabel", "Leave empty to accept
* default.")
* @xmlrpc.param #array_desc("string", "Add-on entitlement label to associate with the
* key.")
* #options()
* #item("virtualization_host")
* #options_end()
* #array_desc_end()
* @xmlrpc.param #param("boolean", "universalDefault")
* @xmlrpc.returntype string - The new activation key.
*/
public String create(User loggedInUser, String key, String description,
String baseChannelLabel, List entitlements,
Boolean universalDefault) throws FaultException {
return create(loggedInUser, key, description, baseChannelLabel, null, entitlements,
universalDefault);
}
/**
* Deletes an activation key.
* @param loggedInUser The current user
* @param key Key for the activation key, or empty string to have one
* autogenerated.
* @return Key of the newly created activation key.
* @throws IllegalArgumentException if the loggedInUser
* doesn't have permissions to create new activation keys.
*
* @xmlrpc.doc Delete an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype #return_int_success()
*/
public int delete(User loggedInUser, String key) {
ActivationKey activationKey = lookupKey(key, loggedInUser);
ActivationKeyManager.getInstance().remove(activationKey, loggedInUser);
return 1;
}
/**
* Set activation key details.
* @param loggedInUser The current user
* @param key The activation key to be modified
* @param details Map of new details. (contents optional)
* @return 1 if edit was successful, exception thrown otherwise.
* @throws FaultException Thrown if the user does not have the activation
* key admin role, if the base channel given does not exist, or if it
* actually is not a base channel.
*
* @xmlrpc.doc Update the details of an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #struct("activation key")
* #prop_desc("string", "description", "optional")
* #prop_desc("string", "base_channel_label", "optional -
* to set default base channel set to empty string or 'none'")
* #prop_desc("int", "usage_limit", "optional")
* #prop_desc("boolean", "unlimited_usage_limit", "Set true
* for unlimited usage and to override usage_limit")
* #prop_desc("boolean", "universal_default", "optional")
* #prop_desc("boolean", "disabled", "optional")
* #struct_end()
* @xmlrpc.returntype #return_int_success()
*/
public int setDetails(User loggedInUser, String key, Map details)
throws FaultException {
// confirm that the user only provided valid keys in the map
Set<String> validKeys = new HashSet<String>();
validKeys.add("description");
validKeys.add("base_channel_label");
validKeys.add("usage_limit");
validKeys.add("unlimited_usage_limit");
validKeys.add("universal_default");
validKeys.add("disabled");
validateMap(validKeys, details);
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey aKey = lookupKey(key, loggedInUser);
// Keep base channel as it is unless explicitly changed:
Channel baseChannel = aKey.getBaseChannel();
if (details.containsKey("base_channel_label")) {
String baseChannelLabel = (String) details
.get("base_channel_label");
if (StringUtils.isEmpty(baseChannelLabel) || baseChannelLabel.equals("none")) {
baseChannel = null;
}
else {
try {
baseChannel = ChannelManager.lookupByLabelAndUser(
baseChannelLabel, loggedInUser);
}
catch (LookupException e) {
throw new InvalidChannelException(e);
}
// Verify the channel given is actually a base channel:
if (!baseChannel.isBaseChannel()) {
throw new InvalidChannelException(baseChannel.getName() +
" is not a base channel.");
}
}
}
String description = null;
if (details.containsKey("description")) {
description = (String) details.get("description");
}
if (details.containsKey("usage_limit")) {
Long usageLimit = new Long(((Integer) details.get("usage_limit"))
.longValue());
aKey.setUsageLimit(usageLimit);
}
// Check if we need to override the usage_limit and set to unlimited:
if (details.containsKey("unlimited_usage_limit")) {
Boolean unlimited = (Boolean)details.get("unlimited_usage_limit");
if (unlimited.booleanValue()) {
aKey.setUsageLimit(null);
}
}
if (details.containsKey("universal_default")) {
Boolean universalDefault = (Boolean)details.get("universal_default");
aKey.setUniversalDefault(universalDefault.booleanValue());
}
if (details.containsKey("disabled")) {
aKey.setDisabled((Boolean)details.get("disabled"));
}
manager.update(aKey, description, baseChannel);
return 1;
}
/**
* Return a struct of activation key details.
* @param loggedInUser The current user
* @param key The activation key to be modified
* @return Map representation of the activation key
* @since 10.2
*
* @xmlrpc.doc Lookup an activation key's details.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype $ActivationKeySerializer
*/
public ActivationKey getDetails(User loggedInUser, String key) {
ActivationKey aKey = lookupKey(key, loggedInUser);
return aKey;
}
/**
* Add entitlements to an activation key. Currently only virtualization_host
* add-on entitlement is permitted.
*
* @param loggedInUser The current user
* @param key The activation key to act upon.
* @param entitlements List of string entitlement labels to be added.
* @return 1 on success, exception thrown otherwise.
*
* @xmlrpc.doc Add entitlements to an activation key. Currently only
* virtualization_host add-on entitlement is permitted.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_desc("string", "entitlement label")
* #options()
* #item("virtualization_host")
* #options_end()
* #array_desc_end()
* @xmlrpc.returntype #return_int_success()
*/
public int addEntitlements(User loggedInUser, String key, List entitlements) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
manager.addEntitlements(activationKey, entitlements);
return 1;
}
/**
* Remove entitlements from an activation key. Currently only
* virtualization_host add-on entitlement is permitted.
*
* @param loggedInUser The current user
* @param key The activation key to act upon.
* @param entitlements List of string entitlement labels to be removed.
* @return 1 on success, exception thrown otherwise.
*
* @xmlrpc.doc Remove entitlements (by label) from an activation key.
* Currently only virtualization_host add-on entitlement is permitted.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_desc("string", "entitlement label")
* #options()
* #item("virtualization_host")
* #options_end()
* #array_desc_end()
* @xmlrpc.returntype #return_int_success()
*/
public int removeEntitlements(User loggedInUser, String key, List entitlements) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
manager.removeEntitlements(activationKey, entitlements);
return 1;
}
/**
* Add a child channel to an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param childChannelLabels List of child channel labels to be added to this
* activation key
* @return 1 on success, exception thrown otherwise
*
* @xmlrpc.doc Add child channels to an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("string", "childChannelLabel")
* @xmlrpc.returntype #return_int_success()
*/
public int addChildChannels(User loggedInUser, String key, List childChannelLabels) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = childChannelLabels.iterator(); it.hasNext();) {
String childChannelLabel = (String)it.next();
Channel childChannel = null;
try {
childChannel = ChannelManager.lookupByLabelAndUser(childChannelLabel,
loggedInUser);
}
catch (LookupException e) {
throw new InvalidChannelException(e);
}
// Verify the channel given is actually a child channel:
if (childChannel.isBaseChannel()) {
throw new InvalidChannelException(childChannel.getName() +
" is not a child channel.");
}
// Verify that, *IF* this AK specifies a base-channel, then the proposed
// child is a child of *that* base channel
Channel base = activationKey.getBaseChannel();
if (base != null && !base.equals(childChannel.getParentChannel())) {
throw new InvalidChannelException(childChannel.getName() +
" is not a child channel of parent " +
base.getName() + " which is already used by this key");
}
manager.addChannel(activationKey, childChannel);
}
return 1;
}
/**
* Remove a child channel from an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param childChannelLabels List of child channel labels to be removed
* from this activation key
* @return 1 on success, exception thrown otherwise
*
* @xmlrpc.doc Remove child channels from an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("string", "childChannelLabel")
* @xmlrpc.returntype #return_int_success()
*/
public int removeChildChannels(User loggedInUser, String key, List childChannelLabels) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = childChannelLabels.iterator(); it.hasNext();) {
String childChannelLabel = (String)it.next();
Channel childChannel = null;
try {
childChannel = ChannelManager.lookupByLabelAndUser(childChannelLabel,
loggedInUser);
}
catch (LookupException e) {
throw new InvalidChannelException(e);
}
// Verify the channel given is actually a child channel:
if (childChannel.isBaseChannel()) {
throw new InvalidChannelException(childChannel.getName() +
" is not a child channel.");
}
manager.removeChannel(activationKey, childChannel);
}
return 1;
}
/**
* Add server groups to an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon.
* @param serverGroupIds List of server group IDs to be added to this activation key.
* @return 1 on success, exception thrown otherwise.
*
* @xmlrpc.doc Add server groups to an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("int", "serverGroupId")
* @xmlrpc.returntype #return_int_success()
*/
public int addServerGroups(User loggedInUser, String key, List serverGroupIds) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = serverGroupIds.iterator(); it.hasNext();) {
Number serverGroupId = (Number)it.next();
ManagedServerGroup group = null;
try {
group = ServerGroupManager.getInstance().lookup(
new Long(serverGroupId.longValue()), loggedInUser);
}
catch (LookupException e) {
throw new InvalidServerGroupException(e);
}
manager.addServerGroup(activationKey, group);
}
return 1;
}
/**
* Remove server groups from an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param serverGroupIds List of server group IDs to be removed from this activation key
* @return 1 on success, exception thrown otherwise
*
* @xmlrpc.doc Remove server groups from an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("int", "serverGroupId")
* @xmlrpc.returntype #return_int_success()
*/
public int removeServerGroups(User loggedInUser, String key, List serverGroupIds) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = serverGroupIds.iterator(); it.hasNext();) {
Integer serverGroupId = (Integer)it.next();
ServerGroup group = null;
try {
group = ServerGroupManager.getInstance().lookup(
new Long(serverGroupId.longValue()), loggedInUser);
}
catch (LookupException e) {
throw new InvalidServerGroupException(e);
}
manager.removeServerGroup(activationKey, group);
}
return 1;
}
/**
* Add packages to an activation key using package name only.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param packageNames List of package names to be added to this activation key
* @return 1 on success, exception thrown otherwise.
* @deprecated being replaced by addPackages(string sessionKey, string key,
* array[packages])
* @since 10.2
*
* @xmlrpc.doc Add packages to an activation key using package name only.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("string", "packageName")
* @xmlrpc.returntype #return_int_success()
*/
@Deprecated
public int addPackageNames(User loggedInUser, String key, List packageNames) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = packageNames.iterator(); it.hasNext();) {
String name = (String)it.next();
PackageName packageName = PackageFactory.lookupOrCreatePackageByName(name);
manager.addPackage(activationKey, packageName, null);
}
return 1;
}
/**
* Remove package names from an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param packageNames List of package names to be removed from this activation key
* @return 1 on success, exception thrown otherwise
* @deprecated being replaced by removePackages(string sessionKey, string key,
* array[packages])
* @since 10.2
*
* @xmlrpc.doc Remove package names from an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param #array_single("string", "packageName")
* @xmlrpc.returntype #return_int_success()
*/
@Deprecated
public int removePackageNames(User loggedInUser, String key, List packageNames) {
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
for (Iterator it = packageNames.iterator(); it.hasNext();) {
String name = (String)it.next();
PackageName packageName = null;
try {
packageName = PackageManager.lookupPackageName(name);
}
catch (LookupException e) {
throw new InvalidPackageException(packageName.getName(), e);
}
manager.removePackage(activationKey, packageName, null);
}
return 1;
}
/**
* Add packages to an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param packages List of packages to be added to this activation key
* @return 1 on success, exception thrown otherwise.
*
* @xmlrpc.doc Add packages to an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param
* #array()
* #struct("packages")
* #prop_desc("string", "name", "Package name")
* #prop_desc("string", "arch", "Arch label - Optional")
* #struct_end()
* #array_end()
* @xmlrpc.returntype #return_int_success()
*/
public int addPackages(User loggedInUser, String key,
List<Map<String, String>> packages) {
// confirm that the user only provided valid keys in the map
Set<String> validKeys = new HashSet<String>();
validKeys.add("name");
validKeys.add("arch");
for (Map<String, String> pkg : packages) {
validateMap(validKeys, pkg);
}
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
String name = null;
String arch = null;
for (Map<String, String> pkg : packages) {
name = pkg.get("name");
if (name.contains(" ")) {
throw new InvalidArgsException(
"More than one package names are specified.");
}
PackageName packageName = PackageFactory.lookupOrCreatePackageByName(name);
arch = pkg.get("arch");
PackageArch packageArch = PackageFactory.lookupPackageArchByLabel(arch);
manager.addPackage(activationKey, packageName, packageArch);
ActivationKeyFactory.save(activationKey);
}
return 1;
}
/**
* Remove packages from an activation key.
*
* @param loggedInUser The current user
* @param key The activation key to act upon
* @param packages List of packages to be removed from this activation key
* @return 1 on success, exception thrown otherwise
*
* @xmlrpc.doc Remove package names from an activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.param
* #array()
* #struct("packages")
* #prop_desc("string", "name", "Package name")
* #prop_desc("string", "arch", "Arch label - Optional")
* #struct_end()
* #array_end()
* @xmlrpc.returntype #return_int_success()
*/
public int removePackages(User loggedInUser, String key,
List<Map<String, String>> packages) {
// confirm that the user only provided valid keys in the map
Set<String> validKeys = new HashSet<String>();
validKeys.add("name");
validKeys.add("arch");
for (Map<String, String> pkg : packages) {
validateMap(validKeys, pkg);
}
ActivationKeyManager manager = ActivationKeyManager.getInstance();
ActivationKey activationKey = lookupKey(key, loggedInUser);
String name = null;
String arch = null;
for (Map<String, String> pkg : packages) {
name = pkg.get("name");
PackageName packageName = PackageFactory.lookupOrCreatePackageByName(name);
arch = pkg.get("arch");
PackageArch packageArch = PackageFactory.lookupPackageArchByLabel(arch);
manager.removePackage(activationKey, packageName, packageArch);
}
return 1;
}
/**
* Return a list of activation key structs that are visible to the requesting user.
* @param loggedInUser The current user
* @return List of map representations of activation keys
* @since 10.2
*
* @xmlrpc.doc List activation keys that are visible to the
* user.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.returntype
* #array()
* $ActivationKeySerializer
* #array_end()
*/
public List<ActivationKey> listActivationKeys(User loggedInUser) {
List<ActivationKey> result = new ArrayList<ActivationKey>();
ActivationKeyManager manager = ActivationKeyManager.getInstance();
for (ActivationKey key : manager.findAll(loggedInUser)) {
try {
manager.validateCredentials(loggedInUser, null, key);
}
catch (LookupException e) {
continue; // skip keys in this org that this user can't see
}
result.add(key);
}
return result;
}
/**
* Return a list of systems activated with the activation key provided.
* @param loggedInUser The current user
* @param key The activation key
* @return List of map representations of systems.
*
* @xmlrpc.doc List the systems activated with the key provided.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype
* #array()
* #struct("system structure")
* #prop_desc("int", "id", "System id")
* #prop("string", "hostname")
* #prop_desc("dateTime.iso8601", "last_checkin", "Last time server
* successfully checked in")
* #struct_end()
* #array_end()
*/
public Object[] listActivatedSystems(User loggedInUser, String key) {
ActivationKey activationKey = lookupKey(key, loggedInUser);
List<Server> servers = new LinkedList<Server>(
activationKey.getToken().getActivatedServers());
List<Object> returnList = new ArrayList<Object>();
// For this API, we don't need to pass back to the user all of the
// information that is defined for a "Server" as would be returned
// by the ServerSerializer; therefore, we'll just pull a few key
// pieces of information.
for (Server server : servers) {
Map<String, Object> system = new HashMap<String, Object>();
system.put("id", server.getId());
system.put("hostname", server.getHostname());
system.put("last_checkin", server.getLastCheckin());
returnList.add(system);
}
return returnList.toArray();
}
private ActivationKey lookupKey(String key, User user) {
return XmlRpcActivationKeysHelper.getInstance().lookupKey(user, key);
}
/**
* Returns a list of config channel structs that are associated
* to a given activation key.
*
* @param loggedInUser The current user
* @param key the activation key
* @return list of config channel strutcs
*
*
* @xmlrpc.doc List configuration channels
* associated to an activation key.
*
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype
* #array()
* $ConfigChannelSerializer
* #array_end()
*/
public List listConfigChannels(User loggedInUser, String key) {
ActivationKey activationKey = lookupKey(key, loggedInUser);
return activationKey.getConfigChannelsFor(loggedInUser);
}
/**
* replaces the existing set of config channels for a given activation key.
* Note: it ranks these channels according to the array order of
* configChannelIds method parameter
* @param loggedInUser The current user
* @param keys a lsit of activation keys.
* @param configChannelLabels sets channels labels
* @return 1 on success 0 on failure
*
* @xmlrpc.doc Replace the existing set of
* configuration channels on the given activation keys.
* Channels are ranked by their order in the array.
* @xmlrpc.param #param("string", "sessionKey ")
* @xmlrpc.param #array_single("string", "activationKey")
* @xmlrpc.param #array_single("string", "configChannelLabel")
* @xmlrpc.returntype #return_int_success()
*/
public int setConfigChannels(User loggedInUser, List<String> keys,
List<String> configChannelLabels) {
XmlRpcActivationKeysHelper helper = XmlRpcActivationKeysHelper.getInstance();
List<ActivationKey> activationKeys = helper.lookupKeys(loggedInUser, keys);
XmlRpcConfigChannelHelper configHelper = XmlRpcConfigChannelHelper.getInstance();
List channels = configHelper.lookupGlobals(loggedInUser, configChannelLabels);
ConfigChannelListProcessor proc = new ConfigChannelListProcessor();
for (ActivationKey activationKey : activationKeys) {
proc.replace(activationKey.getConfigChannelsFor(loggedInUser), channels);
}
return 1;
}
/**
* Given a list of activation keys and configuration channels,
* this method inserts the configuration channels to either the top or
* the bottom (whichever you specify) of an activation key's
* configuration channels list. The ordering of the configuration channels
* provided in the add list is maintained while adding.
* If one of the configuration channels in the 'add' list
* already exists in an activation key, the
* configuration channel will be re-ranked to the appropriate place.
* @param loggedInUser The current user
* @param keys the list of activation keys.
* @param configChannelLabels set of configuration channels labels
* @param addToTop if true inserts the configuration channels list to
* the top of the configuration channels list of a server
* @return 1 on success 0 on failure
*
* @xmlrpc.doc Given a list of activation keys and configuration channels,
* this method adds given configuration channels to either the top or
* the bottom (whichever you specify) of an activation key's
* configuration channels list. The ordering of the configuration channels
* provided in the add list is maintained while adding.
* If one of the configuration channels in the 'add' list
* already exists in an activation key, the
* configuration channel will be re-ranked to the appropriate place.
* @xmlrpc.param #session_key()
* @xmlrpc.param #array_single("string", "activationKey")
* @xmlrpc.param #array_single("string",
* "List of configuration channel labels in the ranked order.")
* @xmlrpc.param #param("boolean","addToTop")
* #options()
* #item_desc ("true", "To prepend the given channels to the beginning of
* the activation key's config channel list")
* #item_desc ("false", "To append the given channels to the end of
* the activation key's config channel list")
* #options_end()
*
* @xmlrpc.returntype #return_int_success()
*/
public int addConfigChannels(User loggedInUser, List<String> keys,
List<String> configChannelLabels, boolean addToTop) {
XmlRpcActivationKeysHelper helper = XmlRpcActivationKeysHelper.getInstance();
List<ActivationKey> activationKeys = helper.lookupKeys(loggedInUser, keys);
XmlRpcConfigChannelHelper configHelper =
XmlRpcConfigChannelHelper.getInstance();
List <ConfigChannel> channels = configHelper.
lookupGlobals(loggedInUser, configChannelLabels);
ConfigChannelListProcessor proc = new ConfigChannelListProcessor();
if (addToTop) {
Collections.reverse(channels);
}
for (ActivationKey key : activationKeys) {
for (ConfigChannel chan : channels) {
if (addToTop) {
proc.add(key.getConfigChannelsFor(loggedInUser), chan, 0);
}
else {
proc.add(key.getConfigChannelsFor(loggedInUser), chan);
}
}
}
return 1;
}
/**
* removes selected channels from list of config channels provided
* for a given list of activation keys.
* @param loggedInUser The current user
* @param keys the list of activation key values.
* @param configChannelLabels sets channels labels
* @return 1 on success 0 on failure
*
* @xmlrpc.doc Remove configuration channels from the given activation keys.
* @xmlrpc.param #param("string", "sessionKey ")
* @xmlrpc.param #array_single("string", "activationKey")
* @xmlrpc.param #array_single("string", "configChannelLabel")
* @xmlrpc.returntype #return_int_success()
*/
public int removeConfigChannels(User loggedInUser, List<String> keys,
List<String> configChannelLabels) {
XmlRpcActivationKeysHelper helper = XmlRpcActivationKeysHelper.getInstance();
List<ActivationKey> activationKeys = helper.lookupKeys(loggedInUser, keys);
XmlRpcConfigChannelHelper configHelper =
XmlRpcConfigChannelHelper.getInstance();
List<ConfigChannel> channels = configHelper.
lookupGlobals(loggedInUser, configChannelLabels);
ConfigChannelListProcessor proc = new ConfigChannelListProcessor();
boolean success = true;
for (ActivationKey activationKey : activationKeys) {
success = success && proc.remove(activationKey.
getConfigChannelsFor(loggedInUser), channels);
}
if (success) {
return 1;
}
return 0;
}
/**
* Enable configuration file deployment for the specified activation key
* @param loggedInUser The current user
* @param key the activation key
* @return 1 on success, 0 on failure
*
* @xmlrpc.doc Enable configuration file deployment for the specified activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype #return_int_success()
*/
public int enableConfigDeployment(User loggedInUser, String key) {
ActivationKey ac = lookupKey(key, loggedInUser);
ac.setDeployConfigs(true);
return 1;
}
/**
* Disable configuration file deployment for the specified activation key
* @param loggedInUser The current user
* @param key the activation key
* @return 1 on success, 0 on failure
*
* @xmlrpc.doc Disable configuration file deployment for the specified activation key.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype #return_int_success()
*/
public int disableConfigDeployment(User loggedInUser, String key) {
ActivationKey ac = lookupKey(key, loggedInUser);
ac.setDeployConfigs(false);
return 1;
}
/**
* Check configuration file deployment status for the activation key specified.
* @param loggedInUser The current user
* @param key the activation key
* @return 1 if enabled, 0 if disabled, exception thrown otherwise
*
* @xmlrpc.doc Check configuration file deployment status for the
* activation key specified.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "key")
* @xmlrpc.returntype 1 if enabled, 0 if disabled, exception thrown otherwise.
*/
public int checkConfigDeployment(User loggedInUser, String key) {
ActivationKey ac = lookupKey(key, loggedInUser);
return (ac.getDeployConfigs() ? 1 : 0);
}
}