Yunze,
Il Lun 22 Ago 2022, 20:20 Enrico Olivelli <eolive...@gmail.com> ha scritto: > > > Il Lun 22 Ago 2022, 17:07 Yunze Xu <y...@streamnative.io.invalid> ha > scritto: > >> I will take a look. But I think we should also add a trivial example >> (or a test) in the Apache repo > > I will add integration tests for sure. Currently the PR is only a prototype without tests. Enrico , e.g. just print some messages for an >> extended command. > > > Sure. I will update the PIP > > And the JavaDocs of these interfaces should be >> complete and more clear. >> > > > I will leave that to the implementation PR > > Enrico > > >> Thanks, >> Yunze >> >> >> >> >> > 2022年8月22日 18:37,Enrico Olivelli <eolive...@gmail.com> 写道: >> > >> > Yunze, >> > >> > Il giorno lun 22 ago 2022 alle ore 08:06 Yunze Xu >> > <y...@streamnative.io.invalid> ha scritto: >> >> >> >> The motivation and goal LGTM, but the API changes look very simple and >> >> hard to use. Do we have to implement all these interfaces for an admin >> >> extension? If yes, could you show an example in the proposal as a >> >> guidance? >> >> >> >> For example, if I just want to implement a simple command: >> >> >> >> ```bash >> >> ./bin/pulsar-admin kafka create-topic <my-topic> --partitions >> <num-partitions> >> >> ``` >> >> >> >> How should I implement these interfaces? >> > >> > This is a example for the implementation that I am going to do for JMS >> > >> https://github.com/datastax/pulsar-jms/pull/53/files#diff-9afaac9c7dc4b3d674e0623cd3d76348b01537c6095e9b5b8e804f59a481cceeR31 >> > >> > it is only a mock command at the moment, but it is good to showcase the >> feature >> > >> > Enrico >> > >> > >> >> >> >> Thanks, >> >> Yunze >> >> >> >> >> >> >> >> >> >>> 2022年8月18日 16:23,Enrico Olivelli <eolive...@gmail.com> 写道: >> >>> >> >>> 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; >> >>> } >> >>