modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java | 18 + modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsSessionUIBean.java | 19 + modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsUIBean.java | 36 ++ modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java | 2 modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/plugin/plugin-list.xhtml | 36 ++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ProductPluginDeployer.java | 2 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerBean.java | 105 +++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerLocal.java | 13 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java | 43 +-- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java | 38 ++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerBean.java | 41 +++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerLocal.java | 13 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java | 136 ---------- 13 files changed, 348 insertions(+), 154 deletions(-)
New commits: commit 4ea06192de6ab17f5a9db8b3677f957c081a5f96 Author: John Sanda jsanda@redhat.com Date: Wed Nov 17 21:25:28 2010 -0500
Refactoring resource and plugin config def updates into separate EJBs
The resource config def update code has been moved out of ResourceMetadataManagerBean and into ResourceConfigurationMetadataManagerBean. Likewise, the plugin config def update code has been moved into PluginConfigurationMetadataManagerBean.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerBean.java new file mode 100644 index 0000000..faa779d --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerBean.java @@ -0,0 +1,105 @@ +package org.rhq.enterprise.server.resource.metadata; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.Property; +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.core.domain.configuration.definition.ConfigurationTemplate; +import org.rhq.core.domain.configuration.definition.PropertyDefinition; +import org.rhq.core.domain.criteria.ResourceCriteria; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.enterprise.server.RHQConstants; +import org.rhq.enterprise.server.auth.SubjectManagerLocal; +import org.rhq.enterprise.server.configuration.metadata.ConfigurationDefinitionUpdateReport; +import org.rhq.enterprise.server.configuration.metadata.ConfigurationMetadataManagerLocal; +import org.rhq.enterprise.server.resource.ResourceManagerLocal; + +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Date; +import java.util.List; + +@Stateless +public class PluginConfigurationMetadataManagerBean implements PluginConfigurationMetadataManagerLocal { + + @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) + private EntityManager entityMgr; + + @EJB + private ConfigurationMetadataManagerLocal configurationMetadataMgr; + + @EJB + private SubjectManagerLocal subjectMgr; + + @EJB + private ResourceManagerLocal resourceMgr; + + @Override + public void updatePluginConfigurationDefinition(ResourceType existingType, ResourceType newType) { + ConfigurationDefinition existingConfigurationDefinition = existingType.getPluginConfigurationDefinition(); + if (newType.getPluginConfigurationDefinition() != null) { + // all new + if (existingConfigurationDefinition == null) { + entityMgr.persist(newType.getPluginConfigurationDefinition()); + existingType.setPluginConfigurationDefinition(newType.getPluginConfigurationDefinition()); + } else // update the configuration + { + ConfigurationDefinitionUpdateReport updateReport = configurationMetadataMgr + .updateConfigurationDefinition(newType.getPluginConfigurationDefinition(), + existingConfigurationDefinition); + + if (updateReport.getNewPropertyDefinitions().size() > 0 || + updateReport.getUpdatedPropertyDefinitions().size() > 0) { + Subject overlord = subjectMgr.getOverlord(); + ResourceCriteria criteria = new ResourceCriteria(); + criteria.addFilterResourceTypeId(existingType.getId()); + List<Resource> resources = resourceMgr.findResourcesByCriteria(overlord, criteria); + + for (Resource resource : resources) { + updateResourcePluginConfiguration(resource, updateReport); + } + } + } + } else { + // resourceType.getPlu... is null -> remove the existing config + if (existingConfigurationDefinition != null) { + existingType.setPluginConfigurationDefinition(null); + entityMgr.remove(existingConfigurationDefinition); + } + } + } + + private void updateResourcePluginConfiguration(Resource resource, ConfigurationDefinitionUpdateReport updateReport) { + Configuration pluginConfiguration = resource.getPluginConfiguration(); + boolean modified = false; + int numberOfProperties = pluginConfiguration.getProperties().size(); + ConfigurationTemplate template = updateReport.getConfigurationDefinition().getDefaultTemplate(); + Configuration templateConfiguration = template.getConfiguration(); + + for (PropertyDefinition propertyDef : updateReport.getNewPropertyDefinitions()) { + if (propertyDef.isRequired()) { + Property templateProperty = templateConfiguration.get(propertyDef.getName()); + pluginConfiguration.put(templateProperty.deepCopy(false)); + modified = true; + } + } + + for (PropertyDefinition propertyDef : updateReport.getUpdatedPropertyDefinitions()) { + if (propertyDef.isRequired()) { + String propertyValue = pluginConfiguration.getSimpleValue(propertyDef.getName(), null); + if (propertyValue == null) { + Property templateProperty = templateConfiguration.get(propertyDef.getName()); + pluginConfiguration.put(templateProperty.deepCopy(false)); + modified = true; + } + } + } + + if (modified) { + resource.setMtime(new Date().getTime()); + } + } +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerLocal.java new file mode 100644 index 0000000..6d6bd75 --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginConfigurationMetadataManagerLocal.java @@ -0,0 +1,13 @@ +package org.rhq.enterprise.server.resource.metadata; + + +import org.rhq.core.domain.resource.ResourceType; + +import javax.ejb.Local; + +@Local +public interface PluginConfigurationMetadataManagerLocal { + + void updatePluginConfigurationDefinition(ResourceType existingType, ResourceType newType); + +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerBean.java new file mode 100644 index 0000000..c6788c6 --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerBean.java @@ -0,0 +1,41 @@ +package org.rhq.enterprise.server.resource.metadata; + +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.enterprise.server.RHQConstants; +import org.rhq.enterprise.server.configuration.metadata.ConfigurationMetadataManagerLocal; + +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +@Stateless +public class ResourceConfigurationMetadataManagerBean implements ResourceConfigurationMetadataManagerLocal { + + @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) + private EntityManager entityMgr; + + @EJB + private ConfigurationMetadataManagerLocal configurationMetadataMgr; + + @Override + public void updateResourceConfigurationDefinition(ResourceType existingType, ResourceType newType) { + ConfigurationDefinition newResourceConfigurationDefinition = newType.getResourceConfigurationDefinition(); + if (newResourceConfigurationDefinition != null) { + if (existingType.getResourceConfigurationDefinition() == null) { + entityMgr.persist(newResourceConfigurationDefinition); + existingType.setResourceConfigurationDefinition(newResourceConfigurationDefinition); + } else { + ConfigurationDefinition existingDefinition = existingType.getResourceConfigurationDefinition(); + configurationMetadataMgr.updateConfigurationDefinition(newResourceConfigurationDefinition, + existingDefinition); + } + } else { // newDefinition == null + if (existingType.getResourceConfigurationDefinition() != null) { + existingType.setResourceConfigurationDefinition(null); + } + } + } + +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerLocal.java new file mode 100644 index 0000000..05c34c3 --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceConfigurationMetadataManagerLocal.java @@ -0,0 +1,13 @@ +package org.rhq.enterprise.server.resource.metadata; + + +import org.rhq.core.domain.resource.ResourceType; + +import javax.ejb.Local; + +@Local +public interface ResourceConfigurationMetadataManagerLocal { + + void updateResourceConfigurationDefinition(ResourceType existingType, ResourceType newType); + +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java index 88ca488..63a62ef 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java @@ -20,35 +20,19 @@ package org.rhq.enterprise.server.resource.metadata;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.rhq.core.clientapi.agent.metadata.PluginDependencyGraph; import org.rhq.core.clientapi.agent.metadata.PluginMetadataManager; import org.rhq.core.clientapi.agent.metadata.SubCategoriesMetadataParser; -import org.rhq.core.clientapi.descriptor.AgentPluginDescriptorUtil; -import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor; -import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.configuration.Property; -import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; -import org.rhq.core.domain.configuration.definition.ConfigurationTemplate; -import org.rhq.core.domain.configuration.definition.PropertyDefinition; -import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.criteria.ResourceCriteria; -import org.rhq.core.domain.plugin.Plugin; -import org.rhq.core.domain.resource.*; +import org.rhq.core.domain.resource.ProcessScan; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceSubCategory; +import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; -import org.rhq.core.util.jdbc.JDBCUtil; import org.rhq.enterprise.server.RHQConstants; -import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; -import org.rhq.enterprise.server.alert.AlertTemplateManagerLocal; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.authz.RequiredPermission; -import org.rhq.enterprise.server.configuration.metadata.ConfigurationDefinitionUpdateReport; -import org.rhq.enterprise.server.configuration.metadata.ConfigurationMetadataManagerLocal; -import org.rhq.enterprise.server.event.EventManagerLocal; -import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal; -import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal; import org.rhq.enterprise.server.resource.group.ResourceGroupDeleteException; @@ -59,14 +43,6 @@ import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.*; -import javax.sql.DataSource; -import javax.swing.*; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.util.*;
/** @@ -87,9 +63,6 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal private EntityManager entityManager;
@EJB - private ConfigurationMetadataManagerLocal configurationMetadataManager; - - @EJB private SubjectManagerLocal subjectManager;
@EJB @@ -119,6 +92,12 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal @EJB private AlertMetadataManagerLocal alertMetadataMgr;
+ @EJB + private ResourceConfigurationMetadataManagerLocal resourceConfigMetadataMgr; + + @EJB + private PluginConfigurationMetadataManagerLocal pluginConfigMetadataMgr; + public void updateTypes(Set<ResourceType> resourceTypes) throws Exception { // Only process the type if it is a non-runs-inside type (i.e. not a child of some other type X at this same // level in the type hierarchy). runs-inside types which we skip here will get processed at the next level down @@ -391,10 +370,10 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal // child types which may still be referencing these sub categories
// Update the rest of these related resources - updatePluginConfiguration(resourceType, existingType); + pluginConfigMetadataMgr.updatePluginConfigurationDefinition(existingType, resourceType); entityManager.flush();
- updateResourceConfiguration(resourceType, existingType); + resourceConfigMetadataMgr.updateResourceConfigurationDefinition(existingType, resourceType);
measurementMetadataMgr.updateMetadata(existingType, resourceType); contentMetadataMgr.updateMetadata(existingType, resourceType); @@ -598,74 +577,6 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal return result; }
- /** - * Update the stuff below a <plugin-configuration> - */ - private void updatePluginConfiguration(ResourceType resourceType, ResourceType existingType) { - ConfigurationDefinition existingConfigurationDefinition = existingType.getPluginConfigurationDefinition(); - if (resourceType.getPluginConfigurationDefinition() != null) { - // all new - if (existingConfigurationDefinition == null) { - entityManager.persist(resourceType.getPluginConfigurationDefinition()); - existingType.setPluginConfigurationDefinition(resourceType.getPluginConfigurationDefinition()); - } else // update the configuration - { - ConfigurationDefinitionUpdateReport updateReport = configurationMetadataManager - .updateConfigurationDefinition(resourceType.getPluginConfigurationDefinition(), - existingConfigurationDefinition); - - if (updateReport.getNewPropertyDefinitions().size() > 0 || - updateReport.getUpdatedPropertyDefinitions().size() > 0) { - Subject overlord = subjectManager.getOverlord(); - ResourceCriteria criteria = new ResourceCriteria(); - criteria.addFilterResourceTypeId(existingType.getId()); - List<Resource> resources = resourceManager.findResourcesByCriteria(overlord, criteria); - - for (Resource resource : resources) { - updateResourcePluginConfiguration(resource, updateReport); - } - } - } - } else { - // resourceType.getPlu... is null -> remove the existing config - if (existingConfigurationDefinition != null) { - existingType.setPluginConfigurationDefinition(null); - entityManager.remove(existingConfigurationDefinition); - } - } - } - - private void updateResourcePluginConfiguration(Resource resource, ConfigurationDefinitionUpdateReport updateReport) { - Configuration pluginConfiguration = resource.getPluginConfiguration(); - boolean modified = false; - int numberOfProperties = pluginConfiguration.getProperties().size(); - ConfigurationTemplate template = updateReport.getConfigurationDefinition().getDefaultTemplate(); - Configuration templateConfiguration = template.getConfiguration(); - - for (PropertyDefinition propertyDef : updateReport.getNewPropertyDefinitions()) { - if (propertyDef.isRequired()) { - Property templateProperty = templateConfiguration.get(propertyDef.getName()); - pluginConfiguration.put(templateProperty.deepCopy(false)); - modified = true; - } - } - - for (PropertyDefinition propertyDef : updateReport.getUpdatedPropertyDefinitions()) { - if (propertyDef.isRequired()) { - String propertyValue = pluginConfiguration.getSimpleValue(propertyDef.getName(), null); - if (propertyValue == null) { - Property templateProperty = templateConfiguration.get(propertyDef.getName()); - pluginConfiguration.put(templateProperty.deepCopy(false)); - modified = true; - } - } - } - -// if (pluginConfiguration.getProperties().size() > numberOfProperties) { - if (modified) { - resource.setMtime(new Date().getTime()); - } - }
/** * Update the set of process scans for a given resource type @@ -857,27 +768,4 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal } }
- /** - * deals with the content of <resource-configuration> - */ - private void updateResourceConfiguration(ResourceType newType, ResourceType existingType) { - ConfigurationDefinition newResourceConfigurationDefinition = newType.getResourceConfigurationDefinition(); - if (newResourceConfigurationDefinition != null) { - if (existingType.getResourceConfigurationDefinition() == null) // everything new - { - entityManager.persist(newResourceConfigurationDefinition); - existingType.setResourceConfigurationDefinition(newResourceConfigurationDefinition); - } else { - ConfigurationDefinition existingDefinition = existingType.getResourceConfigurationDefinition(); - configurationMetadataManager.updateConfigurationDefinition(newResourceConfigurationDefinition, - existingDefinition); - } - } else // newDefinition == null - { - if (existingType.getResourceConfigurationDefinition() != null) { - existingType.setResourceConfigurationDefinition(null); - } - } - } - }
commit b9cdb81c7c69c3fe96160ccf542cd5b8e975cf40 Author: John Sanda jsanda@redhat.com Date: Wed Nov 17 20:57:19 2010 -0500
Adding javadocs
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java index c9f51f2..4c91c67 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java @@ -65,6 +65,17 @@ public interface PluginManagerLocal { */ void deletePlugins(Subject subject, List<Integer> pluginIds) throws Exception;
+ /** + * Permanently removes the plugins with the specified ids from the database. This operation first calls + * {@link #deletePlugins(Subject, List)} as a safeguard to ensure that the plugins are first deleted. In a HA + * deployment however, you should wait at least 5 minutes after deleting a plugin before purging it. Five minutes + * is the default interval of the agent plugin scanner. This should be sufficient time for servers in the cluster + * to delete the plugin from the file system. + * + * @param subject The user purging the plugin + * @param pluginIds The ids of the plugins to be purged + * @throws Exception if an error occurs + */ void purgePlugins(Subject subject, List<Integer> pluginIds) throws Exception;
void setPluginEnabledFlag(Subject subject, int pluginId, boolean enabled) throws Exception;
commit 81977d01b6f6f39b684e4809bf8edf3d3e4d21eb Author: John Sanda jsanda@redhat.com Date: Wed Nov 17 20:49:54 2010 -0500
Adding support for purging an agent plugin
I have updated the UI for agent plugins to behave similar to how it behaves for server plugins. There is now a 'SHOW DELETED' button on the agent plugins tab. When you click it, deleted plugins will be displayed as well as a 'PURGE' button. Clicking the purge button will result in the plugin being purged from the database.
The purge operation as a safeguard calls the delete operation on each plugin before purging them.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java index 1c4cc1e..61a7211 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java @@ -134,6 +134,23 @@ import javax.persistence.NamedQuery; + " FROM Plugin AS p " // + " WHERE p.name=:name "), //
+ @NamedQuery(name = Plugin.QUERY_FIND_ALL, query = + " SELECT new org.rhq.core.domain.plugin.Plugin( " + + " p.id, " + + " p.name, " + + " p.path, " + + " p.displayName, " + + " p.enabled, " + + " p.status, " + + " p.description, " + + " p.help, " + + " p.md5, " + + " p.version, " + + " p.ampsVersion, " + + " p.ctime, " + + " p.mtime) " + + " FROM Plugin AS p "), + // finds all installed - ignores those plugins marked as deleted // this query does not load the content blob, but loads everything else @NamedQuery(name = Plugin.QUERY_FIND_ALL_INSTALLED, query = "" // @@ -213,6 +230,7 @@ public class Plugin extends AbstractPlugin { public static final String QUERY_FIND_ALL_BY_IDS = "Plugin.findAllByIds"; public static final String QUERY_FIND_BY_NAME = "Plugin.findByName"; public static final String QUERY_FIND_ANY_BY_NAME = "Plugin.findAnyByName"; + public static final String QUERY_FIND_ALL = "Plugin.findAll"; public static final String QUERY_FIND_ALL_INSTALLED = "Plugin.findAllInstalled"; public static final String QUERY_FIND_ALL_DELETED = "Plugin.findAllDeleted"; public static final String UPDATE_PLUGINS_ENABLED_BY_IDS = "Plugin.updatePluginsEnabledByIds"; diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsSessionUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsSessionUIBean.java index 096671c..a4d62f2 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsSessionUIBean.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsSessionUIBean.java @@ -19,7 +19,8 @@ package org.rhq.enterprise.gui.admin.plugin;
public class InstalledPluginsSessionUIBean { - private boolean showAllServerPlugins = false; + private boolean showAllServerPlugins; + private boolean showAllAgentPlugins; private String selectedTab;
public InstalledPluginsSessionUIBean() { @@ -33,14 +34,30 @@ public class InstalledPluginsSessionUIBean { this.showAllServerPlugins = showDeletedServerPlugins; }
+ public boolean isShowAllAgentPlugins() { + return showAllAgentPlugins; + } + + public void setShowAllAgentPlugins(boolean showDeletedAgentPlugins) { + showAllAgentPlugins = showDeletedAgentPlugins; + } + public void showUndeployedServerPlugins() { setShowAllServerPlugins(true); }
+ public void showDeletedAgentPlugins() { + setShowAllAgentPlugins(true); + } + public void hideUndeployedServerPlugins() { setShowAllServerPlugins(false); }
+ public void hideDeletedAgentPlugins() { + setShowAllAgentPlugins(false); + } + public String getSelectedTab() { return selectedTab; } diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsUIBean.java index e6026d4..a3c4d9f 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsUIBean.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/InstalledPluginsUIBean.java @@ -69,11 +69,16 @@ public class InstalledPluginsUIBean { }
public Collection<Plugin> getInstalledAgentPlugins() { - hasPermission(); - List<Plugin> plugins = pluginMgr.getPlugins(); - plugins = sort(plugins); - return plugins; + List<Plugin> plugins; + + InstalledPluginsSessionUIBean session = FacesContextUtility.getManagedBean(InstalledPluginsSessionUIBean.class); + if (session.isShowAllAgentPlugins()) { + plugins = pluginMgr.getPlugins(); + } else { + plugins = pluginMgr.getInstalledPlugins(); + } + return sort(plugins); }
public Collection<ServerPlugin> getInstalledServerPlugins() { @@ -347,6 +352,29 @@ public class InstalledPluginsUIBean { return; }
+ public void purgeAgentPlugins() { + try { + List<Plugin> selectedPlugins = getSelectedAgentPlugins(); + + if (selectedPlugins.isEmpty()) { + FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, + "No plugins were selected. Nothing to purge"); + return; + } + + List<String> pluginNames = new ArrayList<String>(); + for (Plugin plugin : selectedPlugins) { + pluginNames.add(plugin.getName()); + } + + Subject subject = EnterpriseFacesContextUtility.getSubject(); + pluginMgr.purgePlugins(subject, getIds(getSelectedAgentPlugins())); + FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Purged server plugins: " + pluginNames); + } catch (Exception e) { + processException("Failed to purge agent plugins", e); + } + } + private List<Integer> getIds(List<? extends AbstractPlugin> plugins) { ArrayList<Integer> ids = new ArrayList<Integer>(plugins.size()); for (AbstractPlugin plugin : plugins) { diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java index 68a95c1..a572f8b 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java @@ -165,7 +165,7 @@ public class GroupDefinitionExpressionBuilderLibraryUIBean {
// setup the Plugin drop-down List<String> pluginNames = new ArrayList<String>(); - for (Plugin plugin : LookupUtil.getPluginManager().getPlugins()) { + for (Plugin plugin : LookupUtil.getPluginManager().getInstalledPlugins()) { // TODO: do we want to do this only when plugin.isEnabled() is true? pluginNames.add(plugin.getName()); } diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/plugin/plugin-list.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/plugin/plugin-list.xhtml index 34b7c01..b2f0317 100644 --- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/plugin/plugin-list.xhtml +++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/plugin/plugin-list.xhtml @@ -112,9 +112,18 @@ <h:graphicImage value="/images/icons/availability_red_16.png" rendered="#{!agentPlugin.enabled}"/> </rich:column>
+ <rich:column sortBy="#{agentPlugin.status}" rendered="#{InstalledPluginsSessionUIBean.showAllAgentPlugins}"> + <f:facet name="header"> + <h:outputText styleClass="headerText" value="Deployed"/> + </f:facet> + + <h:graphicImage value="/images/icons/availability_green_16.png" rendered="#{agentPlugin.status eq 'INSTALLED' }"/> + <h:graphicImage value="/images/icons/availability_red_16.png" rendered="#{agentPlugin.status ne 'INSTALLED' }"/> + </rich:column> + <f:facet name="footer"> rich:columnGroup - <rich:column colspan="5" width="100%"> + <rich:column colspan="#{InstalledPluginsSessionUIBean.showAllAgentPlugins ? 6 : 5}" width="100%"> <onc:selectCommandButton action="#{InstalledPluginsUIBean.enableAgentPlugins}" value="ENABLE" target="selectedPlugin" styleClass="on-pager-button buttonsmall"> </onc:selectCommandButton> @@ -122,13 +131,28 @@ value="DISABLE" target="selectedPlugin" styleClass="on-pager-button buttonsmall"> </onc:selectCommandButton> <onc:selectCommandButton action="#{InstalledPluginsUIBean.deleteAgentPlugins}" - value="DELETE" target="selectedPlugin" styleClass="on-pager-button buttonsmall"> - </onc:selectCommandButton> + value="DELETE" + target="selectedPlugin" + styleClass="on-pager-button buttonsmall"/> + <onc:selectCommandButton action="#{InstalledPluginsUIBean.purgeAgentPlugins}" + rendered="#{InstalledPluginsSessionUIBean.showAllAgentPlugins}" + value="PURGE" + target="selectedPlugin" + styleClass="on-pager-button buttonsmall"/> </rich:column> - <rich:column colspan="5" width="100%" breakBefore="true"> + <rich:column colspan="#{InstalledPluginsSessionUIBean.showAllAgentPlugins ? 6 : 5}" + width="100%" + breakBefore="true"> <h:commandButton action="#{InstalledPluginsUIBean.scan}" - value="SCAN FOR UPDATES" styleClass="on-pager-button buttonsmall"> - </h:commandButton> + value="SCAN FOR UPDATES" styleClass="on-pager-button buttonsmall"/> + <h:commandButton action="#{InstalledPluginsSessionUIBean.showDeletedAgentPlugins}" + rendered="#{!InstalledPluginsSessionUIBean.showAllAgentPlugins}" + value="SHOW DELETED" + styleClass="on-pager-button buttonsmall"/> + <h:commandButton action="#{InstalledPluginsSessionUIBean.hideDeletedAgentPlugins}" + rendered="#{InstalledPluginsSessionUIBean.showAllAgentPlugins}" + value="HIDE DELETED" + styleClass="on-pager-button buttonsmall"/> </rich:column> </rich:columnGroup> </f:facet> diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ProductPluginDeployer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ProductPluginDeployer.java index 966bd6b..61b5a97 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ProductPluginDeployer.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ProductPluginDeployer.java @@ -430,7 +430,7 @@ public class ProductPluginDeployer { /* private List<String> getRegisteredPluginNames() { ResourceMetadataManagerLocal metadataManager = LookupUtil.getResourceMetadataManager(); - Collection<Plugin> plugins = metadataManager.getPlugins(); + Collection<Plugin> plugins = metadataManager.getInstalledPlugins(); List<String> pluginNames = new ArrayList<String>();
for (Plugin plugin : plugins) { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java index aa0b115..a863cc4 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java @@ -15,7 +15,6 @@ import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.util.jdbc.JDBCUtil; import org.rhq.enterprise.server.RHQConstants; import org.rhq.enterprise.server.authz.RequiredPermission; -import org.rhq.enterprise.server.core.plugin.PluginDeploymentScannerMBean; import org.rhq.enterprise.server.inventory.InventoryManagerLocal; import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
@@ -33,7 +32,6 @@ import javax.sql.DataSource; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; -import java.net.URL; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -77,8 +75,24 @@ public class PluginManagerBean implements PluginManagerLocal { return plugin; }
- @SuppressWarnings("unchecked") + @Override + public void purgePlugins(Subject subject, List<Integer> pluginIds) throws Exception { + deletePlugins(subject, pluginIds); + + for (Integer id : pluginIds) { + Plugin plugin = entityManager.find(Plugin.class, id); + log.info("Purging [" + plugin + "] from the database"); + entityManager.remove(plugin); + } + } + + @Override public List<Plugin> getPlugins() { + return entityManager.createNamedQuery(Plugin.QUERY_FIND_ALL).getResultList(); + } + + @SuppressWarnings("unchecked") + public List<Plugin> getInstalledPlugins() { Query q = entityManager.createNamedQuery(Plugin.QUERY_FIND_ALL_INSTALLED); return q.getResultList(); } @@ -115,7 +129,7 @@ public class PluginManagerBean implements PluginManagerLocal {
// we need to make sure that if a plugin is enabled, all of its dependencies are enabled PluginDependencyGraph graph = PLUGIN_METADATA_MANAGER.buildDependencyGraph(); - List<Plugin> allPlugins = getPlugins(); + List<Plugin> allPlugins = getInstalledPlugins(); Set<String> pluginsThatNeedToBeEnabled = new HashSet<String>();
for (Integer pluginId : pluginIds) { @@ -153,7 +167,7 @@ public class PluginManagerBean implements PluginManagerLocal {
// we need to make sure that if a plugin is disabled, no other plugins that depend on it are enabled PluginDependencyGraph graph = PLUGIN_METADATA_MANAGER.buildDependencyGraph(); - List<Plugin> allPlugins = getPlugins(); + List<Plugin> allPlugins = getInstalledPlugins(); Set<String> pluginsThatNeedToBeDisabled = new HashSet<String>();
for (Integer pluginId : pluginIds) { @@ -190,12 +204,12 @@ public class PluginManagerBean implements PluginManagerLocal { }
PluginDependencyGraph graph = PLUGIN_METADATA_MANAGER.buildDependencyGraph(); - List<Plugin> allPlugins = getPlugins(); + List<Plugin> allPlugins = getInstalledPlugins(); Set<String> pluginsToDelete = new HashSet<String>();
for (Integer pluginId : pluginIds) { Plugin plugin = getPluginFromListById(allPlugins, pluginId.intValue()); - if (plugin != null) { + if (plugin != null && plugin.getStatus().equals(PluginStatusType.INSTALLED)) { Collection<String> dependentNames = graph.getAllDependents(plugin.getName()); for (String dependentName : dependentNames) { Plugin dependentPlugin = getPluginFromListByName(allPlugins, dependentName); @@ -214,10 +228,12 @@ public class PluginManagerBean implements PluginManagerLocal {
List<Plugin> plugins = getAllPluginsById(pluginIds); for (Plugin plugin : plugins) { - List<ResourceType> resourceTypes = resourceTypeMgr.getResourceTypesByPlugin(plugin.getName()); - Plugin managedPlugin = entityManager.merge(plugin); - inventoryMgr.markTypesDeleted(resourceTypes); - managedPlugin.setStatus(PluginStatusType.DELETED); + if (plugin.getStatus().equals(PluginStatusType.INSTALLED)) { + List<ResourceType> resourceTypes = resourceTypeMgr.getResourceTypesByPlugin(plugin.getName()); + Plugin managedPlugin = entityManager.merge(plugin); + inventoryMgr.markTypesDeleted(resourceTypes); + managedPlugin.setStatus(PluginStatusType.DELETED); + } } }
@@ -268,11 +284,6 @@ public class PluginManagerBean implements PluginManagerLocal {
if (typesUpdated) { resourceMetadataManager.removeObsoleteTypes(subject, plugin.getName(), PLUGIN_METADATA_MANAGER); - -// Set<ResourceType> removedTypes = new HashSet<ResourceType>(); -// resourceMetadataManager.getPluginTypes(subject, plugin.getName(), new HashSet<ResourceType>(), -// removedTypes, PLUGIN_METADATA_MANAGER); -// inventoryMgr.markTypesDeleted(new ArrayList<ResourceType>(removedTypes)); } }
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java index 29e3374..c9f51f2 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerLocal.java @@ -24,14 +24,26 @@ public interface PluginManagerLocal { Plugin getPlugin(String name);
/** + * @return A list of all plugins deployed in the server, including deleted plugins + */ + List<Plugin> getPlugins(); + + /** * Returns the list of all plugins deployed in the server. * * @return list of plugins deployed */ - List<Plugin> getPlugins(); + List<Plugin> getInstalledPlugins();
List<Plugin> findAllDeletedPlugins();
+ /** + * Returns a list of plugins with the specified ids. Both installed and deleted plugins will be included in the + * results. + * + * @param pluginIds The ids of the plugins to fetch + * @return A list of plugins with the specified ids + */ List<Plugin> getAllPluginsById(List<Integer> pluginIds);
List<Plugin> getPluginsByResourceTypeAndCategory(String resourceTypeName, ResourceCategory resourceCategory); @@ -40,8 +52,21 @@ public interface PluginManagerLocal {
void disablePlugins(Subject subject, List<Integer> pluginIds) throws Exception;
+ /** + * This method puts the plugin into a <i>deleted</i> state and removes the plugin JAR file from the file system. It + * does not remove the plugin from the database. This method does not purge the plugin from the database in order + * to support HA deployments. In a HA deployment, if server A handles the request to delete the plugin and if it + * purges the plugin from the database, server B might see the plugin on the file system and not in the database. + * Server B would then proceed to try and re-install the plugin, not knowing it was deleted. + * + * @param subject The user performing the deletion + * @param pluginIds The ids of the plugins to be deleted + * @throws Exception if an error occurs + */ void deletePlugins(Subject subject, List<Integer> pluginIds) throws Exception;
+ void purgePlugins(Subject subject, List<Integer> pluginIds) throws Exception; + void setPluginEnabledFlag(Subject subject, int pluginId, boolean enabled) throws Exception;
/**
rhq-commits@lists.fedorahosted.org