[
https://issues.apache.org/jira/browse/KNOX-2053?focusedWorklogId=328401&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-328401
]
ASF GitHub Bot logged work on KNOX-2053:
----------------------------------------
Author: ASF GitHub Bot
Created on: 15/Oct/19 08:25
Start Date: 15/Oct/19 08:25
Worklog Time Spent: 10m
Work Description: smolnar82 commented on pull request #164: KNOX-2053 -
New REST API to create/read/update/delete service definitions
URL: https://github.com/apache/knox/pull/164
## What changes were proposed in this pull request?
The main purpose of this PR is to introduce a new Admin API to the end-users
to be able to execute CRUD operations on Knox service definitions. As of now, a
Knox service definition consists of the following two items:
1. a service descriptor (`service.xml`)
2. a list of rewrite rules (inbound/outbound) (`rewrite.xml`)
During the implementation, I realized that storing/loading a service
descriptor (wrongly named as `ServiceDefinition` in Java) was implemented by
using JAXB annotations whereas the same features for the rewrite rules were
coded using DOM (see `XmlUrlRewriteRulesImporter` and
`XmlUrlRewriteRulesExporter` classes). Checking the object tree of
`org.apache.knox.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor` and the
complexity of the current implementation suggested that I need to introduce a
gateway between the two worlds when serializing/de-serializing the HTTP
responses/requests. As a result, you will see that I added a custom
`javax.ws.rs.ext.MessageBodyReader` implementation, as well as I, implemented
an `javax.xml.bind.annotation.adapters.XmlAdapter` to make my changes easy to
read, understand and maintain.
I also found out that simply adding the existing `gateway-provider-rewrite`
Maven project as a new dependency on other projects would lead to cyclic
dependencies. So that a new Maven project got created -
`gateway-provider-rewrite-common` - where I moved all the required
interfaces/classes that were necessary to achieve the above-mentioned goal.
Please note that
- the majority of the changes in the PR is a result of this new project
creation
- only the strictly required resources have been moved to the new project
(there might be a follow-up JIRA to identify possible enhancements in this
area).
## How was this patch tested?
Extending and running JUnit tests:
```
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]
------------------------------------------------------------------------
[INFO] Total time: 17:47 min (Wall Clock)
[INFO] Finished at: 2019-10-14T22:44:44+02:00
[INFO] Final Memory: 390M/2306M
[INFO]
------------------------------------------------------------------------
```
Additionally, I ran the following E2E tests.
Sample service definition I used when tested the POST/PUT requests (I simply
changed the version attribute to submit mulitple versions):
```
<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition>
<service name="mySampleService" role="MYSAMPLEROLE" version="1.0.0">
<dispatch
classname="org.apache.knox.gateway.dispatch.PassAllHeadersNoEncodingDispatch"
use-two-way-ssl="false"/>
<policies>
<policy role="webappsec"/>
<policy name="Anonymous" role="authentication"/>
</policies>
<routes>
<route path="/mysamplerole">
<rewrite apply="mySampleService/mysamplerole/inbound/root"
to="request.url"/>
<rewrite
apply="mySampleService/mysamplerole/outbound/mainpage" to="response.body"/>
</route>
<route path="/mysamplerole/**">
<rewrite apply="mySampleService/mysamplerole/inbound/path"
to="request.url"/>
</route>
<route
path="/mysamplerole/views/SMARTSENSE/**/assets/hstapp-*.js">
<rewrite
apply="mySampleService/mysamplerole/outbound/apiendpoint" to="response.body"/>
</route>
</routes>
</service>
<rules>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/root"
pattern="*://*:*/**/mysamplerole/">
<rewrite template="{$serviceUrl[mySampleService]}/"/>
</rule>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/path"
pattern="*://*:*/**/mysamplerole/{**}">
<rewrite template="{$serviceUrl[mySampleService]}/{**}"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/sitepath">
<rewrite template="{$frontend[path]}/mysamplerole"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/websocket">
<rewrite
template="{$frontend[path]}/mysamplerolews/api/stomp/v1"/>
</rule>
<filter name="mySampleService/mysamplerole/outbound/apiendpoint">
<content type="*/x-javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
<content type="application/javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter
name="mySampleService/mysamplerole/outbound/apiendpoint/html">
<content type="text/html">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter name="mySampleService/mysamplerole/outbound/mainpage">
<content type="*/html">
<apply path="stylesheets/vendor.css"
rule="mySampleService/mysamplerole/outbound/vendorcss" />
<apply path="stylesheets/app.css"
rule="mySampleService/mysamplerole/outbound/appcss" />
<apply path="javascripts/vendor.js"
rule="mySampleService/mysamplerole/outbound/vendorjs" />
<apply path="javascripts/app.js"
rule="mySampleService/mysamplerole/outbound/appjs" />
<apply path="/img/logo.png"
rule="mySampleService/mysamplerole/outbound/favicon"/>
<apply path="/licenses/NOTICE.txt"
rule="mySampleService/mysamplerole/outbound/notice"/>
</content>
</filter>
</rules>
</serviceDefinition>
```
I also modified the `sandbox` topology to include my service:
```
<?xml version="1.0" encoding="UTF-8"?>
<topology>
<uri>https://localhost:8443/gateway/sandbox</uri>
<name>sandbox</name>
...
<service>
<role>MYSAMPLEROLE</role>
<url>http://localhost:8889</url>
</service>
</topology>
```
Added a service definition for `mySampleService/MYSAMPLEROLE/1.0.0`
```
$ curl -H "Content-Type: application/xml" -iku admin:admin-password -d
"@testServiceDefinitionPayload.xml" -X POST
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions'
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 13:20:18 GMT
Set-Cookie: KNOXSESSIONID=node016wqn5epso1bk1th8l5i2wy7fh1.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:20:18 GMT
Content-Type: application/json
Content-Length: 68
Server: Jetty(9.4.20.v20190813)
{ "added service definition": "mySampleService,MYSAMPLEROLE,1.0.0" }
```
Checking if the folders were created with the appropriate content
```
$ ls -al knoxGateway/data/services/mySampleService/
total 0
drwxr-xr-x 3 smolnar staff 102 Oct 14 15:20 .
drwxr-xr-x@ 53 smolnar staff 1802 Oct 14 15:20 ..
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:20 1.0.0
$ ls -al knoxGateway/data/services/mySampleService/1.0.0/
total 16
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:20 .
drwxr-xr-x 3 smolnar staff 102 Oct 14 15:20 ..
-rw-r--r-- 1 smolnar staff 2055 Oct 14 15:20 rewrite.xml
-rw-r--r-- 1 smolnar staff 985 Oct 14 15:20 service.xml
```
Confirmed (from the `gateway.log`) that topology 'sandbox' got redeployed:
```
2019-10-14 15:20:18,171 INFO knox.gateway
(AclsAuthorizationFilter.java:doFilter(105)) - Access Granted: true
2019-10-14 15:20:18,443 INFO knox.gateway
(DefaultTopologyService.java:lambda$2(539)) - Redeploying topology sandbox due
to service definition change mySampleService / MYSAMPLEROLE / 1.0.0
2019-10-14 15:20:23,449 INFO knox.gateway
(GatewayServer.java:handleCreateDeployment(973)) - Deploying topology sandbox
to /Users/smolnar/test/knoxGateway/data/deployments/sandbox.topo.16dca6d3650
2019-10-14 15:20:23,449 INFO knox.gateway
(GatewayServer.java:internalDeactivateTopology(892)) - Deactivating topology
sandbox
2019-10-14 15:20:23,500 INFO knox.gateway
(DefaultGatewayServices.java:initializeContribution(159)) - Credential store
found for the cluster: sandbox - no need to create one.
2019-10-14 15:20:25,688 INFO knox.gateway
(GatewayServer.java:internalActivateTopology(858)) - Activating topology sandbox
2019-10-14 15:20:25,689 INFO knox.gateway
(GatewayServer.java:internalActivateArchive(868)) - Activating topology sandbox
archive %2F
```
Modified the `version` XML attribute to `2.0.0` in the payload file and
added a new service definition
```
$ curl -H "Content-Type: application/xml" -iku admin:admin-password -d
"@testServiceDefinitionPayload.xml" -X POST
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions'
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 13:24:13 GMT
Set-Cookie: KNOXSESSIONID=node01gdv2e7960eagmkz7yh14vr5f2.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:24:13 GMT
Content-Type: application/json
Content-Length: 68
Server: Jetty(9.4.20.v20190813)
{ "added service definition": "mySampleService,MYSAMPLEROLE,2.0.0" }
```
Checking if the folders were created with the appropriate content
```
$ ls -al knoxGateway/data/services/mySampleService/
total 0
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:24 .
drwxr-xr-x@ 53 smolnar staff 1802 Oct 14 15:20 ..
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:20 1.0.0
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:24 2.0.0
$ cat knoxGateway/data/services/mySampleService/2.0.0/service.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<service name="mySampleService" role="MYSAMPLEROLE" version="2.0.0">
<dispatch
classname="org.apache.knox.gateway.dispatch.PassAllHeadersNoEncodingDispatch"
use-two-way-ssl="false"/>
<policies>
<policy role="webappsec"/>
<policy name="Anonymous" role="authentication"/>
</policies>
<routes>
<route path="/mysamplerole">
<rewrite apply="mySampleService/mysamplerole/inbound/root"
to="request.url"/>
<rewrite apply="mySampleService/mysamplerole/outbound/mainpage"
to="response.body"/>
</route>
<route path="/mysamplerole/**">
<rewrite apply="mySampleService/mysamplerole/inbound/path"
to="request.url"/>
</route>
<route path="/mysamplerole/views/SMARTSENSE/**/assets/hstapp-*.js">
<rewrite
apply="mySampleService/mysamplerole/outbound/apiendpoint" to="response.body"/>
</route>
</routes>
</service>
$ cat knoxGateway/data/services/mySampleService/2.0.0/rewrite.xml
<rules>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/root"
pattern="*://*:*/**/mysamplerole/">
<rewrite template="{$serviceUrl[mySampleService]}/"/>
</rule>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/path"
pattern="*://*:*/**/mysamplerole/{**}">
<rewrite template="{$serviceUrl[mySampleService]}/{**}"/>
</rule>
<rule dir="OUT" name="mySampleService/mysamplerole/outbound/sitepath">
<rewrite template="{$frontend[path]}/mysamplerole"/>
</rule>
<rule dir="OUT" name="mySampleService/mysamplerole/outbound/websocket">
<rewrite template="{$frontend[path]}/mysamplerolews/api/stomp/v1"/>
</rule>
<filter name="mySampleService/mysamplerole/outbound/apiendpoint">
<content type="*/x-javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
<content type="application/javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter name="mySampleService/mysamplerole/outbound/apiendpoint/html">
<content type="text/html">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter name="mySampleService/mysamplerole/outbound/mainpage">
<content type="*/html">
<apply path="stylesheets/vendor.css"
rule="mySampleService/mysamplerole/outbound/vendorcss"/>
<apply path="stylesheets/app.css"
rule="mySampleService/mysamplerole/outbound/appcss"/>
<apply path="javascripts/vendor.js"
rule="mySampleService/mysamplerole/outbound/vendorjs"/>
<apply path="javascripts/app.js"
rule="mySampleService/mysamplerole/outbound/appjs"/>
<apply path="/img/logo.png"
rule="mySampleService/mysamplerole/outbound/favicon"/>
<apply path="/licenses/NOTICE.txt"
rule="mySampleService/mysamplerole/outbound/notice"/>
</content>
</filter>
</rules>
```
Confirmed (from the `gateway.log`) that topology `sandbox` got redeployed
```
2019-10-14 15:24:13,732 INFO knox.gateway
(DefaultTopologyService.java:lambda$2(539)) - Redeploying topology sandbox due
to service definition change mySampleService / MYSAMPLEROLE / 2.0.0
2019-10-14 15:24:15,966 INFO knox.gateway
(GatewayServer.java:handleCreateDeployment(973)) - Deploying topology sandbox
to /Users/smolnar/test/knoxGateway/data/deployments/sandbox.topo.16dca70cc48
2019-10-14 15:24:15,967 INFO knox.gateway
(GatewayServer.java:internalDeactivateTopology(892)) - Deactivating topology
sandbox
2019-10-14 15:24:16,022 INFO knox.gateway
(DefaultGatewayServices.java:initializeContribution(159)) - Credential store
found for the cluster: sandbox - no need to create one.
2019-10-14 15:24:18,068 INFO knox.gateway
(GatewayServer.java:internalActivateTopology(858)) - Activating topology sandbox
2019-10-14 15:24:18,068 INFO knox.gateway
(GatewayServer.java:internalActivateArchive(868)) - Activating topology sandbox
archive %2F
```
Checked the `GET` interface:
```
$ curl -iku admin:admin-password -X GET
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions/mysampleservice'
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 13:28:21 GMT
Set-Cookie: KNOXSESSIONID=node01dtizgdsqpgp21xmmgkjrxin2f3.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:28:21 GMT
Content-Type: application/xml
Content-Length: 6620
Server: Jetty(9.4.20.v20190813)
<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinitions>
<serviceDefinition>
<service name="mySampleService" role="MYSAMPLEROLE" version="1.0.0">
<dispatch
classname="org.apache.knox.gateway.dispatch.PassAllHeadersNoEncodingDispatch"
use-two-way-ssl="false"/>
<policies>
<policy role="webappsec"/>
<policy name="Anonymous" role="authentication"/>
</policies>
<routes>
<route path="/mysamplerole">
<rewrite apply="mySampleService/mysamplerole/inbound/root"
to="request.url"/>
<rewrite
apply="mySampleService/mysamplerole/outbound/mainpage" to="response.body"/>
</route>
<route path="/mysamplerole/**">
<rewrite apply="mySampleService/mysamplerole/inbound/path"
to="request.url"/>
</route>
<route
path="/mysamplerole/views/SMARTSENSE/**/assets/hstapp-*.js">
<rewrite
apply="mySampleService/mysamplerole/outbound/apiendpoint" to="response.body"/>
</route>
</routes>
</service>
<rules>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/root"
pattern="*://*:*/**/mysamplerole/">
<rewrite template="{$serviceUrl[mySampleService]}/"/>
</rule>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/path"
pattern="*://*:*/**/mysamplerole/{**}">
<rewrite template="{$serviceUrl[mySampleService]}/{**}"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/sitepath">
<rewrite template="{$frontend[path]}/mysamplerole"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/websocket">
<rewrite
template="{$frontend[path]}/mysamplerolews/api/stomp/v1"/>
</rule>
<filter name="mySampleService/mysamplerole/outbound/apiendpoint">
<content type="*/x-javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
<content type="application/javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter
name="mySampleService/mysamplerole/outbound/apiendpoint/html">
<content type="text/html">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter name="mySampleService/mysamplerole/outbound/mainpage">
<content type="*/html">
<apply path="stylesheets/vendor.css"
rule="mySampleService/mysamplerole/outbound/vendorcss"/>
<apply path="stylesheets/app.css"
rule="mySampleService/mysamplerole/outbound/appcss"/>
<apply path="javascripts/vendor.js"
rule="mySampleService/mysamplerole/outbound/vendorjs"/>
<apply path="javascripts/app.js"
rule="mySampleService/mysamplerole/outbound/appjs"/>
<apply path="/img/logo.png"
rule="mySampleService/mysamplerole/outbound/favicon"/>
<apply path="/licenses/NOTICE.txt"
rule="mySampleService/mysamplerole/outbound/notice"/>
</content>
</filter>
</rules>
</serviceDefinition>
<serviceDefinition>
<service name="mySampleService" role="MYSAMPLEROLE" version="2.0.0">
<dispatch
classname="org.apache.knox.gateway.dispatch.PassAllHeadersNoEncodingDispatch"
use-two-way-ssl="false"/>
<policies>
<policy role="webappsec"/>
<policy name="Anonymous" role="authentication"/>
</policies>
<routes>
<route path="/mysamplerole">
<rewrite apply="mySampleService/mysamplerole/inbound/root"
to="request.url"/>
<rewrite
apply="mySampleService/mysamplerole/outbound/mainpage" to="response.body"/>
</route>
<route path="/mysamplerole/**">
<rewrite apply="mySampleService/mysamplerole/inbound/path"
to="request.url"/>
</route>
<route
path="/mysamplerole/views/SMARTSENSE/**/assets/hstapp-*.js">
<rewrite
apply="mySampleService/mysamplerole/outbound/apiendpoint" to="response.body"/>
</route>
</routes>
</service>
<rules>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/root"
pattern="*://*:*/**/mysamplerole/">
<rewrite template="{$serviceUrl[mySampleService]}/"/>
</rule>
<rule dir="IN" name="mySampleService/mysamplerole/inbound/path"
pattern="*://*:*/**/mysamplerole/{**}">
<rewrite template="{$serviceUrl[mySampleService]}/{**}"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/sitepath">
<rewrite template="{$frontend[path]}/mysamplerole"/>
</rule>
<rule dir="OUT"
name="mySampleService/mysamplerole/outbound/websocket">
<rewrite
template="{$frontend[path]}/mysamplerolews/api/stomp/v1"/>
</rule>
<filter name="mySampleService/mysamplerole/outbound/apiendpoint">
<content type="*/x-javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
<content type="application/javascript">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter
name="mySampleService/mysamplerole/outbound/apiendpoint/html">
<content type="text/html">
<apply path="/api/v1"
rule="mySampleService/mysamplerole/outbound/extrapath"/>
</content>
</filter>
<filter name="mySampleService/mysamplerole/outbound/mainpage">
<content type="*/html">
<apply path="stylesheets/vendor.css"
rule="mySampleService/mysamplerole/outbound/vendorcss"/>
<apply path="stylesheets/app.css"
rule="mySampleService/mysamplerole/outbound/appcss"/>
<apply path="javascripts/vendor.js"
rule="mySampleService/mysamplerole/outbound/vendorjs"/>
<apply path="javascripts/app.js"
rule="mySampleService/mysamplerole/outbound/appjs"/>
<apply path="/img/logo.png"
rule="mySampleService/mysamplerole/outbound/favicon"/>
<apply path="/licenses/NOTICE.txt"
rule="mySampleService/mysamplerole/outbound/notice"/>
</content>
</filter>
</rules>
</serviceDefinition>
</serviceDefinitions>
```
Removing the service definition I added first:
```
$ curl -H "Content-Type: application/xml" -iku admin:admin-password -X
DELETE
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions/mySampleService/mySampleRole/1.0.0'
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 13:29:46 GMT
Set-Cookie: KNOXSESSIONID=node0uegx72m31ta2p7p7g6h35yy4.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:29:46 GMT
Content-Type: application/json
Content-Length: 72
Server: Jetty(9.4.20.v20190813)
{ "deleted service definition": "mySampleService, mySampleRole, 1.0.0" }
$ ls -al knoxGateway/data/services/mySampleService/
total 0
drwxr-xr-x 3 smolnar staff 102 Oct 14 15:29 .
drwxr-xr-x@ 53 smolnar staff 1802 Oct 14 15:20 ..
drwxr-xr-x 4 smolnar staff 136 Oct 14 15:24 2.0.0
I also confirmed (from the gateway.log) that topology 'sandbox' got
redeployed.
```
Trying to remove it again:
```
$ curl -H "Content-Type: application/xml" -iku admin:admin-password -X
DELETE
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions/mySampleService/mySampleRole/1.0.0'
HTTP/1.1 500 Internal Server Error
Date: Mon, 14 Oct 2019 13:31:15 GMT
Set-Cookie: KNOXSESSIONID=node0oygycvwluoa6p56c5gv6feex5.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:31:15 GMT
Content-Type: application/json
Content-Length: 137
Server: Jetty(9.4.20.v20190813)
{ "failed to delete service definition": "There is no service definition
with the given attributes: mySampleService,mySampleRole,1.0.0" }
```
Removing the second service definition I added before:
```
$ curl -H "Content-Type: application/xml" -iku admin:admin-password -X
DELETE
'https://localhost:8443/gateway/admin/api/v1/servicedefinitions/mySampleService/mySampleRole/2.0.0'
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 13:31:40 GMT
Set-Cookie: KNOXSESSIONID=node0nnx2ysaozbhcyg2xgy3jnfal6.node0;
Path=/gateway/admin; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/gateway/admin; Max-Age=0;
Expires=Sun, 13-Oct-2019 13:31:40 GMT
Content-Type: application/json
Content-Length: 72
Server: Jetty(9.4.20.v20190813)
{ "deleted service definition": "mySampleService, mySampleRole, 2.0.0" }
$ ls -al knoxGateway/data/services/mySampleService/
ls: knoxGateway/data/services/mySampleService/: No such file or directory
```
I also tested the following scenario:
1. modified the `sandbox` topology: set a valid NameNodeUI URL for
`MYSAMPLEROLE` (note: there was no other NameNode UI related service listed in
`sandbox`)
2. confirmed that
`https://localhost:8443/gateway/sandbox/hdfs?host=$NAMENODEURL` failed due to
missing matching path of `/hdfs`
3. submitted a new service definition (mySampleService/MYSAMPLEROLE/3.0.0)
with the content of the existing `hdfsui` service (used the GET API to save it
locally)
4. retried `https://localhost:8443/gateway/sandbox/hdfs?host=$NAMENODEURL`
5. confirmed that Knox redirected the request properly to the previously set
NameNodeUI URL without restarting the Knox Gateway
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
Issue Time Tracking
-------------------
Worklog Id: (was: 328401)
Remaining Estimate: 0h
Time Spent: 10m
> Add Service Definition Management to Admin API
> ----------------------------------------------
>
> Key: KNOX-2053
> URL: https://issues.apache.org/jira/browse/KNOX-2053
> Project: Apache Knox
> Issue Type: Improvement
> Components: Server
> Reporter: Larry McCay
> Assignee: Sandor Molnar
> Priority: Major
> Fix For: 1.4.0
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Currently, the Admin API allows management and access to topologies,
> descriptors, provider config, etc but does not provide access to the Service
> Definitions for the proxied services.
> Let's expand the API the include to include service defs and allow for
> customization through the API. Changes made via the API will typically
> require a restart and touch of an topology file that is referencing the
> change service def. This may require a separate Jira and effort to address.
> In the meantime, we should be able to change, add and delete service
> definitions including both service and rewrite XML files.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)