MXS-1220: Reorganize service resource
The service resource now conforms to the JSON API schema. Added a test case for individual resources and resource collections.
This commit is contained in:
@ -2446,16 +2446,25 @@ json_t* service_parameters_to_json(const SERVICE* service)
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
json_t* service_to_json(const SERVICE* service, const char* host)
|
static inline bool have_active_servers(const SERVICE* service)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&service->spin);
|
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
||||||
|
{
|
||||||
|
if (SERVER_REF_IS_ACTIVE(ref))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
json_t* rval = json_object();
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/** General service information */
|
json_t* service_attributes(const SERVICE* service)
|
||||||
json_object_set_new(rval, CN_NAME, json_string(service->name));
|
{
|
||||||
json_object_set_new(rval, CN_ROUTER, json_string(service->routerModule));
|
json_t* attr = json_object();
|
||||||
json_object_set_new(rval, CN_STATE, json_string(service_state_to_string(service->state)));
|
|
||||||
|
json_object_set_new(attr, CN_ROUTER, json_string(service->routerModule));
|
||||||
|
json_object_set_new(attr, CN_STATE, json_string(service_state_to_string(service->state)));
|
||||||
|
|
||||||
if (service->router && service->router_instance)
|
if (service->router && service->router_instance)
|
||||||
{
|
{
|
||||||
@ -2463,7 +2472,7 @@ json_t* service_to_json(const SERVICE* service, const char* host)
|
|||||||
|
|
||||||
if (diag)
|
if (diag)
|
||||||
{
|
{
|
||||||
json_object_set_new(rval, "router_diagnostics", diag);
|
json_object_set_new(attr, "router_diagnostics", diag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2473,12 +2482,12 @@ json_t* service_to_json(const SERVICE* service, const char* host)
|
|||||||
asctime_r(localtime_r(&service->stats.started, &result), timebuf);
|
asctime_r(localtime_r(&service->stats.started, &result), timebuf);
|
||||||
trim(timebuf);
|
trim(timebuf);
|
||||||
|
|
||||||
json_object_set_new(rval, "started", json_string(timebuf));
|
json_object_set_new(attr, "started", json_string(timebuf));
|
||||||
json_object_set_new(rval, "total_connections", json_integer(service->stats.n_sessions));
|
json_object_set_new(attr, "total_connections", json_integer(service->stats.n_sessions));
|
||||||
json_object_set_new(rval, "connections", json_integer(service->stats.n_current));
|
json_object_set_new(attr, "connections", json_integer(service->stats.n_current));
|
||||||
|
|
||||||
/** Add service parameters */
|
/** Add service parameters */
|
||||||
json_object_set_new(rval, CN_PARAMETERS, service_parameters_to_json(service));
|
json_object_set_new(attr, CN_PARAMETERS, service_parameters_to_json(service));
|
||||||
|
|
||||||
/** Add listeners */
|
/** Add listeners */
|
||||||
json_t* arr = json_array();
|
json_t* arr = json_array();
|
||||||
@ -2491,76 +2500,76 @@ json_t* service_to_json(const SERVICE* service, const char* host)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json_object_set_new(rval, CN_LISTENERS, arr);
|
json_object_set_new(attr, CN_LISTENERS, arr);
|
||||||
|
|
||||||
|
return attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_t* service_relationships(const SERVICE* service, const char* host)
|
||||||
|
{
|
||||||
/** Store relationships to other objects */
|
/** Store relationships to other objects */
|
||||||
json_t* rel = json_object();
|
json_t* rel = json_object();
|
||||||
|
|
||||||
string self = host;
|
|
||||||
self += "/services/";
|
|
||||||
self += service->name;
|
|
||||||
json_object_set_new(rel, CN_SELF, json_string(self.c_str()));
|
|
||||||
|
|
||||||
if (service->n_filters)
|
if (service->n_filters)
|
||||||
{
|
{
|
||||||
json_t* arr = json_array();
|
json_t* filters = mxs_json_relationship(host, MXS_JSON_API_FILTERS);
|
||||||
|
|
||||||
for (int i = 0; i < service->n_filters; i++)
|
for (int i = 0; i < service->n_filters; i++)
|
||||||
{
|
{
|
||||||
string filter = host;
|
mxs_json_add_relation(filters, service->filters[i]->name, CN_FILTERS);
|
||||||
filter += "/filters/";
|
|
||||||
filter += service->filters[i]->name;
|
|
||||||
json_array_append_new(arr, json_string(filter.c_str()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
json_object_set_new(rel, "filters", arr);
|
json_object_set_new(rel, CN_FILTERS, filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool active_servers = false;
|
if (have_active_servers(service))
|
||||||
|
|
||||||
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
|
||||||
{
|
{
|
||||||
if (SERVER_REF_IS_ACTIVE(ref))
|
json_t* servers = mxs_json_relationship(host, MXS_JSON_API_SERVERS);
|
||||||
{
|
|
||||||
active_servers = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (active_servers)
|
|
||||||
{
|
|
||||||
json_t* arr = json_array();
|
|
||||||
|
|
||||||
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
||||||
{
|
{
|
||||||
if (SERVER_REF_IS_ACTIVE(ref))
|
if (SERVER_REF_IS_ACTIVE(ref))
|
||||||
{
|
{
|
||||||
string s = host;
|
mxs_json_add_relation(servers, ref->server->unique_name, CN_SERVERS);
|
||||||
s += "/servers/";
|
|
||||||
s += ref->server->unique_name;
|
|
||||||
json_array_append_new(arr, json_string(s.c_str()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json_object_set_new(rel, CN_SERVERS, arr);
|
json_object_set_new(rel, CN_SERVERS, servers);
|
||||||
}
|
}
|
||||||
|
|
||||||
json_object_set_new(rval, CN_RELATIONSHIPS, rel);
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_t* service_json_data(const SERVICE* service, const char* host)
|
||||||
|
{
|
||||||
|
json_t* rval = json_object();
|
||||||
|
|
||||||
|
spinlock_acquire(&service->spin);
|
||||||
|
|
||||||
|
json_object_set_new(rval, CN_ID, json_string(service->name));
|
||||||
|
json_object_set_new(rval, CN_TYPE, json_string(CN_SERVICES));
|
||||||
|
json_object_set_new(rval, CN_ATTRIBUTES, service_attributes(service));
|
||||||
|
json_object_set_new(rval, CN_RELATIONSHIPS, service_relationships(service, host));
|
||||||
|
|
||||||
spinlock_release(&service->spin);
|
spinlock_release(&service->spin);
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json_t* service_to_json(const SERVICE* service, const char* host)
|
||||||
|
{
|
||||||
|
return mxs_json_resource(host, MXS_JSON_API_SERVICES, service_json_data(service, host));
|
||||||
|
}
|
||||||
|
|
||||||
json_t* service_list_to_json(const char* host)
|
json_t* service_list_to_json(const char* host)
|
||||||
{
|
{
|
||||||
json_t* rval = json_array();
|
json_t* arr = json_array();
|
||||||
|
|
||||||
spinlock_acquire(&service_spin);
|
spinlock_acquire(&service_spin);
|
||||||
|
|
||||||
for (SERVICE *service = allServices; service; service = service->next)
|
for (SERVICE *service = allServices; service; service = service->next)
|
||||||
{
|
{
|
||||||
json_t* svc = service_to_json(service, host);
|
json_t* svc = service_json_data(service, host);
|
||||||
|
|
||||||
if (svc)
|
if (svc)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
// These tests use the server/test/maxscale_test.cnf configuration
|
||||||
|
|
||||||
require("../utils.js")()
|
require("../utils.js")()
|
||||||
|
|
||||||
describe("Resource Collections", function(){
|
describe("Resource Collections", function(){
|
||||||
@ -28,6 +30,7 @@ describe("Individual Resources", function(){
|
|||||||
var tests = [
|
var tests = [
|
||||||
"/servers/server1",
|
"/servers/server1",
|
||||||
"/servers/server2",
|
"/servers/server2",
|
||||||
|
"/services/RW-Split-Router",
|
||||||
"/sessions/1",
|
"/sessions/1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user