You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2017/03/02 15:58:21 UTC
ambari git commit: AMBARI-20262 - Startup Annotation Scanning Takes
Too Long (jonathanhurley)
Repository: ambari
Updated Branches:
refs/heads/trunk 453a594f0 -> e1e28c6be
AMBARI-20262 - Startup Annotation Scanning Takes Too Long (jonathanhurley)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e1e28c6b
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e1e28c6b
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e1e28c6b
Branch: refs/heads/trunk
Commit: e1e28c6beb474a0a66a478c50d95889206929c20
Parents: 453a594
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Wed Mar 1 15:50:12 2017 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Thu Mar 2 10:58:13 2017 -0500
----------------------------------------------------------------------
.../ambari/server/audit/AuditLoggerModule.java | 13 ++-
.../server/cleanup/ClasspathScannerUtils.java | 19 +++--
.../ambari/server/cleanup/CleanupModule.java | 13 ++-
.../server/controller/ControllerModule.java | 89 +++++++++++---------
.../UpgradeResourceProviderHDP22Test.java | 34 ++------
.../internal/UpgradeResourceProviderTest.java | 26 ++----
.../internal/WidgetResourceProviderTest.java | 27 +++---
.../server/orm/InMemoryDefaultTestModule.java | 8 +-
8 files changed, 105 insertions(+), 124 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java
index d8b8466..b325dcf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java
@@ -27,6 +27,8 @@ import org.apache.ambari.server.audit.request.RequestAuditLogger;
import org.apache.ambari.server.audit.request.RequestAuditLoggerImpl;
import org.apache.ambari.server.audit.request.eventcreator.RequestAuditEventCreator;
import org.apache.ambari.server.cleanup.ClasspathScannerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
@@ -34,14 +36,15 @@ import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
public class AuditLoggerModule extends AbstractModule {
+ private static final Logger LOG = LoggerFactory.getLogger(AuditLoggerModule.class);
/**
* Selectors identifying objects to be bound.
*
* @return a list with interface and annotation types
*/
- protected List<Class> getSelectors() {
- List<Class> selectorList = new ArrayList<>();
+ protected List<Class<?>> getSelectors() {
+ List<Class<?>> selectorList = new ArrayList<>();
selectorList.add(RequestAuditEventCreator.class);
return selectorList;
}
@@ -51,7 +54,7 @@ public class AuditLoggerModule extends AbstractModule {
*
* @return a list with types to be left out from dynamic bindings
*/
- protected List<Class> getExclusions() {
+ protected List<Class<?>> getExclusions() {
return Collections.emptyList();
}
@@ -73,8 +76,10 @@ public class AuditLoggerModule extends AbstractModule {
// binding for audit event creators
Multibinder<RequestAuditEventCreator> multiBinder = Multibinder.newSetBinder(binder(), RequestAuditEventCreator.class);
- Set<Class> bindingSet = ClasspathScannerUtils.findOnClassPath(getPackageToScan(), getExclusions(), getSelectors());
+ Set<Class<?>> bindingSet = ClasspathScannerUtils.findOnClassPath(getPackageToScan(), getExclusions(), getSelectors());
+
for (Class clazz : bindingSet) {
+ LOG.info("Binding audit event creator {}", clazz);
multiBinder.addBinding().to(clazz).in(Scopes.SINGLETON);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/ClasspathScannerUtils.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/cleanup/ClasspathScannerUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/ClasspathScannerUtils.java
index 01487f0..a1a42bc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/cleanup/ClasspathScannerUtils.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/ClasspathScannerUtils.java
@@ -20,7 +20,7 @@ package org.apache.ambari.server.cleanup;
import java.io.IOException;
import java.lang.annotation.Annotation;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -45,15 +45,16 @@ public class ClasspathScannerUtils {
* @param selectors a list with annotation and interface classes that identify classes to be found (lookup criteria)
* @return a list of classes from the classpath that match the lookup criteria
*/
- public static Set<Class> findOnClassPath(String packageName, List<Class> exclusions, List<Class> selectors) {
+ public static Set<Class<?>> findOnClassPath(String packageName, List<Class<?>> exclusions,
+ List<Class<?>> selectors) {
- Set<Class> bindingSet = new HashSet<>();
+ Set<Class<?>> bindingSet = new LinkedHashSet<>();
try {
ClassPath classpath = ClassPath.from(ClasspathScannerUtils.class.getClassLoader());
LOGGER.info("Checking package [{}] for binding candidates.", packageName);
for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClassesRecursive(packageName)) {
- Class candidate = classInfo.load();
+ Class<?> candidate = classInfo.load();
if (exclusions.contains(candidate)) {
LOGGER.debug("Candidate [{}] is excluded excluded.", candidate);
@@ -61,7 +62,7 @@ public class ClasspathScannerUtils {
}
if (isEligible(candidate, selectors)) {
- LOGGER.info("Found class [{}]", candidate);
+ LOGGER.debug("Found class [{}]", candidate);
bindingSet.add(candidate);
} else {
LOGGER.debug("Candidate [{}] doesn't match.", candidate);
@@ -82,7 +83,7 @@ public class ClasspathScannerUtils {
* @param candidate the type to be checked
* @return true if the class matches, false otherwise
*/
- private static boolean isEligible(Class candidate, List<Class> selectors) {
+ private static boolean isEligible(Class<?> candidate, List<Class<?>> selectors) {
return checkSubClasses(candidate, selectors) || checkAnnotations(candidate, selectors);
}
@@ -92,11 +93,11 @@ public class ClasspathScannerUtils {
* @param candidate the type to be checked
* @return true if the candidate has annotations listed in the selection criteria, false otherwise
*/
- private static boolean checkAnnotations(Class candidate, List<Class> selectors) {
+ private static boolean checkAnnotations(Class<?> candidate, List<Class<?>> selectors) {
LOGGER.debug("Checking annotations for: [{}]", candidate);
boolean ret = false;
for (Annotation candidateAnn : candidate.getDeclaredAnnotations()) {
- if (selectors.contains(candidateAnn)) {
+ if (selectors.contains(candidateAnn.annotationType())) {
ret = true;
break;
}
@@ -110,7 +111,7 @@ public class ClasspathScannerUtils {
* @param candidate the type to be checked
* @return true if the candidate implements interfaces listed in the selection criteria, false otherwise
*/
- private static boolean checkSubClasses(Class candidate, List<Class> selectors) {
+ private static boolean checkSubClasses(Class<?> candidate, List<Class<?>> selectors) {
boolean ret = false;
LOGGER.debug("Checking interfaces for: [{}]", candidate);
List interfaces = ClassUtils.getAllInterfaces(candidate);
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/CleanupModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/cleanup/CleanupModule.java b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/CleanupModule.java
index d2a7583..da90cde 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/cleanup/CleanupModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/cleanup/CleanupModule.java
@@ -23,6 +23,8 @@ import java.util.List;
import java.util.Set;
import org.apache.ambari.server.orm.dao.Cleanable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
@@ -32,14 +34,15 @@ import com.google.inject.multibindings.Multibinder;
* Configuration module for the cleanup framework.
*/
public class CleanupModule extends AbstractModule {
+ private static final Logger LOG = LoggerFactory.getLogger(CleanupModule.class);
/**
* Selectors identifying objects to be bound.
*
* @return a list with interface and annotation types
*/
- protected List<Class> getSelectors() {
- List<Class> selectorList = new ArrayList<>();
+ protected List<Class<?>> getSelectors() {
+ List<Class<?>> selectorList = new ArrayList<>();
selectorList.add(Cleanable.class);
return selectorList;
}
@@ -49,7 +52,7 @@ public class CleanupModule extends AbstractModule {
*
* @return a list with types to be left out from dynamic bindings
*/
- protected List<Class> getExclusions() {
+ protected List<Class<?>> getExclusions() {
return Collections.emptyList();
}
@@ -67,10 +70,12 @@ public class CleanupModule extends AbstractModule {
protected void configure() {
Multibinder<Cleanable> multiBinder = Multibinder.newSetBinder(binder(), Cleanable.class);
- Set<Class> bindingSet = ClasspathScannerUtils.findOnClassPath(getPackageToScan(), getExclusions(), getSelectors());
+ Set<Class<?>> bindingSet = ClasspathScannerUtils.findOnClassPath(getPackageToScan(), getExclusions(), getSelectors());
for (Class clazz : bindingSet) {
+ LOG.info("Binding cleaner {}", clazz);
multiBinder.addBinding().to(clazz).in(Scopes.SINGLETON);
}
+
bind(CleanupServiceImpl.class).in(Scopes.SINGLETON);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index 8646e51..482d602 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -34,10 +34,9 @@ import static org.eclipse.persistence.config.PersistenceUnitProperties.NON_JTA_D
import static org.eclipse.persistence.config.PersistenceUnitProperties.THROW_EXCEPTIONS;
import java.beans.PropertyVetoException;
-import java.lang.annotation.Annotation;
import java.security.SecureRandom;
import java.text.MessageFormat;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
@@ -57,6 +56,7 @@ import org.apache.ambari.server.actionmanager.StageFactoryImpl;
import org.apache.ambari.server.checks.AbstractCheckDescriptor;
import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper;
import org.apache.ambari.server.checks.UpgradeCheckRegistry;
+import org.apache.ambari.server.cleanup.ClasspathScannerUtils;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType;
import org.apache.ambari.server.configuration.Configuration.DatabaseType;
@@ -91,6 +91,7 @@ import org.apache.ambari.server.metrics.system.MetricsService;
import org.apache.ambari.server.metrics.system.impl.MetricsServiceImpl;
import org.apache.ambari.server.notifications.DispatchFactory;
import org.apache.ambari.server.notifications.NotificationDispatcher;
+import org.apache.ambari.server.notifications.dispatchers.AlertScriptDispatcher;
import org.apache.ambari.server.notifications.dispatchers.AmbariSNMPDispatcher;
import org.apache.ambari.server.notifications.dispatchers.SNMPDispatcher;
import org.apache.ambari.server.orm.DBAccessor;
@@ -153,13 +154,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
-import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.StandardPasswordEncoder;
import org.springframework.util.ClassUtils;
import org.springframework.web.filter.DelegatingFilterProxy;
+import com.google.common.reflect.ClassPath;
import com.google.common.util.concurrent.ServiceManager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -503,50 +504,46 @@ public class ControllerModule extends AbstractModule {
* A second example of where this is needed is when classes require static
* members that are available via injection.
* <p/>
- * If {@code beanDefinitions} is empty or null this will scan
+ * Although Spring has a nicer API for performing this search, it's dreadfully
+ * slow on annotation processing. This class will use
+ * {@link ClasspathScannerUtils} which in turn uses {@link ClassPath} to
+ * perform the scan.
+ * <p/>
+ * If {@code matchedClasses} is null this will scan
* {@code org.apache.ambari.server} (currently) for any {@link EagerSingleton}
* or {@link StaticallyInject} or {@link AmbariService} instances.
*
- * @param beanDefinitions the set of bean definitions. If it is empty or
- * {@code null} scan will occur.
- * @return the set of bean definitions that was found during scan if
- * {@code beanDefinitions} was null or empty. Else original
- * {@code beanDefinitions} will be returned.
+ * @param matchedClasses
+ * the set of previously found classes, or {@code null} to invoke
+ * scanning.
+ * @return the set of classes that was found.
*/
- // Method is protected and returns a set of bean definitions for testing convenience.
@SuppressWarnings("unchecked")
- protected Set<BeanDefinition> bindByAnnotation(Set<BeanDefinition> beanDefinitions) {
- List<Class<? extends Annotation>> classes = Arrays.asList(
- EagerSingleton.class, StaticallyInject.class, AmbariService.class);
-
- if (null == beanDefinitions || beanDefinitions.size() == 0) {
- ClassPathScanningCandidateComponentProvider scanner =
- new ClassPathScanningCandidateComponentProvider(false);
-
- // match only singletons that are eager listeners
- for (Class<? extends Annotation> cls : classes) {
- scanner.addIncludeFilter(new AnnotationTypeFilter(cls));
+ protected Set<Class<?>> bindByAnnotation(Set<Class<?>> matchedClasses) {
+ // only search if necessary
+ if (null == matchedClasses) {
+ List<Class<?>> classes = new ArrayList<>();
+ classes.add(EagerSingleton.class);
+ classes.add(StaticallyInject.class);
+ classes.add(AmbariService.class);
+
+ LOG.info("Searching package {} for annotations matching {}", AMBARI_PACKAGE, classes);
+
+ matchedClasses = ClasspathScannerUtils.findOnClassPath(AMBARI_PACKAGE,
+ new ArrayList<Class<?>>(), classes);
+
+ if (null == matchedClasses || matchedClasses.size() == 0) {
+ LOG.warn("No instances of {} found to register", classes);
+ return matchedClasses;
}
-
- beanDefinitions = scanner.findCandidateComponents(AMBARI_PACKAGE);
- }
-
- if (null == beanDefinitions || beanDefinitions.size() == 0) {
- LOG.warn("No instances of {} found to register", classes);
- return beanDefinitions;
}
- Set<com.google.common.util.concurrent.Service> services =
- new HashSet<com.google.common.util.concurrent.Service>();
-
- for (BeanDefinition beanDefinition : beanDefinitions) {
- String className = beanDefinition.getBeanClassName();
- Class<?> clazz = ClassUtils.resolveClassName(className,
- ClassUtils.getDefaultClassLoader());
+ Set<com.google.common.util.concurrent.Service> services = new HashSet<>();
+ for (Class<?> clazz : matchedClasses) {
if (null != clazz.getAnnotation(EagerSingleton.class)) {
bind(clazz).asEagerSingleton();
- LOG.debug("Binding singleton {} eagerly", clazz);
+ LOG.debug("Eagerly binding singleton {}", clazz);
}
if (null != clazz.getAnnotation(StaticallyInject.class)) {
@@ -562,7 +559,7 @@ public class ControllerModule extends AbstractModule {
"Unable to register service {0} because it is not a Service which can be scheduled",
clazz);
- LOG.warn(message);
+ LOG.error(message);
throw new RuntimeException(message);
}
@@ -572,7 +569,7 @@ public class ControllerModule extends AbstractModule {
service = (com.google.common.util.concurrent.Service) clazz.newInstance();
bind((Class<com.google.common.util.concurrent.Service>) clazz).toInstance(service);
services.add(service);
- LOG.debug("Registering service {} ", clazz);
+ LOG.info("Registering service {} ", clazz);
} catch (Exception exception) {
LOG.error("Unable to register {} as a service", clazz, exception);
throw new RuntimeException(exception);
@@ -583,7 +580,7 @@ public class ControllerModule extends AbstractModule {
ServiceManager manager = new ServiceManager(services);
bind(ServiceManager.class).toInstance(manager);
- return beanDefinitions;
+ return matchedClasses;
}
/**
@@ -599,6 +596,10 @@ public class ControllerModule extends AbstractModule {
bind(DispatchFactory.class).toInstance(dispatchFactory);
if (null == beanDefinitions || beanDefinitions.isEmpty()) {
+ String packageName = AlertScriptDispatcher.class.getPackage().getName();
+ LOG.info("Searching package {} for dispatchers matching {}", packageName,
+ NotificationDispatcher.class);
+
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(false);
@@ -608,7 +609,7 @@ public class ControllerModule extends AbstractModule {
scanner.addIncludeFilter(filter);
- beanDefinitions = scanner.findCandidateComponents("org.apache.ambari.server.notifications.dispatchers");
+ beanDefinitions = scanner.findCandidateComponents(packageName);
}
// no dispatchers is a problem
@@ -659,13 +660,17 @@ public class ControllerModule extends AbstractModule {
bind(UpgradeCheckRegistry.class).toInstance(registry);
if (null == beanDefinitions || beanDefinitions.isEmpty()) {
+ String packageName = AbstractCheckDescriptor.class.getPackage().getName();
+ LOG.info("Searching package {} for classes matching {}", packageName,
+ AbstractCheckDescriptor.class);
+
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
// match all implementations of the base check class
AssignableTypeFilter filter = new AssignableTypeFilter(AbstractCheckDescriptor.class);
scanner.addIncludeFilter(filter);
- beanDefinitions = scanner.findCandidateComponents(AbstractCheckDescriptor.class.getPackage().getName());
+ beanDefinitions = scanner.findCandidateComponents(packageName);
}
// no dispatchers is a problem
@@ -692,7 +697,7 @@ public class ControllerModule extends AbstractModule {
// log the order of the pre-upgrade checks
List<AbstractCheckDescriptor> upgradeChecks = registry.getUpgradeChecks();
for (AbstractCheckDescriptor upgradeCheck : upgradeChecks) {
- LOG.debug("Registered pre-upgrade check {}", upgradeCheck.getClass());
+ LOG.info("Registered pre-upgrade check {}", upgradeCheck.getClass());
}
return beanDefinitions;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
index 40c7e50..36889b2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
@@ -17,19 +17,14 @@
*/
package org.apache.ambari.server.controller.internal;
-import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.Collections;
-import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -63,9 +58,7 @@ import org.apache.ambari.server.orm.entities.StackEntity;
import org.apache.ambari.server.orm.entities.UpgradeEntity;
import org.apache.ambari.server.orm.entities.UpgradeGroupEntity;
import org.apache.ambari.server.orm.entities.UpgradeItemEntity;
-import org.apache.ambari.server.security.authorization.AuthorizationHelper;
-import org.apache.ambari.server.security.authorization.ResourceType;
-import org.apache.ambari.server.security.authorization.RoleAuthorization;
+import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Config;
@@ -84,11 +77,7 @@ import org.apache.ambari.server.view.ViewRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.easymock.PowerMock;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.security.core.context.SecurityContextHolder;
import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson;
@@ -98,9 +87,6 @@ import com.google.inject.Injector;
/**
* UpgradeResourceDefinition tests.
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({AuthorizationHelper.class})
-@PowerMockIgnore({"javax.management.*", "javax.crypto.*"})
public class UpgradeResourceProviderHDP22Test {
private UpgradeDAO upgradeDao = null;
@@ -124,6 +110,9 @@ public class UpgradeResourceProviderHDP22Test {
@Before
public void before() throws Exception {
+ SecurityContextHolder.getContext().setAuthentication(
+ TestAuthenticationFactory.createAdministrator());
+
// create an injector which will inject the mocks
injector = Guice.createInjector(new InMemoryDefaultTestModule());
@@ -174,7 +163,7 @@ public class UpgradeResourceProviderHDP22Test {
clusters.addHost("h1");
Host host = clusters.getHost("h1");
- Map<String, String> hostAttributes = new HashMap<String, String>();
+ Map<String, String> hostAttributes = new HashMap<>();
hostAttributes.put("os_family", "redhat");
hostAttributes.put("os_release_version", "6.3");
host.setHostAttributes(hostAttributes);
@@ -197,13 +186,6 @@ public class UpgradeResourceProviderHDP22Test {
StageUtils.setTopologyManager(topologyManager);
StageUtils.setConfiguration(injector.getInstance(Configuration.class));
ActionManager.setTopologyManager(topologyManager);
-
-
- Method isAuthorizedMethod = AuthorizationHelper.class.getMethod("isAuthorized", ResourceType.class, Long.class, Set.class);
- PowerMock.mockStatic(AuthorizationHelper.class, isAuthorizedMethod);
- expect(AuthorizationHelper.isAuthorized(eq(ResourceType.CLUSTER), anyLong(),
- eq(EnumSet.of(RoleAuthorization.CLUSTER_UPGRADE_DOWNGRADE_STACK)))).andReturn(true).anyTimes();
- PowerMock.replay(AuthorizationHelper.class);
}
@After
@@ -241,7 +223,7 @@ public class UpgradeResourceProviderHDP22Test {
Config config = configFactory.createNew(cluster, "hive-site", configTagVersion1, configTagVersion1Properties, null);
cluster.addDesiredConfig("admin", Collections.singleton(config));
- Map<String, Object> requestProps = new HashMap<String, Object>();
+ Map<String, Object> requestProps = new HashMap<>();
requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.4.2");
requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
@@ -307,7 +289,7 @@ public class UpgradeResourceProviderHDP22Test {
// ensure that the latest tag is being used - this is absolutely required
// for upgrades
- Set<String> roleCommandsThatMustHaveRefresh = new HashSet<String>();
+ Set<String> roleCommandsThatMustHaveRefresh = new HashSet<>();
roleCommandsThatMustHaveRefresh.add("SERVICE_CHECK");
roleCommandsThatMustHaveRefresh.add("RESTART");
roleCommandsThatMustHaveRefresh.add("ACTIONEXECUTE");
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
index 4d609b4..62e55c4 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
@@ -17,9 +17,7 @@
*/
package org.apache.ambari.server.controller.internal;
-import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
@@ -29,11 +27,9 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -82,9 +78,7 @@ import org.apache.ambari.server.orm.entities.StageEntity;
import org.apache.ambari.server.orm.entities.UpgradeEntity;
import org.apache.ambari.server.orm.entities.UpgradeGroupEntity;
import org.apache.ambari.server.orm.entities.UpgradeItemEntity;
-import org.apache.ambari.server.security.authorization.AuthorizationHelper;
-import org.apache.ambari.server.security.authorization.ResourceType;
-import org.apache.ambari.server.security.authorization.RoleAuthorization;
+import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.serveraction.upgrades.AutoSkipFailedSummaryAction;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
@@ -113,11 +107,7 @@ import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.easymock.PowerMock;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.security.core.context.SecurityContextHolder;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
@@ -133,9 +123,6 @@ import com.google.inject.util.Modules;
/**
* UpgradeResourceDefinition tests.
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({AuthorizationHelper.class})
-@PowerMockIgnore({"javax.management.*", "javax.crypto.*"})
public class UpgradeResourceProviderTest {
private UpgradeDAO upgradeDao = null;
@@ -154,6 +141,9 @@ public class UpgradeResourceProviderTest {
@Before
public void before() throws Exception {
+ SecurityContextHolder.getContext().setAuthentication(
+ TestAuthenticationFactory.createAdministrator());
+
// setup the config helper for placeholder resolution
configHelper = EasyMock.createNiceMock(ConfigHelper.class);
@@ -265,12 +255,6 @@ public class UpgradeResourceProviderTest {
StageUtils.setConfiguration(injector.getInstance(Configuration.class));
ActionManager.setTopologyManager(topologyManager);
EasyMock.replay(injector.getInstance(AuditLogger.class));
-
- Method isAuthorizedMethod = AuthorizationHelper.class.getMethod("isAuthorized", ResourceType.class, Long.class, Set.class);
- PowerMock.mockStatic(AuthorizationHelper.class, isAuthorizedMethod);
- expect(AuthorizationHelper.isAuthorized(eq(ResourceType.CLUSTER), anyLong(),
- eq(EnumSet.of(RoleAuthorization.CLUSTER_UPGRADE_DOWNGRADE_STACK)))).andReturn(true).anyTimes();
- PowerMock.replay(AuthorizationHelper.class);
}
@After
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WidgetResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WidgetResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WidgetResourceProviderTest.java
index a4f6469..e0434c6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WidgetResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WidgetResourceProviderTest.java
@@ -46,6 +46,7 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.dao.WidgetDAO;
import org.apache.ambari.server.orm.entities.WidgetEntity;
+import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.encryption.CredentialStoreService;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
@@ -55,11 +56,7 @@ import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -72,9 +69,6 @@ import com.google.inject.util.Modules;
/**
* Widget tests
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest( {WidgetResourceProvider.class, SecurityContextHolder.class} )
-@PowerMockIgnore( {"javax.management.*"} )
public class WidgetResourceProviderTest {
private WidgetDAO dao = null;
@@ -82,6 +76,9 @@ public class WidgetResourceProviderTest {
@Before
public void before() {
+ SecurityContextHolder.getContext().setAuthentication(
+ TestAuthenticationFactory.createAdministrator());
+
dao = createStrictMock(WidgetDAO.class);
m_injector = Guice.createInjector(Modules.override(
@@ -230,7 +227,7 @@ public class WidgetResourceProviderTest {
WidgetResourceProvider provider = createProvider(amc);
- Map<String, Object> requestProps = new HashMap<String, Object>();
+ Map<String, Object> requestProps = new HashMap<>();
requestProps.put(WidgetResourceProvider.WIDGET_CLUSTER_NAME_PROPERTY_ID, "c1");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_NAME_PROPERTY_ID, "widget name");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_TYPE_PROPERTY_ID, "GAUGE");
@@ -285,7 +282,7 @@ public class WidgetResourceProviderTest {
replay(amc, clusters, cluster, dao);
- Map<String, Object> requestProps = new HashMap<String, Object>();
+ Map<String, Object> requestProps = new HashMap<>();
requestProps.put(WidgetResourceProvider.WIDGET_CLUSTER_NAME_PROPERTY_ID, "c1");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_NAME_PROPERTY_ID, "widget name");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_TYPE_PROPERTY_ID, "GAUGE");
@@ -329,7 +326,7 @@ public class WidgetResourceProviderTest {
expect(dao.merge((WidgetEntity) anyObject())).andReturn(entity).anyTimes();
replay(dao);
- requestProps = new HashMap<String, Object>();
+ requestProps = new HashMap<>();
requestProps.put(WidgetResourceProvider.WIDGET_ID_PROPERTY_ID, "1");
requestProps.put(WidgetResourceProvider.WIDGET_CLUSTER_NAME_PROPERTY_ID, "c1");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_NAME_PROPERTY_ID, "widget name2");
@@ -382,7 +379,7 @@ public class WidgetResourceProviderTest {
WidgetResourceProvider provider = createProvider(amc);
- Map<String, Object> requestProps = new HashMap<String, Object>();
+ Map<String, Object> requestProps = new HashMap<>();
requestProps.put(WidgetResourceProvider.WIDGET_CLUSTER_NAME_PROPERTY_ID, "c1");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_NAME_PROPERTY_ID, "widget name");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_TYPE_PROPERTY_ID, "GAUGE");
@@ -430,14 +427,15 @@ public class WidgetResourceProviderTest {
@Test
public void testScopePrivilegeCheck() throws Exception {
+ SecurityContextHolder.getContext().setAuthentication(
+ TestAuthenticationFactory.createServiceOperator());
+
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).atLeastOnce();
- WidgetResourceProvider widgetResourceProvider = PowerMock.createPartialMock(WidgetResourceProvider.class, "isScopeAllowedForUser");
- PowerMock.expectPrivate(widgetResourceProvider, "isScopeAllowedForUser", "CLUSTER").andReturn(false);
Capture<WidgetEntity> entityCapture = EasyMock.newCapture();
dao.create(capture(entityCapture));
@@ -446,7 +444,7 @@ public class WidgetResourceProviderTest {
replay(amc, clusters, cluster, dao);
PowerMock.replayAll();
- Map<String, Object> requestProps = new HashMap<String, Object>();
+ Map<String, Object> requestProps = new HashMap<>();
requestProps.put(WidgetResourceProvider.WIDGET_CLUSTER_NAME_PROPERTY_ID, "c1");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_NAME_PROPERTY_ID, "widget name");
requestProps.put(WidgetResourceProvider.WIDGET_WIDGET_TYPE_PROPERTY_ID, "GAUGE");
@@ -456,6 +454,7 @@ public class WidgetResourceProviderTest {
Collections.singleton(requestProps), null);
try {
+ WidgetResourceProvider widgetResourceProvider = createProvider(amc);
widgetResourceProvider.createResources(request);
} catch (AccessDeniedException ex) {
//Expected exception
http://git-wip-us.apache.org/repos/asf/ambari/blob/e1e28c6b/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
index 3090108..f231b60 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
@@ -50,7 +50,7 @@ public class InMemoryDefaultTestModule extends AbstractModule {
private static class BeanDefinitionsCachingTestControllerModule extends ControllerModule {
// Access should be synchronised to allow concurrent test runs.
- private static final AtomicReference<Set<BeanDefinition>> foundBeanDefinitions
+ private static final AtomicReference<Set<Class<?>>> matchedAnnotationClasses
= new AtomicReference<>(null);
private static final AtomicReference<Set<BeanDefinition>> foundNotificationBeanDefinitions
@@ -65,9 +65,9 @@ public class InMemoryDefaultTestModule extends AbstractModule {
}
@Override
- protected Set<BeanDefinition> bindByAnnotation(Set<BeanDefinition> beanDefinitions) {
- Set<BeanDefinition> newBeanDefinitions = super.bindByAnnotation(foundBeanDefinitions.get());
- foundBeanDefinitions.compareAndSet(null, Collections.unmodifiableSet(newBeanDefinitions));
+ protected Set<Class<?>> bindByAnnotation(Set<Class<?>> matchedClasses) {
+ Set<Class<?>> newMatchedClasses = super.bindByAnnotation(matchedAnnotationClasses.get());
+ matchedAnnotationClasses.compareAndSet(null, Collections.unmodifiableSet(newMatchedClasses));
return null;
}