From 32fdc3d454f1df853ec7d649f4dd68249560dd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sun, 15 Apr 2018 09:20:43 +0300 Subject: [PATCH] MXS-1782: Add listener state to REST API The state of each individual listener is now displayed in the REST API. Created common functions for printing the listener state and took them into use. Added the new state into MaxCtrl output. --- include/maxscale/listener.h | 9 +++++++++ maxctrl/lib/list.js | 3 ++- server/core/listener.cc | 28 +++++++++++++++++++++++++++- server/core/service.cc | 10 ++-------- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/include/maxscale/listener.h b/include/maxscale/listener.h index 7b040117e..71ff7236c 100644 --- a/include/maxscale/listener.h +++ b/include/maxscale/listener.h @@ -121,4 +121,13 @@ SERV_LISTENER* listener_iterator_init(const struct service* service, LISTENER_IT */ SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter); +/** + * Get listener state as a string + * + * @param listener Listener to inspect + * + * @return State of the listener as a string + */ +const char* listener_state_to_string(const SERV_LISTENER* listener); + MXS_END_DECLS diff --git a/maxctrl/lib/list.js b/maxctrl/lib/list.js index 7e85c914f..9d2347e7b 100644 --- a/maxctrl/lib/list.js +++ b/maxctrl/lib/list.js @@ -104,7 +104,8 @@ exports.builder = function(yargs) { return getSubCollection(host, 'services/' + argv.service, 'attributes.listeners', [ {'Name': 'id'}, {'Port': 'attributes.parameters.port'}, - {'Host': 'attributes.parameters.host'} + {'Host': 'attributes.parameters.host'}, + {'State': 'attributes.state'} ]) }) }) diff --git a/server/core/listener.cc b/server/core/listener.cc index 3f658478a..376f6d330 100644 --- a/server/core/listener.cc +++ b/server/core/listener.cc @@ -527,6 +527,7 @@ json_t* listener_to_json(const SERV_LISTENER* listener) } json_t* attr = json_object(); + json_object_set_new(attr, CN_STATE, json_string(listener_state_to_string(listener))); json_object_set_new(attr, CN_PARAMETERS, param); if (listener->listener->authfunc.diagnostic_json) @@ -540,9 +541,9 @@ json_t* listener_to_json(const SERV_LISTENER* listener) } json_t* rval = json_object(); - json_object_set_new(rval, CN_ATTRIBUTES, attr); json_object_set_new(rval, CN_ID, json_string(listener->name)); json_object_set_new(rval, CN_TYPE, json_string(CN_LISTENERS)); + json_object_set_new(rval, CN_ATTRIBUTES, attr); return rval; } @@ -580,3 +581,28 @@ SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter) return iter->current; } + +const char* listener_state_to_string(const SERV_LISTENER* listener) +{ + ss_dassert(listener); + + if (listener->listener && listener->listener->session) + { + switch (listener->listener->session->state) + { + case SESSION_STATE_LISTENER_STOPPED: + return "Stopped"; + + case SESSION_STATE_LISTENER: + return "Running"; + + default: + ss_dassert(!true); + return "Unknown"; + } + } + else + { + return "Failed"; + } +} diff --git a/server/core/service.cc b/server/core/service.cc index 2a1bdc9ee..98ca5c0a9 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -1626,10 +1626,7 @@ dListListeners(DCB *dcb) listener->name, service->name, listener->protocol, (listener && listener->address) ? listener->address : "*", listener->port, - (!listener->listener || - !listener->listener->session || - listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? - "Stopped" : "Running"); + listener_state_to_string(listener)); } } service = service->next; @@ -2099,10 +2096,7 @@ serviceListenerRowCallback(RESULTSET *set, void *data) resultset_row_set(row, 2, (lptr && lptr->address) ? lptr->address : "*"); sprintf(buf, "%d", lptr->port); resultset_row_set(row, 3, buf); - resultset_row_set(row, 4, - (!lptr->listener || !lptr->listener->session || - lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? - "Stopped" : "Running"); + resultset_row_set(row, 4, listener_state_to_string(lptr)); spinlock_release(&service_spin); return row; }