MXS-1220: Add PUT support for services
Service parameters can now be altered with a PUT request to the REST API. This allows general level parameters to be altered. Module specific parameters need to be altered with a different mechanism, namely the module command system. This requires that a generic way to call a function needs to be devised.
This commit is contained in:
@ -1143,3 +1143,70 @@ bool runtime_alter_monitor_from_json(MXS_MONITOR* monitor, json_t* new_json)
|
|||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the service parameter can be altered at runtime
|
||||||
|
*
|
||||||
|
* @param key Parameter name
|
||||||
|
* @return True if the parameter can be altered
|
||||||
|
*/
|
||||||
|
static bool is_dynamic_param(const string& key)
|
||||||
|
{
|
||||||
|
return key != CN_TYPE &&
|
||||||
|
key != CN_ROUTER &&
|
||||||
|
key != CN_ROUTER_OPTIONS &&
|
||||||
|
key != CN_SERVERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool runtime_alter_service_from_json(SERVICE* service, json_t* new_json)
|
||||||
|
{
|
||||||
|
bool rval = false;
|
||||||
|
Closer<json_t*> old_json(service_to_json(service, ""));
|
||||||
|
ss_dassert(old_json.get());
|
||||||
|
|
||||||
|
if (object_to_server_relations(service->name, old_json.get(), new_json))
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
json_t* parameters = json_object_get(new_json, CN_PARAMETERS);
|
||||||
|
json_t* old_parameters = json_object_get(old_json.get(), CN_PARAMETERS);
|
||||||
|
|
||||||
|
ss_dassert(old_parameters);
|
||||||
|
|
||||||
|
if (parameters)
|
||||||
|
{
|
||||||
|
/** Create a set of accepted service parameters */
|
||||||
|
set<string> paramset;
|
||||||
|
for (int i = 0; config_service_params[i]; i++)
|
||||||
|
{
|
||||||
|
if (is_dynamic_param(config_service_params[i]))
|
||||||
|
{
|
||||||
|
paramset.insert(config_service_params[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = true;
|
||||||
|
const char* key;
|
||||||
|
json_t* value;
|
||||||
|
|
||||||
|
json_object_foreach(parameters, key, value)
|
||||||
|
{
|
||||||
|
json_t* new_val = json_object_get(parameters, key);
|
||||||
|
json_t* old_val = json_object_get(old_parameters, key);
|
||||||
|
|
||||||
|
if (old_val && new_val && mxs::json_to_string(new_val) == mxs::json_to_string(old_val))
|
||||||
|
{
|
||||||
|
/** No change in values */
|
||||||
|
}
|
||||||
|
else if (paramset.find(key) != paramset.end())
|
||||||
|
{
|
||||||
|
if (!runtime_alter_service(service, key, mxs::json_to_string(value).c_str()))
|
||||||
|
{
|
||||||
|
rval = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
@ -228,4 +228,14 @@ MXS_MONITOR* runtime_create_monitor_from_json(json_t* json);
|
|||||||
*/
|
*/
|
||||||
bool runtime_alter_monitor_from_json(MXS_MONITOR* monitor, json_t* new_json);
|
bool runtime_alter_monitor_from_json(MXS_MONITOR* monitor, json_t* new_json);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Alter a service using JSON
|
||||||
|
*
|
||||||
|
* @param service Service to alter
|
||||||
|
* @param new_json JSON definition of the updated service
|
||||||
|
*
|
||||||
|
* @return True if the service was successfully modified to represent @c new_json
|
||||||
|
*/
|
||||||
|
bool runtime_alter_service_from_json(SERVICE* service, json_t* new_json);
|
||||||
|
|
||||||
MXS_END_DECLS
|
MXS_END_DECLS
|
||||||
|
@ -175,6 +175,23 @@ HttpResponse cb_alter_monitor(const HttpRequest& request)
|
|||||||
return HttpResponse(MHD_HTTP_BAD_REQUEST);
|
return HttpResponse(MHD_HTTP_BAD_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpResponse cb_alter_service(const HttpRequest& request)
|
||||||
|
{
|
||||||
|
json_t* json = request.get_json();
|
||||||
|
|
||||||
|
if (json)
|
||||||
|
{
|
||||||
|
SERVICE* service = service_find(request.uri_part(1).c_str());
|
||||||
|
|
||||||
|
if (service && runtime_alter_service_from_json(service, json))
|
||||||
|
{
|
||||||
|
return HttpResponse(MHD_HTTP_OK, service_to_json(service, request.host()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse(MHD_HTTP_BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
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()));
|
||||||
@ -352,6 +369,7 @@ public:
|
|||||||
|
|
||||||
m_put.push_back(SResource(new Resource(cb_alter_server, 2, "servers", ":server")));
|
m_put.push_back(SResource(new Resource(cb_alter_server, 2, "servers", ":server")));
|
||||||
m_put.push_back(SResource(new Resource(cb_alter_monitor, 2, "monitors", ":monitor")));
|
m_put.push_back(SResource(new Resource(cb_alter_monitor, 2, "monitors", ":monitor")));
|
||||||
|
m_put.push_back(SResource(new Resource(cb_alter_service, 2, "services", ":service")));
|
||||||
}
|
}
|
||||||
|
|
||||||
~RootResource()
|
~RootResource()
|
||||||
|
Reference in New Issue
Block a user