Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 87BC0200D29 for ; Wed, 11 Oct 2017 10:38:44 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 85E1D1609E4; Wed, 11 Oct 2017 08:38:44 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 491B5160BE6 for ; Wed, 11 Oct 2017 10:38:42 +0200 (CEST) Received: (qmail 53104 invoked by uid 500); 11 Oct 2017 08:38:41 -0000 Mailing-List: contact commits-help@ambari.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ambari-dev@ambari.apache.org Delivered-To: mailing list commits@ambari.apache.org Received: (qmail 52655 invoked by uid 99); 11 Oct 2017 08:38:40 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 11 Oct 2017 08:38:40 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C6696F5A00; Wed, 11 Oct 2017 08:38:39 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mpapirkovskyy@apache.org To: commits@ambari.apache.org Date: Wed, 11 Oct 2017 08:38:41 -0000 Message-Id: In-Reply-To: <91e6b014763845d8bc775f5b26b81ccc@git.apache.org> References: <91e6b014763845d8bc775f5b26b81ccc@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [3/7] ambari git commit: AMBARI-22190. After merging trunk to branch-3.0-perf some parts of code are missing. (mpapirkovskyy) archived-at: Wed, 11 Oct 2017 08:38:44 -0000 http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java index 654067b..a1415703 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java @@ -31,7 +31,6 @@ import static org.easymock.EasyMock.verify; import java.io.File; import java.io.FileInputStream; -import java.lang.reflect.Field; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; @@ -68,6 +67,7 @@ import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.RequestStatus; import org.apache.ambari.server.controller.spi.Resource; +import org.apache.ambari.server.controller.spi.Resource.Type; import org.apache.ambari.server.controller.spi.ResourceProvider; import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.apache.ambari.server.controller.utilities.PropertyHelper; @@ -117,6 +117,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -124,9 +125,10 @@ import com.google.gson.JsonParser; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; -import com.google.inject.Provider; import com.google.inject.util.Modules; +import junit.framework.AssertionFailedError; + /** * ClusterStackVersionResourceProvider tests. @@ -144,6 +146,10 @@ public class ClusterStackVersionResourceProviderTest { private HostVersionDAO hostVersionDAO; private HostComponentStateDAO hostComponentStateDAO; + private Clusters clusters; + private ActionManager actionManager; + private AmbariManagementController managementController; + public static final String OS_JSON = "[\n" + " {\n" + " \"repositories\":[\n" + @@ -177,6 +183,10 @@ public class ClusterStackVersionResourceProviderTest { configuration = new Configuration(properties); stageFactory = createNiceMock(StageFactory.class); + clusters = createNiceMock(Clusters.class); + actionManager = createNiceMock(ActionManager.class); + managementController = createMock(AmbariManagementController.class); + // Initialize injector injector = Guice.createInjector(Modules.override(inMemoryModule).with(new MockModule())); injector.getInstance(GuiceJpaInitializer.class); @@ -206,10 +216,6 @@ public class ClusterStackVersionResourceProviderTest { } private void testCreateResources(Authentication authentication) throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); Map hostLevelParams = new HashMap<>(); StackId stackId = new StackId("HDP", "2.0.1"); @@ -256,28 +262,15 @@ public class ClusterStackVersionResourceProviderTest { expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes(); expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes(); // First host contains versionable components - final List schsH1 = new ArrayList(){{ - add(schDatanode); - add(schNamenode); - add(schAMS); - }}; + final List schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS); // Second host does not contain versionable components - final List schsH2 = new ArrayList(){{ - add(schAMS); - }}; - + final List schsH2 = Lists.newArrayList(schAMS); ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package(); hdfsPackage.setName("hdfs"); List packages = Collections.singletonList(hdfsPackage); - ActionManager actionManager = createNiceMock(ActionManager.class); - RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); - ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class); - ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class); - - AbstractControllerResourceProvider.init(resourceProviderFactory); Map> hostConfigTags = new HashMap<>(); expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags); @@ -288,12 +281,10 @@ public class ClusterStackVersionResourceProviderTest { expect(managementController.getActionManager()).andReturn(actionManager).anyTimes(); expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes(); expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class), - EasyMock.anyObject(), anyObject(String.class))). - andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services -// // that's why we don't send commands to it - - expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), - eq(managementController))).andReturn(csvResourceProvider).anyTimes(); + EasyMock.>anyObject(), anyObject(String.class))). + andReturn(packages).anyTimes(); + expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString())) + .andReturn(new HashMap>()).anyTimes(); expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster); expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn( @@ -355,18 +346,14 @@ public class ClusterStackVersionResourceProviderTest { StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class)); StageUtils.setConfiguration(injector.getInstance(Configuration.class)); + ResourceProvider provider = createProvider(managementController); + injector.injectMembers(provider); + // replay - replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider, + replay(managementController, response, clusters, cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager, executionCommand, executionCommandWrapper,stage, stageFactory); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - - injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates Set> propertySet = new LinkedHashSet<>(); @@ -616,10 +603,6 @@ public class ClusterStackVersionResourceProviderTest { } private void testCreateResourcesWithRepoDefinition(Authentication authentication) throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); StackId stackId = new StackId("HDP", "2.0.1"); @@ -704,7 +687,7 @@ public class ClusterStackVersionResourceProviderTest { RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class); - ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class); + ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class); AbstractControllerResourceProvider.init(resourceProviderFactory); @@ -723,6 +706,10 @@ public class ClusterStackVersionResourceProviderTest { expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), eq(managementController))).andReturn(csvResourceProvider).anyTimes(); + expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString())) + .andReturn(new HashMap>()).anyTimes(); + + expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster); expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn( hostsForCluster).anyTimes(); @@ -794,12 +781,7 @@ public class ClusterStackVersionResourceProviderTest { cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager, executionCommandWrapper,stage, stageFactory); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates @@ -857,10 +839,6 @@ public class ClusterStackVersionResourceProviderTest { String os_json = json.toString(); - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); StackId stackId = new StackId("HDP", "2.0.1"); @@ -944,10 +922,7 @@ public class ClusterStackVersionResourceProviderTest { ActionManager actionManager = createNiceMock(ActionManager.class); RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); - ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class); - ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class); - - AbstractControllerResourceProvider.init(resourceProviderFactory); + ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class); Map> hostConfigTags = new HashMap<>(); expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags); @@ -961,8 +936,8 @@ public class ClusterStackVersionResourceProviderTest { EasyMock.anyObject(), anyObject(String.class))). andReturn(packages).anyTimes(); // only one host has the versionable component - expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), - eq(managementController))).andReturn(csvResourceProvider).anyTimes(); + expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString())) + .andReturn(new HashMap>()).anyTimes(); expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster); expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn( @@ -990,11 +965,9 @@ public class ClusterStackVersionResourceProviderTest { expect(cluster.transitionHostsToInstalling(anyObject(RepositoryVersionEntity.class), anyObject(VersionDefinitionXml.class), eq(false))).andReturn(hostsNeedingInstallCommands).atLeastOnce(); -// ExecutionCommand executionCommand = createNiceMock(ExecutionCommand.class); ExecutionCommand executionCommand = new ExecutionCommand(); ExecutionCommandWrapper executionCommandWrapper = createNiceMock(ExecutionCommandWrapper.class); -// expect(executionCommand.getHostLevelParams()).andReturn(new HashMap()).atLeastOnce(); expect(executionCommandWrapper.getExecutionCommand()).andReturn(executionCommand).anyTimes(); Stage stage = createNiceMock(Stage.class); @@ -1029,16 +1002,11 @@ public class ClusterStackVersionResourceProviderTest { StageUtils.setConfiguration(injector.getInstance(Configuration.class)); // replay - replay(managementController, response, clusters, hdfsService, hbaseService, resourceProviderFactory, csvResourceProvider, + replay(managementController, response, clusters, hdfsService, hbaseService, csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager, executionCommandWrapper,stage, stageFactory); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates @@ -1094,10 +1062,6 @@ public class ClusterStackVersionResourceProviderTest { } private void testCreateResourcesMixed(Authentication authentication) throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); Map hostLevelParams = new HashMap<>(); StackId stackId = new StackId("HDP", "2.0.1"); @@ -1162,16 +1126,9 @@ public class ClusterStackVersionResourceProviderTest { expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes(); expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes(); // First host contains versionable components - final List schsH1 = new ArrayList(){{ - add(schDatanode); - add(schNamenode); - add(schAMS); - }}; + final List schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS); // Second host does not contain versionable components - final List schsH2 = new ArrayList(){{ - add(schAMS); - }}; - + final List schsH2 = Lists.newArrayList(schAMS); ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package(); hdfsPackage.setName("hdfs"); @@ -1180,10 +1137,6 @@ public class ClusterStackVersionResourceProviderTest { ActionManager actionManager = createNiceMock(ActionManager.class); RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); - ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class); - ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class); - - AbstractControllerResourceProvider.init(resourceProviderFactory); Map> hostConfigTags = new HashMap<>(); expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags); @@ -1194,12 +1147,11 @@ public class ClusterStackVersionResourceProviderTest { expect(managementController.getActionManager()).andReturn(actionManager).anyTimes(); expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes(); expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class), - EasyMock.anyObject(), anyObject(String.class))). - andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services -// // that's why we don't send commands to it + EasyMock.>anyObject(), anyObject(String.class))). + andReturn(packages).anyTimes(); - expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), - eq(managementController))).andReturn(csvResourceProvider).anyTimes(); + expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString())) + .andReturn(new HashMap>()).anyTimes(); expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster); expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn( @@ -1265,16 +1217,11 @@ public class ClusterStackVersionResourceProviderTest { // replay - replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider, + replay(managementController, response, clusters, cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager, executionCommand, executionCommandWrapper,stage, stageFactory); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates @@ -1327,10 +1274,6 @@ public class ClusterStackVersionResourceProviderTest { */ @Test public void testCreateResourcesInInstalledState() throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); StackId stackId = new StackId("HDP", "2.2.0"); String repoVersion = "2.2.0.1-885"; @@ -1406,8 +1349,7 @@ public class ClusterStackVersionResourceProviderTest { RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class); - ResourceProvider csvResourceProvider = createNiceMock( - ClusterStackVersionResourceProvider.class); + ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class); AbstractControllerResourceProvider.init(resourceProviderFactory); @@ -1452,10 +1394,7 @@ public class ClusterStackVersionResourceProviderTest { csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper, schDatanode, stageFactory, hostVersionDAO); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type, - PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple @@ -1499,10 +1438,6 @@ public class ClusterStackVersionResourceProviderTest { @Test public void testCreateResourcesPPC() throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); Map hostLevelParams = new HashMap<>(); StackId stackId = new StackId("HDP", "2.0.1"); @@ -1565,16 +1500,9 @@ public class ClusterStackVersionResourceProviderTest { expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes(); expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes(); // First host contains versionable components - final List schsH1 = new ArrayList(){{ - add(schDatanode); - add(schNamenode); - add(schAMS); - }}; + final List schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS); // Second host does not contain versionable components - final List schsH2 = new ArrayList(){{ - add(schAMS); - }}; - + final List schsH2 = Lists.newArrayList(schAMS); ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package(); hdfsPackage.setName("hdfs"); @@ -1598,8 +1526,11 @@ public class ClusterStackVersionResourceProviderTest { expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes(); expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class), (Map) anyObject(List.class), anyObject(String.class))). - andReturn(packages).anyTimes(); // 1 host has no versionable components, other hosts have 2 services - // // that's why we don't send commands to it + andReturn(packages).anyTimes(); + + expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString())) + .andReturn(new HashMap>()).anyTimes(); + expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class), eq(managementController))).andReturn(csvResourceProvider).anyTimes(); @@ -1670,12 +1601,7 @@ public class ClusterStackVersionResourceProviderTest { cluster, repoVersion, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager, executionCommand, executionCommandWrapper,stage, stageFactory); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates @@ -1709,10 +1635,6 @@ public class ClusterStackVersionResourceProviderTest { @Test public void testGetSorted() throws Exception { - - Resource.Type type = Resource.Type.ClusterStackVersion; - - final Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); StackId stackId = new StackId("HDP", "2.2.0"); @@ -1764,19 +1686,17 @@ public class ClusterStackVersionResourceProviderTest { csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper, stageFactory, hostVersionDAO); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type, - PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), - /*managementController*/null); + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); - Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters"); - field.setAccessible(true); - field.set(null, new Provider() { - @Override - public Clusters get() { - return clusters; - } - }); +// Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters"); +// field.setAccessible(true); +// field.set(null, new Provider() { +// @Override +// public Clusters get() { +// return clusters; +// } +// }); // set the security auth SecurityContextHolder.getContext().setAuthentication( @@ -1852,6 +1772,9 @@ public class ClusterStackVersionResourceProviderTest { expect(desiredVersionDefinition.getAvailableServices((StackInfo)EasyMock.anyObject())).andReturn(availableServices).once(); + expect(cluster.transitionHostsToInstalling( + anyObject(RepositoryVersionEntity.class), anyObject(VersionDefinitionXml.class), + EasyMock.anyBoolean())).andReturn(Collections.emptyList()).atLeastOnce(); replay(cluster, repoVersionEnt, desiredVersionDefinition, service1, service2, availableService1, availableService2); @@ -1890,7 +1813,9 @@ public class ClusterStackVersionResourceProviderTest { availableServices.add(availableService2); expect(desiredVersionDefinition.getAvailableServices((StackInfo)EasyMock.anyObject())).andReturn(availableServices).once(); - + expect(cluster.transitionHostsToInstalling( + anyObject(RepositoryVersionEntity.class), anyObject(VersionDefinitionXml.class), + EasyMock.anyBoolean())).andThrow(new AssertionFailedError()).anyTimes(); replay(cluster, repoVersionEnt, desiredVersionDefinition, service1, availableService1, availableService2); @@ -1906,10 +1831,6 @@ public class ClusterStackVersionResourceProviderTest { } private void testCreateResourcesExistingUpgrade(Authentication authentication) throws Exception { - Resource.Type type = Resource.Type.ClusterStackVersion; - - AmbariManagementController managementController = createMock(AmbariManagementController.class); - Clusters clusters = createNiceMock(Clusters.class); Cluster cluster = createNiceMock(Cluster.class); expect(managementController.getClusters()).andReturn(clusters).anyTimes(); @@ -1927,12 +1848,7 @@ public class ClusterStackVersionResourceProviderTest { // replay replay(managementController, clusters, cluster); - ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( - type, - PropertyHelper.getPropertyIds(type), - PropertyHelper.getKeyPropertyIds(type), - managementController); - + ResourceProvider provider = createProvider(managementController); injector.injectMembers(provider); // add the property map to a set for the request. add more maps for multiple creates @@ -1964,6 +1880,17 @@ public class ClusterStackVersionResourceProviderTest { verify(cluster); } + + private ClusterStackVersionResourceProvider createProvider(AmbariManagementController amc) { + ResourceProviderFactory factory = injector.getInstance(ResourceProviderFactory.class); + AbstractControllerResourceProvider.init(factory); + + Resource.Type type = Type.ClusterStackVersion; + return (ClusterStackVersionResourceProvider) AbstractControllerResourceProvider.getResourceProvider(type, + PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), + amc); + } + private class MockModule extends AbstractModule { @Override protected void configure() { @@ -1973,6 +1900,9 @@ public class ClusterStackVersionResourceProviderTest { bind(StageFactory.class).toInstance(stageFactory); bind(HostVersionDAO.class).toInstance(hostVersionDAO); bind(HostComponentStateDAO.class).toInstance(hostComponentStateDAO); + bind(Clusters.class).toInstance(clusters); + bind(ActionManager.class).toInstance(actionManager); + bind(AmbariManagementController.class).toInstance(managementController); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java index 0ced822..1ea4b9a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java @@ -217,6 +217,7 @@ public class ComponentResourceProviderTest { Map serviceComponentStateCountMap = new HashMap<>(); serviceComponentStateCountMap.put("startedCount", 1); serviceComponentStateCountMap.put("installedCount", 0); + serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0); serviceComponentStateCountMap.put("installFailedCount", 0); serviceComponentStateCountMap.put("initCount", 0); serviceComponentStateCountMap.put("unknownCount", 1); @@ -280,6 +281,7 @@ public class ComponentResourceProviderTest { propertyIds.add(ComponentResourceProvider.COMPONENT_TOTAL_COUNT_PROPERTY_ID); propertyIds.add(ComponentResourceProvider.COMPONENT_STARTED_COUNT_PROPERTY_ID); propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALLED_COUNT_PROPERTY_ID); + propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID); propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID); propertyIds.add(ComponentResourceProvider.COMPONENT_INIT_COUNT_PROPERTY_ID); propertyIds.add(ComponentResourceProvider.COMPONENT_UNKNOWN_COUNT_PROPERTY_ID); @@ -311,6 +313,8 @@ public class ComponentResourceProviderTest { Assert.assertEquals(0, resource.getPropertyValue( ComponentResourceProvider.COMPONENT_INSTALLED_COUNT_PROPERTY_ID)); Assert.assertEquals(0, resource.getPropertyValue( + ComponentResourceProvider.COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID)); + Assert.assertEquals(0, resource.getPropertyValue( ComponentResourceProvider.COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID)); Assert.assertEquals(0, resource.getPropertyValue( ComponentResourceProvider.COMPONENT_INIT_COUNT_PROPERTY_ID)); @@ -379,6 +383,7 @@ public class ComponentResourceProviderTest { Map serviceComponentStateCountMap = new HashMap<>(); serviceComponentStateCountMap.put("startedCount", 0); serviceComponentStateCountMap.put("installedCount", 1); + serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0); serviceComponentStateCountMap.put("installFailedCount", 0); serviceComponentStateCountMap.put("initCount", 0); serviceComponentStateCountMap.put("unknownCount", 0); @@ -691,6 +696,7 @@ public class ComponentResourceProviderTest { Map serviceComponentStateCountMap = new HashMap<>(); serviceComponentStateCountMap.put("startedCount", 0); serviceComponentStateCountMap.put("installedCount", 1); + serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0); serviceComponentStateCountMap.put("installFailedCount", 0); serviceComponentStateCountMap.put("initCount", 0); serviceComponentStateCountMap.put("unknownCount", 0); http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java index 6a0ab89..ca5cde0 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java @@ -48,13 +48,15 @@ public class RepositoryResourceProviderTest { private static final String VAL_REPO_ID = "HDP-0.2"; private static final String VAL_REPO_NAME = "HDP1"; private static final String VAL_BASE_URL = "http://foo.com"; + private static final String VAL_DISTRIBUTION = "mydist"; + private static final String VAL_COMPONENT_NAME = "mycomponentname"; @Test public void testGetResources() throws Exception{ AmbariManagementController managementController = EasyMock.createMock(AmbariManagementController.class); RepositoryResponse rr = new RepositoryResponse(VAL_BASE_URL, VAL_OS, - VAL_REPO_ID, VAL_REPO_NAME, null, null); + VAL_REPO_ID, VAL_REPO_NAME, VAL_DISTRIBUTION, VAL_COMPONENT_NAME, null, null); rr.setStackName(VAL_STACK_NAME); rr.setStackVersion(VAL_STACK_VERSION); Set allResponse = new HashSet<>(); @@ -76,6 +78,8 @@ public class RepositoryResourceProviderTest { propertyIds.add(RepositoryResourceProvider.REPOSITORY_OS_TYPE_PROPERTY_ID); propertyIds.add(RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID); propertyIds.add(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID); + propertyIds.add(RepositoryResourceProvider.REPOSITORY_DISTRIBUTION_PROPERTY_ID); + propertyIds.add(RepositoryResourceProvider.REPOSITORY_COMPONENTS_PROPERTY_ID); Predicate predicate = new PredicateBuilder().property(RepositoryResourceProvider.REPOSITORY_STACK_NAME_PROPERTY_ID).equals(VAL_STACK_NAME) @@ -111,6 +115,12 @@ public class RepositoryResourceProviderTest { o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID); Assert.assertNull(o); + + o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_DISTRIBUTION_PROPERTY_ID); + Assert.assertEquals(o, VAL_DISTRIBUTION); + + o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_COMPONENTS_PROPERTY_ID); + Assert.assertEquals(o, VAL_COMPONENT_NAME); } // !!! check that the stack version id is returned @@ -139,6 +149,12 @@ public class RepositoryResourceProviderTest { o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID); Assert.assertEquals(525L, o); + + o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_DISTRIBUTION_PROPERTY_ID); + Assert.assertEquals(o, VAL_DISTRIBUTION); + + o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_COMPONENTS_PROPERTY_ID); + Assert.assertEquals(o, VAL_COMPONENT_NAME); } // verify @@ -152,7 +168,7 @@ public class RepositoryResourceProviderTest { AmbariManagementController managementController = EasyMock.createMock(AmbariManagementController.class); RepositoryResponse rr = new RepositoryResponse(VAL_BASE_URL, VAL_OS, - VAL_REPO_ID, VAL_REPO_NAME, null, null); + VAL_REPO_ID, VAL_REPO_NAME, null, null, null, null); Set allResponse = new HashSet<>(); allResponse.add(rr); http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java index bb3fa8f..f13aeed 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java @@ -33,6 +33,7 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactory; import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.StageFactory; +import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.controller.AbstractRootServiceResponseFactory; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.KerberosHelper; @@ -56,8 +57,10 @@ import org.apache.ambari.server.state.Config; import org.apache.ambari.server.state.ConfigFactory; import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.DesiredConfig; +import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.RepositoryType; import org.apache.ambari.server.state.Service; +import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentFactory; import org.apache.ambari.server.state.ServiceComponentHostFactory; import org.apache.ambari.server.state.ServiceFactory; @@ -65,6 +68,7 @@ import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.UpgradeContext; import org.apache.ambari.server.state.UpgradeContextFactory; import org.apache.ambari.server.state.UpgradeHelper; +import org.apache.ambari.server.state.ValueAttributesInfo; import org.apache.ambari.server.state.configgroup.ConfigGroupFactory; import org.apache.ambari.server.state.scheduler.RequestExecutionFactory; import org.apache.ambari.server.state.stack.OsFamily; @@ -95,12 +99,15 @@ import com.google.inject.assistedinject.FactoryModuleBuilder; public class StackUpgradeConfigurationMergeTest extends EasyMockSupport { private Injector m_injector; + private AmbariMetaInfo m_metainfo; /** * @throws Exception */ @Before public void before() throws Exception { + m_metainfo = createNiceMock(AmbariMetaInfo.class); + MockModule mockModule = new MockModule(); // create an injector which will inject the mocks @@ -286,6 +293,134 @@ public class StackUpgradeConfigurationMergeTest extends EasyMockSupport { assertEquals("stack-220-original", expectedBarType.get("bar-property-2")); } + /** + * Tests that any read-only properties are not taken from the existing + * configs, but from the new stack value. + * + * @throws Exception + */ + @Test + public void testReadOnlyPropertyIsTakenFromTargetStack() throws Exception { + RepositoryVersionEntity repoVersion211 = createNiceMock(RepositoryVersionEntity.class); + RepositoryVersionEntity repoVersion220 = createNiceMock(RepositoryVersionEntity.class); + + StackId stack211 = new StackId("HDP-2.1.1"); + StackId stack220 = new StackId("HDP-2.2.0"); + + String version211 = "2.1.1.0-1234"; + String version220 = "2.2.0.0-1234"; + + expect(repoVersion211.getStackId()).andReturn(stack211).atLeastOnce(); + expect(repoVersion211.getVersion()).andReturn(version211).atLeastOnce(); + + expect(repoVersion220.getStackId()).andReturn(stack220).atLeastOnce(); + expect(repoVersion220.getVersion()).andReturn(version220).atLeastOnce(); + + String fooSite = "foo-site"; + String fooPropertyName = "foo-property-1"; + String serviceName = "ZOOKEEPER"; + + Map> stack211Configs = new HashMap<>(); + Map stack211FooType = new HashMap<>(); + stack211Configs.put(fooSite, stack211FooType); + stack211FooType.put(fooPropertyName, "stack-211-original"); + + Map> stack220Configs = new HashMap<>(); + Map stack220FooType = new HashMap<>(); + stack220Configs.put(fooSite, stack220FooType); + stack220FooType.put(fooPropertyName, "stack-220-original"); + + PropertyInfo readOnlyProperty = new PropertyInfo(); + ValueAttributesInfo valueAttributesInfo = new ValueAttributesInfo(); + valueAttributesInfo.setReadOnly(true); + readOnlyProperty.setName(fooPropertyName); + readOnlyProperty.setFilename(fooSite + ".xml"); + readOnlyProperty.setPropertyValueAttributes(null); + readOnlyProperty.setPropertyValueAttributes(valueAttributesInfo); + + expect(m_metainfo.getServiceProperties(stack211.getStackName(), stack211.getStackVersion(), + serviceName)).andReturn(Sets.newHashSet(readOnlyProperty)).atLeastOnce(); + + Map existingFooType = new HashMap<>(); + + ClusterConfigEntity fooConfigEntity = createNiceMock(ClusterConfigEntity.class); + + expect(fooConfigEntity.getType()).andReturn(fooSite); + + Config fooConfig = createNiceMock(Config.class); + + existingFooType.put(fooPropertyName, "my-foo-property-1"); + + expect(fooConfig.getType()).andReturn(fooSite).atLeastOnce(); + expect(fooConfig.getProperties()).andReturn(existingFooType); + + Map desiredConfigurations = new HashMap<>(); + desiredConfigurations.put(fooSite, null); + + Service zookeeper = createNiceMock(Service.class); + expect(zookeeper.getName()).andReturn(serviceName).atLeastOnce(); + expect(zookeeper.getServiceComponents()).andReturn(new HashMap()).once(); + zookeeper.setDesiredRepositoryVersion(repoVersion220); + expectLastCall().once(); + + Cluster cluster = createNiceMock(Cluster.class); + expect(cluster.getCurrentStackVersion()).andReturn(stack211).atLeastOnce(); + expect(cluster.getDesiredStackVersion()).andReturn(stack220); + expect(cluster.getDesiredConfigs()).andReturn(desiredConfigurations); + expect(cluster.getDesiredConfigByType(fooSite)).andReturn(fooConfig); + expect(cluster.getService(serviceName)).andReturn(zookeeper); + + ConfigHelper configHelper = m_injector.getInstance(ConfigHelper.class); + + expect(configHelper.getDefaultProperties(stack211, serviceName)).andReturn(stack211Configs).anyTimes(); + expect(configHelper.getDefaultProperties(stack220, serviceName)).andReturn(stack220Configs).anyTimes(); + + Capture>> expectedConfigurationsCapture = EasyMock.newCapture(); + + configHelper.createConfigTypes(EasyMock.anyObject(Cluster.class), + EasyMock.anyObject(StackId.class), EasyMock.anyObject(AmbariManagementController.class), + EasyMock.capture(expectedConfigurationsCapture), EasyMock.anyObject(String.class), + EasyMock.anyObject(String.class)); + + expectLastCall().once(); + + // mock the service config DAO and replay it + ServiceConfigEntity zookeeperServiceConfig = createNiceMock(ServiceConfigEntity.class); + expect(zookeeperServiceConfig.getClusterConfigEntities()).andReturn( + Lists.newArrayList(fooConfigEntity)); + + ServiceConfigDAO serviceConfigDAOMock = m_injector.getInstance(ServiceConfigDAO.class); + List latestServiceConfigs = Lists.newArrayList(zookeeperServiceConfig); + expect(serviceConfigDAOMock.getLastServiceConfigsForService(EasyMock.anyLong(), + eq(serviceName))).andReturn(latestServiceConfigs).once(); + + UpgradeContext context = createNiceMock(UpgradeContext.class); + expect(context.getCluster()).andReturn(cluster).atLeastOnce(); + expect(context.getType()).andReturn(UpgradeType.ROLLING).atLeastOnce(); + expect(context.getDirection()).andReturn(Direction.UPGRADE).atLeastOnce(); + expect(context.getRepositoryVersion()).andReturn(repoVersion220).anyTimes(); + expect(context.getSupportedServices()).andReturn(Sets.newHashSet(serviceName)).atLeastOnce(); + expect(context.getSourceRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion211).atLeastOnce(); + expect(context.getTargetRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion220).atLeastOnce(); + expect(context.getOrchestrationType()).andReturn(RepositoryType.STANDARD).anyTimes(); + expect(context.getHostRoleCommandFactory()).andStubReturn(m_injector.getInstance(HostRoleCommandFactory.class)); + expect(context.getRoleGraphFactory()).andStubReturn(m_injector.getInstance(RoleGraphFactory.class)); + + replayAll(); + + UpgradeHelper upgradeHelper = m_injector.getInstance(UpgradeHelper.class); + upgradeHelper.updateDesiredRepositoriesAndConfigs(context); + + Map> expectedConfigurations = expectedConfigurationsCapture.getValue(); + Map expectedFooType = expectedConfigurations.get(fooSite); + + // As the upgrade pack did not have any Flume updates, its configs should + // not be updated. + assertEquals(1, expectedConfigurations.size()); + assertEquals(1, expectedFooType.size()); + + assertEquals("stack-220-original", expectedFooType.get(fooPropertyName)); + } private class MockModule implements Module { @@ -325,6 +460,7 @@ public class StackUpgradeConfigurationMergeTest extends EasyMockSupport { binder.bind(ServiceConfigDAO.class).toInstance(createNiceMock(ServiceConfigDAO.class)); binder.install(new FactoryModuleBuilder().build(UpgradeContextFactory.class)); binder.bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class); + binder.bind(AmbariMetaInfo.class).toInstance(m_metainfo); binder.requestStaticInjection(UpgradeResourceProvider.class); } http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/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 37a7b44..fea56d9 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 @@ -84,6 +84,7 @@ import org.apache.ambari.server.orm.entities.UpgradeHistoryEntity; import org.apache.ambari.server.orm.entities.UpgradeItemEntity; import org.apache.ambari.server.security.TestAuthenticationFactory; import org.apache.ambari.server.serveraction.upgrades.AutoSkipFailedSummaryAction; +import org.apache.ambari.server.serveraction.upgrades.ConfigureAction; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; @@ -1733,6 +1734,113 @@ public class UpgradeResourceProviderTest extends EasyMockSupport { upgradeResourceProvider.createResources(request); } + @Test + public void testCreatePatchWithConfigChanges() throws Exception { + Cluster cluster = clusters.getCluster("c1"); + + File f = new File("src/test/resources/version_definition_test_patch_config.xml"); + repoVersionEntity2112.setType(RepositoryType.PATCH); + repoVersionEntity2112.setVersionXml(IOUtils.toString(new FileInputStream(f))); + repoVersionEntity2112.setVersionXsd("version_definition.xsd"); + repoVersionDao.merge(repoVersionEntity2112); + + List upgrades = upgradeDao.findUpgrades(cluster.getClusterId()); + assertEquals(0, upgrades.size()); + + Map requestProps = new HashMap<>(); + requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); + requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2112.getId())); + requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); + requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true"); + requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name()); + + // !!! test that a PATCH upgrade skips config changes + ResourceProvider upgradeResourceProvider = createProvider(amc); + + Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null); + RequestStatus status = upgradeResourceProvider.createResources(request); + Set resources = status.getAssociatedResources(); + assertEquals(1, resources.size()); + Long requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id"); + assertNotNull(requestId); + + UpgradeEntity upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId); + assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration()); + + HostRoleCommandDAO hrcDAO = injector.getInstance(HostRoleCommandDAO.class); + List commands = hrcDAO.findByRequest(upgradeEntity.getRequestId()); + + boolean foundConfigTask = false; + for (HostRoleCommandEntity command : commands) { + if (StringUtils.isNotBlank(command.getCustomCommandName()) && + command.getCustomCommandName().equals(ConfigureAction.class.getName())) { + foundConfigTask = true; + break; + } + } + assertFalse(foundConfigTask); + + // !!! test that a patch with a supported patch change gets picked up + cluster.setUpgradeEntity(null); + requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test_force_config_change"); + request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null); + + status = upgradeResourceProvider.createResources(request); + resources = status.getAssociatedResources(); + assertEquals(1, resources.size()); + requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id"); + assertNotNull(requestId); + + upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId); + assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration()); + + commands = hrcDAO.findByRequest(upgradeEntity.getRequestId()); + + foundConfigTask = false; + for (HostRoleCommandEntity command : commands) { + if (StringUtils.isNotBlank(command.getCustomCommandName()) && + command.getCustomCommandName().equals(ConfigureAction.class.getName())) { + foundConfigTask = true; + break; + } + } + assertTrue(foundConfigTask); + + + + // !!! test that a regular upgrade will pick up the config change + cluster.setUpgradeEntity(null); + repoVersionEntity2112.setType(RepositoryType.STANDARD); + repoVersionDao.merge(repoVersionEntity2112); + + requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); + request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null); + + status = upgradeResourceProvider.createResources(request); + resources = status.getAssociatedResources(); + assertEquals(1, resources.size()); + requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id"); + assertNotNull(requestId); + + upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId); + assertEquals(RepositoryType.STANDARD, upgradeEntity.getOrchestration()); + + commands = hrcDAO.findByRequest(upgradeEntity.getRequestId()); + + foundConfigTask = false; + for (HostRoleCommandEntity command : commands) { + if (StringUtils.isNotBlank(command.getCustomCommandName()) && + command.getCustomCommandName().equals(ConfigureAction.class.getName())) { + foundConfigTask = true; + break; + } + } + assertTrue(foundConfigTask); + + } + + + private String parseSingleMessage(String msgStr){ JsonParser parser = new JsonParser(); JsonArray msgArray = (JsonArray) parser.parse(msgStr); http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java index b066324..ffacab9 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java @@ -306,6 +306,11 @@ public class StackVersionListenerTest extends EasyMockSupport { RepositoryVersionDAO dao = createNiceMock(RepositoryVersionDAO.class); RepositoryVersionEntity entity = createNiceMock(RepositoryVersionEntity.class); expect(entity.getVersion()).andReturn("2.4.0.0").once(); + + // when the version gets reported back, we set this repo to resolved + entity.setResolved(true); + expectLastCall().once(); + expect(dao.findByPK(1L)).andReturn(entity).once(); expect(dao.merge(entity)).andReturn(entity).once(); @@ -325,6 +330,47 @@ public class StackVersionListenerTest extends EasyMockSupport { } /** + * Tests that if a component advertises a version and the repository already + * matches, that we ensure that it is marked as resolved. + * + * @throws Exception + */ + @Test + public void testRepositoryResolvedWhenVersionsMatch() throws Exception { + String version = "2.4.0.0"; + + expect(sch.getVersion()).andReturn(version); + expect(componentInfo.isVersionAdvertised()).andReturn(true).once(); + + RepositoryVersionDAO dao = createNiceMock(RepositoryVersionDAO.class); + RepositoryVersionEntity entity = createNiceMock(RepositoryVersionEntity.class); + expect(entity.getVersion()).andReturn(version).once(); + expect(entity.isResolved()).andReturn(false).once(); + + // when the version gets reported back, we set this repo to resolved + entity.setResolved(true); + expectLastCall().once(); + + expect(dao.findByPK(1L)).andReturn(entity).once(); + expect(dao.merge(entity)).andReturn(entity).once(); + + replayAll(); + + String newVersion = version; + + HostComponentVersionAdvertisedEvent event = new HostComponentVersionAdvertisedEvent(cluster, sch, newVersion, 1L); + + // !!! avoid injector for test class + Field field = StackVersionListener.class.getDeclaredField("repositoryVersionDAO"); + field.setAccessible(true); + field.set(listener, dao); + + listener.onAmbariEvent(event); + + verifyAll(); + } + + /** * Tests that the {@link RepositoryVersionEntity} is not updated if there is * an upgrade, even if the repo ID is passed back and the versions don't * match. http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java index 8f587be..bc1ab47 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java @@ -32,7 +32,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -87,6 +86,8 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.persist.Transactional; import com.google.inject.util.Modules; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.WebResource; import junit.framework.Assert; @@ -640,15 +641,35 @@ public class ExecutionScheduleManagerTest { } @Test - public void testCompleteRelativePath() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - ExecutionScheduleManager scheduleManagerMock = createMock(ExecutionScheduleManager.class); - Method completeRelativeUri = ExecutionScheduleManager.class.getDeclaredMethod("completeRelativeUri", String.class); - completeRelativeUri.setAccessible(true); - - assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "clusters")); - assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "/clusters")); - assertEquals("/api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "/api/v1/clusters")); - assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "api/v1/clusters")); - assertEquals("", completeRelativeUri.invoke(scheduleManagerMock, "")); + public void testExtendApiResource() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + WebResource webResource = Client.create().resource("http://localhost:8080/"); + + String clustersEndpoint = "http://localhost:8080/api/v1/clusters"; + + Clusters clustersMock = createMock(Clusters.class); + + Configuration configurationMock = createNiceMock(Configuration.class); + ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class); + InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class); + ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class); + Gson gson = new Gson(); + + replay(clustersMock, configurationMock, executionSchedulerMock, tokenStorageMock, + actionDBAccessorMock); + + ExecutionScheduleManager scheduleManager = + new ExecutionScheduleManager(configurationMock, executionSchedulerMock, + tokenStorageMock, clustersMock, actionDBAccessorMock, gson); + + assertEquals(clustersEndpoint, + scheduleManager.extendApiResource(webResource, "clusters").getURI().toString()); + assertEquals(clustersEndpoint, + scheduleManager.extendApiResource(webResource, "/clusters").getURI().toString()); + assertEquals(clustersEndpoint, + scheduleManager.extendApiResource(webResource, "/api/v1/clusters").getURI().toString()); + assertEquals(clustersEndpoint, + scheduleManager.extendApiResource(webResource, "api/v1/clusters").getURI().toString()); + assertEquals("http://localhost:8080/", + scheduleManager.extendApiResource(webResource, "").getURI().toString()); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java index 95e5513..8ff5ad2 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java @@ -149,7 +149,7 @@ public class AbstractPrepareKerberosServerActionTest { identityFilter, "", configurations, kerberosConfigurations, - false, propertiesToIgnore); + false, propertiesToIgnore, false); verify(kerberosHelper); } http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosIdentityDataFileTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosIdentityDataFileTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosIdentityDataFileTest.java index 323ba8e..03727d7 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosIdentityDataFileTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosIdentityDataFileTest.java @@ -54,7 +54,7 @@ public class KerberosIdentityDataFileTest { "principal" + i, "principal_type" + i, "keytabFilePath" + i, "keytabFileOwnerName" + i, "keytabFileOwnerAccess" + i, "keytabFileGroupName" + i, "keytabFileGroupAccess" + i, - "false"); + "false", "false"); } // Add some odd characters @@ -62,7 +62,7 @@ public class KerberosIdentityDataFileTest { "principal", "principal_type", "keytabFilePath", "'keytabFileOwnerName'", "", "\"keytabFileGroupName\"", "keytab,File,Group,Access", - "false"); + "false", "false"); writer.close(); Assert.assertTrue(writer.isClosed()); @@ -153,7 +153,7 @@ public class KerberosIdentityDataFileTest { "principal", "principal_type", "keytabFilePath", "keytabFileOwnerName", "keytabFileOwnerAccess", "keytabFileGroupName", "keytabFileGroupAccess", - "true"); + "true", "false"); writer.close(); Assert.assertTrue(writer.isClosed()); @@ -179,7 +179,7 @@ public class KerberosIdentityDataFileTest { "principal", "principal_type", "keytabFilePath", "keytabFileOwnerName", "keytabFileOwnerAccess", "keytabFileGroupName", "keytabFileGroupAccess", - "true"); + "true", "false"); writer.close(); Assert.assertTrue(writer.isClosed()); @@ -205,4 +205,4 @@ public class KerberosIdentityDataFileTest { Assert.assertEquals(0, i); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerActionTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerActionTest.java index f63e6b8..a43db4d 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerActionTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerActionTest.java @@ -120,7 +120,7 @@ public class KerberosServerActionTest { "principal|_HOST|_REALM" + i, "principal_type", "keytabFilePath" + i, "keytabFileOwnerName" + i, "keytabFileOwnerAccess" + i, "keytabFileGroupName" + i, "keytabFileGroupAccess" + i, - "false"); + "false", "false"); } writer.close(); http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java index d07ac15..9f87312 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java @@ -36,7 +36,6 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactory; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.agent.CommandReport; import org.apache.ambari.server.agent.ExecutionCommand; -import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; import org.apache.ambari.server.orm.OrmTestHelper; @@ -56,7 +55,6 @@ import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ConfigFactory; import org.apache.ambari.server.state.Host; -import org.apache.ambari.server.state.RepositoryInfo; import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; @@ -308,12 +306,6 @@ public class ComponentVersionCheckActionTest { makeUpgradeCluster(sourceStack, sourceRepo, targetStack, targetRepo); - // Verify the repo before calling Finalize - AmbariMetaInfo metaInfo = m_injector.getInstance(AmbariMetaInfo.class); - - RepositoryInfo repo = metaInfo.getRepository(sourceStack.getStackName(), sourceStack.getStackVersion(), "redhat6", sourceStack.getStackId()); - assertEquals(HDP_211_CENTOS6_REPO_URL, repo.getBaseUrl()); - // Finalize the upgrade Map commandParams = new HashMap<>(); ExecutionCommand executionCommand = new ExecutionCommand(); @@ -470,12 +462,6 @@ public class ComponentVersionCheckActionTest { sch = createNewServiceComponentHost(cluster, "ZOOKEEPER", "ZOOKEEPER_SERVER", "h1"); sch.setVersion(HDP_2_1_1_1); - // Verify the repo before calling Finalize - AmbariMetaInfo metaInfo = m_injector.getInstance(AmbariMetaInfo.class); - - RepositoryInfo repo = metaInfo.getRepository(sourceStack.getStackName(), sourceStack.getStackVersion(), "redhat6", sourceStack.getStackId()); - assertEquals(HDP_211_CENTOS6_REPO_URL, repo.getBaseUrl()); - // Finalize the upgrade Map commandParams = new HashMap<>(); ExecutionCommand executionCommand = new ExecutionCommand(); http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java new file mode 100644 index 0000000..61ca682 --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ambari.server.serveraction.upgrades; + +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.replay; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper; +import org.apache.ambari.server.actionmanager.HostRoleCommand; +import org.apache.ambari.server.agent.CommandReport; +import org.apache.ambari.server.agent.ExecutionCommand; +import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.Config; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.Injector; + +public class RangerUsersyncConfigCalculationTest { + + private Injector m_injector; + private Clusters m_clusters; + private Field m_clusterField; + + @Before + public void setup() throws Exception { + m_injector = createMock(Injector.class); + m_clusters = createMock(Clusters.class); + Cluster cluster = createMock(Cluster.class); + + Map mockRangerUsersyncProperties = new HashMap() { + { + put("ranger.usersync.ldap.grouphierarchylevels", "2"); + } + }; + + Map mockRangerEnvProperties = new HashMap(); + + Config rangerUsersyncConfig = createMock(Config.class); + expect(rangerUsersyncConfig.getType()).andReturn("ranger-ugsync-site").anyTimes(); + expect(rangerUsersyncConfig.getProperties()).andReturn(mockRangerUsersyncProperties).anyTimes(); + + Config rangerEnvConfig = createMock(Config.class); + expect(rangerEnvConfig.getType()).andReturn("ranger-env").anyTimes(); + expect(rangerEnvConfig.getProperties()).andReturn(mockRangerEnvProperties).anyTimes(); + + rangerEnvConfig.setProperties(anyObject(Map.class)); + expectLastCall().atLeastOnce(); + + rangerEnvConfig.save(); + expectLastCall().atLeastOnce(); + + expect(cluster.getDesiredConfigByType("ranger-ugsync-site")).andReturn(rangerUsersyncConfig).atLeastOnce(); + expect(cluster.getDesiredConfigByType("ranger-env")).andReturn(rangerEnvConfig).atLeastOnce(); + expect(m_clusters.getCluster((String) anyObject())).andReturn(cluster).anyTimes(); + expect(m_injector.getInstance(Clusters.class)).andReturn(m_clusters).atLeastOnce(); + + replay(m_injector, m_clusters, cluster, rangerUsersyncConfig, rangerEnvConfig); + + m_clusterField = RangerUsersyncConfigCalculation.class.getDeclaredField("m_clusters"); + m_clusterField.setAccessible(true); + + } + + @Test + public void testAction() throws Exception { + + Map commandParams = new HashMap(); + commandParams.put("clusterName", "cl1"); + + ExecutionCommand executionCommand = new ExecutionCommand(); + executionCommand.setCommandParams(commandParams); + executionCommand.setClusterName("cl1"); + + HostRoleCommand hrc = createMock(HostRoleCommand.class); + expect(hrc.getRequestId()).andReturn(1L).anyTimes(); + expect(hrc.getStageId()).andReturn(2L).anyTimes(); + expect(hrc.getExecutionCommandWrapper()).andReturn(new ExecutionCommandWrapper(executionCommand)).anyTimes(); + replay(hrc); + + RangerUsersyncConfigCalculation action = new RangerUsersyncConfigCalculation(); + m_clusterField.set(action, m_clusters); + + action.setExecutionCommand(executionCommand); + action.setHostRoleCommand(hrc); + + CommandReport report = action.execute(null); + Assert.assertNotNull(report); + + Cluster cl = m_clusters.getCluster("cl1"); + Config config = cl.getDesiredConfigByType("ranger-env"); + + Map map = config.getProperties(); + + Assert.assertTrue(map.containsKey("is_nested_groupsync_enabled")); + Assert.assertEquals("true", map.get("is_nested_groupsync_enabled")); + + report = action.execute(null); + Assert.assertNotNull(report); + + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/stack/KerberosDescriptorTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/KerberosDescriptorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/KerberosDescriptorTest.java index 0f1dd55..d208cfc 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/stack/KerberosDescriptorTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/KerberosDescriptorTest.java @@ -19,147 +19,113 @@ package org.apache.ambari.server.stack; import java.io.File; -import java.io.IOException; +import java.io.InputStream; import java.net.URL; +import java.util.Set; +import java.util.regex.Pattern; -import org.apache.ambari.server.state.kerberos.KerberosDescriptor; -import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; -import org.springframework.util.Assert; +import org.junit.experimental.categories.Category; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.ValidationMessage; + +import junit.framework.Assert; /** * KerberosDescriptorTest tests the stack- and service-level descriptors for certain stacks * and services */ -@Ignore +@Category({category.KerberosTest.class}) public class KerberosDescriptorTest { - private static final KerberosDescriptorFactory KERBEROS_DESCRIPTOR_FACTORY = new KerberosDescriptorFactory(); + private static Logger LOG = LoggerFactory.getLogger(KerberosDescriptorTest.class); + + private static final Pattern PATTERN_KERBEROS_DESCRIPTOR_FILENAME = Pattern.compile("^kerberos(?:_preconfigure)?\\.json$"); private static File stacksDirectory; - private static File hdpStackDirectory; - private static File hdp22StackDirectory; - private static File hdp22ServicesDirectory; private static File commonServicesDirectory; @BeforeClass public static void beforeClass() { URL rootDirectoryURL = KerberosDescriptorTest.class.getResource("/"); - Assert.notNull(rootDirectoryURL); + Assert.assertNotNull(rootDirectoryURL); File resourcesDirectory = new File(new File(rootDirectoryURL.getFile()).getParentFile().getParentFile(), "src/main/resources"); - Assert.notNull(resourcesDirectory); - Assert.isTrue(resourcesDirectory.canRead()); + Assert.assertNotNull(resourcesDirectory); + Assert.assertTrue(resourcesDirectory.canRead()); stacksDirectory = new File(resourcesDirectory, "stacks"); - Assert.notNull(stacksDirectory); - Assert.isTrue(stacksDirectory.canRead()); - - hdpStackDirectory = new File(stacksDirectory, "HDP"); - Assert.notNull(hdpStackDirectory); - Assert.isTrue(hdpStackDirectory.canRead()); - - hdp22StackDirectory = new File(hdpStackDirectory, "2.2"); - Assert.notNull(hdp22StackDirectory); - Assert.isTrue(hdp22StackDirectory.canRead()); - - hdp22ServicesDirectory = new File(hdp22StackDirectory, "services"); - Assert.notNull(hdp22ServicesDirectory); - Assert.isTrue(hdp22ServicesDirectory.canRead()); + Assert.assertNotNull(stacksDirectory); + Assert.assertTrue(stacksDirectory.canRead()); commonServicesDirectory = new File(resourcesDirectory, "common-services"); - Assert.notNull(commonServicesDirectory); - Assert.isTrue(commonServicesDirectory.canRead()); + Assert.assertNotNull(commonServicesDirectory); + Assert.assertTrue(commonServicesDirectory.canRead()); } @Test - public void testCommonHBASEServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "HBASE", "0.96.0.2.0"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("HBASE")); + public void testCommonServiceDescriptor() throws Exception { + JsonSchema schema = getJsonSchemaFromPath("kerberos_descriptor_schema.json"); + Assert.assertTrue(visitFile(schema, commonServicesDirectory, true)); } @Test - public void testCommonHDFSServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "HDFS", "2.1.0.2.0"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("HDFS")); + public void testStackServiceDescriptor() throws Exception { + JsonSchema schema = getJsonSchemaFromPath("kerberos_descriptor_schema.json"); + Assert.assertTrue(visitFile(schema, stacksDirectory, true)); } - @Test - public void testCommonYarnServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "YARN", "2.1.0.2.0"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("YARN")); - Assert.notNull(descriptor.getService("MAPREDUCE2")); - } + private boolean visitFile(JsonSchema schema, File file, boolean previousResult) throws Exception { - @Test - public void testCommonFalconServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "FALCON", "0.5.0.2.1"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("FALCON")); - } + if (file.isDirectory()) { + boolean currentResult = true; - @Test - public void testCommonHiveServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "HIVE", "0.12.0.2.0"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("HIVE")); - } + File[] files = file.listFiles(); + if (files != null) { + for (File currentFile : files) { + currentResult = visitFile(schema, currentFile, previousResult) && currentResult; + } + } + return previousResult && currentResult; + } else if (file.isFile()) { + if (PATTERN_KERBEROS_DESCRIPTOR_FILENAME.matcher(file.getName()).matches()) { + LOG.info("Validating " + file.getAbsolutePath()); - @Test - public void testCommonKnoxServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "KNOX", "0.5.0.2.2"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("KNOX")); - } + JsonNode node = getJsonNodeFromUrl(file.toURI().toURL().toExternalForm()); + Set errors = schema.validate(node); - @Test - public void testCommonOozieServiceDescriptor() throws IOException { - KerberosDescriptor descriptor; + if ((errors != null) && !errors.isEmpty()) { + for (ValidationMessage message : errors) { + LOG.error(message.getMessage()); + } - descriptor = getKerberosDescriptor(commonServicesDirectory, "OOZIE", "4.0.0.2.0"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("OOZIE")); - } + return false; + } - @Test - public void testCommonStormServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "STORM", "0.9.1"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("STORM")); - } + return true; + } else { + return true; + } + } - @Test - public void testCommonZookeepeerServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "ZOOKEEPER", "3.4.5"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("ZOOKEEPER")); + return previousResult; } - @Test - public void testCommonSparkServiceDescriptor() throws IOException { - KerberosDescriptor descriptor = getKerberosDescriptor(commonServicesDirectory, "SPARK", "1.2.1"); - Assert.notNull(descriptor); - Assert.notNull(descriptor.getServices()); - Assert.notNull(descriptor.getService("SPARK")); + private JsonNode getJsonNodeFromUrl(String url) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readTree(new URL(url)); } - private KerberosDescriptor getKerberosDescriptor(File baseDirectory, String service, String version) throws IOException { - File serviceDirectory = new File(baseDirectory, service); - File serviceVersionDirectory = new File(serviceDirectory, version); - return KERBEROS_DESCRIPTOR_FACTORY.createInstance(new File(serviceVersionDirectory, "kerberos.json")); + private JsonSchema getJsonSchemaFromPath(String name) throws Exception { + JsonSchemaFactory factory = new JsonSchemaFactory(); + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name); + return factory.getSchema(is); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/stack/StackServiceDirectoryTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackServiceDirectoryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackServiceDirectoryTest.java new file mode 100644 index 0000000..5983dce --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackServiceDirectoryTest.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ambari.server.stack; + +import static org.junit.Assert.assertEquals; + +import java.io.File; + +import org.apache.ambari.server.AmbariException; + +import org.junit.Test; + +/** + * Tests for StackServiceDirectory + */ +public class StackServiceDirectoryTest { + + private MockStackServiceDirectory createStackServiceDirectory(String servicePath) throws AmbariException { + MockStackServiceDirectory ssd = new MockStackServiceDirectory(servicePath); + return ssd; + } + + @Test + public void testValidServiceAdvisorClassName() throws Exception { + String pathWithInvalidChars = "/Fake-Stack.Name/1.0/services/FAKESERVICE/"; + String serviceNameValidChars = "FakeService"; + + String pathWithValidChars = "/FakeStackName/1.0/services/FAKESERVICE/"; + String serviceNameInvalidChars = "Fake-Serv.ice"; + + String desiredServiceAdvisorName = "FakeStackName10FakeServiceServiceAdvisor"; + + MockStackServiceDirectory ssd1 = createStackServiceDirectory(pathWithInvalidChars); + assertEquals(desiredServiceAdvisorName, ssd1.getAdvisorName(serviceNameValidChars)); + + MockStackServiceDirectory ssd2 = createStackServiceDirectory(pathWithValidChars); + assertEquals(desiredServiceAdvisorName, ssd2.getAdvisorName(serviceNameInvalidChars)); + + MockStackServiceDirectory ssd3 = createStackServiceDirectory(pathWithInvalidChars); + assertEquals(desiredServiceAdvisorName, ssd3.getAdvisorName(serviceNameInvalidChars)); + + MockStackServiceDirectory ssd4 = createStackServiceDirectory(pathWithValidChars); + assertEquals(desiredServiceAdvisorName, ssd4.getAdvisorName(serviceNameValidChars)); + } + + private class MockStackServiceDirectory extends StackServiceDirectory { + File advisor = null; + + MockStackServiceDirectory (String servicePath) throws AmbariException { + super(servicePath); + advisor = new File(servicePath, StackDirectory.SERVICE_ADVISOR_FILE_NAME); + } + + protected void parsePath() {} + + public File getAdvisorFile() { + return advisor; + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/5ae98dbe/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java index d341a09..0cc43ba 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java @@ -274,15 +274,28 @@ public class ServiceComponentTest { service.addServiceComponent(component); addHostToCluster("h1", service.getCluster().getClusterName()); + addHostToCluster("h2", service.getCluster().getClusterName()); + addHostToCluster("h3", service.getCluster().getClusterName()); ServiceComponentHost sch = serviceComponentHostFactory.createNew(component, "h1"); + ServiceComponentHost sch2 = + serviceComponentHostFactory.createNew(component, "h2"); + ServiceComponentHost sch3 = + serviceComponentHostFactory.createNew(component, "h3"); sch.setState(State.INSTALLED); + sch2.setState(State.INSTALLED); + sch3.setState(State.INSTALLED); Map compHosts = new HashMap<>(); compHosts.put("h1", sch); + compHosts.put("h2", sch2); + compHosts.put("h3", sch3); component.addServiceComponentHosts(compHosts); - Assert.assertEquals(1, component.getServiceComponentHosts().size()); + Assert.assertEquals(3, component.getServiceComponentHosts().size()); + + component.getServiceComponentHost("h2").setMaintenanceState(MaintenanceState.ON); + sch3.setMaintenanceState(MaintenanceState.ON); ServiceComponent sc = service.getServiceComponent(componentName); Assert.assertNotNull(sc); @@ -299,9 +312,11 @@ public class ServiceComponentTest { int totalCount = r.getServiceComponentStateCount().get("totalCount"); int startedCount = r.getServiceComponentStateCount().get("startedCount"); int installedCount = r.getServiceComponentStateCount().get("installedCount"); - Assert.assertEquals(1, totalCount); + int installedAndMaintenanceOffCount = r.getServiceComponentStateCount().get("installedAndMaintenanceOffCount"); + Assert.assertEquals(3, totalCount); Assert.assertEquals(0, startedCount); - Assert.assertEquals(1, installedCount); + Assert.assertEquals(3, installedCount); + Assert.assertEquals(1, installedAndMaintenanceOffCount); // TODO check configs // r.getConfigVersions()