You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rn...@apache.org on 2016/04/13 17:48:26 UTC

ambari git commit: AMBARI-15861. NullPointerException in cluster deployment due to LogSearch PropertyProvider error. (rnettleton)

Repository: ambari
Updated Branches:
  refs/heads/trunk e57576bf1 -> 4938e8479


AMBARI-15861. NullPointerException in cluster deployment due to LogSearch PropertyProvider error. (rnettleton)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4938e847
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4938e847
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4938e847

Branch: refs/heads/trunk
Commit: 4938e84794fae9b84acbd732199c7c4cdbd088dc
Parents: e57576b
Author: Bob Nettleton <rn...@hortonworks.com>
Authored: Wed Apr 13 10:19:07 2016 -0400
Committer: Bob Nettleton <rn...@hortonworks.com>
Committed: Wed Apr 13 11:43:14 2016 -0400

----------------------------------------------------------------------
 .../logging/LoggingSearchPropertyProvider.java  | 49 ++++++-----
 .../LoggingSearchPropertyProviderTest.java      | 89 ++++++++++++++++++++
 2 files changed, 115 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4938e847/ambari-server/src/main/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProvider.java
index 6b4a8a4..2d2ef18 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProvider.java
@@ -93,30 +93,33 @@ public class LoggingSearchPropertyProvider implements PropertyProvider {
         LoggingRequestHelper requestHelper =
           requestHelperFactory.getHelper(controller, clusterName);
 
-        // send query to obtain logging metadata
-        Set<String> logFileNames =
-          requestHelper.sendGetLogFileNamesRequest(mappedComponentNameForLogSearch, hostName);
-
-        if ((logFileNames != null) && (!logFileNames.isEmpty())) {
-          loggingInfo.setComponentName(mappedComponentNameForLogSearch);
-          List<LogFileDefinitionInfo> listOfFileDefinitions =
-            new LinkedList<LogFileDefinitionInfo>();
-
-          for (String fileName : logFileNames) {
-            // generate the URIs that can be used by clients to obtain search results/tail log results/etc
-            final String searchEngineURI = controller.getAmbariServerURI(getFullPathToSearchEngine(clusterName));
-            final String logFileTailURI = createLogFileTailURI(searchEngineURI, mappedComponentNameForLogSearch, hostName);
-            // all log files are assumed to be service types for now
-            listOfFileDefinitions.add(new LogFileDefinitionInfo(fileName, LogFileType.SERVICE, searchEngineURI, logFileTailURI));
+        // if LogSearch service is available
+        if (requestHelper != null) {
+          // send query to obtain logging metadata
+          Set<String> logFileNames =
+            requestHelper.sendGetLogFileNamesRequest(mappedComponentNameForLogSearch, hostName);
+
+          if ((logFileNames != null) && (!logFileNames.isEmpty())) {
+            loggingInfo.setComponentName(mappedComponentNameForLogSearch);
+            List<LogFileDefinitionInfo> listOfFileDefinitions =
+              new LinkedList<LogFileDefinitionInfo>();
+
+            for (String fileName : logFileNames) {
+              // generate the URIs that can be used by clients to obtain search results/tail log results/etc
+              final String searchEngineURI = controller.getAmbariServerURI(getFullPathToSearchEngine(clusterName));
+              final String logFileTailURI = createLogFileTailURI(searchEngineURI, mappedComponentNameForLogSearch, hostName);
+              // all log files are assumed to be service types for now
+              listOfFileDefinitions.add(new LogFileDefinitionInfo(fileName, LogFileType.SERVICE, searchEngineURI, logFileTailURI));
+            }
+
+            loggingInfo.setListOfLogFileDefinitions(listOfFileDefinitions);
+
+            LOG.info("Adding logging info for component name = " + componentName + " on host name = " + hostName);
+            // add the logging metadata for this host component
+            resource.setProperty("logging", loggingInfo);
+          } else {
+            LOG.error("Error occurred while making request to LogSearch service, unable to populate logging properties on this resource");
           }
-
-          loggingInfo.setListOfLogFileDefinitions(listOfFileDefinitions);
-
-          LOG.info("Adding logging info for component name = " + componentName + " on host name = " + hostName);
-          // add the logging metadata for this host component
-          resource.setProperty("logging", loggingInfo);
-        } else {
-          LOG.error("Error occurred while making request to LogSearch service, unable to populate logging properties on this resource");
         }
       }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/4938e847/ambari-server/src/test/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProviderTest.java
index 19c0756..b360a49 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/logging/LoggingSearchPropertyProviderTest.java
@@ -167,4 +167,93 @@ public class LoggingSearchPropertyProviderTest {
     mockSupport.verifyAll();
   }
 
+  @Test
+  public void testCheckWhenLogSearchNotAvailable() throws Exception {
+
+    final String expectedStackName = "HDP";
+    final String expectedStackVersion = "2.4";
+    final String expectedComponentName = "NAMENODE";
+    final String expectedServiceName = "HDFS";
+    final String expectedLogSearchComponentName = "hdfs_namenode";
+
+    EasyMockSupport mockSupport = new EasyMockSupport();
+
+    Resource resourceMock =
+      mockSupport.createMock(Resource.class);
+    expect(resourceMock.getPropertyValue(PropertyHelper.getPropertyId("HostRoles", "component_name"))).andReturn(expectedComponentName).atLeastOnce();
+    expect(resourceMock.getPropertyValue(PropertyHelper.getPropertyId("HostRoles", "host_name"))).andReturn("c6401.ambari.apache.org").atLeastOnce();
+    expect(resourceMock.getPropertyValue(PropertyHelper.getPropertyId("HostRoles", "cluster_name"))).andReturn("clusterone").atLeastOnce();
+
+    LoggingRequestHelperFactory helperFactoryMock =
+      mockSupport.createMock(LoggingRequestHelperFactory.class);
+
+    Request requestMock =
+      mockSupport.createMock(Request.class);
+
+    Predicate predicateMock =
+      mockSupport.createMock(Predicate.class);
+
+    LoggingSearchPropertyProvider.ControllerFactory factoryMock =
+      mockSupport.createMock(LoggingSearchPropertyProvider.ControllerFactory.class);
+
+    AmbariManagementController controllerMock =
+      mockSupport.createMock(AmbariManagementController.class);
+
+    AmbariMetaInfo metaInfoMock =
+      mockSupport.createMock(AmbariMetaInfo.class);
+
+    Clusters clustersMock =
+      mockSupport.createMock(Clusters.class);
+
+    Cluster clusterMock =
+      mockSupport.createMock(Cluster.class);
+
+    StackId stackIdMock =
+      mockSupport.createMock(StackId.class);
+
+    ComponentInfo componentInfoMock =
+      mockSupport.createMock(ComponentInfo.class);
+
+    LogDefinition logDefinitionMock =
+      mockSupport.createMock(LogDefinition.class);
+
+    expect(factoryMock.getAmbariManagementController()).andReturn(controllerMock);
+    expect(controllerMock.getAmbariMetaInfo()).andReturn(metaInfoMock).atLeastOnce();
+    expect(controllerMock.getClusters()).andReturn(clustersMock).atLeastOnce();
+    expect(clustersMock.getCluster("clusterone")).andReturn(clusterMock).atLeastOnce();
+    expect(stackIdMock.getStackName()).andReturn(expectedStackName).atLeastOnce();
+    expect(stackIdMock.getStackVersion()).andReturn(expectedStackVersion).atLeastOnce();
+    expect(clusterMock.getCurrentStackVersion()).andReturn(stackIdMock).atLeastOnce();
+
+    expect(metaInfoMock.getComponentToService(expectedStackName, expectedStackVersion, expectedComponentName)).andReturn(expectedServiceName).atLeastOnce();
+    expect(metaInfoMock.getComponent(expectedStackName, expectedStackVersion, expectedServiceName, expectedComponentName)).andReturn(componentInfoMock).atLeastOnce();
+
+    // simulate the case when LogSearch is not deployed, or is not available for some reason
+    expect(helperFactoryMock.getHelper(controllerMock, "clusterone")).andReturn(null).atLeastOnce();
+
+    expect(componentInfoMock.getLogs()).andReturn(Collections.singletonList(logDefinitionMock)).atLeastOnce();
+    expect(logDefinitionMock.getLogId()).andReturn(expectedLogSearchComponentName).atLeastOnce();
+
+    mockSupport.replayAll();
+
+    PropertyProvider propertyProvider =
+      new LoggingSearchPropertyProvider(helperFactoryMock, factoryMock);
+
+
+    // execute the populate resources method, verify that no exceptions occur, due to
+    // the LogSearch helper not being available
+    Set<Resource> returnedResources =
+      propertyProvider.populateResources(Collections.singleton(resourceMock), requestMock, predicateMock);
+
+    // verify that the set of resources has not changed in size
+    assertEquals("Returned resource set was of an incorrect size",
+      1, returnedResources.size());
+
+    // verify that the single resource passed in was returned
+    assertSame("Returned resource was not the expected instance.",
+      resourceMock, returnedResources.iterator().next());
+
+    mockSupport.verifyAll();
+  }
+
 }