Hi Maxim, I will take a look too.

Regards,
Dmitry

On Tue, 13 May 2025 at 08:59, Štefan Miklošovič <smikloso...@apache.org>
wrote:

> Hi Maxim,
>
> I took yet another look after my initial review some time ago and I still
> do not see any issues with it.
>
> I appreciate that by default it behaves exactly the same way as before and
> one has to just flip a switch (env property / system property) to start to
> use another layout.
>
> Arguments / parameters are behaving the same way as well, no matter if
> picocli or legacy airline is used which is just great as the end user does
> not notice anything.
>
> I would just stay on legacy layout for a while and if no other issues are
> found we might contemplate about making the switch but I think we should
> just go over some phase of having legacy as default and people might opt-in
> into new stuff (that's what I will be doing at least).
>
> Not sure what needs to happen in order to merge it, I think one more
> committer taking a look would be great.
>
> Regards
>
> On Fri, May 9, 2025 at 9:45 AM Maxim Muzafarov <mmu...@apache.org> wrote:
>
>> Hello everyone,
>>
>> The commands have been migrated to picocli and are ready for review,
>> and we need a second committer to review them.
>> Would anyone be able to help?
>>
>> Key points:
>> - All the commands are backwards-compatible with everything we have in
>> the trunk now (including the accord commands);
>> - The commands help output also match the trunk (no difference from
>> the UX point of view);
>> - Test coverage has also been significantly increased (most of the
>> changes are new tests);
>>
>> https://github.com/apache/cassandra/pull/2497/files
>> https://issues.apache.org/jira/browse/CASSANDRA-17445
>>
>> On Mon, 15 Jul 2024 at 20:53, Maxim Muzafarov <mmu...@apache.org> wrote:
>> >
>> > Hello everyone,
>> >
>> >
>> > I want to continue the discussion that was originally started here
>> > [2], however, it's better to move it to a new thread with an
>> > appropriate title, so that everyone is aware of the replacement
>> > library we're trying to agree on.
>> >
>> > The question is:
>> > Does everyone agree with using Picocli as an airlift/airline
>> > replacement for our cli tools?
>> > The prototype to look at is here [1].
>> >
>> >
>> > The reasons are as follows:
>> >
>> > Why to replace?
>> >
>> > There are several cli tools that rely on the airlift/airline library
>> > to mark up the commands: NodeTool, JMXTool, FullQueryLogTool,
>> > CompactionStress (with the size of the NodeTool dominating the rest of
>> > the tools). The airline is no longer maintained, so we will have to
>> > update it sooner or later anyway.
>> >
>> >
>> > What criteria?
>> >
>> > Before we dive into the pros and cons of each candidate, I think we
>> > have to formulate criteria for the libraries we are considering, based
>> > on what we already have in the source code (from Cassandra's
>> > perspective). This in itself limits the libraries we can consider.
>> >
>> > Criteria can be as follows:
>> > - Library licensing, including risks that it may change in the future
>> > (the asf libs are the safest for us from this perspective);
>> > - Similarity of library design (to the airline). This means that the
>> > closer the libraries are, the easier it is to migrate to them, and the
>> > easier it is to get guarantees that we haven't broken anything. The
>> > further away the libraries are, the more extra code and testing we
>> > need;
>> > - Backward compatibility. The ideal case is where the user doesn't
>> > even notice that a different library is being used under the hood.
>> > This includes both the help output and command output.
>> >
>> > Of course, all libraries need to be known and well-maintained.
>> >
>> > What candidates?
>> >
>> >
>> > Picocli
>> > https://picocli.info/
>> >
>> > This is the well-known cli library under the Apache 2.0 license, which
>> > is similar to what we have in source code right now. This also means
>> > that the amount of changes (despite the number of the commands)
>> > required to migrate what we have is quite small.
>> > In particular, I would like to point out that:
>> > - It allows us to unbind the jmx-specific command options from the
>> > commands themselves, so that they can be reused in other APIs (my
>> > goal);
>> > - We can customize the help output so that the user doesn't notice
>> > anything while using of the nodetool;
>> > - The cli parser is the same as what we now do with cli arguments.
>> >
>> > This makes the library a good candidate, but leaves open the question
>> > of changing the license of the lib in the future. However, these risks
>> > are relatively small because the CLI library is not a monetizable
>> > thing, as I believe. We can also mitigate the risks copying the lib to
>> > sources, as it mentioned here:
>> > https://picocli.info/#_getting_started
>> >
>> >
>> > commons-cli
>> > https://commons.apache.org/proper/commons-cli/
>> >
>> > In terms of licenses, it is the easiest candidate for us to use as
>> > it's under the asf, and in fact the library is already used in e.g.
>> > BulkLoader, SSTableExpoert.
>> > However, I'd like to point out the following disadvantages the library
>> > has for our case:
>> > - This is not a drop-in replacement for the airline commands, as the
>> > lib does not have annotation for markup commands. We have to flesh out
>> > all the options we have as java classes, or create our owns;
>> > - Subcommands have to be supported manually, which requires extra
>> > effort to adopt the cli parser (correct me if I'm wrong here). We have
>> > at least several subcommands in the NodeTool e.g. cms describe, cms
>> > snapshot;
>> > - Apart from parsing the cli arguments, we need to manually initialize
>> > the command class and set the input arguments we have.
>> >
>> >
>> > JComannder
>> > https://jcommander.org/
>> >
>> > The library is licensed under the Apache 2.0 license, so the situation
>> > is the same as for Picocli. Here I'd like to point out a few things I
>> > encountered while prototyping:
>> > - Unbinding the jmx-specific options from commands is quite tricky and
>> > requires touching an internal API (which I won't do). Option
>> > inheritance is not the way to go if we want to have a clear command
>> > hierarchy regardless of the API used.
>> > - We won't be able to inject a Logger (the Output class in terms of
>> > NodeTool) or other abstractions (e.g. MBeans) directly into the
>> > commands, because it doesn't support dependency injection. This is
>> > also part of the activity of reusing the commands in other APIs, for
>> > instance to execute them via CQL;
>> >
>> > More basic in comparison to the Picocli, focusing primarily on simple
>> > annotation-based parsing and subcommands, and won't allow us to reuse
>> > the commands outside of the cli.
>> >
>> >
>> > airline2
>> > https://github.com/rvesse/airline
>> >
>> > The library is licensed under the Apache 2.0 license, and this is an
>> > attempt to rebuild the original airline library. Currently, this is
>> > not a drop-in replacement, as it has some minor API differences from
>> > the original library. It is also not a better choice for us, as it has
>> > the same drawbacks I mentioned for the previous alternatives, e.g. not
>> > possible to unbind the specific options from the command and use them
>> > only when commands are called from the cli.
>> >
>> >
>> >
>> >
>> > [1] https://github.com/apache/cassandra/pull/2497/files
>> > [2] https://lists.apache.org/thread/m9wfb3gdo9s210824c9rm2ojc9qv9412
>>
>

-- 
Dmitry Konstantinov

Reply via email to