diff --git a/include/neuron/adapter.h b/include/neuron/adapter.h index 3391d993..edfa097e 100644 --- a/include/neuron/adapter.h +++ b/include/neuron/adapter.h @@ -349,7 +349,7 @@ inline static UT_icd neu_nodes_state_t_icd() return icd; } typedef struct { - UT_array *states; // array of neu_node_state_t + UT_array *states; // array of neu_nodes_state_t } neu_resp_get_nodes_state_t, neu_reqresp_nodes_state_t; typedef struct neu_req_update_license { diff --git a/plugins/restful/adapter_handle.c b/plugins/restful/adapter_handle.c index abbf6750..fb52a515 100644 --- a/plugins/restful/adapter_handle.c +++ b/plugins/restful/adapter_handle.c @@ -234,17 +234,15 @@ void handle_get_node_state(nng_aio *aio) VALIDATE_JWT(aio); + header.ctx = aio; + if (http_get_param_str(aio, "node", node_name, sizeof(node_name)) <= 0) { - NEU_JSON_RESPONSE_ERROR(NEU_ERR_PARAM_IS_WRONG, { - http_response(aio, error_code.error, result_error); - }) - return; + header.type = NEU_REQ_GET_NODES_STATE; + } else { + header.type = NEU_REQ_GET_NODE_STATE; + strcpy(cmd.node, node_name); } - header.ctx = aio; - header.type = NEU_REQ_GET_NODE_STATE; - - strcpy(cmd.node, node_name); ret = neu_plugin_op(plugin, header, &cmd); if (ret != 0) { NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { @@ -265,4 +263,32 @@ void handle_get_node_state_resp(nng_aio *aio, neu_resp_get_node_state_t *state) http_ok(aio, result); free(result); +} + +void handle_get_nodes_state_resp(nng_aio * aio, + neu_resp_get_nodes_state_t *states) +{ + neu_json_get_nodes_state_resp_t states_res = { 0 }; + char * result = NULL; + + states_res.n_node = utarray_len(states->states); + states_res.nodes = + calloc(states_res.n_node, sizeof(neu_json_get_nodes_state_t)); + + utarray_foreach(states->states, neu_nodes_state_t *, state) + { + int index = utarray_eltidx(states->states, state); + states_res.nodes[index].name = state->node; + states_res.nodes[index].running = state->state.running; + states_res.nodes[index].link = state->state.link; + } + + neu_json_encode_by_fn(&states_res, neu_json_encode_get_nodes_state_resp, + &result); + + http_ok(aio, result); + + free(result); + free(states_res.nodes); + utarray_free(states->states); } \ No newline at end of file diff --git a/plugins/restful/adapter_handle.h b/plugins/restful/adapter_handle.h index 7cfa59f8..693263d5 100644 --- a/plugins/restful/adapter_handle.h +++ b/plugins/restful/adapter_handle.h @@ -36,5 +36,7 @@ void handle_get_node_setting_resp(nng_aio * aio, void handle_node_ctl(nng_aio *aio); void handle_get_node_state(nng_aio *aio); void handle_get_node_state_resp(nng_aio *aio, neu_resp_get_node_state_t *state); +void handle_get_nodes_state_resp(nng_aio * aio, + neu_resp_get_nodes_state_t *states); #endif \ No newline at end of file diff --git a/plugins/restful/rest.c b/plugins/restful/rest.c index 2cbe3d2e..2cbf9ebf 100644 --- a/plugins/restful/rest.c +++ b/plugins/restful/rest.c @@ -280,6 +280,10 @@ static int dashb_plugin_request(neu_plugin_t * plugin, handle_get_node_setting_resp(header->ctx, (neu_resp_get_node_setting_t *) data); break; + case NEU_RESP_GET_NODES_STATE: + handle_get_nodes_state_resp(header->ctx, + (neu_resp_get_nodes_state_t *) data); + break; case NEU_RESP_GET_NODE_STATE: handle_get_node_state_resp(header->ctx, (neu_resp_get_node_state_t *) data); diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 15100534..d0959c22 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -249,6 +249,7 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) case NEU_REQ_UPDATE_LICENSE: case NEU_REQ_APP_UNSUBSCRIBE_GROUP: case NEU_RESP_GET_NODE_STATE: + case NEU_RESP_GET_NODES_STATE: case NEU_RESP_GET_NODE_SETTING: case NEU_RESP_READ_GROUP: case NEU_RESP_GET_SUBSCRIBE_GROUP: diff --git a/src/core/manager.c b/src/core/manager.c index b5f05e96..1d0dae13 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -358,7 +358,20 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) reply(manager, header, &resp); break; } + case NEU_REQ_GET_NODES_STATE: { + neu_resp_get_nodes_state_t resp = { 0 }; + UT_array *states = neu_node_manager_get_state(manager->node_manager); + resp.states = utarray_clone(states); + + strcpy(header->receiver, header->sender); + strcpy(header->sender, "manager"); + header->type = NEU_RESP_GET_NODES_STATE; + reply(manager, header, &resp); + + utarray_free(states); + break; + } case NEU_REQ_GET_NODE_SETTING: case NEU_REQ_READ_GROUP: case NEU_REQ_WRITE_TAG: diff --git a/src/parser/neu_json_node.c b/src/parser/neu_json_node.c index f72793c9..c2b2f486 100644 --- a/src/parser/neu_json_node.c +++ b/src/parser/neu_json_node.c @@ -145,6 +145,48 @@ int neu_json_encode_get_node_state_resp(void *json_object, void *param) return ret; } +int neu_json_encode_get_nodes_state_resp(void *json_object, void *param) +{ + int ret = 0; + neu_json_get_nodes_state_resp_t *resp = + (neu_json_get_nodes_state_resp_t *) param; + + void * node_array = neu_json_array(); + neu_json_get_nodes_state_t *p_node = resp->nodes; + for (int i = 0; i < resp->n_node; i++) { + neu_json_elem_t node_elems[] = { + { + .name = "node", + .t = NEU_JSON_STR, + .v.val_str = p_node->name, + }, + { + .name = "running", + .t = NEU_JSON_INT, + .v.val_int = p_node->running, + }, + { + .name = "link", + .t = NEU_JSON_INT, + .v.val_int = p_node->link, + }, + }; + node_array = neu_json_encode_array(node_array, node_elems, + NEU_JSON_ELEM_SIZE(node_elems)); + p_node++; + } + + neu_json_elem_t resp_elems[] = { { + .name = "states", + .t = NEU_JSON_OBJECT, + .v.val_object = node_array, + } }; + ret = neu_json_encode_field(json_object, resp_elems, + NEU_JSON_ELEM_SIZE(resp_elems)); + + return ret; +} + int neu_json_encode_get_nodes_resp(void *json_object, void *param) { int ret = 0; diff --git a/src/parser/neu_json_node.h b/src/parser/neu_json_node.h index c3905cde..9a549726 100644 --- a/src/parser/neu_json_node.h +++ b/src/parser/neu_json_node.h @@ -53,6 +53,19 @@ typedef struct { int neu_json_encode_get_node_state_resp(void *json_object, void *param); +typedef struct { + char * name; + int64_t running; + int64_t link; +} neu_json_get_nodes_state_t; + +typedef struct { + uint16_t n_node; + neu_json_get_nodes_state_t *nodes; +} neu_json_get_nodes_state_resp_t; + +int neu_json_encode_get_nodes_state_resp(void *json_object, void *param); + typedef struct { char *name; char *plugin;