MXS-1929: Add filter deletion entry points
Added the code required to delete a filter via the REST API. The actual deleting of the filters is still to be implemented.
This commit is contained in:
@ -1078,6 +1078,26 @@ bool runtime_create_filter(const char *name, const char *module, MXS_CONFIG_PARA
|
||||
return rval;
|
||||
}
|
||||
|
||||
bool runtime_destroy_filter(MXS_FILTER_DEF* filter)
|
||||
{
|
||||
ss_dassert(filter);
|
||||
bool rval = false;
|
||||
mxs::SpinLockGuard guard(crt_lock);
|
||||
|
||||
if (filter_can_be_destroyed(filter))
|
||||
{
|
||||
filter_destroy(filter);
|
||||
rval = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
runtime_error("Filter '%s' cannot be destroyed: Remove it from all services "
|
||||
"first", filter->name);
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
static bool runtime_create_service(const char *name, const char *router, MXS_CONFIG_PARAMETER* params)
|
||||
{
|
||||
mxs::SpinLockGuard guard(crt_lock);
|
||||
|
||||
@ -37,6 +37,7 @@
|
||||
|
||||
#include "internal/config.h"
|
||||
#include "internal/modules.h"
|
||||
#include "internal/service.h"
|
||||
|
||||
using std::string;
|
||||
using std::set;
|
||||
@ -152,6 +153,17 @@ filter_def_find(const char *name)
|
||||
return filter;
|
||||
}
|
||||
|
||||
bool filter_can_be_destroyed(MXS_FILTER_DEF *filter)
|
||||
{
|
||||
return !service_filter_in_use(filter);
|
||||
}
|
||||
|
||||
void filter_destroy(MXS_FILTER_DEF *filter)
|
||||
{
|
||||
ss_dassert(filter_can_be_destroyed(filter));
|
||||
ss_info_dassert(!true, "Not yet implemented");
|
||||
}
|
||||
|
||||
const char* filter_def_get_name(const MXS_FILTER_DEF* filter_def)
|
||||
{
|
||||
return filter_def->name;
|
||||
|
||||
@ -205,6 +205,17 @@ bool runtime_create_monitor(const char *name, const char *module);
|
||||
*/
|
||||
bool runtime_create_filter(const char *name, const char *module, MXS_CONFIG_PARAMETER* params);
|
||||
|
||||
/**
|
||||
* Destroy a filter
|
||||
*
|
||||
* The filter can only be destroyed if no service uses it
|
||||
*
|
||||
* @param service Filter to destroy
|
||||
*
|
||||
* @return True if filter was destroyed
|
||||
*/
|
||||
bool runtime_destroy_filter(MXS_FILTER_DEF* filter);
|
||||
|
||||
/**
|
||||
* @brief Destroy a monitor
|
||||
*
|
||||
|
||||
@ -46,4 +46,23 @@ MXS_UPSTREAM *filter_upstream(MXS_FILTER_DEF *filter_def,
|
||||
MXS_FILTER_SESSION *fsession,
|
||||
MXS_UPSTREAM *upstream);
|
||||
|
||||
/**
|
||||
* Check if filter can be destroyed
|
||||
*
|
||||
* A filter can be destroyed if no service uses it.
|
||||
*
|
||||
* @param filter Filter to check
|
||||
*
|
||||
* @return True if filter can be destroyed
|
||||
*/
|
||||
bool filter_can_be_destroyed(MXS_FILTER_DEF *filter);
|
||||
|
||||
/**
|
||||
* Destroy a filter
|
||||
*
|
||||
* @param filter Filter to destroy
|
||||
*/
|
||||
void filter_destroy(MXS_FILTER_DEF *filter);
|
||||
|
||||
|
||||
MXS_END_DECLS
|
||||
|
||||
@ -148,6 +148,15 @@ int service_isvalid(SERVICE *service);
|
||||
*/
|
||||
bool service_server_in_use(const SERVER *server);
|
||||
|
||||
/**
|
||||
* Check if filter is used by any service
|
||||
*
|
||||
* @param filter Filter to inspect
|
||||
*
|
||||
* @return True if at least one service uses the filter
|
||||
*/
|
||||
bool service_filter_in_use(const MXS_FILTER_DEF *filter);
|
||||
|
||||
/** Update the server weights used by services */
|
||||
void service_update_weights();
|
||||
|
||||
|
||||
@ -484,6 +484,18 @@ HttpResponse cb_delete_service(const HttpRequest& request)
|
||||
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
|
||||
}
|
||||
|
||||
HttpResponse cb_delete_filter(const HttpRequest& request)
|
||||
{
|
||||
MXS_FILTER_DEF* filter = filter_def_find(request.uri_part(1).c_str());
|
||||
ss_dassert(filter);
|
||||
|
||||
if (runtime_destroy_filter(filter))
|
||||
{
|
||||
return HttpResponse(MHD_HTTP_NO_CONTENT);
|
||||
}
|
||||
|
||||
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
|
||||
}
|
||||
HttpResponse cb_all_servers(const HttpRequest& request)
|
||||
{
|
||||
return HttpResponse(MHD_HTTP_OK, server_list_to_json(request.host()));
|
||||
@ -957,6 +969,7 @@ public:
|
||||
m_delete.push_back(SResource(new Resource(cb_delete_server, 2, "servers", ":server")));
|
||||
m_delete.push_back(SResource(new Resource(cb_delete_monitor, 2, "monitors", ":monitor")));
|
||||
m_delete.push_back(SResource(new Resource(cb_delete_service, 2, "services", ":service")));
|
||||
m_delete.push_back(SResource(new Resource(cb_delete_filter, 2, "filters", ":filter")));
|
||||
|
||||
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")));
|
||||
|
||||
@ -2196,6 +2196,33 @@ bool service_server_in_use(const SERVER *server)
|
||||
return rval;
|
||||
}
|
||||
|
||||
bool service_filter_in_use(const MXS_FILTER_DEF *filter)
|
||||
{
|
||||
ss_dassert(filter);
|
||||
bool rval = false;
|
||||
|
||||
spinlock_acquire(&service_spin);
|
||||
|
||||
for (SERVICE *service = allServices; service && !rval; service = service->next)
|
||||
{
|
||||
spinlock_acquire(&service->spin);
|
||||
for (int i = 0; i < service->n_filters; i++)
|
||||
{
|
||||
if (service->filters[i] == filter)
|
||||
{
|
||||
rval = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spinlock_release(&service->spin);
|
||||
}
|
||||
|
||||
spinlock_release(&service_spin);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a service configuration at the location pointed by @c filename
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user