Merged to master.

> 6 июня 2023 г., в 16:19, Nikolay Izhikov <nizhi...@apache.org> написал(а):
> 
> Hello, Igniters.
> 
> Last couple of weeks we actively worked on Phase 1 of IEP-81.
> Now, after several dozens of feature branch reviews Phase 1 is almost ready.
> 
> If you are interested in new Management API, please, join to the reivew.
> 
> PR - https://github.com/apache/ignite/pull/10675
> IEP - 
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-81+Cluster+Management+API
> 
> 
> 
> On 2021/11/26 13:54:51 Andrey Mashenkov wrote:
>> Hi Maxim,
>> 
>> I like the idea, the IEP looks very useful.
>> 
>> However, I agree with Nikolay on this
>> 
>>> 
>>> Don’t think we should rely on auto scan class path capabilities.
>>>        1. How this automatic scanner will distinguish ignite class from
>>> user class if they both in node class path and same package like
>>> «org.apache.ignite.internal»?
>>>        2. It seems hard to debug any errors with auto class path scanner.
>>> How we ensure correct order of scanning in case different jar order in
>>> class path?
>> 
>> I think we should go with some kind of  hardcoded «on startup» command
>>> registration.
>> 
>> 
>> Maybe we could use Java ServiceLoader [1] for this?
>> 
>> You can add a list of command classes to e.g.
>> META-INF/services/o.a.i.CommandHandlerProvider,
>> then register all mentioned classes that are found via ServiceLoader.load(
>> CommandHandlerProvider.class)
>> Service loader can return the iterator for all found providers.
>> 
>> This will prevent scanning all the classes in classpath and allow to load
>> classes from 3-rd party extensions.
>> 
>> [1] https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
>> 
>> 
>> On Fri, Nov 26, 2021 at 12:25 PM Nikolay Izhikov <nizhi...@apache.org>
>> wrote:
>> 
>>> Hello, Maxim.
>>> 
>>> Thanks for the IEP.
>>> I support the intentions and design of the IEP in general but have some
>>> comments:
>>> 
>>>> AnnotationCommandScanner, PackageCommandScanner, URICommandScanner
>>> 
>>> Don’t think we should rely on auto scan class path capabilities.
>>>        1. How this automatic scanner will distinguish ignite class from
>>> user class if they both in node class path and same package like
>>> «org.apache.ignite.internal»?
>>>        2. It seems hard to debug any errors with auto class path scanner.
>>> How we ensure correct order of scanning in case different jar order in
>>> class path?
>>> 
>>> I think we should go with some kind of  hardcoded «on startup» command
>>> registration.
>>> 
>>> 
>>>> execute(ProxyManagementTask.class, Map<String, String> atts)
>>> 
>>> 1. Do we have some well-defined place to validate `atts`?
>>> 
>>> 2. Do we really need to rely on `java.lang.Class` parameter?
>>>        This means executor (thin client) should have all class
>>> definitions which can be hard for plugins provided class.
>>>        Can we rely on some kind of «path array» like `String[] {
>>> «baseline», «set» }` or `String[] { «user», «add» }`
>>>        So the API usage will looks like:
>>> 
>>> ```
>>>        String execute(String[] path, Map<String, String> params)
>>> 
>>>        Map<String, String> params = new HashMap();
>>> 
>>>        params.put(«—login», «admin»)
>>>        params.put(«—password», «mypassw0rd»)
>>> 
>>>        String res = execute(new String[] {«user», «add»}, params);
>>> ```
>>> 
>>> 
>>>> Design issues …       it is not possible to add and run new management
>>> tasks at the cluster runtime (e.g. REPL mode for CLI tools can't be used);
>>> 
>>> It seems to me as a good thing?
>>> We shouldn’t have ability to add management tasks in runtime from the user
>>> side because of security reasons.
>>> 
>>> But, we should be able to run any existing task dynamically in some
>>> scripting environment - REPL, CLI as you mentioned.
>>> 
>>> 
>>>> Features
>>> 
>>> I think we should focus on:
>>> 
>>> 1. Subsystem then stores all available management tasks
>>> 2. Unified execution flow that guarantees all required things like
>>> authorization, authentication, logging and event generation.
>>> 3. Creation of the specific protocol implementation that will expose all
>>> existing commands **in the same way** through all supported protocols
>>> **without any additional development**.
>>> 4. Simplification of new command development and improvement of existing.
>>> 
>>> 
>>>> Compatibility
>>> 
>>> IEP doesn’t clearly define compatibility.
>>> Do we keep all existing commands as is?
>>> Is new subsystem a replacement for current API?
>>> 
>>> Is new subsystem will co-exist with current API? For how long?
>>> 
>>>> 26 нояб. 2021 г., в 11:44, Maxim Muzafarov <mmu...@apache.org>
>>> написал(а):
>>>> 
>>>> Igniters,
>>>> 
>>>> 
>>>> I'd like to propose a new internal cluster management API that will
>>>> simplify new cluster management commands creation and expose new
>>>> commands to CLI, REST, JMX Ignite interfaces without any additional
>>>> actions from the engineer adding a new command. This main goal of the
>>>> IEP is supposed to be available after the implementation of the 1-st
>>>> phase. From my point of view, the implementation will also provide
>>>> some additional features like auto ASCII-docs generation which can be
>>>> achieved with minor code changes.
>>>> 
>>>> Please, take a look at the IEP-81 [1] with a detailed explanation of
>>>> my proposal. Below you can find some crucial points from it.
>>>> 
>>>> 
>>>> = Current Limitations =
>>>> 
>>>> - The same commands through CLI, REST, JMX APIs don't have the same
>>>> input arguments and use different subsystems for command execution;
>>>> - A new command that is added must be manually exposed to all the
>>>> Ignite APIs (new implementation required for each new command being
>>>> added);
>>>> - New commands can't be added via Ignite Plugins and exposed to API;
>>>> - The own binary protocol is used (GridClient) for command executions
>>>> instead of the ignite thin client (IgniteClient);
>>>> - Security and role model: a user have to add compute tasks
>>>> permissions the same time as adding permissions for the process he
>>>> intended to use.
>>>> - New commands can't be added or executed at runtime
>>>> 
>>>> 
>>>> = Crutial Impelemntation Notes =
>>>> 
>>>> 1. Create a one for all proxy compute task gate that will accept a map
>>>> of parameters for preparing management command based on input
>>>> parameters and executing it on ignite nodes.
>>>> For instance:
>>>> 
>>>> IgniteClient.compute().execute(ProxyManagementTask.class.getName(),
>>> attrs);
>>>> 
>>>> Map:
>>>> baseline.add=execute
>>>> baseline.add.projection=SINGLE
>>>> baseline.add.nodes=[consistendtId3, consistendeId4]
>>>> 
>>>> 2. Create a CommandRegisty that will contain all available commanded
>>>> on the local ignite node. Commands will be added by command scanners
>>>> e.g. AnnotationCommandScanner, PackageCommandScanner,
>>>> URICommandScanner as well as registered manually at runtime by calling
>>>> `add` method on command registry. The CommandRegistry will also be
>>>> available for the thin clients in a standalone mode.
>>>> 
>>>> 3. Prepare a command parsers for REST, JMX, CLI interfaces that will
>>>> use command registry and calling the proxy management task right away
>>>> with correct task input parameters.
>>>> 
>>>> 4. Check the API [2] for commands that may be executed only on a
>>>> single node (the same as the VisorOneNodeTask) or on all nodes e.g.
>>>> collecting some information from each node and reducing it on a
>>>> originating node.
>>>> 
>>>> 
>>>> [1]
>>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-81+Cluster+Management+API
>>>> [2]
>>> https://cwiki.apache.org/confluence/display/IGNITE/IEP-81+Cluster+Management+API#IEP81ClusterManagementAPI-CommandInterface
>>> 
>>> 
>> 
>> -- 
>> Best regards,
>> Andrey V. Mashenkov
>> 

Reply via email to