You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by jx...@apache.org on 2022/03/24 16:51:52 UTC

[helix] branch master updated: Implement deactivate rest API (#1988)

This is an automated email from the ASF dual-hosted git repository.

jxue 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 1e5aa3c  Implement deactivate rest API (#1988)
1e5aa3c is described below

commit 1e5aa3cf53f55c3d79b5b59f44a7efadd4b5d14a
Author: Qi (Quincy) Qu <qq...@linkedin.com>
AuthorDate: Thu Mar 24 09:51:46 2022 -0700

    Implement deactivate rest API (#1988)
    
    Implement deactivate REST API
    Added a new REST API for deactivating cluster from supercluster.
---
 .../java/org/apache/helix/manager/zk/ZKHelixAdmin.java   |  3 +++
 .../helix/controller/stages/TestRebalancePipeline.java   |  5 +++--
 .../helix/rest/server/resources/AbstractResource.java    |  1 +
 .../rest/server/resources/helix/ClusterAccessor.java     | 12 ++++++++++++
 .../apache/helix/rest/server/TestClusterAccessor.java    | 16 ++++++++++++++++
 5 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
index 3faa9c4..4e87776 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
@@ -1255,6 +1255,9 @@ public class ZKHelixAdmin implements HelixAdmin {
   @Override
   public void dropResource(String clusterName, String resourceName) {
     logger.info("Drop resource {} from cluster {}", resourceName, clusterName);
+    if (!ZKUtil.isClusterSetup(clusterName, _zkClient)) {
+      throw new HelixException("Cluster " + clusterName + " is not setup yet");
+    }
     HelixDataAccessor accessor =
         new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient));
     PropertyKey.Builder keyBuilder = accessor.keyBuilder();
diff --git a/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java b/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
index 8b1b7bc..40fa820 100644
--- a/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
+++ b/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
@@ -297,8 +297,10 @@ public class TestRebalancePipeline extends ZkUnitTestBase {
   @Test
   public void testChangeIdealStateWithPendingMsg() throws Exception {
     String clusterName = "CLUSTER_" + _className + "_pending";
-    System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
+    HelixAdmin admin = new ZKHelixAdmin(_gZkClient);
 
+    System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
+    admin.addCluster(clusterName);
     HelixDataAccessor accessor =
         new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<>(_gZkClient));
     HelixManager manager =
@@ -356,7 +358,6 @@ public class TestRebalancePipeline extends ZkUnitTestBase {
 
     // round2: drop resource, but keep the
     // message, make sure controller should not send O->DROPPED until O->S is done
-    HelixAdmin admin = new ZKHelixAdmin(_gZkClient);
     admin.dropResource(clusterName, resourceName);
     List<IdealState> idealStates = accessor.getChildValues(accessor.keyBuilder().idealStates(), true);
     cache.setIdealStates(idealStates);
diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
index b7d02a7..9dc49bd 100644
--- a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
+++ b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
@@ -58,6 +58,7 @@ public class AbstractResource {
 
   public enum Command {
     activate,
+    deactivate,
     addInstanceTag,
     addVirtualTopologyGroup,
     expand,
diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
index 6c14207..e0790c0 100644
--- a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
+++ b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
@@ -243,6 +243,18 @@ public class ClusterAccessor extends AbstractHelixResource {
         }
         break;
 
+      case deactivate:
+        if (superCluster == null) {
+          return badRequest("Super Cluster name is missing!");
+        }
+        try {
+          clusterSetup.activateCluster(clusterId, superCluster, false);
+        } catch (Exception ex) {
+          LOG.error("Failed to deactivate cluster {} from super cluster {}.", clusterId, superCluster);
+          return serverError(ex);
+        }
+        break;
+
       case addVirtualTopologyGroup:
         try {
           addVirtualTopologyGroup(clusterId, content);
diff --git a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
index 34cfbaf..e53c72a 100644
--- a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
+++ b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
@@ -781,6 +781,22 @@ public class TestClusterAccessor extends AbstractTestClass {
     LiveInstance leader = normalAccessor.getProperty(normKeyBuilder.controllerLeader());
     Assert.assertEquals(leader.getId(), superClusterleader);
 
+    // deactivate cluster ACTIVATE_NORM_CLUSTER from super cluster ACTIVATE_SUPER_CLUSTER
+    post("clusters/" + ACTIVATE_NORM_CLUSTER,
+        ImmutableMap.of("command", "deactivate", "superCluster", ACTIVATE_SUPER_CLUSTER),
+        Entity.entity("", MediaType.APPLICATION_JSON_TYPE), Response.Status.OK .getStatusCode());
+    idealState = accessor.getProperty(keyBuilder.idealStates(ACTIVATE_NORM_CLUSTER));
+    Assert.assertNull(idealState);
+
+    post("clusters/" + ACTIVATE_NORM_CLUSTER,
+        ImmutableMap.of("command", "activate", "superCluster", ACTIVATE_SUPER_CLUSTER),
+        Entity.entity("", MediaType.APPLICATION_JSON_TYPE), Response.Status.OK .getStatusCode());
+    idealState = accessor.getProperty(keyBuilder.idealStates(ACTIVATE_NORM_CLUSTER));
+    Assert.assertNotNull(idealState);
+    Assert.assertEquals(idealState.getRebalanceMode(), IdealState.RebalanceMode.FULL_AUTO);
+    Assert.assertEquals(idealState.getRebalancerClassName(), WagedRebalancer.class.getName());
+    Assert.assertEquals(idealState.getReplicas(), "3");
+
     // clean up by tearing down controllers and delete clusters
     for (ClusterDistributedController dc: clusterDistributedControllers) {
       if (dc != null && dc.isConnected()) {