This is an automated email from the ASF dual-hosted git repository.
manikumar 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 c32b7e5 KAFKA-7037: Improve the topic command description of `--topic` option
c32b7e5 is described below
commit c32b7e5a9f494dc4ef9c04bca6f73902269e1d49
Author: Vahid Hashemian <vahidhashemian@us.ibm.com>
AuthorDate: Wed Nov 28 16:16:45 2018 +0530
KAFKA-7037: Improve the topic command description of `--topic` option
Author: Vahid Hashemian <vahidhashemian@us.ibm.com>
Reviewers: Manikumar Reddy <manikumar.reddy@gmail.com>
Closes #5193 from vahidhashemian/KAFKA-7037
---
core/src/main/scala/kafka/admin/TopicCommand.scala | 5 ++--
.../scala/unit/kafka/admin/TopicCommandTest.scala | 33 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/core/src/main/scala/kafka/admin/TopicCommand.scala b/core/src/main/scala/kafka/admin/TopicCommand.scala
index 9d28452..37dd233 100755
--- a/core/src/main/scala/kafka/admin/TopicCommand.scala
+++ b/core/src/main/scala/kafka/admin/TopicCommand.scala
@@ -308,8 +308,9 @@ object TopicCommand extends Logging {
val deleteOpt = parser.accepts("delete", "Delete a topic")
val alterOpt = parser.accepts("alter", "Alter the number of partitions, replica assignment,
and/or configuration for the topic.")
val describeOpt = parser.accepts("describe", "List details for the given topics.")
- val topicOpt = parser.accepts("topic", "The topic to be create, alter or describe. Can
also accept a regular " +
- "expression except for --create option")
+ val topicOpt = parser.accepts("topic", "The topic to create, alter, describe or delete.
It also accepts a regular " +
+ "expression, except for --create option. Put topic
name in double quotes and use the '\\' prefix " +
+ "to escape regular expression symbols; e.g. \"test\\.topic\".")
.withRequiredArg
.describedAs("topic")
.ofType(classOf[String])
diff --git a/core/src/test/scala/unit/kafka/admin/TopicCommandTest.scala b/core/src/test/scala/unit/kafka/admin/TopicCommandTest.scala
index a469f8e..5d2d873 100644
--- a/core/src/test/scala/unit/kafka/admin/TopicCommandTest.scala
+++ b/core/src/test/scala/unit/kafka/admin/TopicCommandTest.scala
@@ -278,4 +278,37 @@ class TopicCommandTest extends ZooKeeperTestHarness with Logging with
RackAwareT
assertTrue(output.contains(topic))
assertFalse(output.contains(Topic.GROUP_METADATA_TOPIC_NAME))
}
+
+ @Test
+ def testTopicOperationsWithRegexSymbolInTopicName(): Unit = {
+ val topic1 = "test.topic"
+ val topic2 = "test-topic"
+ val escapedTopic = "\"test\\.topic\""
+ val unescapedTopic = "test.topic"
+ val numPartitionsOriginal = 1
+
+ // create brokers
+ val brokers = List(0, 1, 2)
+ TestUtils.createBrokersInZk(zkClient, brokers)
+
+ // create the topics
+ val createOpts = new TopicCommandOptions(Array("--partitions", numPartitionsOriginal.toString,
+ "--replication-factor", "1", "--topic", topic1))
+ TopicCommand.createTopic(zkClient, createOpts)
+ val createOpts2 = new TopicCommandOptions(Array("--partitions", numPartitionsOriginal.toString,
+ "--replication-factor", "1", "--topic", topic2))
+ TopicCommand.createTopic(zkClient, createOpts2)
+
+ val escapedCommandOpts = new TopicCommandOptions(Array("--topic", escapedTopic))
+ val unescapedCommandOpts = new TopicCommandOptions(Array("--topic", unescapedTopic))
+
+ // topic actions with escaped regex do not affect 'test-topic'
+ // topic actions with unescaped topic affect 'test-topic'
+
+ assertFalse(TestUtils.grabConsoleOutput(TopicCommand.describeTopic(zkClient, escapedCommandOpts)).contains(topic2))
+ assertTrue(TestUtils.grabConsoleOutput(TopicCommand.describeTopic(zkClient, unescapedCommandOpts)).contains(topic2))
+
+ assertFalse(TestUtils.grabConsoleOutput(TopicCommand.deleteTopic(zkClient, escapedCommandOpts)).contains(topic2))
+ assertTrue(TestUtils.grabConsoleOutput(TopicCommand.deleteTopic(zkClient, unescapedCommandOpts)).contains(topic2))
+ }
}
|