You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geode.apache.org by Jinmei Liao <ji...@pivotal.io> on 2017/05/26 16:59:27 UTC

RestHttpOperationInvoker and SimpleHttpOperationInvoker

Hi, team,

Do we know why in our admin rest api, we have these two kind of
OpeationInvokers, it looks like when RestHttpOperationInvoker failed to
find the resource, it will use the SimpleHttpOperationInvoker to try again,
but shouldn't that also fail as well?

Here is some of the logic I found in the code. I am wondering why this is
necessary.

.....
if( link is not available){
throw new RestApiCallForCommandNotFoundException(

      String.format("No REST API call for command (%1$s) was found!",
command.getInput()));
}

somewhere else in the process:

catch (RestApiCallForCommandNotFoundException e) {

    SimpleHttpOperationInvoker.processCommand()

}


-- 
Cheers

Jinmei

Re: RestHttpOperationInvoker and SimpleHttpOperationInvoker

Posted by John Blum <jb...@pivotal.io>.
Jinmei-

I think I am mistaken about the use of Apache's HTTP Components.  I know at
one time I experimented with using Apache's HTTP Components as more robust
solution (than JDK's URLConnection/HttpURLConnection) that is supported by
*Spring's* RestTemplate for client HTTP access, but I see
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java#L183>
[1]
now that I just used *Spring's* SimpleClientHttpRequestFactory, which as
the Javadoc
<http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/SimpleClientHttpRequestFactory.html>
[2]
explains, just uses JDK's facilities (i.e. URLConnection, or
specifically/technically, HttpURLConnection).

Still, *Spring* abstracts
<http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestFactory.html>
[3]
the HTTP client in use, which the RestTemplate supports
<http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#RestTemplate-org.springframework.http.client.ClientHttpRequestFactory->
[4],
therefore it would be possible to plugin
<http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html>
[5]
Apache's HTTP Components implementation, assuming, of course, Apache HTTP
Components are on the classpath.

So configuration of things, like HTTPS, auth, or other client HTTP protocol
specifics, must be configured at the JDK level, which seems to be in place, for
instance
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java#L447>
 [6].

Hope this helps.

-j


[1]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java#L183
[2]
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/SimpleClientHttpRequestFactory.html
[3]
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestFactory.html
[4]
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#RestTemplate-org.springframework.http.client.ClientHttpRequestFactory-
[5]
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html
[6]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java#L447


On Fri, May 26, 2017 at 12:55 PM, John Blum <jb...@pivotal.io> wrote:

> Response below...
>
> On Fri, May 26, 2017 at 11:49 AM, Jinmei Liao <ji...@pivotal.io> wrote:
>
>> John, thank you for the detailed response. So the difference between these
>> two are the way request url is obtained, the RestHttpOperationInvoker
>> obtained the url from the returned LinkIndex map, while this
>> SimpleHttpOperationInvoker construct the url itself and eventually gets
>> something like  "...//management/commands/cmd=xyz".
>>
>>  Is that basically it?
>>
>>
> Essentially, yes.  The SimpleHttpOperationInvoker only ever uses the
> single, fixed Controller endpoint (/management/commands/cmd=xyz) where as
> the RestHttpOperationInvoker attempts to the corresponding URL for the
> *Gfsh* command in the Index.
>
> The RestHttpOperationInvoker delegates to the SimpleHttpOperationInvoker
> when the *Gfsh* command is not represented in the Index, i.e. does not
> have a dedicated URL.
>
>
>
>
>> On Fri, May 26, 2017 at 11:33 AM, John Blum <jb...@pivotal.io> wrote:
>>
>> > Hi Jinmei-
>> >
>> > *> Do we know why in our admin rest api, we have these two kind
>> > of OpeationInvokers*
>> >
>> > Yes.
>> >
>> > The Javadoc
>> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/shell/
>> > SimpleHttpOperationInvoker.java#L33-L34>
>> > [1]
>> > somewhat explains the reason for this, but...
>> >
>> > In a nutshell, the Management (or "Admin") REST-like API  has 2 type of
>> > REST service endpoints.
>> >
>> > First, are "Well-Known
>> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > ShellCommandsController.java#L143-L294>"
>> > [2] with actual *Spring Web MVC* Controller Endpoints corresponding to
>> each
>> > of the *Gfsh* commands (e.g. `create region
>> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > RegionCommandsController.java#L156-L228>`
>> > [3]).
>> >
>> > Then, there is a "Catch-all
>> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > ShellCommandsController.java#L68-L70>"
>> > endpoint [4], which is what the SimpleHttpOperationInvoker
>> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/shell/
>> > SimpleHttpOperationInvoker.java#L49>
>> > "invokes" [5].  The idea behind this endpoint was, often times, someone
>> > would add a new command but forget to update the Admin REST API to
>> match,
>> > with "explicit" support (e.g. both this [2] and this [3]) for the new
>> > command.
>> >
>> > While this later approach works, it is not highly recommended and is
>> > certainly not very "REST-like", much less "REST-ful".
>> >
>> > In fact, the former, "Well-Known" endpoints I setup separately and
>> > individually in order to eventually introduce proper "Resource
>> > abstractions" for each of the REST API service endpoints for each of the
>> > *Gfsh* commands rather than the very use of HTTP Request Parameters to
>> > naively "reconstruct" the Gfsh command-line syntax that is largely
>> still in
>> > place today.  However, I never got that far before the priorities
>> changed.
>> >
>> > So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the
>> > availability of the command in the Admin REST API "Index" [2].
>> >
>> > Anyway, there is much to know in terms of the reasons why this API was
>> > designed the way it was at the time.  I'd say it still needs a lot of
>> work
>> > realize the full vision I had for it when it was created, something I
>> > documented quite well and gave to the leadership team at that time.
>> >
>> > If you have more questions, let's talk live.
>> >
>> > Cheers,
>> > John
>> >
>> >
>> > [1]
>> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/shell/
>> > SimpleHttpOperationInvoker.java#L33-L34
>> > [2]
>> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > ShellCommandsController.java#L143-L294
>> > [3]
>> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > RegionCommandsController.java#L156-L228
>> > [4]
>> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/
>> controllers/
>> > ShellCommandsController.java#L68-L70
>> > [5]
>> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
>> > core/src/main/java/org/apache/geode/management/internal/web/shell/
>> > SimpleHttpOperationInvoker.java#L49
>> >
>> >
>> > On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <ji...@pivotal.io> wrote:
>> >
>> > > Hi, team,
>> > >
>> > > Do we know why in our admin rest api, we have these two kind of
>> > > OpeationInvokers, it looks like when RestHttpOperationInvoker failed
>> to
>> > > find the resource, it will use the SimpleHttpOperationInvoker to try
>> > again,
>> > > but shouldn't that also fail as well?
>> > >
>> > > Here is some of the logic I found in the code. I am wondering why
>> this is
>> > > necessary.
>> > >
>> > > .....
>> > > if( link is not available){
>> > > throw new RestApiCallForCommandNotFoundException(
>> > >
>> > >       String.format("No REST API call for command (%1$s) was found!",
>> > > command.getInput()));
>> > > }
>> > >
>> > > somewhere else in the process:
>> > >
>> > > catch (RestApiCallForCommandNotFoundException e) {
>> > >
>> > >     SimpleHttpOperationInvoker.processCommand()
>> > >
>> > > }
>> > >
>> > >
>> > > --
>> > > Cheers
>> > >
>> > > Jinmei
>> > >
>> >
>> >
>> >
>> > --
>> > -John
>> > john.blum10101 (skype)
>> >
>>
>>
>>
>> --
>> Cheers
>>
>> Jinmei
>>
>
>
>
> --
> -John
> john.blum10101 (skype)
>



-- 
-John
john.blum10101 (skype)

Re: RestHttpOperationInvoker and SimpleHttpOperationInvoker

Posted by John Blum <jb...@pivotal.io>.
Response below...

On Fri, May 26, 2017 at 11:49 AM, Jinmei Liao <ji...@pivotal.io> wrote:

> John, thank you for the detailed response. So the difference between these
> two are the way request url is obtained, the RestHttpOperationInvoker
> obtained the url from the returned LinkIndex map, while this
> SimpleHttpOperationInvoker construct the url itself and eventually gets
> something like  "...//management/commands/cmd=xyz".
>
>  Is that basically it?
>
>
Essentially, yes.  The SimpleHttpOperationInvoker only ever uses the
single, fixed Controller endpoint (/management/commands/cmd=xyz) where as
the RestHttpOperationInvoker attempts to the corresponding URL for the
*Gfsh* command in the Index.

The RestHttpOperationInvoker delegates to the SimpleHttpOperationInvoker
when the *Gfsh* command is not represented in the Index, i.e. does not have
a dedicated URL.




> On Fri, May 26, 2017 at 11:33 AM, John Blum <jb...@pivotal.io> wrote:
>
> > Hi Jinmei-
> >
> > *> Do we know why in our admin rest api, we have these two kind
> > of OpeationInvokers*
> >
> > Yes.
> >
> > The Javadoc
> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/shell/
> > SimpleHttpOperationInvoker.java#L33-L34>
> > [1]
> > somewhat explains the reason for this, but...
> >
> > In a nutshell, the Management (or "Admin") REST-like API  has 2 type of
> > REST service endpoints.
> >
> > First, are "Well-Known
> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > ShellCommandsController.java#L143-L294>"
> > [2] with actual *Spring Web MVC* Controller Endpoints corresponding to
> each
> > of the *Gfsh* commands (e.g. `create region
> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > RegionCommandsController.java#L156-L228>`
> > [3]).
> >
> > Then, there is a "Catch-all
> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > ShellCommandsController.java#L68-L70>"
> > endpoint [4], which is what the SimpleHttpOperationInvoker
> > <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/shell/
> > SimpleHttpOperationInvoker.java#L49>
> > "invokes" [5].  The idea behind this endpoint was, often times, someone
> > would add a new command but forget to update the Admin REST API to match,
> > with "explicit" support (e.g. both this [2] and this [3]) for the new
> > command.
> >
> > While this later approach works, it is not highly recommended and is
> > certainly not very "REST-like", much less "REST-ful".
> >
> > In fact, the former, "Well-Known" endpoints I setup separately and
> > individually in order to eventually introduce proper "Resource
> > abstractions" for each of the REST API service endpoints for each of the
> > *Gfsh* commands rather than the very use of HTTP Request Parameters to
> > naively "reconstruct" the Gfsh command-line syntax that is largely still
> in
> > place today.  However, I never got that far before the priorities
> changed.
> >
> > So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the
> > availability of the command in the Admin REST API "Index" [2].
> >
> > Anyway, there is much to know in terms of the reasons why this API was
> > designed the way it was at the time.  I'd say it still needs a lot of
> work
> > realize the full vision I had for it when it was created, something I
> > documented quite well and gave to the leadership team at that time.
> >
> > If you have more questions, let's talk live.
> >
> > Cheers,
> > John
> >
> >
> > [1]
> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/shell/
> > SimpleHttpOperationInvoker.java#L33-L34
> > [2]
> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > ShellCommandsController.java#L143-L294
> > [3]
> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > RegionCommandsController.java#L156-L228
> > [4]
> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/controllers/
> > ShellCommandsController.java#L68-L70
> > [5]
> > https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> > core/src/main/java/org/apache/geode/management/internal/web/shell/
> > SimpleHttpOperationInvoker.java#L49
> >
> >
> > On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <ji...@pivotal.io> wrote:
> >
> > > Hi, team,
> > >
> > > Do we know why in our admin rest api, we have these two kind of
> > > OpeationInvokers, it looks like when RestHttpOperationInvoker failed to
> > > find the resource, it will use the SimpleHttpOperationInvoker to try
> > again,
> > > but shouldn't that also fail as well?
> > >
> > > Here is some of the logic I found in the code. I am wondering why this
> is
> > > necessary.
> > >
> > > .....
> > > if( link is not available){
> > > throw new RestApiCallForCommandNotFoundException(
> > >
> > >       String.format("No REST API call for command (%1$s) was found!",
> > > command.getInput()));
> > > }
> > >
> > > somewhere else in the process:
> > >
> > > catch (RestApiCallForCommandNotFoundException e) {
> > >
> > >     SimpleHttpOperationInvoker.processCommand()
> > >
> > > }
> > >
> > >
> > > --
> > > Cheers
> > >
> > > Jinmei
> > >
> >
> >
> >
> > --
> > -John
> > john.blum10101 (skype)
> >
>
>
>
> --
> Cheers
>
> Jinmei
>



-- 
-John
john.blum10101 (skype)

Re: RestHttpOperationInvoker and SimpleHttpOperationInvoker

Posted by Jinmei Liao <ji...@pivotal.io>.
John, thank you for the detailed response. So the difference between these
two are the way request url is obtained, the RestHttpOperationInvoker
obtained the url from the returned LinkIndex map, while this
SimpleHttpOperationInvoker construct the url itself and eventually gets
something like  "...//management/commands/cmd=xyz".

 Is that basically it?


On Fri, May 26, 2017 at 11:33 AM, John Blum <jb...@pivotal.io> wrote:

> Hi Jinmei-
>
> *> Do we know why in our admin rest api, we have these two kind
> of OpeationInvokers*
>
> Yes.
>
> The Javadoc
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L33-L34>
> [1]
> somewhat explains the reason for this, but...
>
> In a nutshell, the Management (or "Admin") REST-like API  has 2 type of
> REST service endpoints.
>
> First, are "Well-Known
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L143-L294>"
> [2] with actual *Spring Web MVC* Controller Endpoints corresponding to each
> of the *Gfsh* commands (e.g. `create region
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> RegionCommandsController.java#L156-L228>`
> [3]).
>
> Then, there is a "Catch-all
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L68-L70>"
> endpoint [4], which is what the SimpleHttpOperationInvoker
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L49>
> "invokes" [5].  The idea behind this endpoint was, often times, someone
> would add a new command but forget to update the Admin REST API to match,
> with "explicit" support (e.g. both this [2] and this [3]) for the new
> command.
>
> While this later approach works, it is not highly recommended and is
> certainly not very "REST-like", much less "REST-ful".
>
> In fact, the former, "Well-Known" endpoints I setup separately and
> individually in order to eventually introduce proper "Resource
> abstractions" for each of the REST API service endpoints for each of the
> *Gfsh* commands rather than the very use of HTTP Request Parameters to
> naively "reconstruct" the Gfsh command-line syntax that is largely still in
> place today.  However, I never got that far before the priorities changed.
>
> So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the
> availability of the command in the Admin REST API "Index" [2].
>
> Anyway, there is much to know in terms of the reasons why this API was
> designed the way it was at the time.  I'd say it still needs a lot of work
> realize the full vision I had for it when it was created, something I
> documented quite well and gave to the leadership team at that time.
>
> If you have more questions, let's talk live.
>
> Cheers,
> John
>
>
> [1]
> https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L33-L34
> [2]
> https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L143-L294
> [3]
> https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> RegionCommandsController.java#L156-L228
> [4]
> https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L68-L70
> [5]
> https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L49
>
>
> On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <ji...@pivotal.io> wrote:
>
> > Hi, team,
> >
> > Do we know why in our admin rest api, we have these two kind of
> > OpeationInvokers, it looks like when RestHttpOperationInvoker failed to
> > find the resource, it will use the SimpleHttpOperationInvoker to try
> again,
> > but shouldn't that also fail as well?
> >
> > Here is some of the logic I found in the code. I am wondering why this is
> > necessary.
> >
> > .....
> > if( link is not available){
> > throw new RestApiCallForCommandNotFoundException(
> >
> >       String.format("No REST API call for command (%1$s) was found!",
> > command.getInput()));
> > }
> >
> > somewhere else in the process:
> >
> > catch (RestApiCallForCommandNotFoundException e) {
> >
> >     SimpleHttpOperationInvoker.processCommand()
> >
> > }
> >
> >
> > --
> > Cheers
> >
> > Jinmei
> >
>
>
>
> --
> -John
> john.blum10101 (skype)
>



-- 
Cheers

Jinmei

Re: RestHttpOperationInvoker and SimpleHttpOperationInvoker

Posted by John Blum <jb...@pivotal.io>.
I should also add that the RestHttpOperationInvoker even makes use
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvoker.java#L138>
[1]
of the SimpleHttpOperationInvoker as a fallback.

There is also configuration for the underlying HTTP protocol "provider" as
well (which is where SSL and auth is configured at the HTTP level) that I
am trying to find in the Admin REST API  code but do not remember where I
put it.  I think it even used Apache HTTP Components to configure the HTTP
client or something like that. Gah.


[1]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/RestHttpOperationInvoker.java#L138

On Fri, May 26, 2017 at 11:33 AM, John Blum <jb...@pivotal.io> wrote:

> Hi Jinmei-
>
> *> Do we know why in our admin rest api, we have these two kind
> of OpeationInvokers*
>
> Yes.
>
> The Javadoc
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L33-L34> [1]
> somewhat explains the reason for this, but...
>
> In a nutshell, the Management (or "Admin") REST-like API  has 2 type of
> REST service endpoints.
>
> First, are "Well-Known
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L143-L294>"
> [2] with actual *Spring Web MVC* Controller Endpoints corresponding to
> each of the *Gfsh* commands (e.g. `create region
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/RegionCommandsController.java#L156-L228>`
> [3]).
>
> Then, there is a "Catch-all
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L68-L70>"
> endpoint [4], which is what the SimpleHttpOperationInvoker
> <https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L49>
> "invokes" [5].  The idea behind this endpoint was, often times, someone
> would add a new command but forget to update the Admin REST API to match,
> with "explicit" support (e.g. both this [2] and this [3]) for the new
> command.
>
> While this later approach works, it is not highly recommended and is
> certainly not very "REST-like", much less "REST-ful".
>
> In fact, the former, "Well-Known" endpoints I setup separately and
> individually in order to eventually introduce proper "Resource
> abstractions" for each of the REST API service endpoints for each of the
> *Gfsh* commands rather than the very use of HTTP Request Parameters to
> naively "reconstruct" the Gfsh command-line syntax that is largely still in
> place today.  However, I never got that far before the priorities changed.
>
> So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the
> availability of the command in the Admin REST API "Index" [2].
>
> Anyway, there is much to know in terms of the reasons why this API was
> designed the way it was at the time.  I'd say it still needs a lot of work
> realize the full vision I had for it when it was created, something I
> documented quite well and gave to the leadership team at that time.
>
> If you have more questions, let's talk live.
>
> Cheers,
> John
>
>
> [1] https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L33-L34
> [2] https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L143-L294
> [3] https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> RegionCommandsController.java#L156-L228
> [4] https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/controllers/
> ShellCommandsController.java#L68-L70
> [5] https://github.com/apache/geode/blob/rel/v1.1.1/geode-
> core/src/main/java/org/apache/geode/management/internal/web/shell/
> SimpleHttpOperationInvoker.java#L49
>
>
> On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <ji...@pivotal.io> wrote:
>
>> Hi, team,
>>
>> Do we know why in our admin rest api, we have these two kind of
>> OpeationInvokers, it looks like when RestHttpOperationInvoker failed to
>> find the resource, it will use the SimpleHttpOperationInvoker to try
>> again,
>> but shouldn't that also fail as well?
>>
>> Here is some of the logic I found in the code. I am wondering why this is
>> necessary.
>>
>> .....
>> if( link is not available){
>> throw new RestApiCallForCommandNotFoundException(
>>
>>       String.format("No REST API call for command (%1$s) was found!",
>> command.getInput()));
>> }
>>
>> somewhere else in the process:
>>
>> catch (RestApiCallForCommandNotFoundException e) {
>>
>>     SimpleHttpOperationInvoker.processCommand()
>>
>> }
>>
>>
>> --
>> Cheers
>>
>> Jinmei
>>
>
>
>
> --
> -John
> john.blum10101 (skype)
>



-- 
-John
john.blum10101 (skype)

Re: RestHttpOperationInvoker and SimpleHttpOperationInvoker

Posted by John Blum <jb...@pivotal.io>.
Hi Jinmei-

*> Do we know why in our admin rest api, we have these two kind
of OpeationInvokers*

Yes.

The Javadoc
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L33-L34>
[1]
somewhat explains the reason for this, but...

In a nutshell, the Management (or "Admin") REST-like API  has 2 type of
REST service endpoints.

First, are "Well-Known
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L143-L294>"
[2] with actual *Spring Web MVC* Controller Endpoints corresponding to each
of the *Gfsh* commands (e.g. `create region
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/RegionCommandsController.java#L156-L228>`
[3]).

Then, there is a "Catch-all
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L68-L70>"
endpoint [4], which is what the SimpleHttpOperationInvoker
<https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L49>
"invokes" [5].  The idea behind this endpoint was, often times, someone
would add a new command but forget to update the Admin REST API to match,
with "explicit" support (e.g. both this [2] and this [3]) for the new
command.

While this later approach works, it is not highly recommended and is
certainly not very "REST-like", much less "REST-ful".

In fact, the former, "Well-Known" endpoints I setup separately and
individually in order to eventually introduce proper "Resource
abstractions" for each of the REST API service endpoints for each of the
*Gfsh* commands rather than the very use of HTTP Request Parameters to
naively "reconstruct" the Gfsh command-line syntax that is largely still in
place today.  However, I never got that far before the priorities changed.

So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the
availability of the command in the Admin REST API "Index" [2].

Anyway, there is much to know in terms of the reasons why this API was
designed the way it was at the time.  I'd say it still needs a lot of work
realize the full vision I had for it when it was created, something I
documented quite well and gave to the leadership team at that time.

If you have more questions, let's talk live.

Cheers,
John


[1]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L33-L34
[2]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L143-L294
[3]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/RegionCommandsController.java#L156-L228
[4]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L68-L70
[5]
https://github.com/apache/geode/blob/rel/v1.1.1/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/SimpleHttpOperationInvoker.java#L49


On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <ji...@pivotal.io> wrote:

> Hi, team,
>
> Do we know why in our admin rest api, we have these two kind of
> OpeationInvokers, it looks like when RestHttpOperationInvoker failed to
> find the resource, it will use the SimpleHttpOperationInvoker to try again,
> but shouldn't that also fail as well?
>
> Here is some of the logic I found in the code. I am wondering why this is
> necessary.
>
> .....
> if( link is not available){
> throw new RestApiCallForCommandNotFoundException(
>
>       String.format("No REST API call for command (%1$s) was found!",
> command.getInput()));
> }
>
> somewhere else in the process:
>
> catch (RestApiCallForCommandNotFoundException e) {
>
>     SimpleHttpOperationInvoker.processCommand()
>
> }
>
>
> --
> Cheers
>
> Jinmei
>



-- 
-John
john.blum10101 (skype)