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 <[email protected]>
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);