MXS-1220: Add deletion of listeners
The listeners can now be deleted via the REST API. Documented the added endpoint in the REST API documentation.
This commit is contained in:
@ -302,6 +302,35 @@ object.
|
|||||||
|ssl_version | The SSL version to use [TLSv1.2|TLSv1.1|TLSv1.0] |
|
|ssl_version | The SSL version to use [TLSv1.2|TLSv1.1|TLSv1.0] |
|
||||||
|ssl_cert_verify_depth | Certificate verification depth |
|
|ssl_cert_verify_depth | Certificate verification depth |
|
||||||
|
|
||||||
|
### Destroy a listener
|
||||||
|
|
||||||
|
```
|
||||||
|
DELETE /v1/services/:service/listeners/:name
|
||||||
|
```
|
||||||
|
|
||||||
|
In the URI , the _:name_ must map to a listener and the _:service_ must map to a
|
||||||
|
service. Both names must have all whitespace replaced with hyphens.
|
||||||
|
|
||||||
|
#### Response
|
||||||
|
|
||||||
|
OK:
|
||||||
|
|
||||||
|
```
|
||||||
|
Status: 204 No Content
|
||||||
|
```
|
||||||
|
|
||||||
|
Listener not found:
|
||||||
|
|
||||||
|
```
|
||||||
|
Status: 404 Not Found
|
||||||
|
```
|
||||||
|
|
||||||
|
Listener cannot be deleted:
|
||||||
|
|
||||||
|
```
|
||||||
|
Status: 403 Forbidden
|
||||||
|
```
|
||||||
|
|
||||||
### Update a service
|
### Update a service
|
||||||
|
|
||||||
The _:name_ in the URI must map to a service name and the request body must be a
|
The _:name_ in the URI must map to a service name and the request body must be a
|
||||||
|
@ -258,6 +258,16 @@ bool serviceHasListener(SERVICE *service, const char *protocol,
|
|||||||
*/
|
*/
|
||||||
bool service_port_is_used(unsigned short port);
|
bool service_port_is_used(unsigned short port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the service has a listener with a matching name
|
||||||
|
*
|
||||||
|
* @param service Service to check
|
||||||
|
* @param name Name to compare to
|
||||||
|
*
|
||||||
|
* @return True if the service has a listener with a matching name
|
||||||
|
*/
|
||||||
|
bool service_has_named_listener(SERVICE *service, const char *name);
|
||||||
|
|
||||||
int serviceGetUser(SERVICE *service, char **user, char **auth);
|
int serviceGetUser(SERVICE *service, char **user, char **auth);
|
||||||
int serviceSetUser(SERVICE *service, const char *user, const char *auth);
|
int serviceSetUser(SERVICE *service, const char *user, const char *auth);
|
||||||
bool serviceSetFilters(SERVICE *service, char *filters);
|
bool serviceSetFilters(SERVICE *service, char *filters);
|
||||||
|
@ -806,6 +806,7 @@ bool runtime_destroy_listener(SERVICE *service, const char *name)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_ERROR("Failed to destroy listener '%s' for service '%s'", name, service->name);
|
MXS_ERROR("Failed to destroy listener '%s' for service '%s'", name, service->name);
|
||||||
|
runtime_error("Failed to destroy listener '%s' for service '%s'", name, service->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,6 +353,29 @@ HttpResponse cb_delete_monitor(const HttpRequest& request)
|
|||||||
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
|
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpResponse cb_delete_listener(const HttpRequest& request)
|
||||||
|
{
|
||||||
|
|
||||||
|
SERVICE* service = service_find(request.uri_part(1).c_str());
|
||||||
|
ss_dassert(service);
|
||||||
|
|
||||||
|
if (service)
|
||||||
|
{
|
||||||
|
std::string listener = request.uri_part(3);
|
||||||
|
|
||||||
|
if (!service_has_named_listener(service, listener.c_str()))
|
||||||
|
{
|
||||||
|
return HttpResponse(MHD_HTTP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
else if (runtime_destroy_listener(service, listener.c_str()))
|
||||||
|
{
|
||||||
|
return HttpResponse(MHD_HTTP_NO_CONTENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
|
||||||
|
}
|
||||||
|
|
||||||
HttpResponse cb_all_servers(const HttpRequest& request)
|
HttpResponse cb_all_servers(const HttpRequest& request)
|
||||||
{
|
{
|
||||||
return HttpResponse(MHD_HTTP_OK, server_list_to_json(request.host()));
|
return HttpResponse(MHD_HTTP_OK, server_list_to_json(request.host()));
|
||||||
@ -754,6 +777,12 @@ public:
|
|||||||
m_delete.push_back(SResource(new Resource(cb_delete_monitor, 2, "monitors", ":monitor")));
|
m_delete.push_back(SResource(new Resource(cb_delete_monitor, 2, "monitors", ":monitor")));
|
||||||
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "inet", ":inetuser")));
|
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "inet", ":inetuser")));
|
||||||
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "unix", ":unixuser")));
|
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "unix", ":unixuser")));
|
||||||
|
|
||||||
|
/** The wildcard for listener name isn't a good solution as it adds
|
||||||
|
* a burden to the callback and requires it to do the checking but it'll
|
||||||
|
* do for the time being */
|
||||||
|
m_delete.push_back(SResource(new Resource(cb_delete_listener, 4,
|
||||||
|
"services", ":service", "listeners", "?")));
|
||||||
}
|
}
|
||||||
|
|
||||||
~RootResource()
|
~RootResource()
|
||||||
|
@ -796,6 +796,22 @@ bool serviceHasListener(SERVICE *service, const char *protocol,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool service_has_named_listener(SERVICE *service, const char *name)
|
||||||
|
{
|
||||||
|
LISTENER_ITERATOR iter;
|
||||||
|
|
||||||
|
for (SERV_LISTENER *listener = listener_iterator_init(service, &iter);
|
||||||
|
listener; listener = listener_iterator_next(&iter))
|
||||||
|
{
|
||||||
|
if (listener_is_active(listener) && strcmp(listener->name, name) == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate a new server reference
|
* Allocate a new server reference
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user