From 3bf7a10ac9d669c9da5c665a0b15742f606a230e Mon Sep 17 00:00:00 2001 From: fengzero Date: Tue, 1 Apr 2025 06:28:12 +0000 Subject: [PATCH 1/3] get nodes: query state/link, sort delay --- include/neuron/msg.h | 13 +++++++-- plugins/restful/adapter_handle.c | 22 ++++++++++++++++ src/core/manager.c | 18 ++++++++----- src/core/manager_internal.c | 7 +++-- src/core/manager_internal.h | 4 ++- src/core/node_manager.c | 45 +++++++++++++++++++++++++++++++- src/core/node_manager.h | 4 ++- 7 files changed, 99 insertions(+), 14 deletions(-) diff --git a/include/neuron/msg.h b/include/neuron/msg.h index db67880d7..47b5aac7c 100644 --- a/include/neuron/msg.h +++ b/include/neuron/msg.h @@ -326,11 +326,20 @@ typedef struct neu_req_get_node { neu_node_type_e type; char plugin[NEU_PLUGIN_NAME_LEN]; char node[NEU_NODE_NAME_LEN]; + + struct { + bool q_state; + int state; + bool q_link; + int link; + bool s_delay; + } query; } neu_req_get_node_t; typedef struct neu_resp_node_info { - char node[NEU_NODE_NAME_LEN]; - char plugin[NEU_PLUGIN_NAME_LEN]; + int64_t delay; + char node[NEU_NODE_NAME_LEN]; + char plugin[NEU_PLUGIN_NAME_LEN]; } neu_resp_node_info_t; typedef struct neu_resp_get_node { diff --git a/plugins/restful/adapter_handle.c b/plugins/restful/adapter_handle.c index 90ccd2b45..2952bf6a0 100644 --- a/plugins/restful/adapter_handle.c +++ b/plugins/restful/adapter_handle.c @@ -173,6 +173,28 @@ void handle_get_adapter(nng_aio *aio) strcpy(cmd.node, node_name); } + uintmax_t query_state = 0; + if (neu_http_get_param_uintmax(aio, "state", &query_state) == 0) { + if (query_state == 1 || query_state == 2 || query_state == 3 || + query_state == 4) { + cmd.query.q_state = true; + cmd.query.state = (int) query_state; + } + } + + uintmax_t query_link = 0; + if (neu_http_get_param_uintmax(aio, "link", &query_link) == 0) { + if (query_link == 0 || query_link == 1) { + cmd.query.q_link = true; + cmd.query.link = (int) query_link; + } + } + + uintmax_t sort_delay = 0; + if (neu_http_get_param_uintmax(aio, "delay", &sort_delay) == 0) { + cmd.query.s_delay = true; + } + cmd.type = node_type; ret = neu_plugin_op(plugin, header, &cmd); if (ret != 0) { diff --git a/src/core/manager.c b/src/core/manager.c index 3d3ec7c6c..17f0fbca3 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -434,8 +434,9 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) neu_req_del_plugin_t *cmd = (neu_req_del_plugin_t *) &header[1]; neu_resp_error_t e = { 0 }; - UT_array *nodes = neu_manager_get_nodes( - manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, cmd->plugin, ""); + UT_array *nodes = + neu_manager_get_nodes(manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, + cmd->plugin, "", false, false, 0, false, 0); if (nodes != NULL) { if (utarray_len(nodes) > 0) { @@ -615,8 +616,9 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } - UT_array *nodes = neu_manager_get_nodes( - manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, module_name, ""); + UT_array *nodes = + neu_manager_get_nodes(manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, + module_name, "", false, false, 0, false, 0); if (nodes != NULL) { if (utarray_len(nodes) > 0) { @@ -866,9 +868,11 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } case NEU_REQ_GET_NODE: { - neu_req_get_node_t *cmd = (neu_req_get_node_t *) &header[1]; - UT_array * nodes = - neu_manager_get_nodes(manager, cmd->type, cmd->plugin, cmd->node); + neu_req_get_node_t *cmd = (neu_req_get_node_t *) &header[1]; + UT_array * nodes = neu_manager_get_nodes( + manager, cmd->type, cmd->plugin, cmd->node, cmd->query.s_delay, + cmd->query.q_state, cmd->query.state, cmd->query.q_link, + cmd->query.link); neu_resp_get_node_t resp = { .nodes = nodes }; header->type = NEU_RESP_GET_NODE; diff --git a/src/core/manager_internal.c b/src/core/manager_internal.c index e754fe476..f388d4578 100644 --- a/src/core/manager_internal.c +++ b/src/core/manager_internal.c @@ -114,9 +114,12 @@ int neu_manager_del_node(neu_manager_t *manager, const char *node_name) } UT_array *neu_manager_get_nodes(neu_manager_t *manager, int type, - const char *plugin, const char *node) + const char *plugin, const char *node, + bool sort_delay, bool q_state, int state, + bool q_link, int link) { - return neu_node_manager_filter(manager->node_manager, type, plugin, node); + return neu_node_manager_filter(manager->node_manager, type, plugin, node, + sort_delay, q_state, state, q_link, link); } int neu_manager_update_node_name(neu_manager_t *manager, const char *node, diff --git a/src/core/manager_internal.h b/src/core/manager_internal.h index 9df56a18f..0715f6ff7 100644 --- a/src/core/manager_internal.h +++ b/src/core/manager_internal.h @@ -56,7 +56,9 @@ int neu_manager_add_node(neu_manager_t *manager, const char *node_name, neu_node_running_state_e state, bool load); int neu_manager_del_node(neu_manager_t *manager, const char *node_name); UT_array *neu_manager_get_nodes(neu_manager_t *manager, int type, - const char *plugin, const char *node); + const char *plugin, const char *node, + bool sort_delay, bool q_state, int state, + bool q_link, int link); int neu_manager_update_node_name(neu_manager_t *manager, const char *node, const char *new_name); int neu_manager_update_group_name(neu_manager_t *manager, const char *driver, diff --git a/src/core/node_manager.c b/src/core/node_manager.c index a9cb09015..b60f54064 100644 --- a/src/core/node_manager.c +++ b/src/core/node_manager.c @@ -194,8 +194,23 @@ UT_array *neu_node_manager_get(neu_node_manager_t *mgr, int type) return array; } +static int neu_resp_node_info_sort(const void *a, const void *b) +{ + const neu_resp_node_info_t *info_a = (const neu_resp_node_info_t *) a; + const neu_resp_node_info_t *info_b = (const neu_resp_node_info_t *) b; + + if (info_a->delay < info_b->delay) { + return -1; + } else if (info_a->delay > info_b->delay) { + return 1; + } + return 0; +} + UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, - const char *plugin, const char *node) + const char *plugin, const char *node, + bool sort_delay, bool q_state, int state, + bool q_link, int link) { UT_array * array = NULL; UT_icd icd = { sizeof(neu_resp_node_info_t), NULL, NULL, NULL }; @@ -215,14 +230,42 @@ UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, strstr(el->adapter->name, node) == NULL) { continue; } + if (q_state) { + if (el->adapter->state != + (neu_node_running_state_e) state) { + continue; + } + } + if (q_link) { + neu_node_state_t node_state = + neu_adapter_get_state(el->adapter); + if (node_state.link != (neu_node_link_state_e) link) { + continue; + } + } + neu_resp_node_info_t info = { 0 }; strcpy(info.node, el->adapter->name); strcpy(info.plugin, el->adapter->module->module_name); + if (sort_delay) { + neu_metric_entry_t *e = NULL; + if (NULL != el->adapter->metrics) { + HASH_FIND_STR(el->adapter->metrics->entries, + NEU_METRIC_LAST_RTT_MS, e); + } + info.delay = NULL != e ? e->value : 0; + } else { + info.delay = 0; + } utarray_push_back(array, &info); } } } + if (sort_delay) { + utarray_sort(array, neu_resp_node_info_sort); + } + return array; } diff --git a/src/core/node_manager.h b/src/core/node_manager.h index 2ebf4cd56..d606e11d3 100644 --- a/src/core/node_manager.h +++ b/src/core/node_manager.h @@ -49,7 +49,9 @@ uint16_t neu_node_manager_size(neu_node_manager_t *mgr); // neu_resp_node_info array UT_array *neu_node_manager_get(neu_node_manager_t *mgr, int type); UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, - const char *plugin, const char *node); + const char *plugin, const char *node, + bool sort_delay, bool q_state, int state, + bool q_link, int link); UT_array *neu_node_manager_get_all(neu_node_manager_t *mgr); // neu_adapter_t array From 67c5b178163a04965dcd53396fd8c995239ddf03 Mon Sep 17 00:00:00 2001 From: "xiang.zhou" Date: Wed, 7 May 2025 11:14:06 +0800 Subject: [PATCH 2/3] node&group support filter --- include/neuron/msg.h | 2 ++ plugins/restful/adapter_handle.c | 6 ++++++ plugins/restful/group_config_handle.c | 16 ++++++++++----- src/adapter/adapter.c | 15 +++++++++++++- src/adapter/adapter_internal.h | 1 + src/adapter/driver/driver.c | 16 +++++++++------ src/adapter/driver/driver_internal.h | 3 ++- src/core/manager.c | 14 ++++++------- src/core/manager_internal.c | 7 ++++--- src/core/manager_internal.h | 3 ++- src/core/node_manager.c | 16 ++++++++++++++- src/core/node_manager.h | 3 ++- tests/ft/http_api/test_http_api.py | 29 +++++++++++++++++++++++++++ tests/ft/neuron/api.py | 16 +++++++++++---- 14 files changed, 117 insertions(+), 30 deletions(-) diff --git a/include/neuron/msg.h b/include/neuron/msg.h index 47b5aac7c..153f57ab2 100644 --- a/include/neuron/msg.h +++ b/include/neuron/msg.h @@ -333,6 +333,7 @@ typedef struct neu_req_get_node { bool q_link; int link; bool s_delay; + char q_group_name[NEU_GROUP_NAME_LEN]; } query; } neu_req_get_node_t; @@ -377,6 +378,7 @@ typedef struct neu_req_del_group { typedef struct neu_req_get_group { char driver[NEU_NODE_NAME_LEN]; + char q_group[NEU_GROUP_NAME_LEN]; } neu_req_get_group_t; typedef struct neu_resp_group_info { diff --git a/plugins/restful/adapter_handle.c b/plugins/restful/adapter_handle.c index 2952bf6a0..c3d439ad1 100644 --- a/plugins/restful/adapter_handle.c +++ b/plugins/restful/adapter_handle.c @@ -145,6 +145,7 @@ void handle_get_adapter(nng_aio *aio) int ret = 0; char plugin_name[NEU_PLUGIN_NAME_LEN] = { 0 }; char node_name[NEU_NODE_NAME_LEN] = { 0 }; + char group_name[NEU_GROUP_NAME_LEN] = { 0 }; neu_plugin_t * plugin = neu_rest_get_plugin(); neu_node_type_e node_type = { 0 }; @@ -173,6 +174,11 @@ void handle_get_adapter(nng_aio *aio) strcpy(cmd.node, node_name); } + if (neu_http_get_param_str(aio, "group", group_name, sizeof(group_name)) > + 0) { + strcpy(cmd.query.q_group_name, group_name); + } + uintmax_t query_state = 0; if (neu_http_get_param_uintmax(aio, "state", &query_state) == 0) { if (query_state == 1 || query_state == 2 || query_state == 3 || diff --git a/plugins/restful/group_config_handle.c b/plugins/restful/group_config_handle.c index 97deeba6b..3fdbd91d2 100644 --- a/plugins/restful/group_config_handle.c +++ b/plugins/restful/group_config_handle.c @@ -160,11 +160,12 @@ void handle_del_group_config(nng_aio *aio) void handle_get_group_config(nng_aio *aio) { - neu_plugin_t * plugin = neu_rest_get_plugin(); - char node_name[NEU_NODE_NAME_LEN] = { 0 }; - int ret = 0; - neu_req_get_group_t cmd = { 0 }; - neu_reqresp_head_t header = { + neu_plugin_t * plugin = neu_rest_get_plugin(); + char node_name[NEU_NODE_NAME_LEN] = { 0 }; + char group_name[NEU_GROUP_NAME_LEN] = { 0 }; + int ret = 0; + neu_req_get_group_t cmd = { 0 }; + neu_reqresp_head_t header = { .ctx = aio, .type = NEU_REQ_GET_GROUP, .otel_trace_type = NEU_OTEL_TRACE_TYPE_REST_COMM, @@ -178,6 +179,11 @@ void handle_get_group_config(nng_aio *aio) header.type = NEU_REQ_GET_DRIVER_GROUP; } + if (neu_http_get_param_str(aio, "group", group_name, sizeof(group_name)) > + 0) { + strcpy(cmd.q_group, group_name); + } + ret = neu_plugin_op(plugin, header, &cmd); if (ret != 0) { NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index d489926b7..74e2d5e76 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -1033,12 +1033,15 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } case NEU_REQ_GET_GROUP: { + + neu_req_get_group_t *cmd = (neu_req_get_group_t *) &header[1]; + neu_msg_exchange(header); if (adapter->module->type == NEU_NA_TYPE_DRIVER) { neu_resp_get_group_t resp = { .groups = neu_adapter_driver_get_group( - (neu_adapter_driver_t *) adapter) + (neu_adapter_driver_t *) adapter, cmd->q_group) }; header->type = NEU_RESP_GET_GROUP; reply(adapter, header, &resp); @@ -1736,6 +1739,16 @@ neu_node_state_t neu_adapter_get_state(neu_adapter_t *adapter) return state; } +UT_array *neu_adapter_get_groups(neu_adapter_t *adapter, const char *filter) +{ + if (adapter->module->type != NEU_NA_TYPE_DRIVER) { + return NULL; + } else { + return neu_adapter_driver_get_group((neu_adapter_driver_t *) adapter, + filter); + } +} + neu_event_timer_t *neu_adapter_add_timer(neu_adapter_t * adapter, neu_event_timer_param_t param) { diff --git a/src/adapter/adapter_internal.h b/src/adapter/adapter_internal.h index 7afa19c8a..d9954795f 100644 --- a/src/adapter/adapter_internal.h +++ b/src/adapter/adapter_internal.h @@ -95,6 +95,7 @@ void neu_adapter_del_timer(neu_adapter_t *adapter, neu_event_timer_t *timer); int neu_adapter_set_setting(neu_adapter_t *adapter, const char *config); int neu_adapter_get_setting(neu_adapter_t *adapter, char **config); neu_node_state_t neu_adapter_get_state(neu_adapter_t *adapter); +UT_array *neu_adapter_get_groups(neu_adapter_t *adapter, const char *filter); static inline void neu_adapter_reset_metrics(neu_adapter_t *adapter) { diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index a61f88591..694c24958 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -1757,7 +1757,8 @@ int neu_adapter_driver_group_exist(neu_adapter_driver_t *driver, return ret; } -UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver) +UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver, + const char * filter) { group_t * el = NULL, *tmp = NULL; UT_array *groups = NULL; @@ -1767,13 +1768,16 @@ UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver) HASH_ITER(hh, driver->groups, el, tmp) { - neu_resp_group_info_t info = { 0 }; - info.interval = neu_group_get_interval(el->group); - info.tag_count = neu_group_tag_size(el->group); - strncpy(info.name, el->name, sizeof(info.name)); + if (strlen(filter) == 0 || strstr(el->name, filter) != NULL) { + neu_resp_group_info_t info = { 0 }; - utarray_push_back(groups, &info); + info.interval = neu_group_get_interval(el->group); + info.tag_count = neu_group_tag_size(el->group); + strncpy(info.name, el->name, sizeof(info.name)); + + utarray_push_back(groups, &info); + } } return groups; diff --git a/src/adapter/driver/driver_internal.h b/src/adapter/driver/driver_internal.h index 74e7837a3..93db15342 100644 --- a/src/adapter/driver/driver_internal.h +++ b/src/adapter/driver/driver_internal.h @@ -54,7 +54,8 @@ int neu_adapter_driver_del_group(neu_adapter_driver_t *driver, const char * name); int neu_adapter_driver_group_exist(neu_adapter_driver_t *driver, const char * name); -UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver); +UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver, + const char * filter); uint16_t neu_adapter_driver_group_count(neu_adapter_driver_t *driver); uint16_t neu_adapter_driver_new_group_count(neu_adapter_driver_t *driver, neu_req_add_gtag_t * cmd); diff --git a/src/core/manager.c b/src/core/manager.c index 17f0fbca3..ef8fc53c7 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -434,9 +434,9 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) neu_req_del_plugin_t *cmd = (neu_req_del_plugin_t *) &header[1]; neu_resp_error_t e = { 0 }; - UT_array *nodes = - neu_manager_get_nodes(manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, - cmd->plugin, "", false, false, 0, false, 0); + UT_array *nodes = neu_manager_get_nodes( + manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, cmd->plugin, "", + false, false, 0, false, 0, ""); if (nodes != NULL) { if (utarray_len(nodes) > 0) { @@ -616,9 +616,9 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } - UT_array *nodes = - neu_manager_get_nodes(manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, - module_name, "", false, false, 0, false, 0); + UT_array *nodes = neu_manager_get_nodes( + manager, NEU_NA_TYPE_DRIVER | NEU_NA_TYPE_APP, module_name, "", + false, false, 0, false, 0, ""); if (nodes != NULL) { if (utarray_len(nodes) > 0) { @@ -872,7 +872,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) UT_array * nodes = neu_manager_get_nodes( manager, cmd->type, cmd->plugin, cmd->node, cmd->query.s_delay, cmd->query.q_state, cmd->query.state, cmd->query.q_link, - cmd->query.link); + cmd->query.link, cmd->query.q_group_name); neu_resp_get_node_t resp = { .nodes = nodes }; header->type = NEU_RESP_GET_NODE; diff --git a/src/core/manager_internal.c b/src/core/manager_internal.c index f388d4578..9437dc5e5 100644 --- a/src/core/manager_internal.c +++ b/src/core/manager_internal.c @@ -116,10 +116,11 @@ int neu_manager_del_node(neu_manager_t *manager, const char *node_name) UT_array *neu_manager_get_nodes(neu_manager_t *manager, int type, const char *plugin, const char *node, bool sort_delay, bool q_state, int state, - bool q_link, int link) + bool q_link, int link, const char *q_group_name) { return neu_node_manager_filter(manager->node_manager, type, plugin, node, - sort_delay, q_state, state, q_link, link); + sort_delay, q_state, state, q_link, link, + q_group_name); } int neu_manager_update_node_name(neu_manager_t *manager, const char *node, @@ -185,7 +186,7 @@ UT_array *neu_manager_get_driver_group(neu_manager_t *manager) neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, driver->node); UT_array *groups = - neu_adapter_driver_get_group((neu_adapter_driver_t *) adapter); + neu_adapter_driver_get_group((neu_adapter_driver_t *) adapter, ""); utarray_foreach(groups, neu_resp_group_info_t *, g) { diff --git a/src/core/manager_internal.h b/src/core/manager_internal.h index 0715f6ff7..5ebcaefc8 100644 --- a/src/core/manager_internal.h +++ b/src/core/manager_internal.h @@ -58,7 +58,8 @@ int neu_manager_del_node(neu_manager_t *manager, const char *node_name); UT_array *neu_manager_get_nodes(neu_manager_t *manager, int type, const char *plugin, const char *node, bool sort_delay, bool q_state, int state, - bool q_link, int link); + bool q_link, int link, + const char *q_group_name); int neu_manager_update_node_name(neu_manager_t *manager, const char *node, const char *new_name); int neu_manager_update_group_name(neu_manager_t *manager, const char *driver, diff --git a/src/core/node_manager.c b/src/core/node_manager.c index b60f54064..3e049de8c 100644 --- a/src/core/node_manager.c +++ b/src/core/node_manager.c @@ -210,7 +210,8 @@ static int neu_resp_node_info_sort(const void *a, const void *b) UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, const char *plugin, const char *node, bool sort_delay, bool q_state, int state, - bool q_link, int link) + bool q_link, int link, + const char *q_group_name) { UT_array * array = NULL; UT_icd icd = { sizeof(neu_resp_node_info_t), NULL, NULL, NULL }; @@ -244,6 +245,19 @@ UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, } } + if (strlen(q_group_name) > 0) { + UT_array *groups = + neu_adapter_get_groups(el->adapter, q_group_name); + if (NULL == groups || utarray_len(groups) == 0) { + if (groups != NULL) { + utarray_free(groups); + } + continue; + } else { + utarray_free(groups); + } + } + neu_resp_node_info_t info = { 0 }; strcpy(info.node, el->adapter->name); strcpy(info.plugin, el->adapter->module->module_name); diff --git a/src/core/node_manager.h b/src/core/node_manager.h index d606e11d3..1f281b3ba 100644 --- a/src/core/node_manager.h +++ b/src/core/node_manager.h @@ -51,7 +51,8 @@ UT_array *neu_node_manager_get(neu_node_manager_t *mgr, int type); UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, const char *plugin, const char *node, bool sort_delay, bool q_state, int state, - bool q_link, int link); + bool q_link, int link, + const char *q_group_name); UT_array *neu_node_manager_get_all(neu_node_manager_t *mgr); // neu_adapter_t array diff --git a/tests/ft/http_api/test_http_api.py b/tests/ft/http_api/test_http_api.py index ded618e5d..45642d47f 100644 --- a/tests/ft/http_api/test_http_api.py +++ b/tests/ft/http_api/test_http_api.py @@ -610,6 +610,33 @@ def test_get_status(self): response = api.get_status() assert 200 == response.status_code + @description(given="running neuron", when="get node or group by filter", then="success") + def test_get_node_or_group_by_filter(self): + node_1 = "test1" + node_2 = "test2" + group_1 = "abcd1" + group_2 = "abdc2" + api.add_node_check(node_1, 'Modbus TCP') + api.add_node_check(node_2, 'Modbus TCP') + api.add_group_check(node_1, group_1, 1000) + api.add_group_check(node_1, group_2, 1000) + api.add_group_check(node_2, group_1, 1000) + # api.add_group_check(node_2, group_2, 1000) + + response = api.get_nodes(1) + assert 2 == len(response.json()["nodes"]) + response = api.get_nodes(1, group="dc") + assert 1 == len(response.json()["nodes"]) + response = api.get_nodes(1, group="ab") + assert 2 == len(response.json()["nodes"]) + response = api.get_group(node=node_1) + assert 2 == len(response.json()["groups"]) + response = api.get_group(node=node_1, group="1") + assert 1 == len(response.json()["groups"]) + response = api.get_group(node=node_2) + assert 1 == len(response.json()["groups"]) + + @description(given="running neuron", when="test jwt error", then="failed") def test_jwt_err(self): response = api.change_password(new_password='123456', jwt='invalid') @@ -629,3 +656,5 @@ def test_jwt_err(self): response = api.delete_virtual_license(jwt='invalid') assert 404 == response.status_code + + diff --git a/tests/ft/neuron/api.py b/tests/ft/neuron/api.py index a1b363a5b..ef29b2c18 100644 --- a/tests/ft/neuron/api.py +++ b/tests/ft/neuron/api.py @@ -79,8 +79,11 @@ def del_node(node, jwt=config.default_jwt): return requests.delete(url=config.BASE_URL + '/api/v2/node', headers={"Authorization": jwt}, json={"name": node}) -def get_nodes(type, jwt=config.default_jwt): - return requests.get(url=config.BASE_URL + '/api/v2/node', headers={"Authorization": jwt}, params={"type": type}) +def get_nodes(type, jwt=config.default_jwt, group=""): + if group == "": + return requests.get(url=config.BASE_URL + '/api/v2/node', headers={"Authorization": jwt}, params={"type": type}) + else: + return requests.get(url=config.BASE_URL + '/api/v2/node?group=' + group, headers={"Authorization": jwt}, params={"type": type}) @gen_check @@ -124,8 +127,13 @@ def update_group(node, group, new_name="", interval=0): @gen_check -def get_group(node=""): - return requests.get(url=config.BASE_URL + f'/api/v2/group?node={node}', headers={"Authorization": config.default_jwt}) +def get_group(node="", group=""): + if group == "": + return requests.get(url=config.BASE_URL + f'/api/v2/group?node={node}', headers={"Authorization": config.default_jwt}) + else: + return requests.get(url=config.BASE_URL + f'/api/v2/group?node={node}&group={group}', headers={"Authorization": config.default_jwt}) + + @gen_check From 217799aadf6d20faf3b78b99f3e578a8c80a3bed Mon Sep 17 00:00:00 2001 From: "xiang.zhou" Date: Tue, 20 May 2025 11:35:40 +0800 Subject: [PATCH 3/3] filter node name --- src/core/node_manager.c | 16 +++++++++------- tests/ft/http_api/test_http_api.py | 6 ++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/core/node_manager.c b/src/core/node_manager.c index 3e049de8c..95f445768 100644 --- a/src/core/node_manager.c +++ b/src/core/node_manager.c @@ -246,15 +246,17 @@ UT_array *neu_node_manager_filter(neu_node_manager_t *mgr, int type, } if (strlen(q_group_name) > 0) { - UT_array *groups = - neu_adapter_get_groups(el->adapter, q_group_name); - if (NULL == groups || utarray_len(groups) == 0) { - if (groups != NULL) { + if (strstr(el->adapter->name, q_group_name) == NULL) { + UT_array *groups = + neu_adapter_get_groups(el->adapter, q_group_name); + if (NULL == groups || utarray_len(groups) == 0) { + if (groups != NULL) { + utarray_free(groups); + } + continue; + } else { utarray_free(groups); } - continue; - } else { - utarray_free(groups); } } diff --git a/tests/ft/http_api/test_http_api.py b/tests/ft/http_api/test_http_api.py index 45642d47f..3862463fe 100644 --- a/tests/ft/http_api/test_http_api.py +++ b/tests/ft/http_api/test_http_api.py @@ -629,6 +629,12 @@ def test_get_node_or_group_by_filter(self): assert 1 == len(response.json()["nodes"]) response = api.get_nodes(1, group="ab") assert 2 == len(response.json()["nodes"]) + response = api.get_nodes(1, group="test") + assert 2 == len(response.json()["nodes"]) + response = api.get_nodes(1, group="test1") + assert 1 == len(response.json()["nodes"]) + response = api.get_nodes(1, group="1234") + assert 0 == len(response.json()["nodes"]) response = api.get_group(node=node_1) assert 2 == len(response.json()["groups"]) response = api.get_group(node=node_1, group="1")