/**
* Copyright (c) 2009--2015 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.rhnset;
import com.redhat.rhn.common.util.Asserts;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.rhnset.RhnSet;
import com.redhat.rhn.domain.rhnset.SetCleanup;
import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.action.SetLabels;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.util.HashMap;
import java.util.Map;
/**
* The declaration of an {@link RhnSet}. This combines the name of the set with
* the security information needed to ensure that users only put items into the
* set they actually have permission to see. All sets must be declared as
* constants in this class; to load a set, you can simply say
* <code>RhnSetDecl.SYSTEMS.get(user)</code>.
* <p>
* To create a new set, you need to first define the needed cleanup as a
* constant in {@link SetCleanup} and then declare the set with a new constant
* in this class.
*
* @version $Rev$
*/
public class RhnSetDecl {
private static final Map<String, RhnSetDecl> DECLS = new HashMap<String, RhnSetDecl>();
// set of actions by action_id
public static final RhnSetDecl ACTIONS_COMPLETED = make(
"completed_action_list", SetCleanup.UNOWNED_ACTIONS);
// set of actions by action_id
public static final RhnSetDecl ACTIONS_FAILED = make("failed_action_list",
SetCleanup.UNOWNED_ACTIONS);
// set of actions by action_id
public static final RhnSetDecl ACTIONS_ARCHIVED = make("archived_action_list",
SetCleanup.UNOWNED_ACTIONS);
// set of actions by action_id
public static final RhnSetDecl ACTIONS_PENDING = make(
"pending_action_list", SetCleanup.UNOWNED_ACTIONS);
// set of servers by server_id
public static final RhnSetDecl ACTIONS_UNSCHEDULE = make(
"unscheduleaction", SetCleanup.UNOWNED_SERVERS);
// set of Action Chains by id
public static final RhnSetDecl ACTION_CHAINS = make(
"action_chains", SetCleanup.NOOP);
// set of channels by channel_id
public static final RhnSetDecl CHANNELS_FOR_ERRATA = make(
"channels_for_errata", SetCleanup.UNOWNED_CHANNELS);
// set of errata by errata_id
public static final RhnSetDecl ERRATA = make("errata_list",
SetCleanup.ILLEGAL_ERRATA);
// set of errata by errata_id
public static final RhnSetDecl ERRATA_CLONE = make("clone_errata_list",
SetCleanup.UNOWNED_NONRHN_ERRATA);
// set of errata by errata_id; needs new cleanup
public static final RhnSetDecl ERRATA_TO_DELETE = make("errata_to_delete",
SetCleanup.UNOWNED_ERRATA);
// set of errata by errata_id; needs new cleanup
public static final RhnSetDecl ERRATA_TO_DELETE_BULK = make("errata_to_delete_bulk",
SetCleanup.UNOWNED_ERRATA);
// set of errata by errata_id; needs new cleanup
public static final RhnSetDecl ERRATA_TO_SYNC = make("errata_to_sync",
SetCleanup.UNOWNED_ERRATA);
public static final RhnSetDecl ERRATA_PACKAGES_TO_SYNC = make("errata_packages_to_sync",
SetCleanup.UNOWNED_PACKAGES);
// set of file list: needs new cleanup
public static final RhnSetDecl FILE_LISTS = make("file_lists",
SetCleanup.UNOWNED_FILE_LIST);
// set of packages by package_id
public static final RhnSetDecl PACKAGES_FOR_SYSTEM_SYNC = make(
"packages_for_system_sync", SetCleanup.NOOP);
// set of packages by name_id/evr_id; can not be cleaned
public static final RhnSetDecl PACKAGES_REMOVABLE = make(
"removable_package_list", SetCleanup.NOOP);
// set of packages by package_id
public static final RhnSetDecl PACKAGES_TO_ADD = make("packages_to_add",
SetCleanup.NOOP);
// set of packages by package_id
public static final RhnSetDecl PACKAGES_TO_PUSH = make(
"update_package_list", SetCleanup.UNOWNED_PACKAGES);
// set of packages by name_id/evr_id; can not be cleaned
public static final RhnSetDecl PACKAGES_TO_INSTALL = make(
"install_package_list", SetCleanup.NOOP);
// set of packages by name_id/evr_id; can not be cleaned
// set of package_ids for deleting packages (from manage software packages)
public static final RhnSetDecl PACKAGES_TO_REMOVE = make(
"packages_to_remove", SetCleanup.NOOP);
// set of packages by name_id/evr_id; can not be cleaned
public static final RhnSetDecl PACKAGES_UPGRADABLE = make(
SetLabels.PACKAGE_UPGRADE_SET, SetCleanup.NOOP);
// set of packages by name_id/evr_id; can not be cleaned
public static final RhnSetDecl PACKAGES_VERIFY = make(
"verify_package_list", SetCleanup.NOOP);
// set of packages by package_id (sync channels)
public static final RhnSetDecl PACKAGES_TO_SYNC_CHANNEL = make(
"packages_to_sync_channel", SetCleanup.NOOP);
// set of servers by server_id
public static final RhnSetDecl SYSTEMS = make(SetLabels.SYSTEM_LIST,
SetCleanup.ILLEGAL_SERVERS);
// set of duplicate servers by server_id
public static final RhnSetDecl DUPLICATE_SYSTEMS = make(
SetLabels.DUPLICATE_SYSTEM_LIST, SetCleanup.NOOP);
// set of servers by server_id
public static final RhnSetDecl SYSTEMS_AFFECTED = make(
SetLabels.AFFECTED_SYSTEMS_LIST, SetCleanup.UNOWNED_SERVERS);
// set of servers by server_id
public static final RhnSetDecl SYSTEM_ENTITLEMENTS = make(
SetLabels.SYSTEM_ENTITLEMENTS, SetCleanup.UNOWNED_SERVERS);
// set of servers by server_id
public static final RhnSetDecl SYSTEMS_FAILED = make("failed_system_list",
SetCleanup.UNOWNED_SERVERS);
// set of system groups by group id
public static final RhnSetDecl SYSTEM_GROUPS = make("system_group_list",
SetCleanup.UNOWNED_SYSTEM_GROUPS);
public static final RhnSetDecl TEST = make("test action", SetCleanup.NOOP);
// set of users by user_id
public static final RhnSetDecl USERS = make("user_list",
SetCleanup.UNOWNED_USERS);
// Set of contact methods in an org
public static final RhnSetDecl METHODS_IN_ORG = make("methods_in_org",
SetCleanup.UNOWNED_METHODS);
// set of kickstart profiles
public static final RhnSetDecl KICSKTART_IPRANGES = make(
"kickstart_ipranges", SetCleanup.NOOP);
public static final RhnSetDecl ACTIVATION_KEYS = make("activation_keys",
SetCleanup.UNOWNED_ACTIVATION_KEYS);
public static final RhnSetDecl KICKSTART_ACTIVATION_KEYS =
make("kickstart_activation_keys", SetCleanup.UNOWNED_ACTIVATION_KEYS);
public static final RhnSetDecl GPGSSL_KEYS =
make("gpgssl_keys", SetCleanup.UNOWNED_GPGSSL_KEYS);
public static final RhnSetDecl PACKAGE_PROFILES = make("package_profiles",
SetCleanup.UNOWNED_PACKAGE_PROFILES);
// Set of systems subscribed to a specified config-channel
public static final RhnSetDecl CONFIG_SYSTEMS = make(
"config_subscribed_systems", SetCleanup.UNOWNED_SERVERS);
// Set of systems subscribable, but not yet subscribed, to a specified
// config-channel
public static final RhnSetDecl CONFIG_TARGET_SYSTEMS = make(
"config_target_systems", SetCleanup.UNOWNED_SERVERS);
public static final RhnSetDecl CONFIG_ENABLE_SYSTEMS = make(
"enable_config_systems", SetCleanup.UNOWNED_SERVERS);
public static final RhnSetDecl CONFIG_CHANNELS = make("config_channels",
SetCleanup.INACCESSIBLE_CONFIG_CHANNELS);
public static final RhnSetDecl CONFIG_CHANNELS_RANKING = make(
"config_channels_rankings", SetCleanup.INACCESSIBLE_CONFIG_CHANNELS);
public static final RhnSetDecl CONFIG_CHANNELS_TO_UNSUBSCRIBE = make(
"config_channels_to_unsubscribe",
SetCleanup.INACCESSIBLE_CONFIG_CHANNELS);
// Set of files contained within a specified config-channel
public static final RhnSetDecl CONFIG_FILES = make("config_files",
SetCleanup.INACCESSIBLE_CONFIG_FILES);
public static final RhnSetDecl CONFIG_FILE_NAMES = make(
"config_file_names", SetCleanup.NOOP); // always a no-op
public static final RhnSetDecl ORG_LIST = make("org_list", SetCleanup.NOOP);
// set of config file names to be uploaded from the server.
// must have a no-op set cleanup because the file names might be new
public static final RhnSetDecl CONFIG_IMPORT_FILE_NAMES = make(
"config_import_names", SetCleanup.NOOP);
public static final RhnSetDecl CONFIG_REVISIONS = make("config_revisions",
SetCleanup.INACCESSIBLE_CONFIG_REVISIONS);
// Set of systems a given config-file could be deployed to
public static final RhnSetDecl CONFIG_FILE_DEPLOY_SYSTEMS = make(
"config_deploy_systems", SetCleanup.NOOP);
// Set of config-revisions to be deployed from a specified config-channel
public static final RhnSetDecl CONFIG_CHANNEL_DEPLOY_REVISIONS =
make("config_channel_deploy_revisions", SetCleanup.NOOP);
// Set of systems subscribed to a channel to deploy CONFIG_CHANNEL_DEPLOY_REVISIONS to
public static final RhnSetDecl CONFIG_CHANNEL_DEPLOY_SYSTEMS =
make("config_channel_deploy_systems", SetCleanup.NOOP);
// Set of groups we're adding / removing systems to / from in the SSM
public static final RhnSetDecl SSM_GROUP_LIST =
make("ssm_group_list", SetCleanup.NOOP);
// Set of channels we're subscribing to/unsubscribing from in the SSM
public static final RhnSetDecl SSM_CHANNEL_LIST =
make("channel_list", SetCleanup.UNOWNED_CHANNELS);
// Set of packages being removed from packages in the SSM (this is used by the
// query but the UI uses SessionSet)
public static final RhnSetDecl SSM_REMOVE_PACKAGES_LIST =
make("ssm_remove_packages_list", SetCleanup.NOOP);
// Set of packages being upgraded from packages in the SSM (this is used by the
// query but the UI uses SessionSet)
public static final RhnSetDecl SSM_UPGRADE_PACKAGES_LIST =
make("ssm_upgrade_packages_list", SetCleanup.NOOP);
// Set of packages being verified from packages in the SSM (this is used by the
// query but the UI uses SessionSet)
public static final RhnSetDecl SSM_VERIFY_PACKAGES_LIST =
make("ssm_verify_packages_list", SetCleanup.NOOP);
// This cleanser is for when the set contains rhnVirtualInstance.id
// instead of rhnServer.id
public static final RhnSetDecl VIRTUAL_SYSTEMS = make("virtual_systems",
SetCleanup.UNOWNED_VIRTUAL_SERVERS);
public static final RhnSetDecl REMOVE_SYSTEMS_LIST = make(
"remove_systems_list", SetCleanup.NOOP);
public static final RhnSetDecl CHANNEL_SUBSCRIPTION_PERMS = make(
"channel_subscription_perms", SetCleanup.NOOP);
public static final RhnSetDecl TARGET_SYSTEMS_FOR_CHANNEL = make(
"target_systems_for_channel", SetCleanup.NOOP);
public static final RhnSetDecl PACKAGE_DOWNLOADABLE_LIST = make(
"package_downloadable_list", SetCleanup.NOOP);
public static final RhnSetDecl ERRATA_TO_REMOVE = make("errata_to_remove",
SetCleanup.NOOP);
public static final RhnSetDecl ERRATA_TO_ADD = make("errata_to_add",
SetCleanup.NOOP);
public static final RhnSetDecl PACKAGES_FOR_MERGE = make(
"packages_for_merge", SetCleanup.NOOP);
public static final RhnSetDecl CHANNEL_MANAGEMENT_PERMS = make(
"channel_management_perms", SetCleanup.NOOP);
public static final RhnSetDecl TARGET_SYSTEMS = make("target_systems",
SetCleanup.NOOP);
public static final RhnSetDecl DELETABLE_PACKAGE_LIST = make(
"deletable_package_list", SetCleanup.NOOP);
public static final RhnSetDecl REMOVEABLE_SYSTEM_LIST = make(
"removable_system_list", SetCleanup.NOOP);
public static final RhnSetDecl PACKAGE_INSTALLABLE_LIST = make(
"package_installable_list", SetCleanup.NOOP);
public static final RhnSetDecl PACKAGE_ANSWER_FILE_LIST = make(
"package_answer_file_list", SetCleanup.NOOP);
public static final RhnSetDecl PACKAGE_UPGRADABLE_LIST = make(
"package_upgradable_list", SetCleanup.NOOP);
public static final RhnSetDecl REMOVE_SYSTEM_FROM_GROUPS = make(
"remove_system_from_groups", SetCleanup.NOOP);
public static final RhnSetDecl TARGET_GROUPS_FOR_SYSTEM = make(
"target_groups_for_system", SetCleanup.NOOP);
public static final RhnSetDecl SCHEDULE_ACTION_LIST = make(
"schedule_action_list", SetCleanup.NOOP);
public static final RhnSetDecl REMOVABLE_SNAPSHOT_TAG_LIST = make(
"removable_snapshot_tag_list", SetCleanup.NOOP);
public static final RhnSetDecl SYSTEMS_AFFECTED_BY_ERRATA = make(
"systems_affected_by_errata", SetCleanup.NOOP);
public static final RhnSetDecl SSCD_VERIFY_PACKAGE_LIST = make(
"sscd_verify_package_list", SetCleanup.NOOP);
public static final RhnSetDecl SSCD_REMOVABLE_PACKAGE_LIST = make(
"sscd_removable_package_list", SetCleanup.NOOP);
public static final RhnSetDecl MULTIORG_TRUST_LIST = make(
"multiorg_trust_list", SetCleanup.NOOP);
public static final RhnSetDecl SSM_CHANNEL_SUBSCRIBE = make(
"ssm_channel_subscribe", SetCleanup.NOOP);
public static final RhnSetDecl SSM_CHANNEL_UNSUBSCRIBE = make(
"ssm_channel_unsubscribe", SetCleanup.NOOP);
public static final RhnSetDecl ISS_SLAVES = make(
"iss_slaves", SetCleanup.NOOP);
public static final RhnSetDecl ISS_MASTERS = make(
"iss_masters", SetCleanup.NOOP);
public static final RhnSetDecl ISS_LOCAL_ORGS = make(
"iss_local_orgs", SetCleanup.NOOP);
public static final RhnSetDecl XCCDF_TESTRESULTS = make(
"xccdf_testresults", SetCleanup.INACCESSIBLE_XCCDF_RESULTS);
public static final RhnSetDecl SSM_SYSTEMS_SET_LOCK = make(
"ssm_systems_set_lock", SetCleanup.NOOP);
public static final RhnSetDecl SSM_SYSTEMS_REBOOT = make(
"ssm_systems_reboot", SetCleanup.NOOP);
public static final RhnSetDecl PENDING_ACTIONS_TO_DELETE = make(
"pending_actions_delete", SetCleanup.NOOP);
public static final RhnSetDecl SNAPSHOT_TAGS_TO_DELETE = make(
"snapshot_tags_delete", SetCleanup.NOOP);
private SetCleanup cleanup;
private String label;
private RhnSetDecl(String label0, SetCleanup cleanup0) {
label = label0;
cleanup = cleanup0;
}
/**
* Clear the set for user <code>u</code>
* @param u the user whose set to clear
*/
public void clear(User u) {
RhnSetManager.deleteByLabel(u.getId(), label);
}
/**
* Create a new, empty set
* @param u the user for whom to create the set
* @return the created set
*/
public RhnSet create(User u) {
Asserts.assertNotNull(u, "u");
return RhnSetManager.createSet(u.getId(), label, cleanup);
}
/**
* Load the set for user <code>u</code>. If the set for this user does
* not exist yet, a new one is created. In other words, this method will
* always return a non-null value.
* @param u the user for whom to get the set
* @return the set for user <code>u</code>
*/
public RhnSet get(User u) {
Asserts.assertNotNull(u, "u");
RhnSet s = lookup(u);
if (s == null) {
s = create(u);
}
return s;
}
/**
* The label of the set
* @return the label of the set
*/
public String getLabel() {
return label;
}
/**
* Look the set for user <code>u</code> up from the database. If the user
* has no entries in the set, return <code>null</code>
* @param u the user for whom to look the set up
* @return the set or <code>null</code> if the user has nothing in the set
*/
public RhnSet lookup(User u) {
return RhnSetManager.findByLabel(u.getId(), label, cleanup);
}
/**
* Creates new Declaration based on the selections for this set.
* @param suffix suffix to make this set declaration unique
* @return the newly created set declaration.
*/
public RhnSetDecl createCustom(Object... suffix) {
String customName = generateCustomSetName(this, suffix);
return make(customName, cleanup);
}
/**
* Make a new set declaration with the given <code>label</code> and
* <code>cleanup</code>
* @param label the label of the set
* @param cleanup the cleanup
* @return a new set declaration
*/
private static RhnSetDecl make(String label, SetCleanup cleanup) {
RhnSetDecl result = new RhnSetDecl(label, cleanup);
DECLS.put(label, result);
return result;
}
/**
* DO NOT USE THIS METHOD. IT IS ONLY PROVIDED TO SUPPORT LEGACY USES. Looks
* up an existing set declaration for the given <code>label</code>. If
* one exists, <code>cleanup</code> is ignored. Otherwise, a declaration
* with the given <code>cleanup</code> and <code>label</code> is
* created.
* @deprecated Do not use this method.
* @param label the label for the set
* @param cleanup the cleanup to use
* @return the set declaration
*/
@Deprecated
public static RhnSetDecl findOrCreate(String label, SetCleanup cleanup) {
RhnSetDecl result = DECLS.get(label);
if (result == null) {
result = new RhnSetDecl(label, cleanup);
}
return result;
}
/**
* Retrieves the set declaration associated to the given label
* @param label the label for the set
* @return the set declaration or null if none exists
*/
public static RhnSetDecl find(String label) {
return DECLS.get(label);
}
/**
* get the set for Channel Errata cloning
* @param chan the Channel passed in
* @return the Set decl
*/
public static RhnSetDecl setForChannelErrata(Channel chan) {
return make("errata_clone_list" + chan.getId(), SetCleanup.ILLEGAL_ERRATA);
}
/**
* get the set for Channel package pushing
* @param chan the Channel passed in
* @return the Set decl
*/
public static RhnSetDecl setForChannelPackages(Channel chan) {
return make("package_clone_list" + chan.getId(), SetCleanup.NOOP);
}
/**
* get the set for system software crashes
* @param serv server passed in
* @return the Set descl
*/
public static RhnSetDecl setForSystemCrashes(Server serv) {
return make("crashes_for_system" + serv.getId(), SetCleanup.NOOP);
}
public static final RhnSetDecl SYSTEM_NOTES = make("systems_notes",
SetCleanup.NOOP);
/**
* Generates a new set name based on an existing set and one or more variables.
*
* @param base the generation will use the label from this set
* @param suffix used as entropy in the custom name
* @return name suitable for an RhnSet that is a derivative of the base set
*/
public static String generateCustomSetName(RhnSetDecl base, Object... suffix) {
HashCodeBuilder builder = new HashCodeBuilder();
for (Object o : suffix) {
builder.append(o);
}
String customName = base.getLabel() + builder.toHashCode();
return customName;
}
}