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

mmerli 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 cbe8900  [pulsar-broker] support remove-ttl api for V1 namespace 
(#12121)
cbe8900 is described below

commit cbe8900ae3ed857a14412b4e23c273d97adb7747
Author: Rajan Dhabalia <rdhaba...@apache.org>
AuthorDate: Wed Sep 22 15:44:36 2021 -0700

    [pulsar-broker] support remove-ttl api for V1 namespace (#12121)
---
 .../apache/pulsar/broker/admin/v1/Namespaces.java  | 14 +++++++++-
 .../pulsar/broker/admin/TopicMessageTTLTest.java   | 30 +++++++++++++++++-----
 2 files changed, 37 insertions(+), 7 deletions(-)

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 03849ec..dac7e44 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
@@ -331,7 +331,7 @@ public class Namespaces extends NamespacesBase {
     @ApiOperation(hidden = true, value = "Get the message TTL for the 
namespace")
     @ApiResponses(value = { @ApiResponse(code = 403, message = "Don't have 
admin permission"),
             @ApiResponse(code = 404, message = "Property or cluster or 
namespace doesn't exist") })
-    public int getNamespaceMessageTTL(@PathParam("property") String property, 
@PathParam("cluster") String cluster,
+    public Integer getNamespaceMessageTTL(@PathParam("property") String 
property, @PathParam("cluster") String cluster,
             @PathParam("namespace") String namespace) {
         validateNamespaceName(property, cluster, namespace);
         validateNamespacePolicyOperation(NamespaceName.get(property, 
namespace), PolicyName.TTL, PolicyOperation.READ);
@@ -352,6 +352,18 @@ public class Namespaces extends NamespacesBase {
         internalSetNamespaceMessageTTL(messageTTL);
     }
 
+    @DELETE
+    @Path("/{property}/{cluster}/{namespace}/messageTTL")
+    @ApiOperation(value = "Set message TTL in seconds for namespace")
+    @ApiResponses(value = { @ApiResponse(code = 403, message = "Don't have 
admin permission"),
+            @ApiResponse(code = 404, message = "Tenant or cluster or namespace 
doesn't exist"),
+            @ApiResponse(code = 412, message = "Invalid TTL") })
+    public void removeNamespaceMessageTTL(@PathParam("property") String 
property, @PathParam("cluster") String cluster,
+            @PathParam("namespace") String namespace) {
+        validateNamespaceName(property, cluster, namespace);
+        internalSetNamespaceMessageTTL(null);
+    }
+
     @GET
     @Path("/{property}/{cluster}/{namespace}/subscriptionExpirationTime")
     @ApiOperation(hidden = true, value = "Get the subscription expiration time 
for the namespace")
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicMessageTTLTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicMessageTTLTest.java
index 4a2c728..746b1a1 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicMessageTTLTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicMessageTTLTest.java
@@ -33,6 +33,7 @@ import org.eclipse.jetty.http.HttpStatus;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import java.lang.reflect.Method;
@@ -43,11 +44,9 @@ import java.util.UUID;
 public class TopicMessageTTLTest extends MockedPulsarServiceBaseTest {
 
     private final String testTenant = "my-tenant";
-
+    private final String testCluster = "test";
     private final String testNamespace = "my-namespace";
-
     private final String myNamespace = testTenant + "/" + testNamespace;
-
     private final String testTopic = "persistent://" + myNamespace + 
"/test-topic-message-ttl";
 
     @BeforeMethod
@@ -59,10 +58,10 @@ public class TopicMessageTTLTest extends 
MockedPulsarServiceBaseTest {
         this.conf.setTtlDurationDefaultInSeconds(3600);
         super.internalSetup();
 
-        admin.clusters().createCluster("test", 
ClusterData.builder().serviceUrl(pulsar.getWebServiceAddress()).build());
-        TenantInfoImpl tenantInfo = new 
TenantInfoImpl(Sets.newHashSet("role1", "role2"), Sets.newHashSet("test"));
+        admin.clusters().createCluster(testCluster, 
ClusterData.builder().serviceUrl(pulsar.getWebServiceAddress()).build());
+        TenantInfoImpl tenantInfo = new 
TenantInfoImpl(Sets.newHashSet("role1", "role2"), Sets.newHashSet(testCluster));
         admin.tenants().createTenant(this.testTenant, tenantInfo);
-        admin.namespaces().createNamespace(testTenant + "/" + testNamespace, 
Sets.newHashSet("test"));
+        admin.namespaces().createNamespace(testTenant + "/" + testNamespace, 
Sets.newHashSet(testCluster));
         admin.topics().createPartitionedTopic(testTopic, 2);
         Producer producer = pulsarClient.newProducer().topic(testTenant + "/" 
+ testNamespace + "/" + "dummy-topic").create();
         producer.close();
@@ -75,6 +74,11 @@ public class TopicMessageTTLTest extends 
MockedPulsarServiceBaseTest {
         super.internalCleanup();
     }
 
+    @DataProvider(name = "isV1")
+    public Object[][] isV1() {
+        return new Object[][] { { true }, { false } };
+    }
+
     @Test
     public void testSetThenRemoveMessageTTL() throws Exception {
         admin.topics().setMessageTTL(testTopic, 100);
@@ -181,6 +185,20 @@ public class TopicMessageTTLTest extends 
MockedPulsarServiceBaseTest {
         Assert.assertEquals((int) ((CompletableFuture<Integer>) 
method.invoke(persistentTopic)).join(), 3600);
     }
 
+    @Test(dataProvider = "isV1")
+    public void testNamespaceTTL(boolean isV1) throws Exception {
+        String myNamespace = testTenant + "/" + (isV1 ? testCluster + "/" : 
"") + "n1"+isV1;
+        admin.namespaces().createNamespace(myNamespace, 
Sets.newHashSet(testCluster));
+
+        admin.namespaces().setNamespaceMessageTTL(myNamespace, 10);
+        Awaitility.await().untilAsserted(()
+                -> 
Assert.assertEquals(admin.namespaces().getNamespaceMessageTTL(myNamespace).intValue(),
 10));
+
+        admin.namespaces().removeNamespaceMessageTTL(myNamespace);
+        Awaitility.await().untilAsserted(()
+                -> 
Assert.assertNull(admin.namespaces().getNamespaceMessageTTL(myNamespace)));
+    }
+
     @Test(timeOut = 20000)
     public void testDifferentLevelPolicyApplied() throws Exception {
         final String topicName = testTopic + UUID.randomUUID();

Reply via email to