This is an automated email from the ASF dual-hosted git repository.
jiajunwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git
The following commit(s) were added to refs/heads/master by this push:
new c24b32f Use activate/DeactivateInstances as keyword in
PartitionAssignment API (#1850)
c24b32f is described below
commit c24b32f0cf989ff1d67dcf3d572ae13a50272b45
Author: xyuanlu <[email protected]>
AuthorDate: Tue Aug 24 14:23:45 2021 -0700
Use activate/DeactivateInstances as keyword in PartitionAssignment API
(#1850)
Use activate/DeactivateInstances as keyword in PartitionAssignment API.
---
.../helix/ResourceAssignmentOptimizerAccessor.java | 165 ++++++++++-----------
.../TestResourceAssignmentOptimizerAccessor.java | 66 ++++-----
2 files changed, 111 insertions(+), 120 deletions(-)
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAssignmentOptimizerAccessor.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAssignmentOptimizerAccessor.java
index 1e35d5f..6fab112 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAssignmentOptimizerAccessor.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAssignmentOptimizerAccessor.java
@@ -22,6 +22,8 @@ package org.apache.helix.rest.server.resources.helix;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -30,7 +32,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
-import java.util.stream.Collectors;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -52,7 +53,6 @@ import org.apache.helix.model.IdealState;
import org.apache.helix.model.InstanceConfig;
import org.apache.helix.model.ResourceAssignment;
import org.apache.helix.model.ResourceConfig;
-import org.apache.helix.model.StateModelDefinition;
import org.apache.helix.rest.common.HttpConstants;
import org.apache.helix.util.HelixUtil;
import org.slf4j.Logger;
@@ -70,9 +70,8 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
new String[]{"instanceFilter", "resourceFilter", "returnFormat"};
private static class InputFields {
- List<String> newInstances = new ArrayList<>();
- List<String> instancesToRemove = new ArrayList<>();
- Map<String, String> nodeSwap = new HashMap<>(); // old instance -> new
instance.
+ Set<String> activatedInstances = new HashSet<>(); // active = online +
enabled.
+ Set<String> deactivatedInstances = new HashSet<>(); // deactive = offline
+ disabled.
Set<String> instanceFilter = new HashSet<>();
Set<String> resourceFilter = new HashSet<>();
AssignmentFormat returnFormat = AssignmentFormat.IdealStateFormat;
@@ -83,7 +82,7 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
List<InstanceConfig> instanceConfigs = new ArrayList<>();
ClusterConfig clusterConfig;
List<String> resources = new ArrayList<>();
- List<String> instances; // cluster LiveInstance + addInstances -
instancesToRemove.
+ List<String> liveInstances; // cluster LiveInstance + activatedInstances -
deactivatedInstances
}
// Result format. User can choose from IdealState or CurrentState format,
@@ -103,15 +102,13 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
}
private static class InstanceChangeMap {
- @JsonProperty("AddInstances")
- List<String> addInstances;
- @JsonProperty("RemoveInstances")
- List<String> removeInstances;
- @JsonProperty("SwapInstances")
- Map<String, String> swapInstances;
+ @JsonProperty("ActivateInstances")
+ List<String> activateInstances;
+ @JsonProperty("DeactivateInstances")
+ List<String> deactivateInstances;
}
- private enum AssignmentFormat{
+ private enum AssignmentFormat {
IdealStateFormat,
CurrentStateFormat
}
@@ -161,19 +158,17 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
}
private InputFields readInput(String content)
- throws JsonProcessingException, IllegalArgumentException {
+ throws JsonProcessingException, IllegalArgumentException {
ObjectMapper objectMapper = new ObjectMapper();
InputJsonContent inputJsonContent = objectMapper.readValue(content,
InputJsonContent.class);
InputFields inputFields = new InputFields();
if (inputJsonContent.instanceChangeMap != null) {
- Optional.ofNullable(inputJsonContent.instanceChangeMap.addInstances)
- .ifPresent(inputFields.newInstances::addAll);
- Optional.ofNullable(inputJsonContent.instanceChangeMap.removeInstances)
- .ifPresent(inputFields.instancesToRemove::addAll);
- Optional.ofNullable(inputJsonContent.instanceChangeMap.swapInstances)
- .ifPresent(inputFields.nodeSwap::putAll);
+ Optional.ofNullable(inputJsonContent.instanceChangeMap.activateInstances)
+ .ifPresent(inputFields.activatedInstances::addAll);
+
Optional.ofNullable(inputJsonContent.instanceChangeMap.deactivateInstances)
+ .ifPresent(inputFields.deactivatedInstances::addAll);
}
if (inputJsonContent.optionsMap != null) {
Optional.ofNullable(inputJsonContent.optionsMap.resourceFilter)
@@ -190,42 +185,44 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
private ClusterState readClusterStateAndValidateInput(String clusterId,
InputFields inputFields)
throws InvalidParameterException {
+ // One instance can only exist in one of the list in InstanceChange.
+ // Validate the intersection is empty.
+ validateNoIntxnInstanceChange(inputFields);
+
+ // Add instances to current liveInstances
ClusterState clusterState = new ClusterState();
ConfigAccessor cfgAccessor = getConfigAccessor();
HelixDataAccessor dataAccessor = getDataAccssor(clusterId);
clusterState.resources =
dataAccessor.getChildNames(dataAccessor.keyBuilder().idealStates());
// Add existing live instances and new instances from user input to
instances list.
- clusterState.instances =
dataAccessor.getChildNames(dataAccessor.keyBuilder().liveInstances());
- clusterState.instances.addAll(inputFields.newInstances);
-
- // Check if to be removed instances and old instances in swap node exist
in live instance.
- if (!inputFields.nodeSwap.isEmpty() ||
!inputFields.instancesToRemove.isEmpty()) {
- Set<String> liveInstanceSet = new HashSet<>(clusterState.instances);
- for (Map.Entry<String, String> nodeSwapPair :
inputFields.nodeSwap.entrySet()) {
- if (!liveInstanceSet.contains(nodeSwapPair.getKey())) {
- throw new InvalidParameterException("Invalid input: instance [" +
nodeSwapPair.getKey()
- + "] in SwapInstances does not exist in cluster.");
- }
- }
- for (String instanceToRemove : inputFields.instancesToRemove) {
- if (!liveInstanceSet.contains(instanceToRemove)) {
- throw new InvalidParameterException("Invalid input: instance [" +
instanceToRemove
- + "] in RemoveInstances does not exist in cluster.");
- }
- }
- if (!inputFields.instancesToRemove.isEmpty()) {
-
clusterState.instances.removeIf(inputFields.instancesToRemove::contains);
+ Set<String> liveInstancesSet =
+ new
HashSet<>(dataAccessor.getChildNames(dataAccessor.keyBuilder().liveInstances()));
+ liveInstancesSet.addAll(inputFields.activatedInstances);
+ liveInstancesSet.removeAll(inputFields.deactivatedInstances);
+
+ Map<String, InstanceConfig> instanceConfigMap =
+
dataAccessor.getChildValuesMap(dataAccessor.keyBuilder().instanceConfigs(),
true);
+
+ // Read instance and cluster config.
+ // Throw exception if there is no instanceConfig for activatedInstances
instance.
+ for (String instance : inputFields.activatedInstances) {
+ if (instanceConfigMap.containsKey(instance)) {
+ instanceConfigMap.get(instance).setInstanceEnabled(true);
+ } else {
+ throw new InvalidParameterException(
+ "instance: " + instance + "does not have instanceConfig");
}
}
- // Read instance and cluster config.
- // It will throw exception if there is no instanceConfig for newly added
instance.
- for (String instance : clusterState.instances) {
- InstanceConfig config = cfgAccessor.getInstanceConfig(clusterId,
instance);
- clusterState.instanceConfigs.add(config);
+ for (String instance : inputFields.deactivatedInstances) {
+ if (instanceConfigMap.containsKey(instance)) {
+ instanceConfigMap.get(instance).setInstanceEnabled(false);
+ }
}
- clusterState.clusterConfig = cfgAccessor.getClusterConfig(clusterId);
+ clusterState.clusterConfig = cfgAccessor.getClusterConfig(clusterId);
+ clusterState.liveInstances = new ArrayList<>(liveInstancesSet);
+ clusterState.instanceConfigs.addAll(instanceConfigMap.values());
return clusterState;
}
@@ -260,33 +257,12 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
}
partitionAssignments = new TreeMap<>(HelixUtil
.getIdealAssignmentForFullAuto(clusterState.clusterConfig,
clusterState.instanceConfigs,
- clusterState.instances, idealState, new
ArrayList<>(idealState.getPartitionSet()),
+ clusterState.liveInstances, idealState, new
ArrayList<>(idealState.getPartitionSet()),
rebalanceStrategy));
- instanceSwapAndFilter(inputFields, partitionAssignments, resource,
result);
+ instanceFilter(inputFields, partitionAssignments, resource, result);
} else if (idealState.getRebalanceMode() ==
IdealState.RebalanceMode.SEMI_AUTO) {
- // Use computeIdealMapping for SEMI_AUTO resource.
- Map<String, List<String>> preferenceLists =
idealState.getPreferenceLists();
- partitionAssignments = new TreeMap<>();
- HashSet<String> liveInstances = new HashSet<>(clusterState.instances);
- List<String> disabledInstance =
- clusterState.instanceConfigs.stream().filter(enabled ->
!enabled.getInstanceEnabled())
-
.map(InstanceConfig::getInstanceName).collect(Collectors.toList());
- liveInstances.removeAll(disabledInstance);
- StateModelDefinition stateModelDef = dataAccessor
-
.getProperty(dataAccessor.keyBuilder().stateModelDef(idealState.getStateModelDefRef()));
- for (String partitionName : preferenceLists.keySet()) {
- if (!preferenceLists.get(partitionName).isEmpty() &&
preferenceLists.get(partitionName)
- .get(0)
-
.equalsIgnoreCase(ResourceConfig.ResourceConfigConstants.ANY_LIVEINSTANCE.name()))
{
- partitionAssignments.put(partitionName, HelixUtil
- .computeIdealMapping(clusterState.instances, stateModelDef,
liveInstances));
- } else {
- partitionAssignments.put(partitionName, HelixUtil
- .computeIdealMapping(preferenceLists.get(partitionName),
stateModelDef,
- liveInstances));
- }
- }
- instanceSwapAndFilter(inputFields, partitionAssignments, resource,
result);
+ LOG.error(
+ "Resource" + resource + "is in SEMI_AUTO mode. Skip partition
assignment computation.");
}
}
@@ -316,6 +292,32 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
return idealStateFormatResult;
}
+ /*
+ * Return if there are instance exists in more than one lists in
InstanceChangeMap.
+ */
+ private void validateNoIntxnInstanceChange(InputFields inputFields) {
+ Set<String> tempSet = new HashSet<>();
+ List<Collection<String>> inputs = new ArrayList<>();
+ inputs.add(inputFields.activatedInstances);
+ inputs.add(inputFields.deactivatedInstances);
+ inputs.sort(Comparator.comparingInt(Collection::size));
+
+ for (int i = 0; i < inputs.size() - 1; ++i) {
+ for (String s : inputs.get(i)) {
+ if (!tempSet.add(s)) {
+ throw new InvalidParameterException("Invalid input: instance [" + s
+ + "] exist in more than one field in InstanceChange.");
+ }
+ }
+ }
+ for (String s : inputs.get(inputs.size() - 1)) {
+ if (tempSet.contains(s)) {
+ throw new InvalidParameterException(
+ "Invalid input: instance [" + s + "] exist in more than one field
in InstanceChange.");
+ }
+ }
+ }
+
private void computeWagedAssignmentResult(List<IdealState>
wagedResourceIdealState,
InputFields inputFields, ClusterState clusterState, String clusterId,
AssignmentResult result) {
@@ -331,7 +333,7 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
Map<String, ResourceAssignment> wagedAssignmentResult;
wagedAssignmentResult =
HelixUtil.getTargetAssignmentForWagedFullAuto(getZkBucketDataAccessor(),
new ZkBaseDataAccessor<>(getRealmAwareZkClient()),
clusterState.clusterConfig,
- clusterState.instanceConfigs, clusterState.instances,
wagedResourceIdealState,
+ clusterState.instanceConfigs, clusterState.liveInstances,
wagedResourceIdealState,
wagedResourceConfigs);
// Convert ResourceAssignment to plain map.
@@ -343,30 +345,23 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
Map<String, Map<String, String>> partitionAssignments = new TreeMap<>();
wagedAssignment.getValue().getMappedPartitions().forEach(partition ->
partitionAssignments
.put(partition.getPartitionName(),
wagedAssignment.getValue().getReplicaMap(partition)));
- instanceSwapAndFilter(inputFields, partitionAssignments, resource,
result);
+ instanceFilter(inputFields, partitionAssignments, resource, result);
}
}
- private void instanceSwapAndFilter(InputFields inputFields,
+ private void instanceFilter(InputFields inputFields,
Map<String, Map<String, String>> partitionAssignments, String resource,
AssignmentResult result) {
- if (!inputFields.nodeSwap.isEmpty() ||
!inputFields.instanceFilter.isEmpty()) {
+ if (!inputFields.instanceFilter.isEmpty()) {
for (Iterator<Map.Entry<String, Map<String, String>>>
partitionAssignmentIt =
partitionAssignments.entrySet().iterator();
partitionAssignmentIt.hasNext(); ) {
Map.Entry<String, Map<String, String>> partitionAssignment =
partitionAssignmentIt.next();
Map<String, String> instanceStates = partitionAssignment.getValue();
- Map<String, String> tempInstanceState = new HashMap<>();
- // Add new pairs to tempInstanceState
- instanceStates.entrySet().stream()
- .filter(entry ->
inputFields.nodeSwap.containsKey(entry.getKey())).forEach(
- entry -> tempInstanceState
- .put(inputFields.nodeSwap.get(entry.getKey()),
entry.getValue()));
- instanceStates.putAll(tempInstanceState);
// Only keep instance in instanceFilter
instanceStates.entrySet().removeIf(e ->
(!inputFields.instanceFilter.isEmpty() &&
!inputFields.instanceFilter
- .contains(e.getKey())) ||
inputFields.nodeSwap.containsKey(e.getKey()));
+ .contains(e.getKey())));
if (instanceStates.isEmpty()) {
partitionAssignmentIt.remove();
}
@@ -375,8 +370,8 @@ public class ResourceAssignmentOptimizerAccessor extends
AbstractHelixResource {
result.put(resource, partitionAssignments);
}
- private Map<String,Object> buildResponseHeaders(InputFields inputFields) {
- Map<String, Object> headers= new HashMap<>();
+ private Map<String, Object> buildResponseHeaders(InputFields inputFields) {
+ Map<String, Object> headers = new HashMap<>();
headers.put(RESPONSE_HEADER_FIELDS[0], inputFields.instanceFilter);
headers.put(RESPONSE_HEADER_FIELDS[1], inputFields.resourceFilter);
headers.put(RESPONSE_HEADER_FIELDS[2], inputFields.returnFormat.name());
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestResourceAssignmentOptimizerAccessor.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestResourceAssignmentOptimizerAccessor.java
index e5a75f5..ad8597f 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestResourceAssignmentOptimizerAccessor.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestResourceAssignmentOptimizerAccessor.java
@@ -35,6 +35,7 @@ import org.apache.helix.HelixDataAccessor;
import org.apache.helix.TestHelper;
import org.apache.helix.manager.zk.ZKHelixDataAccessor;
import org.apache.helix.model.IdealState;
+import org.apache.helix.model.InstanceConfig;
import
org.apache.helix.rest.server.resources.helix.ResourceAssignmentOptimizerAccessor;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
@@ -46,9 +47,8 @@ public class TestResourceAssignmentOptimizerAccessor extends
AbstractTestClass {
String cluster = "TestCluster_3";
String instance1 = cluster + "dummyInstance_localhost_12930";
- String swapNewInstance = "swapNewInstance";
String urlBase = "clusters/TestCluster_3/partitionAssignment/";
- String swapOldInstance, toRemoveInstance;
+ String toDeactivatedInstance, toEnabledInstance;
HelixDataAccessor helixDataAccessor;
List<String> resources;
List<String> liveInstances;
@@ -61,8 +61,14 @@ public class TestResourceAssignmentOptimizerAccessor extends
AbstractTestClass {
liveInstances =
helixDataAccessor.getChildNames(helixDataAccessor.keyBuilder().liveInstances());
Assert.assertFalse(resources.isEmpty() || liveInstances.isEmpty());
- toRemoveInstance = liveInstances.get(0);
- swapOldInstance = liveInstances.get(1);
+ toDeactivatedInstance = liveInstances.get(0);
+ toEnabledInstance = liveInstances.get(2);
+ InstanceConfig config = _gSetupTool.getClusterManagementTool()
+ .getInstanceConfig(cluster, toEnabledInstance);
+ config.setInstanceEnabled(false);
+ _gSetupTool.getClusterManagementTool()
+ .setInstanceConfig(cluster, toEnabledInstance, config);
+
}
@AfterClass
@@ -73,6 +79,12 @@ public class TestResourceAssignmentOptimizerAccessor extends
AbstractTestClass {
idealState.setRebalanceMode(IdealState.RebalanceMode.SEMI_AUTO);
_gSetupTool.getClusterManagementTool().setResourceIdealState(cluster,
resource, idealState);
}
+ InstanceConfig config = _gSetupTool.getClusterManagementTool()
+ .getInstanceConfig(cluster, toEnabledInstance);
+ config.setInstanceEnabled(true);
+ _gSetupTool.getClusterManagementTool()
+ .setInstanceConfig(cluster, toEnabledInstance, config);
+
}
@Test
@@ -89,9 +101,8 @@ public class TestResourceAssignmentOptimizerAccessor extends
AbstractTestClass {
}
// Test AddInstances, RemoveInstances and SwapInstances
- String payload = "{\"InstanceChange\" : { \"AddInstances\" : [\"" +
instance1
- + "\"], \"RemoveInstances\" : [ \"" + toRemoveInstance + "\"],
\"SwapInstances\" : {\""
- + swapOldInstance + "\" : \"" + swapNewInstance + "\"} }} ";
+ String payload = "{\"InstanceChange\" : { \"ActivateInstances\" : [\"" +
toEnabledInstance + "\"],"
+ + "\"DeactivateInstances\" : [ \"" + toDeactivatedInstance + "\"] }}
";
Response response = post(urlBase, null, Entity.entity(payload,
MediaType.APPLICATION_JSON_TYPE),
Response.Status.OK.getStatusCode(), true);
Map<String, Map<String, Map<String, String>>> resourceAssignments =
OBJECT_MAPPER
@@ -100,10 +111,8 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
});
Set<String> hostSet = new HashSet<>();
resourceAssignments.forEach((k, v) -> v.forEach((kk, vv) ->
hostSet.addAll(vv.keySet())));
- Assert.assertTrue(hostSet.contains(instance1));
- Assert.assertTrue(hostSet.contains(swapNewInstance));
- Assert.assertFalse(hostSet.contains(liveInstances.get(0)));
- Assert.assertFalse(hostSet.contains(liveInstances.get(1)));
+ Assert.assertTrue(hostSet.contains(toEnabledInstance));
+ Assert.assertFalse(hostSet.contains(toDeactivatedInstance));
// Validate header
MultivaluedMap<String, Object> headers = response.getHeaders();
Assert.assertTrue(headers.containsKey(ResourceAssignmentOptimizerAccessor.RESPONSE_HEADER_KEY));
@@ -175,10 +184,9 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
partitionAssignmentMetadata3.get(0).toString());
// Test Option CurrentState format with AddInstances, RemoveInstances and
SwapInstances
- String payload4 = "{\"InstanceChange\" : { \"AddInstances\" : [\"" +
instance1
- + "\"], \"RemoveInstances\" : [ \"" + toRemoveInstance + "\"],
\"SwapInstances\" : {\""
- + swapOldInstance + "\" : \"" + swapNewInstance
- + "\"} }, \"Options\" : { \"ReturnFormat\" : \"CurrentStateFormat\" ,
\"ResourceFilter\" : [\""
+ String payload4 = "{\"InstanceChange\" : { \"ActivateInstances\" : [\"" +
toEnabledInstance
+ + "\"], \"DeactivateInstances\" : [ \"" + toDeactivatedInstance + "\"]
"
+ + "}, \"Options\" : { \"ReturnFormat\" : \"CurrentStateFormat\" ,
\"ResourceFilter\" : [\""
+ resources.get(0) + "\" , \"" + resources.get(1) + "\"]} } ";
Response response4 =
post(urlBase, null, Entity.entity(payload4,
MediaType.APPLICATION_JSON_TYPE),
@@ -187,16 +195,11 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
Map<String, Map<String, Map<String, String>>> resourceAssignments4 =
OBJECT_MAPPER
.readValue(body4, new TypeReference<HashMap<String, Map<String,
Map<String, String>>>>() {
});
- // Validate outer map key is instance
+ // Validate target resources exist
Set<String> resource4 = new HashSet<>();
resourceAssignments4.forEach((k, v) -> v.forEach((kk, vv) ->
resource4.add(kk)));
Assert.assertTrue(resource4.contains(resources.get(0)));
Assert.assertTrue(resource4.contains(resources.get(1)));
- // First inner map key is resource
- Assert.assertTrue(resourceAssignments4.containsKey(instance1));
- Assert.assertTrue(resourceAssignments4.containsKey(swapNewInstance));
- Assert.assertFalse(resourceAssignments4.containsKey(liveInstances.get(0)));
- Assert.assertFalse(resourceAssignments4.containsKey(liveInstances.get(1)));
// Validate header
MultivaluedMap<String, Object> headers4 = response4.getHeaders();
Assert
@@ -231,9 +234,8 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
}
// Test AddInstances, RemoveInstances and SwapInstances
- String payload = "{\"InstanceChange\" : { \"AddInstances\" : [\"" +
instance1
- + "\"], \"RemoveInstances\" : [ \"" + toRemoveInstance + "\"],
\"SwapInstances\" : {\""
- + swapOldInstance + "\" : \"" + swapNewInstance + "\"} }} ";
+ String payload = "{\"InstanceChange\" : { \"ActivateInstances\" : [\"" +
toEnabledInstance
+ + "\"], \"DeactivateInstances\" : [ \"" + toDeactivatedInstance + "\"]
}} ";
String body = post(urlBase, null, Entity.entity(payload,
MediaType.APPLICATION_JSON_TYPE),
Response.Status.OK.getStatusCode(), true).readEntity(String.class);
Map<String, Map<String, Map<String, String>>> resourceAssignments =
OBJECT_MAPPER
@@ -241,10 +243,8 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
});
Set<String> hostSet = new HashSet<>();
resourceAssignments.forEach((k, v) -> v.forEach((kk, vv) ->
hostSet.addAll(vv.keySet())));
- Assert.assertTrue(hostSet.contains(instance1));
- Assert.assertTrue(hostSet.contains(swapNewInstance));
- Assert.assertFalse(hostSet.contains(liveInstances.get(0)));
- Assert.assertFalse(hostSet.contains(liveInstances.get(1)));
+ Assert.assertTrue(hostSet.contains(toEnabledInstance));
+ Assert.assertFalse(hostSet.contains(toDeactivatedInstance));
// Test partitionAssignment host filter
String payload2 = "{\"Options\" : { \"InstanceFilter\" : [\"" +
liveInstances.get(0) + "\" , \""
@@ -279,20 +279,16 @@ public class TestResourceAssignmentOptimizerAccessor
extends AbstractTestClass {
System.out.println("Start test :" + TestHelper.getTestMethodName());
// Test negative input
- String payload4 = "{\"InstanceChange\" : { \"AddInstances\" : [\"
nonExistInstanceName \"] }} ";
+ String payload4 = "{\"InstanceChange\" : { \"ActivateInstances\" : [\"
nonExistInstanceName \"] }} ";
post(urlBase, null, Entity.entity(payload4,
MediaType.APPLICATION_JSON_TYPE),
Response.Status.BAD_REQUEST.getStatusCode(), true);
String payload5 =
- "{\"InstanceChange\" : { \"RemoveInstances\" : [\"
nonExistInstanceName \"] }} ";
+ "{\"InstanceChange\" : { { \"ActivateInstances\" : [\"" +
toDeactivatedInstance
+ + "\"], \"DeactivateInstances\" : [\"" + toDeactivatedInstance +
"\"] }} ";
post(urlBase, null, Entity.entity(payload5,
MediaType.APPLICATION_JSON_TYPE),
Response.Status.BAD_REQUEST.getStatusCode(), true);
- String payload6 =
- "{\"InstanceChange\" : { \"SwapInstances\" : {\" nonExistInstanceName
\" : \" swapNewInstance \"} }} ";
- post(urlBase, null, Entity.entity(payload6,
MediaType.APPLICATION_JSON_TYPE),
- Response.Status.BAD_REQUEST.getStatusCode(), true);
-
System.out.println("End test :" + TestHelper.getTestMethodName());
}
}
\ No newline at end of file