This is an automated email from the ASF dual-hosted git repository. ncole pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new 0c8286a [AMBARI-25036] Update Stack Classloader Loading Pattern (#2716) 0c8286a is described below commit 0c8286a5d39c95022c1857090b175efb5e81098a Author: ncole <nc...@hortonworks.com> AuthorDate: Tue Dec 11 16:35:22 2018 -0500 [AMBARI-25036] Update Stack Classloader Loading Pattern (#2716) --- .../ambari/server/checks/UpgradeCheckRegistry.java | 7 +-- .../upgrades/PluginUpgradeServerAction.java | 6 +-- .../stack/upgrade/orchestrate/UpgradeContext.java | 5 +- .../org/apache/ambari/server/state/StackInfo.java | 53 ++++++++++++++++++---- .../PreUpgradeCheckResourceProviderTest.java | 6 +-- .../upgrades/PluginUpgradeServerActionTest.java | 5 +- 6 files changed, 52 insertions(+), 30 deletions(-) diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java index b529f28..2e36f36 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java @@ -178,7 +178,6 @@ public class UpgradeCheckRegistry { * @param pluginChecks * the collection to popoulate. */ - @SuppressWarnings("unchecked") private void loadPluginUpgradeChecksFromStack(UpgradePack upgradePack, PluginUpgradeChecks pluginChecks) throws AmbariException { List<String> pluginCheckClassNames = upgradePack.getPrerequisiteChecks(); @@ -189,13 +188,11 @@ public class UpgradeCheckRegistry { if (null != classLoader) { for (String pluginCheckClassName : pluginCheckClassNames) { try { - Class<? extends UpgradeCheck> upgradeCheckClass = (Class<? extends UpgradeCheck>) classLoader.loadClass( - pluginCheckClassName); + UpgradeCheck upgradeCheck = stackInfo.getLibraryInstance(m_injector, pluginCheckClassName); - UpgradeCheck upgradeCheck = m_injector.getInstance(upgradeCheckClass); pluginChecks.m_loadedChecks.add(upgradeCheck); - LOG.info("Registered pre-upgrade check {} for stack {}", upgradeCheckClass, ownerStackId); + LOG.info("Registered pre-upgrade check {} for stack {}", pluginCheckClassName, ownerStackId); } catch (Exception exception) { LOG.error("Unable to load the upgrade check {}", pluginCheckClassName, exception); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java index 154352e..7be983d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java @@ -83,11 +83,7 @@ public class PluginUpgradeServerAction extends AbstractUpgradeServerAction { final String pluginClassName = getActionClassName(); try { - @SuppressWarnings("unchecked") - Class<? extends UpgradeAction> upgradeActionClass = (Class<? extends UpgradeAction>) pluginClassLoader.loadClass( - pluginClassName); - - upgradeAction = upgradeActionClass.newInstance(); + upgradeAction = stackInfo.getLibraryInstance(pluginClassName); } catch (Exception exception) { LOG.error("Unable to load the upgrade action {}", pluginClassName, exception); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java index 56094c0..546ec30 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java @@ -1545,12 +1545,9 @@ public class UpgradeContext { try { StackInfo stack = metaInfo.getStack(stackId); - ClassLoader cl = stack.getLibraryClassLoader(); - Class<?> clazz = (null == cl) ? Class.forName(className) : - cl.loadClass(className); + return stack.getLibraryInstance(className); - return (OrchestrationOptions) clazz.newInstance(); } catch (Exception e) { LOG.error(String.format("Could not load orchestration options for stack {}: {}", stackId, e.getMessage())); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java index b4911cb..99b2d3b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java @@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import com.google.common.io.Files; +import com.google.inject.Injector; public class StackInfo implements Comparable<StackInfo>, Validable { private static final Logger LOG = LoggerFactory.getLogger(StackInfo.class); @@ -654,17 +655,8 @@ public class StackInfo implements Comparable<StackInfo>, Validable { public StackReleaseVersion getReleaseVersion() { if (StringUtils.isNotEmpty(releaseVersionClass)) { - try { - Class<?> clazz = null; - - if (null != libraryClassLoader) { - clazz = libraryClassLoader.loadClass(releaseVersionClass); - } else { - clazz = Class.forName(releaseVersionClass); - } - - return (StackReleaseVersion) clazz.newInstance(); + return getLibraryInstance(releaseVersionClass); } catch (Exception e) { LOG.error("Could not create stack release instance. Using default. {}", e.getMessage()); return new DefaultStackVersion(); @@ -695,4 +687,45 @@ public class StackInfo implements Comparable<StackInfo>, Validable { public void setLibraryClassLoader(ClassLoader libraryClassLoader) { this.libraryClassLoader = libraryClassLoader; } + + /** + * Loads an instance of the class from the stack classloader, if available. + * + * @param className + * the name of the class to get an instance + * @return + * the instance of the class + * @throws Exception + * when the class cannot be loaded or instantiated + */ + public <T> T getLibraryInstance(String className) throws Exception { + return getLibraryInstance(null, className); + } + + /** + * Loads an instance of the class from the stack classloader, if available. + * + * @param injector + * the injector to use, or {@code null} to invoke the default, no-arg + * constructor + * @param className + * the name of the class to get an instance + * @return + * the instance of the class + * @throws Exception + * when the class cannot be loaded or instantiated + */ + @SuppressWarnings("unchecked") + public <T> T getLibraryInstance(Injector injector, String className) throws Exception { + Class<? extends T> clazz; + + if (null != libraryClassLoader) { + clazz = (Class<? extends T>) libraryClassLoader.loadClass(className); + } else { + clazz = (Class<? extends T>) Class.forName(className); + } + + return (null == injector) ? clazz.newInstance() : injector.getInstance(clazz); + } + } diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java index feff55a..2e0c5d6 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java @@ -102,6 +102,7 @@ import org.apache.ambari.spi.upgrade.UpgradeCheckStatus; import org.apache.ambari.spi.upgrade.UpgradeCheckType; import org.apache.ambari.spi.upgrade.UpgradeType; import org.apache.commons.lang3.StringUtils; +import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.Assert; import org.junit.Test; @@ -214,12 +215,11 @@ public class PreUpgradeCheckResourceProviderTest extends EasyMockSupport { expect(serviceInfo.getChecksFolder()).andReturn(new File(checks)); ClassLoader classLoader = createNiceMock(ClassLoader.class); - Class clazz = SampleServiceCheck.class; - expect(classLoader.loadClass(TEST_SERVICE_CHECK_CLASS_NAME)).andReturn(clazz).atLeastOnce(); - StackInfo stackInfo = createNiceMock(StackInfo.class); expect(ambariMetaInfo.getStack(targetStackId)).andReturn(stackInfo).atLeastOnce(); expect(stackInfo.getLibraryClassLoader()).andReturn(classLoader).atLeastOnce(); + expect(stackInfo.getLibraryInstance(EasyMock.anyObject(), EasyMock.eq(TEST_SERVICE_CHECK_CLASS_NAME))) + .andReturn(new SampleServiceCheck()).atLeastOnce(); // replay replayAll(); diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java index cd88ff9..6e4b17b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java @@ -49,6 +49,7 @@ import org.apache.ambari.spi.upgrade.UpgradeAction; import org.apache.ambari.spi.upgrade.UpgradeActionOperations; import org.apache.ambari.spi.upgrade.UpgradeActionOperations.ConfigurationChanges; import org.apache.ambari.spi.upgrade.UpgradeInformation; +import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.After; import org.junit.Before; @@ -128,13 +129,11 @@ public class PluginUpgradeServerActionTest extends EasyMockSupport { expect(m_mockUpgradePack.getOwnerStackId()).andReturn(m_stackId).atLeastOnce(); expect(m_mockMetaInfo.getStack(m_stackId)).andReturn(m_mockStackInfo).atLeastOnce(); expect(m_mockStackInfo.getLibraryClassLoader()).andReturn(m_mockClassLoader).atLeastOnce(); + expect(m_mockStackInfo.getLibraryInstance(EasyMock.anyString())).andReturn(new MockUpgradeAction()).atLeastOnce(); expect(m_action.getClusters()).andReturn(m_mockClusters).anyTimes(); expect(m_action.getUpgradeContext(m_mockCluster)).andReturn(m_mockUpgradeContext).once(); - Class clazz = MockUpgradeAction.class; - expect(m_mockClassLoader.loadClass(CLASS_NAME)).andReturn(clazz).atLeastOnce(); - m_action.agentConfigsHolder = m_mockAgentConfigsHolder; m_commandParams.put("clusterName", CLUSTER_NAME);