Author: dcrutchf Date: 2009-07-27 14:11:49 -0700 (Mon, 27 Jul 2009) New Revision: 13542 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=13542 Modified: trunk/src/org/hyperic/hq/agent/AgentConfig.java trunk/src/org/hyperic/hq/agent/client/AgentCommandsClient.java trunk/src/org/hyperic/hq/agent/client/AgentCommandsClientImpl.java trunk/src/org/hyperic/hq/agent/client/LegacyAgentCommandsClientImpl.java trunk/src/org/hyperic/hq/agent/commands/AgentUpgrade_result.java trunk/src/org/hyperic/hq/agent/server/AgentCommandsServer.java trunk/src/org/hyperic/hq/agent/server/AgentCommandsService.java trunk/src/org/hyperic/hq/appdef/server/session/AgentManagerEJBImpl.java trunk/tools/agentpork/etc/agent.properties trunk/ui_plugins/health/app/HealthController.groovy Log: [HHQ-3017] - Agent version is incorrectly displayed at the HQ-Health page after the remote upgrade of agent from HQ Updated implementation of AgentUpgrade_result to support passing version, build and bundle name values Modified the AgentCommandsClient interface to return a Map object when calling the upgrade method Modified classes implementing the AgentCommandsClient interface to return a Map object Modified the AgentManagerEJBImpl to take a AgentUpgrade_result return object, extract the version and update the EAM_AGENT table with the new version. Changed the groovy script back to its original implementation PLEASE NOTE: This change does not fix pre 4.2 agents. If upgrading from a < 4.2 version of the agent, the version column will not be updated in the database. However, upgrades from 4.2 and beyond will update this field. Modified: trunk/src/org/hyperic/hq/agent/AgentConfig.java =================================================================== --- trunk/src/org/hyperic/hq/agent/AgentConfig.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/AgentConfig.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -73,6 +73,7 @@ public static final String PDK_PLUGIN_DIR_KEY = "agent.pdkPluginDir"; public static final String PDK_WORK_DIR_KEY = "agent.pdkWorkDir"; public static final String AGENT_BUNDLE_HOME = "agent.bundle.home"; + public static final String HQ_PRODUCT_JAR_KEY = "agent.hqProductJar"; // The following final objects are the properties which are usable // within the configuation object. The first element in the array Modified: trunk/src/org/hyperic/hq/agent/client/AgentCommandsClient.java =================================================================== --- trunk/src/org/hyperic/hq/agent/client/AgentCommandsClient.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/client/AgentCommandsClient.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -26,6 +26,7 @@ package org.hyperic.hq.agent.client; import java.io.InputStream; +import java.util.Map; import org.hyperic.hq.agent.AgentConnectionException; import org.hyperic.hq.agent.AgentRemoteException; @@ -94,7 +95,7 @@ * communicating with the agent. */ - void upgrade(String tarFile, String destination) throws AgentRemoteException, AgentConnectionException; + Map upgrade(String tarFile, String destination) throws AgentRemoteException, AgentConnectionException; /** * Send file data to a remote agent Modified: trunk/src/org/hyperic/hq/agent/client/AgentCommandsClientImpl.java =================================================================== --- trunk/src/org/hyperic/hq/agent/client/AgentCommandsClientImpl.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/client/AgentCommandsClientImpl.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -28,6 +28,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; import org.hyperic.hq.agent.AgentConnectionException; import org.hyperic.hq.agent.AgentRemoteException; @@ -231,17 +233,20 @@ /** * @see org.hyperic.hq.agent.client.AgentCommandsClient#upgrade(java.lang.String, java.lang.String) */ - public void upgrade(String tarFile, String destination) + public Map upgrade(String tarFile, String destination) throws AgentRemoteException, AgentConnectionException { AgentCommandsClient proxy = null; + Map result = new HashMap(); try { proxy = (AgentCommandsClient)getSynchronousProxy(AgentCommandsClient.class); - proxy.upgrade(tarFile, destination); + result = proxy.upgrade(tarFile, destination); } finally { safeDestroyService(proxy); } + + return result; } /** Modified: trunk/src/org/hyperic/hq/agent/client/LegacyAgentCommandsClientImpl.java =================================================================== --- trunk/src/org/hyperic/hq/agent/client/LegacyAgentCommandsClientImpl.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/client/LegacyAgentCommandsClientImpl.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -28,6 +28,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; import org.hyperic.hq.agent.AgentCommandsAPI; import org.hyperic.hq.agent.AgentConnectionException; @@ -42,7 +44,9 @@ import org.hyperic.hq.agent.commands.AgentPing_args; import org.hyperic.hq.agent.commands.AgentReceiveFileData_args; import org.hyperic.hq.agent.commands.AgentRestart_args; +import org.hyperic.hq.agent.commands.AgentRestart_result; import org.hyperic.hq.agent.commands.AgentUpgrade_args; +import org.hyperic.hq.agent.commands.AgentUpgrade_result; import org.hyperic.util.math.MathUtil; /** @@ -157,13 +161,19 @@ /** * @see org.hyperic.hq.agent.client.AgentCommandsClient#upgrade(java.lang.String, java.lang.String) */ - public void upgrade(String tarFile, String destination) - throws AgentRemoteException, AgentConnectionException { + public Map upgrade(String tarFile, String destination) + throws AgentRemoteException, AgentConnectionException { // set the arguments to the command AgentUpgrade_args args = new AgentUpgrade_args(tarFile, destination); + AgentRemoteValue cmdRes = this.agentConn.sendCommand(AgentCommandsAPI.command_upgrade, this.verAPI.getVersion(), args); + AgentUpgrade_result upgradeResult = new AgentUpgrade_result(cmdRes); + Map result = new HashMap(); - this.agentConn.sendCommand(AgentCommandsAPI.command_upgrade, - this.verAPI.getVersion(), args); + result.put(AgentUpgrade_result.VERSION, upgradeResult.getAgentVersion()); + result.put(AgentUpgrade_result.BUILD, upgradeResult.getAgentBuild()); + result.put(AgentUpgrade_result.BUNDLE_NAME, upgradeResult.getAgentBundleName()); + + return result; } /** @@ -181,4 +191,4 @@ return new AgentBundle_result(cmdRes).getCurrentAgentBundle(); } -} +} \ No newline at end of file Modified: trunk/src/org/hyperic/hq/agent/commands/AgentUpgrade_result.java =================================================================== --- trunk/src/org/hyperic/hq/agent/commands/AgentUpgrade_result.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/commands/AgentUpgrade_result.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -31,16 +31,36 @@ public class AgentUpgrade_result extends AgentRemoteValue { - public AgentUpgrade_result() { - super(); + public static final String VERSION = "version"; + public static final String BUILD = "build"; + public static final String BUNDLE_NAME = "bundleName"; + + public AgentUpgrade_result(String version, String build, String bundleName) { + super.setValue(AgentUpgrade_result.VERSION, version); + super.setValue(AgentUpgrade_result.BUILD, build); + super.setValue(AgentUpgrade_result.BUNDLE_NAME, bundleName); } public AgentUpgrade_result(AgentRemoteValue args) - throws AgentRemoteException + throws AgentRemoteException { - super(); + this(args.getValue(AgentUpgrade_result.VERSION), + args.getValue(AgentUpgrade_result.BUILD), + args.getValue(AgentUpgrade_result.BUNDLE_NAME)); } + public String getAgentVersion() { + return this.getValue(AgentUpgrade_result.VERSION); + } + + public String getAgentBuild() { + return this.getValue(AgentUpgrade_result.BUILD); + } + + public String getAgentBundleName() { + return this.getValue(AgentUpgrade_result.BUNDLE_NAME); + } + public void setValue(String key, String val){ throw new AgentAssertionException("This should never be called"); } Modified: trunk/src/org/hyperic/hq/agent/server/AgentCommandsServer.java =================================================================== --- trunk/src/org/hyperic/hq/agent/server/AgentCommandsServer.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/server/AgentCommandsServer.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -27,6 +27,7 @@ import java.io.InputStream; import java.io.OutputStream; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -45,6 +46,7 @@ import org.hyperic.hq.agent.commands.AgentRestart_args; import org.hyperic.hq.agent.commands.AgentRestart_result; import org.hyperic.hq.agent.commands.AgentUpgrade_args; +import org.hyperic.hq.agent.commands.AgentUpgrade_result; /** * The server-side of the commands the Agent supports. This object @@ -95,8 +97,15 @@ AgentUpgrade_args upgradeArgs = new AgentUpgrade_args(args); // Just parse the args String bundleFile = upgradeArgs.getBundleFile(); String dest = upgradeArgs.getDestination(); - agentCommandsService.upgrade(bundleFile, dest); - return new AgentRestart_result(); + Map props = agentCommandsService.upgrade(bundleFile, dest); + + if (props.isEmpty()) return new AgentRestart_result(); // Fall back to what it used to do, if we have an empty map + + String version = (String) props.get(AgentUpgrade_result.VERSION); + String build = (String) props.get(AgentUpgrade_result.BUILD); + String bundleName = (String) props.get(AgentUpgrade_result.BUNDLE_NAME); + + return new AgentUpgrade_result(version, build, bundleName); } else if(cmd.equals(AgentCommandsAPI.command_die)){ new AgentDie_args(args); // Just parse the args agentCommandsService.die(); Modified: trunk/src/org/hyperic/hq/agent/server/AgentCommandsService.java =================================================================== --- trunk/src/org/hyperic/hq/agent/server/AgentCommandsService.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/agent/server/AgentCommandsService.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -26,13 +26,21 @@ package org.hyperic.hq.agent.server; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.JarURLConnection; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.util.PropertiesHelper; import org.hyperic.hq.agent.AgentConfig; import org.hyperic.hq.agent.AgentRemoteException; import org.hyperic.hq.agent.AgentUpgradeManager; @@ -40,6 +48,8 @@ import org.hyperic.hq.agent.FileDataResult; import org.hyperic.hq.agent.client.AgentCommandsClient; import org.hyperic.hq.agent.commands.AgentReceiveFileData_args; +import org.hyperic.hq.agent.commands.AgentUpgrade_result; +import org.hyperic.hq.common.shared.ProductProperties; import org.hyperic.hq.transport.util.RemoteInputStream; import org.hyperic.util.StringUtil; import org.hyperic.util.file.FileUtil; @@ -295,11 +305,15 @@ /** * @see org.hyperic.hq.agent.client.AgentCommandsClient#upgrade(java.lang.String, java.lang.String) */ - public void upgrade(String bundle, String destination) - throws AgentRemoteException { + public Map upgrade(String bundle, String destination) + throws AgentRemoteException { final File bundleFile = new File(bundle); final File workDir = new File(destination, "work"); + + Map result = new HashMap(); + try { + _log.info("Preparing to upgrade agent bundle from file " + bundle + " at destination " + destination); // check that we are running in Java Service Wrapper mode @@ -367,11 +381,55 @@ } } _log.info("Successfully upgraded to new agent bundle"); + + try { + _log.debug("Creating result map"); + + // Grab the version.properties file from the newly extracted hq-product.jar + final String relativePathToJarFile = System.getProperty(AgentConfig.HQ_PRODUCT_JAR_KEY, "./pdk/lib/hq-product.jar"); + final File hqProductJar = new File(bundleDir, relativePathToJarFile); + + _log.debug("HQ product jar path: " + hqProductJar.getCanonicalPath()); + + URL jarUrl = new URL("jar:" + hqProductJar.toURL() +"!/"); + + _log.debug("HQ product jar url: " + jarUrl.toString()); + + URL fileUrl = new URL(jarUrl, "version.properties"); + + _log.debug("version.properties url is: " + fileUrl.toString()); + + JarURLConnection connection = (JarURLConnection) fileUrl.openConnection(); + + connection.connect(); + + Properties newVersionProperties = new Properties(); + + newVersionProperties.load(connection.getInputStream()); + + // Created return map + String version = newVersionProperties.getProperty("version"); + String build = newVersionProperties.getProperty("build.number"); + + _log.debug("VERSION: " + version); + _log.debug("BUILD: " + build); + _log.debug("BUNDLE_NAME: " + bundleHome); + + result.put(AgentUpgrade_result.VERSION, version); + result.put(AgentUpgrade_result.BUILD, build); + result.put(AgentUpgrade_result.BUNDLE_NAME, bundleHome); + } catch(MalformedURLException e) { + _log.warn("Could not access new version.properties due to a malformed url, version value will not be updated in the database.", e); + } catch(IOException e) { + _log.warn("Could not read new version.properties file, version value will not be updated in the database.", e); + } } // cleanup work dir files and bundle finally { doUpgradeCleanup(bundleFile, workDir); } + + return result; } private void doUpgradeCleanup(File bundleFile, File workDir) { Modified: trunk/src/org/hyperic/hq/appdef/server/session/AgentManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/appdef/server/session/AgentManagerEJBImpl.java 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/src/org/hyperic/hq/appdef/server/session/AgentManagerEJBImpl.java 2009-07-27 21:11:49 UTC (rev 13542) @@ -34,6 +34,7 @@ import java.util.Iterator; import java.util.List; import java.util.ArrayList; +import java.util.Map; import java.util.Properties; import javax.ejb.CreateException; @@ -49,6 +50,7 @@ import org.hyperic.hq.agent.FileDataResult; import org.hyperic.hq.agent.client.AgentCommandsClient; import org.hyperic.hq.agent.client.AgentCommandsClientFactory; +import org.hyperic.hq.agent.commands.AgentUpgrade_result; import org.hyperic.hq.appdef.server.session.AgentConnections.AgentConnection; import org.hyperic.hq.appdef.shared.AgentCreateException; import org.hyperic.hq.appdef.shared.AgentNotFoundException; @@ -1001,9 +1003,7 @@ * @ejb:interface-method * @ejb:transaction type="Required" */ - public void upgradeAgentBundle(AuthzSubject subject, - AppdefEntityID aid, - String bundleFileName) + public void upgradeAgentBundle(AuthzSubject subject, AppdefEntityID aid, String bundleFileName) throws PermissionException, AgentNotFoundException, AgentConnectionException, @@ -1017,10 +1017,21 @@ checkCreatePlatformPermission(subject); - AgentCommandsClient client = AgentCommandsClientFactory.getInstance() - .getClient(aid); + AgentCommandsClient client = AgentCommandsClientFactory.getInstance().getClient(aid); String bundleFilePath = HQConstants.AgentBundleDropDir + "/" + bundleFileName; - client.upgrade(bundleFilePath, HQConstants.AgentBundleDropDir); + Map updatedAgentInfo = client.upgrade(bundleFilePath, HQConstants.AgentBundleDropDir); + + if (!updatedAgentInfo.isEmpty()) { + // If Map is not empty, we'll handle the data otherwise we do nothing + + Agent agent = getAgent(aid); + String updatedVersion = (String) updatedAgentInfo.get(AgentUpgrade_result.VERSION); + + if (!agent.getVersion().equals(updatedVersion) && updatedVersion != null) { + // Only update if different + agent.setVersion(updatedVersion); + } + } } /** Modified: trunk/tools/agentpork/etc/agent.properties =================================================================== --- trunk/tools/agentpork/etc/agent.properties 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/tools/agentpork/etc/agent.properties 2009-07-27 21:11:49 UTC (rev 13542) @@ -61,6 +61,9 @@ agent.pdkLibDir=./pdk/lib agent.pdkPluginDir=./pdk/plugins +## Agent Product Jar - Needed for upgrade process +agent.hqProductJar=./pdk/lib/hq-product.jar + ## ## Auto-inventory options ## Modified: trunk/ui_plugins/health/app/HealthController.groovy =================================================================== --- trunk/ui_plugins/health/app/HealthController.groovy 2009-07-27 08:16:25 UTC (rev 13541) +++ trunk/ui_plugins/health/app/HealthController.groovy 2009-07-27 21:11:49 UTC (rev 13542) @@ -64,7 +64,7 @@ label: {it.agent.port}], [field: AgentSortField.VERSION, width: '10%', - label: {it.version}], + label: {it.agent.version}], [field: [getValue: {localeBundle.build}, description:'build', sortable:false], width: '5%', |