+1 Great idea.

Thanks,
Zixuan

Enrico Olivelli <eolive...@gmail.com> 于2022年8月18日周四 16:24写道:

> Hello,
> I have drafted a PIP around this proposal.
>
> PIP link: https://github.com/apache/pulsar/issues/17155
>
> I am preparing an official PR, I already have a working prototype.
>
> Copy of the contents of the GH issue is attached for discussion here
> on the Mailing list.
>
> Motivation
>
> There are many projects that are in the Pulsar ecosystem like Protocol
> Handlers (Kafka, MQTT, RabbitMQ) and libraries (JMS…) that need
> additional tools for operating Pulsar following specific conventions
> adopted by each project and to handle custom domain objects (like JMS
> queues, Kafka Consumer Groups...).
>
> Some examples:
>
> Kafka: tools for inspecting internal systems, SchemaRegistry,
> Transaction Manager, Consumers Groups
> JMS: tools to handling Subscriptions and Selectors
> RabbitMQ: tools to handle Pulsar topics and subscription following the
> convention
>
> This is very important as it is hard to follow the conventions of each
> project using pulsar-admin and the administrator may inadvertently
> break the system.
>
> This feature will enhance the UX of the Pulsar Admin CLI tools for the
> benefit of the whole ecosystem and users.
>
> Goal
>
> As we do for many other components in Pulsar, we need a way to enhance
> the CLI tools, pulsar-admin and pulsar-shell, with additional commands
> that are specific to the additional features.
>
> The proposal here is to add an extension mechanism to the pulsar-admin
> (and so pulsar-shell) tool.
> Following the usual conventions for extensions the extension will be
> bundled in a .nar file that may contain additional third party
> libraries.
>
> The extension will be able to provide new top level commands
>
> pulsar-admin my-command-group my-command arguments…
>
> The extension will be able to access the PulsarAdmin API provided by
> the environment.
>
> The extension must not depend directly on the JCommander library but
> we will provide an API to declare the parameters and the other
> metadata necessary to document and execute the command.
> This is very important because during the lifecycle of Pulsar the
> project may decide to upgrade JCommander to an incompatible version or
> to drop the dependency at all.
>
> API Changes
>
> We will introduce a new Maven module pulsar-tools-api that contains
> the public API that can be used by implementations of the custom
> commands.
>
> The implementation will be bundled in a .nar file with a descriptor
> with the following fields:
>
> factoryClass: xxxxx.CommandFactory
> name: extension-name
> description: Description...
>
> There are the new classes:
>
> /**
>    Access to the environment
> */
> public interface CommandExecutionContext {
>     PulsarAdmin getPulsarAdmin();
>     Properties getConfiguration();
> }
>
>
> /**
>  * Custom command implementation
>  */
> public interface CustomCommand {
>     String name();
>     String description();
>     List<ParameterDescriptor> parameters();
>     boolean execute(Map<String, Object> parameters,
> CommandExecutionContext context) throws Exception;
> }
>
> /**
>  * A group of commands.
>  */
> public interface CustomCommandGroup {
>     String name();
>     String description();
>     List<CustomCommand> commands(CommandExecutionContext context);
> }
>
> /**
>  * Main entry point of the extension
> */
> public interface CustomCommandFactory {
>
>     /**
>      * Generate the available command groups.
>      */
>     List<CustomCommandGroup> commandGroups(CommandExecutionContext
> context);
> }
>
> @Builder
> @Getter
> public final class ParameterDescriptor {
>     @Builder.Default
>     private String name = "";
>     @Builder.Default
>     private String description = "";
>     private ParameterType type = ParameterType.STRING;
>     private  boolean required = false;
> }
>

Reply via email to