John Blum created GEODE-4787:
--------------------------------

             Summary: Re-instate Management REST API endpoints for 'create 
index' and 'created region'.
                 Key: GEODE-4787
                 URL: https://issues.apache.org/jira/browse/GEODE-4787
             Project: Geode
          Issue Type: Bug
          Components: gfsh, management
            Reporter: John Blum


As of _Apache Geode_ *1.3*, Apache Geode no longer supports proper (REST-like) 
Web service endpoints for the Geode's Management functionality.

This primarily concerns the Management (REST-like) Web service API in 
{{org.apache.geode.management.internal.web.controllers}}, which in Apache Geode 
1.2.1 and earlier, consisted of the following [Spring Web MVC 
Cntrollers|https://github.com/apache/geode/tree/rel/v1.2.1/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers].

However, as Apache Geode 1.3 and later (i.e. 1.4 and beyond), the Apache Geode 
community refactored and [reduced the 
Controllers|https://github.com/apache/geode/tree/rel/v1.3.0/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers],
 and by extension, the Web service endpoints to, mostly, a [single Web service 
endpoint|https://github.com/apache/geode/blob/rel/v1.3.0/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ShellCommandsController.java#L72-L79],
 which essentially just accepts a _Gfsh_ command string, such as `{{create 
region --name=Example --type=PARTITION}}`.

This is an significant *anti-pattern* to be sure nor is it consistent with 
good/proper Web service/general API design, much less REST-ful design.

While this Management REST-like API was not a "complete" REST API design, as 
measured against [Richardson Maturity 
Model|https://martinfowler.com/articles/richardsonMaturityModel.html], it did 
consist of elements in both Levels 1 and 2.

For instance, it used proper URLs and URIs to identify and access resources 
(e.g. Regions, Indexes, etc).  Additionally, it also used property Verbs to 
affect (e.g. CRUD) the resources.

Essentially, it only needed proper Resource abstractions representing the 
different resources (e.g. Regions, Indexes, etc) along with Hypermedia Controls 
to move beyond being a specific interface for _Gfsh_.

The intent was never to make the Management REST API a specific extension for 
_Gfsh_.  The initial purpose was to enable _Gfsh_ to connect to the Manager via 
HTTP in order to transcend firewalls when a devops team wanted to manage a 
remote cluster deployed in a cloud environment, such as AWS or GCP.  By using 
HTTP over JMX/RMI, a user would not need to punch additional holes in the 
firewall to expose the JMX/RMI port (1099) for instance.

Still, the "intent" was never to stop at supporting just _Gfsh_, but to become 
a true REST API that can be consumed by any client (not just _Gfsh_): 
application, framework, tool, etc, regardless of language (e.g. Java, C++/C#, 
Ruby, Python, etc).

However, the team that modified this API failed to recognize the benefit of 
this design and actually took a step backwards.  The HTTP Verbs are not 
properly used.  The Web service API endpoints are not resourceful, and imposing 
the _Gfsh_ DSL on clients is foolish and too restrictive.

While, it might be argued that this was an "internal" API, technically, 
speaking, guarding classes by putting them in an "internal" package is no 
safe-guard or guarantee that could have been properly enforced using Java 
access modifiers (e.g. {{private}}, {{package-protected}}, etc) and then only 
exposing an SPI for consumption.

The fact remains that this API was changed in an incompatible way before an 
"alternative" solution was properly introduced.





--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to