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

chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new e9ffe0ba7c1 KAFKA-18808 add test to ensure the name=<default> is not 
equal to default quota (#18966)
e9ffe0ba7c1 is described below

commit e9ffe0ba7c125219c2c00148a9e6174c8ce0a6d9
Author: Nick Guo <[email protected]>
AuthorDate: Tue Mar 18 01:57:24 2025 +0800

    KAFKA-18808 add test to ensure the name=<default> is not equal to default 
quota (#18966)
    
    see discussion in
    [KAFKA-18735](https://issues.apache.org/jira/browse/KAFKA-18735) - the
    test should include following check.
    
    1. Using name=<default> does not create default quota
    2. the returned entity should have name=<default>
    2. the filter `ClientQuotaFilterComponent.ofDefaultEntity` should return
    nothing
    
    Reviewers: Chia-Ping Tsai <[email protected]>
---
 .../kafka/api/PlaintextAdminIntegrationTest.scala  | 59 +++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git 
a/core/src/test/scala/integration/kafka/api/PlaintextAdminIntegrationTest.scala 
b/core/src/test/scala/integration/kafka/api/PlaintextAdminIntegrationTest.scala
index af2a27fdf4f..87f66cd8d0e 100644
--- 
a/core/src/test/scala/integration/kafka/api/PlaintextAdminIntegrationTest.scala
+++ 
b/core/src/test/scala/integration/kafka/api/PlaintextAdminIntegrationTest.scala
@@ -42,7 +42,7 @@ import org.apache.kafka.common.config.{ConfigResource, 
LogLevelConfig, SslConfig
 import org.apache.kafka.common.errors._
 import org.apache.kafka.common.internals.Topic
 import org.apache.kafka.common.KafkaException
-import org.apache.kafka.common.quota.{ClientQuotaAlteration, 
ClientQuotaEntity, ClientQuotaFilter}
+import org.apache.kafka.common.quota.{ClientQuotaAlteration, 
ClientQuotaEntity, ClientQuotaFilter, ClientQuotaFilterComponent}
 import org.apache.kafka.common.record.FileRecords
 import org.apache.kafka.common.requests.DeleteRecordsRequest
 import org.apache.kafka.common.resource.{PatternType, ResourcePattern, 
ResourceType}
@@ -138,6 +138,63 @@ class PlaintextAdminIntegrationTest extends 
BaseAdminIntegrationTest {
     assertEquals(configEntries, quotaEntities.get(entity).asScala)
   }
 
+  @Test
+  def testDefaultNameQuotaIsNotEqualToDefaultQuota(): Unit = {
+    val config = createConfig
+    val defaultQuota = "<default>"
+    client = Admin.create(config)
+
+    //"<default>" can not create default quota
+    val userEntity = new ClientQuotaEntity(Map(ClientQuotaEntity.USER -> 
defaultQuota).asJava)
+    val clientEntity = new ClientQuotaEntity(Map(ClientQuotaEntity.CLIENT_ID 
-> defaultQuota).asJava)
+    val userAlterations = new ClientQuotaAlteration(userEntity,
+      Collections.singleton(new ClientQuotaAlteration.Op("consumer_byte_rate", 
10000D)))
+    val clientAlterations = new ClientQuotaAlteration(clientEntity,
+      Collections.singleton(new ClientQuotaAlteration.Op("producer_byte_rate", 
10000D)))
+    val alterations = List(userAlterations, clientAlterations)
+    client.alterClientQuotas(alterations.asJava).all().get()
+
+    TestUtils.waitUntilTrue(() => {
+      try {
+        //check "<default>" as a default quota use
+        val userDefaultQuotas = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofDefaultEntity(ClientQuotaEntity.USER)))).entities().get()
+        val clientDefaultQuotas = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofDefaultEntity(ClientQuotaEntity.CLIENT_ID)))).entities().get()
+
+        //check "<default>" as a normal quota use
+        val userNormalQuota = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofEntity(ClientQuotaEntity.USER,defaultQuota)))).entities().get()
+        val clientNormalQuota = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofEntity(ClientQuotaEntity.CLIENT_ID,defaultQuota)))).entities().get()
+
+        userDefaultQuotas.size() == 0 && clientDefaultQuotas.size() == 0 && 
userNormalQuota.size() == 1 && clientNormalQuota.size() == 1
+      } catch {
+        case _: Exception => false
+      }
+    }, "Timed out waiting for quota config to be propagated to all servers")
+
+    //null can create default quota
+    val userDefaultEntity = new ClientQuotaEntity(Map(ClientQuotaEntity.USER 
-> Option.empty[String].orNull).asJava)
+    client.alterClientQuotas(List(new ClientQuotaAlteration(userDefaultEntity, 
Collections.singleton(
+            new ClientQuotaAlteration.Op("consumer_byte_rate", 
100D)))).asJava).all().get()
+    val clientDefaultEntity = new 
ClientQuotaEntity(Map(ClientQuotaEntity.CLIENT_ID -> 
Option.empty[String].orNull).asJava)
+    client.alterClientQuotas(List(new 
ClientQuotaAlteration(clientDefaultEntity, Collections.singleton(
+      new ClientQuotaAlteration.Op("producer_byte_rate", 
100D)))).asJava).all().get()
+
+    TestUtils.waitUntilTrue(() => {
+      try {
+        val userDefaultQuota = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofDefaultEntity(ClientQuotaEntity.USER)))).entities().get()
+        val clientDefaultQuota = 
client.describeClientQuotas(ClientQuotaFilter.containsOnly(Collections.singletonList(
+          
ClientQuotaFilterComponent.ofDefaultEntity(ClientQuotaEntity.CLIENT_ID)))).entities().get()
+        userDefaultQuota.size() == 1 && clientDefaultQuota.size() == 1
+      } catch {
+        case _: Exception => false
+      }
+    }, "Timed out waiting for quota config to be propagated to all servers")
+  }
+
   @Test
   def testDescribeUserScramCredentials(): Unit = {
     client = createAdminClient

Reply via email to