diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.java index 8e72969..54ffe17 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.java @@ -26,10 +26,15 @@ import org.apache.slider.server.appmaster.model.mock.MockYarnEngine; import org.apache.slider.server.appmaster.state.AppStateBindingInfo; import org.apache.slider.server.appmaster.state.MostRecentContainerReleaseSelector; +import org.apache.slider.server.appmaster.state.RoleInstance; import org.apache.slider.server.appmaster.state.RoleStatus; import org.junit.Test; import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; /** * Test that if you have more than one role, the right roles are chosen for @@ -72,23 +77,72 @@ public Application buildApplication() { return application; } + public static Map organize(List + instances) { + Map map = new TreeMap<>(); + for (RoleInstance instance : instances) { + assertFalse("Multiple role instances for unique name " + instance + .compInstanceName, map.containsKey(instance.compInstanceName)); + System.out.println("Adding to map " + instance.compInstanceName + " for" + + instance.role); + map.put(instance.compInstanceName, instance); + } + return map; + } + + public static void verifyInstances(List instances, String + group, String... roles) { + assertEquals(roles.length, instances.size()); + Map map = organize(instances); + int i = 0; + for (Entry entry : map.entrySet()) { + assertEquals(roles[i], entry.getKey()); + RoleInstance instance = entry.getValue(); + assertEquals(roles[i], instance.compInstanceName); + assertEquals(group, instance.role); + assertEquals(group, instance.providerRole.name); + assertEquals(group, instance.providerRole.group); + // TODO remove group from provider role if it continues to be unused + i++; + } + } + @Test public void testDynamicFlexDown() throws Throwable { createAndStartNodes(); + List instances = appState.cloneOwnedContainerList(); + verifyInstances(instances, "group1", "group10", "group11"); + appState.updateComponents(Collections.singletonMap("group1", 0L)); createAndStartNodes(); + instances = appState.cloneOwnedContainerList(); + assertEquals(0, instances.size()); + RoleStatus roleStatus = appState.lookupRoleStatus("group1"); assertEquals(0, roleStatus.getDesired()); assertEquals(1024L, roleStatus.getResourceRequirements().getMemorySize()); assertEquals(2, roleStatus.getResourceRequirements().getVirtualCores()); assertEquals("group1", roleStatus.getGroup()); + + // now flex back up + appState.updateComponents(Collections.singletonMap("group1", 3L)); + createAndStartNodes(); + instances = appState.cloneOwnedContainerList(); + verifyInstances(instances, "group1", "group10", "group11", "group12"); + // fails because the names continue at N+1, with group12, group13, group14 } @Test public void testDynamicFlexUp() throws Throwable { createAndStartNodes(); + List instances = appState.cloneOwnedContainerList(); + verifyInstances(instances, "group1", "group10", "group11"); + appState.updateComponents(Collections.singletonMap("group1", 3L)); createAndStartNodes(); + instances = appState.cloneOwnedContainerList(); + verifyInstances(instances, "group1", "group10", "group11", "group12"); + RoleStatus group1 = appState.lookupRoleStatus("group1"); assertEquals(3, group1.getDesired()); assertEquals(1024L, group1.getResourceRequirements().getMemorySize()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.java index eca8401..7ee8cfa 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.java @@ -176,7 +176,7 @@ public RoleStatus getRole2Status() { */ public RoleInstance roleInstance(ContainerAssignment assigned) { Container target = assigned.container; - RoleInstance ri = new RoleInstance(target); + RoleInstance ri = new RoleInstance(target, assigned.role.getProviderRole()); ri.roleId = assigned.role.getPriority(); ri.role = assigned.role.getName(); return ri;