+1, it will have a great impact to the Pulsar ecosystem

Nicolò Boschi


Il giorno ven 19 ago 2022 alle ore 09:13 Zixuan Liu <node...@gmail.com> ha
scritto:

> +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