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

Reply via email to