jolshan commented on code in PR #16973: URL: https://github.com/apache/kafka/pull/16973#discussion_r1731850276
########## core/src/main/scala/kafka/tools/StorageTool.scala: ########## @@ -153,50 +186,92 @@ object StorageTool extends Logging { } def parseArguments(args: Array[String]): Namespace = { - val parser = ArgumentParsers. - newArgumentParser("kafka-storage", /* defaultHelp */ true, /* prefixChars */ "-", /* fromFilePrefix */ "@"). - description("The Kafka storage tool.") + val parser = ArgumentParsers + .newArgumentParser("kafka-storage", true, "-", "@") + .description("The Kafka storage tool.") val subparsers = parser.addSubparsers().dest("command") - val infoParser = subparsers.addParser("info"). - help("Get information about the Kafka log directories on this node.") - val formatParser = subparsers.addParser("format"). - help("Format the Kafka log directories on this node.") - subparsers.addParser("random-uuid").help("Print a random UUID.") - List(infoParser, formatParser).foreach(parser => { - parser.addArgument("--config", "-c"). - action(store()). - required(true). - help("The Kafka configuration file to use.") - }) - formatParser.addArgument("--cluster-id", "-t"). - action(store()). - required(true). - help("The cluster ID to use.") - formatParser.addArgument("--add-scram", "-S"). - action(append()). - help("""A SCRAM_CREDENTIAL to add to the __cluster_metadata log e.g. + addInfoParser(subparsers) + addFormatParser(subparsers) + addVersionMappingParser(subparsers) + addRandomUuidParser(subparsers) + + parser.parseArgs(args) + } + + private def addInfoParser(subparsers: Subparsers): Unit = { + val infoParser = subparsers.addParser("info") + .help("Get information about the Kafka log directories on this node.") + + addCommonArguments(infoParser) + } + + private def addFormatParser(subparsers: Subparsers): Unit = { + val formatParser = subparsers.addParser("format") + .help("Format the Kafka log directories on this node.") + + formatParser.addArgument("--cluster-id", "-t") + .action(store()) + .required(true) + .help("The cluster ID to use.") + + formatParser.addArgument("--add-scram", "-S") + .action(append()) + .help("""A SCRAM_CREDENTIAL to add to the __cluster_metadata log e.g. |'SCRAM-SHA-256=[name=alice,password=alice-secret]' |'SCRAM-SHA-512=[name=alice,iterations=8192,salt="N3E=",saltedpassword="YCE="]'""".stripMargin) - formatParser.addArgument("--ignore-formatted", "-g"). - action(storeTrue()) - formatParser.addArgument("--release-version", "-r"). - action(store()). - help(s"The release version to use for the initial feature settings. The minimum is " + + + formatParser.addArgument("--ignore-formatted", "-g") + .action(storeTrue()) + + formatParser.addArgument("--release-version", "-r") + .action(store()) + .help(s"The release version to use for the initial feature settings. The minimum is " + s"${MetadataVersion.IBP_3_0_IV0}; the default is ${MetadataVersion.LATEST_PRODUCTION}") - formatParser.addArgument("--feature", "-f"). - help("The setting to use for a specific feature, in feature=level format. For example: `kraft.version=1`."). - action(append()) + + formatParser.addArgument("--feature", "-f") + .help("The setting to use for a specific feature, in feature=level format. For example: `kraft.version=1`.") + .action(append()) + val reconfigurableQuorumOptions = formatParser.addMutuallyExclusiveGroup() - reconfigurableQuorumOptions.addArgument("--standalone", "-s"). - help("Used to initialize a single-node quorum controller quorum."). - action(storeTrue()) - reconfigurableQuorumOptions.addArgument("--initial-controllers", "-I"). - help("The initial controllers, as a comma-separated list of id@hostname:port:directory. The same values must be used to format all nodes. For example:\n" + - "0...@example.com:8082:JEXY6aqzQY-32P5TStzaFg,1...@example.com:8083:MvDxzVmcRsaTz33bUuRU6A,2...@example.com:8084:07R5amHmR32VDA6jHkGbTA\n"). - action(store()) - parser.parseArgs(args) + reconfigurableQuorumOptions.addArgument("--standalone", "-s") + .help("Used to initialize a single-node quorum controller quorum.") + .action(storeTrue()) + + reconfigurableQuorumOptions.addArgument("--initial-controllers", "-I") + .help("The initial controllers, as a comma-separated list of id@hostname:port:directory. The same values must be used to format all nodes. For example:\n" + + "0...@example.com:8082:JEXY6aqzQY-32P5TStzaFg,1...@example.com:8083:MvDxzVmcRsaTz33bUuRU6A,2...@example.com:8084:07R5amHmR32VDA6jHkGbTA\n") + .action(store()) + + addCommonArguments(formatParser) + } + + private def addVersionMappingParser(subparsers: Subparsers): Unit = { + val versionMappingParser = subparsers.addParser("version-mapping") + .help("Look up the corresponding features for a given metadata version. " + + "Using the command with no --release-version argument will return the mapping for " + + "the latest stable metadata version" + ) + + versionMappingParser.addArgument("--release-version", "-r") + .action(store()) + .help(s"The release version to use for the corresponding feature mapping. The minimum is " + + s"${MetadataVersion.IBP_3_0_IV0}; the default is ${MetadataVersion.LATEST_PRODUCTION}") + + addCommonArguments(versionMappingParser) + } + + private def addRandomUuidParser(subparsers: Subparsers): Unit = { + subparsers.addParser("random-uuid") + .help("Print a random UUID.") + } + + private def addCommonArguments(parser: Subparser): Unit = { Review Comment: Maybe we can call this addConfigArguments? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: jira-unsubscr...@kafka.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org