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 <[email protected]> Authored: Wed Apr 13 10:19:07 2016 -0400 Committer: Bob Nettleton <[email protected]> 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(); + } + }
