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.
This commit is contained in:
		@ -121,4 +121,13 @@ SERV_LISTENER* listener_iterator_init(const struct service* service, LISTENER_IT
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter);
 | 
					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
 | 
					MXS_END_DECLS
 | 
				
			||||||
 | 
				
			|||||||
@ -104,7 +104,8 @@ exports.builder = function(yargs) {
 | 
				
			|||||||
                return getSubCollection(host, 'services/' + argv.service, 'attributes.listeners', [
 | 
					                return getSubCollection(host, 'services/' + argv.service, 'attributes.listeners', [
 | 
				
			||||||
                    {'Name': 'id'},
 | 
					                    {'Name': 'id'},
 | 
				
			||||||
                    {'Port': 'attributes.parameters.port'},
 | 
					                    {'Port': 'attributes.parameters.port'},
 | 
				
			||||||
                    {'Host': 'attributes.parameters.host'}
 | 
					                    {'Host': 'attributes.parameters.host'},
 | 
				
			||||||
 | 
					                    {'State': 'attributes.state'}
 | 
				
			||||||
                ])
 | 
					                ])
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
				
			|||||||
@ -527,6 +527,7 @@ json_t* listener_to_json(const SERV_LISTENER* listener)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    json_t* attr = json_object();
 | 
					    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);
 | 
					    json_object_set_new(attr, CN_PARAMETERS, param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (listener->listener->authfunc.diagnostic_json)
 | 
					    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_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_ID, json_string(listener->name));
 | 
				
			||||||
    json_object_set_new(rval, CN_TYPE, json_string(CN_LISTENERS));
 | 
					    json_object_set_new(rval, CN_TYPE, json_string(CN_LISTENERS));
 | 
				
			||||||
 | 
					    json_object_set_new(rval, CN_ATTRIBUTES, attr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return rval;
 | 
					    return rval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -580,3 +581,28 @@ SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return iter->current;
 | 
					    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";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1626,10 +1626,7 @@ dListListeners(DCB *dcb)
 | 
				
			|||||||
                           listener->name, service->name, listener->protocol,
 | 
					                           listener->name, service->name, listener->protocol,
 | 
				
			||||||
                           (listener && listener->address) ? listener->address : "*",
 | 
					                           (listener && listener->address) ? listener->address : "*",
 | 
				
			||||||
                           listener->port,
 | 
					                           listener->port,
 | 
				
			||||||
                           (!listener->listener ||
 | 
					                           listener_state_to_string(listener));
 | 
				
			||||||
                            !listener->listener->session ||
 | 
					 | 
				
			||||||
                            listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ?
 | 
					 | 
				
			||||||
                           "Stopped" : "Running");
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        service = service->next;
 | 
					        service = service->next;
 | 
				
			||||||
@ -2099,10 +2096,7 @@ serviceListenerRowCallback(RESULTSET *set, void *data)
 | 
				
			|||||||
    resultset_row_set(row, 2, (lptr && lptr->address) ? lptr->address : "*");
 | 
					    resultset_row_set(row, 2, (lptr && lptr->address) ? lptr->address : "*");
 | 
				
			||||||
    sprintf(buf, "%d", lptr->port);
 | 
					    sprintf(buf, "%d", lptr->port);
 | 
				
			||||||
    resultset_row_set(row, 3, buf);
 | 
					    resultset_row_set(row, 3, buf);
 | 
				
			||||||
    resultset_row_set(row, 4,
 | 
					    resultset_row_set(row, 4, listener_state_to_string(lptr));
 | 
				
			||||||
                      (!lptr->listener || !lptr->listener->session ||
 | 
					 | 
				
			||||||
                       lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ?
 | 
					 | 
				
			||||||
                      "Stopped" : "Running");
 | 
					 | 
				
			||||||
    spinlock_release(&service_spin);
 | 
					    spinlock_release(&service_spin);
 | 
				
			||||||
    return row;
 | 
					    return row;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user