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()) {