You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by si...@apache.org on 2019/06/14 10:50:43 UTC
[pulsar] branch master updated: [pulsar-broker] add cli/admin api
to delete bookie-affinity group (#4471)
This is an automated email from the ASF dual-hosted git repository.
sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new 6636c79 [pulsar-broker] add cli/admin api to delete bookie-affinity group (#4471)
6636c79 is described below
commit 6636c7927b7601dae78bc6253d423bbcb7128f7d
Author: Rajan Dhabalia <rd...@apache.org>
AuthorDate: Fri Jun 14 03:50:38 2019 -0700
[pulsar-broker] add cli/admin api to delete bookie-affinity group (#4471)
### Motivation
This PR is on top of #4458. It adds support to delete bookie-affinity group using cli/admin api.
---
.../pulsar/broker/admin/impl/NamespacesBase.java | 4 ++
.../apache/pulsar/broker/admin/v1/Namespaces.java | 14 +++-
.../apache/pulsar/broker/admin/v2/Namespaces.java | 16 ++++-
.../broker/service/BrokerBookieIsolationTest.java | 81 +++++++++++++++++++++-
.../org/apache/pulsar/client/admin/Namespaces.java | 7 ++
.../client/admin/internal/NamespacesImpl.java | 11 +++
.../pulsar/admin/cli/PulsarAdminToolTest.java | 3 +
.../org/apache/pulsar/admin/cli/CmdNamespaces.java | 15 +++-
8 files changed, 146 insertions(+), 5 deletions(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
index 12fb243..c6b7806 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
@@ -637,6 +637,10 @@ public abstract class NamespacesBase extends AdminResource {
}
}
+ protected void internalDeleteBookieAffinityGroup() {
+ internalSetBookieAffinityGroup(null);
+ }
+
protected BookieAffinityGroupData internalGetBookieAffinityGroup() {
validateSuperUserAccess();
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
index d74feae..0fec21d 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
@@ -575,7 +575,19 @@ public class Namespaces extends NamespacesBase {
validateNamespaceName(property, cluster, namespace);
return internalGetBookieAffinityGroup();
}
-
+
+ @DELETE
+ @Path("/{property}/{cluster}/{namespace}/persistence/bookieAffinity")
+ @ApiOperation(hidden = true, value = "Delete the bookie-affinity-group from namespace-local policy.")
+ @ApiResponses(value = { @ApiResponse(code = 403, message = "Don't have admin permission"),
+ @ApiResponse(code = 404, message = "Namespace does not exist"),
+ @ApiResponse(code = 409, message = "Concurrent modification") })
+ public void deleteBookieAffinityGroup(@PathParam("property") String property, @PathParam("cluster") String cluster,
+ @PathParam("namespace") String namespace) {
+ validateNamespaceName(property, cluster, namespace);
+ internalDeleteBookieAffinityGroup();
+ }
+
@GET
@Path("/{property}/{cluster}/{namespace}/persistence")
@ApiOperation(hidden = true, value = "Get the persistence configuration for a namespace.")
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
index 09b9928..d29972e 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
@@ -506,7 +506,7 @@ public class Namespaces extends NamespacesBase {
@GET
@Path("/{property}/{namespace}/persistence/bookieAffinity")
- @ApiOperation(hidden = true, value = "Get the bookie-affinity-group from namespace-local policy.")
+ @ApiOperation(value = "Get the bookie-affinity-group from namespace-local policy.")
@ApiResponses(value = { @ApiResponse(code = 403, message = "Don't have admin permission"),
@ApiResponse(code = 404, message = "Namespace does not exist"),
@ApiResponse(code = 409, message = "Concurrent modification") })
@@ -515,7 +515,19 @@ public class Namespaces extends NamespacesBase {
validateNamespaceName(property, namespace);
return internalGetBookieAffinityGroup();
}
-
+
+ @DELETE
+ @Path("/{property}/{namespace}/persistence/bookieAffinity")
+ @ApiOperation(value = "Delete the bookie-affinity-group from namespace-local policy.")
+ @ApiResponses(value = { @ApiResponse(code = 403, message = "Don't have admin permission"),
+ @ApiResponse(code = 404, message = "Namespace does not exist"),
+ @ApiResponse(code = 409, message = "Concurrent modification") })
+ public void deleteBookieAffinityGroup(@PathParam("property") String property,
+ @PathParam("namespace") String namespace) {
+ validateNamespaceName(property, namespace);
+ internalDeleteBookieAffinityGroup();
+ }
+
@GET
@Path("/{tenant}/{namespace}/persistence")
@ApiOperation(value = "Get the persistence configuration for a namespace.")
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBookieIsolationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBookieIsolationTest.java
index 2ada2ec..edad08c 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBookieIsolationTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBookieIsolationTest.java
@@ -49,6 +49,7 @@ import org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl;
import org.apache.pulsar.broker.service.persistent.PersistentTopic;
import org.apache.pulsar.client.admin.PulsarAdmin;
import org.apache.pulsar.client.admin.PulsarAdminException;
+import org.apache.pulsar.client.admin.PulsarAdminException.NotFoundException;
import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.Producer;
import org.apache.pulsar.client.api.ProducerBuilder;
@@ -249,7 +250,6 @@ public class BrokerBookieIsolationTest {
*/
@Test
public void testBookieIsilationWithSecondaryGroup() throws Exception {
-
final String tenant1 = "tenant1";
final String cluster = "use";
final String ns1 = String.format("%s/%s/%s", tenant1, cluster, "ns1");
@@ -374,6 +374,85 @@ public class BrokerBookieIsolationTest {
}
}
+ @Test
+ public void testDeleteIsolationGroup() throws Exception {
+
+ final String tenant1 = "tenant1";
+ final String cluster = "use";
+ final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
+ final String ns3 = String.format("%s/%s/%s", tenant1, cluster, "ns3");
+
+ final String brokerBookkeeperClientIsolationGroups = "default-group";
+ final String tenantNamespaceIsolationGroupsPrimary = "tenant1-isolation-primary";
+ final String tenantNamespaceIsolationGroupsSecondary = "tenant1-isolation=secondary";
+
+ BookieServer[] bookies = bkEnsemble.getBookies();
+ ZooKeeper zkClient = bkEnsemble.getZkClient();
+
+ Set<BookieSocketAddress> defaultBookies = Sets.newHashSet(bookies[0].getLocalAddress(),
+ bookies[1].getLocalAddress());
+ Set<BookieSocketAddress> isolatedBookies = Sets.newHashSet(bookies[2].getLocalAddress(),
+ bookies[3].getLocalAddress());
+
+ setDefaultIsolationGroup(brokerBookkeeperClientIsolationGroups, zkClient, defaultBookies);
+ // primary group empty
+ setDefaultIsolationGroup(tenantNamespaceIsolationGroupsPrimary, zkClient, Sets.newHashSet());
+ setDefaultIsolationGroup(tenantNamespaceIsolationGroupsSecondary, zkClient, isolatedBookies);
+
+ ServiceConfiguration config = new ServiceConfiguration();
+ config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
+ config.setClusterName(cluster);
+ config.setWebServicePort(Optional.of(PRIMARY_BROKER_WEBSERVICE_PORT));
+ config.setZookeeperServers("127.0.0.1" + ":" + ZOOKEEPER_PORT);
+ config.setBrokerServicePort(Optional.of(PRIMARY_BROKER_PORT));
+ config.setAdvertisedAddress("localhost");
+ config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
+
+ config.setManagedLedgerDefaultEnsembleSize(2);
+ config.setManagedLedgerDefaultWriteQuorum(2);
+ config.setManagedLedgerDefaultAckQuorum(2);
+
+ config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
+ pulsarService = new PulsarService(config);
+ pulsarService.start();
+
+ URL brokerUrl = new URL("http://127.0.0.1" + ":" + PRIMARY_BROKER_WEBSERVICE_PORT);
+ PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(brokerUrl.toString()).build();
+
+ ClusterData clusterData = new ClusterData(pulsarService.getWebServiceAddress());
+ admin.clusters().createCluster(cluster, clusterData);
+ TenantInfo tenantInfo = new TenantInfo(null, Sets.newHashSet(cluster));
+ admin.tenants().createTenant(tenant1, tenantInfo);
+ admin.namespaces().createNamespace(ns2);
+ admin.namespaces().createNamespace(ns3);
+
+ // (1) set affinity-group
+ admin.namespaces().setBookieAffinityGroup(ns2, new BookieAffinityGroupData(
+ tenantNamespaceIsolationGroupsPrimary, tenantNamespaceIsolationGroupsSecondary));
+ admin.namespaces().setBookieAffinityGroup(ns3, new BookieAffinityGroupData(
+ tenantNamespaceIsolationGroupsPrimary, tenantNamespaceIsolationGroupsSecondary));
+
+ // (2) get affinity-group
+ assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), new BookieAffinityGroupData(
+ tenantNamespaceIsolationGroupsPrimary, tenantNamespaceIsolationGroupsSecondary));
+ assertEquals(admin.namespaces().getBookieAffinityGroup(ns3), new BookieAffinityGroupData(
+ tenantNamespaceIsolationGroupsPrimary, tenantNamespaceIsolationGroupsSecondary));
+
+ // (3) delete affinity-group
+ admin.namespaces().deleteBookieAffinityGroup(ns2);
+
+ try {
+ admin.namespaces().getBookieAffinityGroup(ns2);
+ fail("should have fail due to affinity-group not present");
+ } catch (NotFoundException e) {
+ // Ok
+ }
+
+ assertEquals(admin.namespaces().getBookieAffinityGroup(ns3), new BookieAffinityGroupData(
+ tenantNamespaceIsolationGroupsPrimary, tenantNamespaceIsolationGroupsSecondary));
+
+ }
+
private void assertAffinityBookies(LedgerManager ledgerManager, List<LedgerInfo> ledgers1,
Set<BookieSocketAddress> defaultBookies) throws Exception {
for (LedgerInfo lInfo : ledgers1) {
diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/Namespaces.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/Namespaces.java
index 3866c49..a828993 100644
--- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/Namespaces.java
+++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/Namespaces.java
@@ -775,6 +775,13 @@ public interface Namespaces {
void setBookieAffinityGroup(String namespace, BookieAffinityGroupData bookieAffinityGroup)
throws PulsarAdminException;
+ /**
+ * Delete bookie affinity group configured for a namespace.
+ *
+ * @param namespace
+ * @throws PulsarAdminException
+ */
+ void deleteBookieAffinityGroup(String namespace) throws PulsarAdminException;
/**
* Get bookie affinity group configured for a namespace.
diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java
index c6540f6..08f7b87 100644
--- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java
+++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java
@@ -416,6 +416,17 @@ public class NamespacesImpl extends BaseResource implements Namespaces {
}
@Override
+ public void deleteBookieAffinityGroup(String namespace) throws PulsarAdminException {
+ try {
+ NamespaceName ns = NamespaceName.get(namespace);
+ WebTarget path = namespacePath(ns, "persistence", "bookieAffinity");
+ request(path).delete(ErrorData.class);
+ } catch (Exception e) {
+ throw getApiException(e);
+ }
+ }
+
+ @Override
public BookieAffinityGroupData getBookieAffinityGroup(String namespace) throws PulsarAdminException {
try {
NamespaceName ns = NamespaceName.get(namespace);
diff --git a/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/PulsarAdminToolTest.java b/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/PulsarAdminToolTest.java
index 96d4741..e3b35f3 100644
--- a/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/PulsarAdminToolTest.java
+++ b/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/PulsarAdminToolTest.java
@@ -289,6 +289,9 @@ public class PulsarAdminToolTest {
namespaces.run(split("get-bookie-affinity-group myprop/clust/ns1"));
verify(mockNamespaces).getBookieAffinityGroup("myprop/clust/ns1");
+ namespaces.run(split("delete-bookie-affinity-group myprop/clust/ns1"));
+ verify(mockNamespaces).deleteBookieAffinityGroup("myprop/clust/ns1");
+
namespaces.run(split("unload myprop/clust/ns1"));
verify(mockNamespaces).unload("myprop/clust/ns1");
diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java
index a837f6c..5a996e4 100644
--- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java
+++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java
@@ -442,7 +442,19 @@ public class CmdNamespaces extends CmdBase {
new BookieAffinityGroupData(bookieAffinityGroupNamePrimary, bookieAffinityGroupNameSecondary));
}
}
-
+
+ @Parameters(commandDescription = "Set the bookie-affinity group name")
+ private class DeleteBookieAffinityGroup extends CliCommand {
+ @Parameter(description = "tenant/namespace", required = true)
+ private java.util.List<String> params;
+
+ @Override
+ void run() throws PulsarAdminException {
+ String namespace = validateNamespace(params);
+ admin.namespaces().deleteBookieAffinityGroup(namespace);
+ }
+ }
+
@Parameters(commandDescription = "Get the bookie-affinity group name")
private class GetBookieAffinityGroup extends CliCommand {
@Parameter(description = "tenant/namespace\n", required = true)
@@ -1162,6 +1174,7 @@ public class CmdNamespaces extends CmdBase {
jcommander.addCommand("set-bookie-affinity-group", new SetBookieAffinityGroup());
jcommander.addCommand("get-bookie-affinity-group", new GetBookieAffinityGroup());
+ jcommander.addCommand("delete-bookie-affinity-group", new DeleteBookieAffinityGroup());
jcommander.addCommand("unload", new Unload());