/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.server.gwt; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.plugin.AbstractPlugin; import org.rhq.core.domain.plugin.CannedGroupExpression; import org.rhq.core.domain.plugin.Plugin; import org.rhq.core.domain.plugin.PluginConfigurationRequiredException; import org.rhq.core.domain.plugin.PluginKey; import org.rhq.core.domain.plugin.PluginStatusType; import org.rhq.core.domain.plugin.ServerPlugin; import org.rhq.core.domain.plugin.ServerPluginControlDefinition; import org.rhq.core.domain.plugin.ServerPluginControlResults; import org.rhq.coregui.client.gwt.PluginGWTService; import org.rhq.coregui.server.util.SerialUtility; import org.rhq.enterprise.server.core.plugin.PluginDeploymentScannerMBean; import org.rhq.enterprise.server.plugin.ServerPluginManagerLocal; import org.rhq.enterprise.server.plugin.pc.ControlResults; import org.rhq.enterprise.server.resource.metadata.PluginManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.xmlschema.ControlDefinition; /** * @author John Mazzitelli */ public class PluginGWTServiceImpl extends AbstractGWTServiceImpl implements PluginGWTService { private static final long serialVersionUID = 1L; private final Log log = LogFactory.getLog(PluginGWTServiceImpl.class); private PluginManagerLocal pluginManager = LookupUtil.getPluginManager(); private ServerPluginManagerLocal serverPluginManager = LookupUtil.getServerPluginManager(); @Override public void restartMasterPluginContainer() throws RuntimeException { try { serverPluginManager.restartMasterPluginContainer(getSessionSubject()); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public Plugin getAgentPlugin(int pluginId) throws RuntimeException { try { List<Plugin> result = getSelectedAgentPlugins(new int[] { pluginId }); if (result == null || result.isEmpty()) { return null; } return SerialUtility.prepare(result.get(0), "PluginGWTService.getAgentPlugin"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ServerPlugin getServerPlugin(int pluginId, boolean includeRelationships) throws RuntimeException { try { ArrayList<Integer> ids = new ArrayList<Integer>(1); ids.add(pluginId); List<ServerPlugin> result = serverPluginManager.getServerPluginsById(ids); // use this API to get config, too if (result == null || result.isEmpty()) { return null; } ServerPlugin plugin = result.get(0); if (includeRelationships) { plugin = serverPluginManager.getServerPluginRelationships(plugin); } return SerialUtility.prepare(plugin, "PluginGWTService.getServerPlugin"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<Plugin> getAgentPlugins(boolean includeDeletedPlugins) throws RuntimeException { try { ArrayList<Plugin> result; if (includeDeletedPlugins) { result = new ArrayList<Plugin>(pluginManager.getPlugins()); } else { result = new ArrayList<Plugin>(pluginManager.getInstalledPlugins()); } return SerialUtility.prepare(result, "PluginGWTService.getAgentPlugins"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<ServerPlugin> getServerPlugins(boolean includeDeletedPlugins) throws RuntimeException { try { ArrayList<ServerPlugin> result; if (includeDeletedPlugins) { result = new ArrayList<ServerPlugin>(serverPluginManager.getAllServerPlugins()); } else { result = new ArrayList<ServerPlugin>(serverPluginManager.getServerPlugins()); } return SerialUtility.prepare(result, "PluginGWTService.getServerPlugins"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public void scanAndRegister() throws RuntimeException { try { PluginDeploymentScannerMBean scanner = LookupUtil.getPluginDeploymentScanner(); scanner.scanAndRegister(); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> enableAgentPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<Plugin> allSelectedPlugins = getSelectedAgentPlugins(selectedPluginIds); ArrayList<String> selectedPluginNames = new ArrayList<String>(); ArrayList<Plugin> pluginsToEnable = new ArrayList<Plugin>(); for (Plugin selectedPlugin : allSelectedPlugins) { if (!selectedPlugin.isEnabled() && selectedPlugin.getStatus() == PluginStatusType.INSTALLED) { selectedPluginNames.add(selectedPlugin.getDisplayName()); pluginsToEnable.add(selectedPlugin); } } if (selectedPluginNames.isEmpty()) { log.debug("No disabled agent plugins were selected. Nothing to enable"); return selectedPluginNames; } pluginManager.enablePlugins(getSessionSubject(), getIds(pluginsToEnable)); log.info("Enabled agent plugins: " + selectedPluginNames); return selectedPluginNames; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> disableAgentPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<Plugin> allSelectedPlugins = getSelectedAgentPlugins(selectedPluginIds); ArrayList<String> selectedPluginNames = new ArrayList<String>(); ArrayList<Plugin> pluginsToDisable = new ArrayList<Plugin>(); for (Plugin selectedPlugin : allSelectedPlugins) { if (selectedPlugin.isEnabled()) { selectedPluginNames.add(selectedPlugin.getDisplayName()); pluginsToDisable.add(selectedPlugin); } } if (selectedPluginNames.isEmpty()) { log.debug("No enabled agent plugins were selected. Nothing to disable"); return selectedPluginNames; } pluginManager.disablePlugins(getSessionSubject(), getIds(pluginsToDisable)); log.info("Disabled agent plugins: " + selectedPluginNames); return selectedPluginNames; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> deleteAgentPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<Plugin> allSelectedPlugins = getSelectedAgentPlugins(selectedPluginIds); if (allSelectedPlugins.isEmpty()) { log.debug("No agent plugins were selected. Nothing to delete"); return new ArrayList<String>(0); } ArrayList<String> pluginNames = new ArrayList<String>(); for (Plugin plugin : allSelectedPlugins) { pluginNames.add(plugin.getDisplayName()); } pluginManager.deletePlugins(getSessionSubject(), getIds(allSelectedPlugins)); log.info("Deleted agent plugins: " + pluginNames); PluginDeploymentScannerMBean scanner = LookupUtil.getPluginDeploymentScanner(); scanner.scanAndRegister(); return pluginNames; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> enableServerPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<ServerPlugin> allSelectedPlugins = getSelectedServerPlugins(selectedPluginIds); ArrayList<String> selectedPluginNames = new ArrayList<String>(); ArrayList<ServerPlugin> pluginsToEnable = new ArrayList<ServerPlugin>(); for (ServerPlugin selectedPlugin : allSelectedPlugins) { if (!selectedPlugin.isEnabled() && selectedPlugin.getStatus() == PluginStatusType.INSTALLED) { selectedPluginNames.add(selectedPlugin.getDisplayName()); pluginsToEnable.add(selectedPlugin); } } if (selectedPluginNames.isEmpty()) { log.debug("No disabled server plugins were selected. Nothing to enable"); return selectedPluginNames; } List<PluginKey> enabled = serverPluginManager.enableServerPlugins(getSessionSubject(), getIds(pluginsToEnable)); if (enabled.size() == pluginsToEnable.size()) { return selectedPluginNames; } else { ArrayList<String> enabledPlugins = new ArrayList<String>(); ArrayList<String> failedPlugins = new ArrayList<String>(); for (ServerPlugin pluginToEnable : pluginsToEnable) { PluginKey key = PluginKey.createServerPluginKey(pluginToEnable.getType(), pluginToEnable.getName()); if (enabled.contains(key)) { enabledPlugins.add(pluginToEnable.getDisplayName()); } else { failedPlugins.add(pluginToEnable.getDisplayName()); } } if (enabledPlugins.size() > 0) { log.info("Enabled server plugins: " + enabledPlugins); } if (failedPlugins.size() > 0) { log.info("Failed to enable server plugins: " + failedPlugins); } return enabledPlugins; } } catch (PluginConfigurationRequiredException pcre) { // this is expected exception and we just want to show it's message throw new RuntimeException(pcre.getMessage()); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> disableServerPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<ServerPlugin> allSelectedPlugins = getSelectedServerPlugins(selectedPluginIds); ArrayList<String> selectedPluginNames = new ArrayList<String>(); ArrayList<ServerPlugin> pluginsToDisable = new ArrayList<ServerPlugin>(); for (ServerPlugin selectedPlugin : allSelectedPlugins) { if (selectedPlugin.isEnabled()) { selectedPluginNames.add(selectedPlugin.getDisplayName()); pluginsToDisable.add(selectedPlugin); } } if (selectedPluginNames.isEmpty()) { log.debug("No enabled server plugins were selected. Nothing to disable"); return selectedPluginNames; } serverPluginManager.disableServerPlugins(getSessionSubject(), getIds(pluginsToDisable)); log.info("Disabled server plugins: " + selectedPluginNames); return selectedPluginNames; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<String> deleteServerPlugins(int[] selectedPluginIds) throws RuntimeException { try { List<ServerPlugin> allSelectedPlugins = getSelectedServerPlugins(selectedPluginIds); ArrayList<String> selectedPluginNames = new ArrayList<String>(); ArrayList<ServerPlugin> pluginsToUndeploy = new ArrayList<ServerPlugin>(); for (ServerPlugin selectedPlugin : allSelectedPlugins) { if (selectedPlugin.getStatus() == PluginStatusType.INSTALLED) { selectedPluginNames.add(selectedPlugin.getDisplayName()); pluginsToUndeploy.add(selectedPlugin); } } if (selectedPluginNames.isEmpty()) { log.debug("No deployed server plugins were selected. Nothing to undeploy"); return selectedPluginNames; } serverPluginManager.deleteServerPlugins(getSessionSubject(), getIds(pluginsToUndeploy)); log.info("Undeployed server plugins: " + selectedPluginNames); return selectedPluginNames; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ConfigurationDefinition getServerPluginConfigurationDefinition(PluginKey pluginKey) throws RuntimeException { try { ConfigurationDefinition def; def = serverPluginManager.getServerPluginConfigurationDefinition(pluginKey); return def; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ConfigurationDefinition getServerPluginScheduledJobsDefinition(PluginKey pluginKey) throws RuntimeException { try { ConfigurationDefinition def; def = serverPluginManager.getServerPluginScheduledJobsDefinition(pluginKey); return def; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ArrayList<ServerPluginControlDefinition> getServerPluginControlDefinitions(PluginKey serverPluginKey) throws RuntimeException { try { List<ControlDefinition> defs = serverPluginManager.getServerPluginControlDefinitions(serverPluginKey); // ControlDefinition is a server-side only class - we need to convert it to our domain DTO if (defs == null || defs.isEmpty()) { return new ArrayList<ServerPluginControlDefinition>(0); } ArrayList<ServerPluginControlDefinition> spcd = new ArrayList<ServerPluginControlDefinition>(defs.size()); for (ControlDefinition cd : defs) { spcd.add(new ServerPluginControlDefinition(cd.getName(), cd.getDisplayName(), cd.getDescription(), cd .getParameters(), cd.getResults())); } return SerialUtility.prepare(spcd, "PluginGWTService.getServerPluginControlDefinitions"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public ServerPluginControlResults invokeServerPluginControl(PluginKey serverPluginKey, String controlName, Configuration params) throws RuntimeException { try { ControlResults results; results = serverPluginManager.invokeServerPluginControl(getSessionSubject(), serverPluginKey, controlName, params); // ControlDefinition is a server-side only class - we need to convert it to our domain DTO ServerPluginControlResults spcr = new ServerPluginControlResults(); for (Property prop : results.getComplexResults().getProperties()) { spcr.getComplexResults().put(prop.deepCopy(true)); } if (!results.isSuccess()) { spcr.setError(results.getError()); } return spcr; } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public void updateServerPluginConfiguration(PluginKey serverPluginKey, Configuration config) throws RuntimeException { try { ServerPluginManagerLocal serverPlugins = LookupUtil.getServerPluginManager(); // first load the full original plugin data ServerPlugin plugin = serverPlugins.getServerPlugin(serverPluginKey); if (plugin == null) { throw new IllegalArgumentException("Unknown plugin key: " + serverPluginKey); } plugin = serverPlugins.getServerPluginRelationships(plugin); // now overwrite the config that we want to set and tell the server about it plugin.setPluginConfiguration(config); serverPlugins.updateServerPluginExceptContent(getSessionSubject(), plugin); // Since the config has changed, we can tell the server to re-load the plugin now // in order for it to pick up the changes immediately. Any other servers in the HA Server Cloud // will pick up these changes later, when they scan for changes in the database. // Note that if the plugin is disabled, don't bother since the plugin isn't really running anyway. if (plugin.isEnabled()) { // enabling an already enabled plugin forces the plugin to reload ArrayList<Integer> id = new ArrayList<Integer>(1); id.add(plugin.getId()); serverPlugins.enableServerPlugins(getSessionSubject(), id); } } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public void updateServerPluginScheduledJobs(PluginKey serverPluginKey, Configuration jobsConfig) throws RuntimeException { try { ServerPluginManagerLocal serverPlugins = LookupUtil.getServerPluginManager(); // first load the full original plugin data ServerPlugin plugin = serverPlugins.getServerPlugin(serverPluginKey); if (plugin == null) { throw new IllegalArgumentException("Unknown plugin key: " + serverPluginKey); } plugin = serverPlugins.getServerPluginRelationships(plugin); // now overwrite the config that we want to set and tell the server about it plugin.setScheduledJobsConfiguration(jobsConfig); serverPlugins.updateServerPluginExceptContent(getSessionSubject(), plugin); // Since the config has changed, we can tell the server to re-load the plugin now // in order for it to pick up the changes immediately. Any other servers in the HA Server Cloud // will pick up these changes later, when they scan for changes in the database. // Note that if the plugin is disabled, don't bother since the plugin isn't really running anyway. if (plugin.isEnabled()) { // enabling an already enabled plugin forces the plugin to reload ArrayList<Integer> id = new ArrayList<Integer>(1); id.add(plugin.getId()); serverPlugins.enableServerPlugins(getSessionSubject(), id); } } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } @Override public void updatePluginsOnAgents(long delayInMilliseconds) { try { pluginManager.schedulePluginUpdateOnAgents(getSessionSubject(), delayInMilliseconds); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } } private List<Plugin> getSelectedAgentPlugins(int[] selectedPluginIds) { if (selectedPluginIds == null || selectedPluginIds.length == 0) { return new ArrayList<Plugin>(0); } List<Integer> idList = new ArrayList<Integer>(selectedPluginIds.length); for (int id : selectedPluginIds) { idList.add(id); } List<Plugin> plugins = pluginManager.getAllPluginsById(idList); return plugins; } private List<ServerPlugin> getSelectedServerPlugins(int[] selectedPluginIds) { if (selectedPluginIds == null || selectedPluginIds.length == 0) { return new ArrayList<ServerPlugin>(0); } List<Integer> idList = new ArrayList<Integer>(selectedPluginIds.length); for (int id : selectedPluginIds) { idList.add(id); } List<ServerPlugin> plugins = serverPluginManager.getAllServerPluginsById(idList); return plugins; } private List<Integer> getIds(List<? extends AbstractPlugin> plugins) { ArrayList<Integer> ids = new ArrayList<Integer>(plugins.size()); for (AbstractPlugin plugin : plugins) { ids.add(plugin.getId()); } return ids; } @Override public ArrayList<CannedGroupExpression> getCannedGroupExpressions() { return new ArrayList<CannedGroupExpression>(pluginManager.getCannedGroupExpressions()); } }