mirror of
https://github.com/emqx/neuron.git
synced 2026-10-28 14:07:20 +08:00
refactor persist & adapter msg
This commit is contained in:
+2
-1
@@ -91,6 +91,8 @@ set(NEURON_SOURCES
|
||||
src/core/subscribe.c
|
||||
src/core/plugin_manager.c
|
||||
src/core/node_manager.c
|
||||
src/core/storage.c
|
||||
src/adapter/storage.c
|
||||
src/adapter/adapter.c
|
||||
src/adapter/driver/cache.c
|
||||
src/adapter/driver/driver.c
|
||||
@@ -107,7 +109,6 @@ set(NEURON_SOURCES
|
||||
plugins/restful/version_handle.c
|
||||
plugins/restful/rest.c
|
||||
plugins/restful/http.c
|
||||
plugins/dummy/dummy.c
|
||||
${PERSIST_SOURCES})
|
||||
|
||||
set(CMAKE_BUILD_RPATH ./)
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ ${tag_desc} {"name": "tag_desc", "description": "description info",
|
||||
Add tags to non-existent node, it should return failure
|
||||
${res}= Add Tags modbus-node group ${tag1},${tag2}
|
||||
|
||||
Check Response Status ${res} 200
|
||||
Check Response Status ${res} 404
|
||||
Check Error Code ${res} ${NEU_ERR_NODE_NOT_EXIST}
|
||||
|
||||
Add tags to the non-existent group, it should return failure
|
||||
|
||||
@@ -41,7 +41,6 @@ typedef enum neu_reqresp_type {
|
||||
NEU_RESP_ERROR,
|
||||
NEU_REQRESP_TRANS_DATA,
|
||||
NEU_REQ_UPDATE_LICENSE,
|
||||
NEU_REQRESP_PERSISTENCE_LOAD,
|
||||
|
||||
NEU_REQ_READ_GROUP,
|
||||
NEU_RESP_READ_GROUP,
|
||||
@@ -56,6 +55,8 @@ typedef enum neu_reqresp_type {
|
||||
NEU_REQ_APP_UNSUBSCRIBE_GROUP,
|
||||
|
||||
NEU_REQ_NODE_INIT,
|
||||
NEU_REQ_NODE_UNINIT,
|
||||
NEU_RESP_NODE_UNINIT,
|
||||
NEU_REQ_ADD_NODE,
|
||||
NEU_REQ_DEL_NODE,
|
||||
NEU_REQ_GET_NODE,
|
||||
@@ -98,9 +99,9 @@ typedef struct neu_resp_error {
|
||||
int error;
|
||||
} neu_resp_error_t;
|
||||
|
||||
typedef struct neu_req_node_init {
|
||||
typedef struct {
|
||||
char node[NEU_NODE_NAME_LEN];
|
||||
} neu_req_node_init_t;
|
||||
} neu_req_node_init_t, neu_req_node_uninit_t, neu_resp_node_uninit_t;
|
||||
|
||||
typedef struct neu_req_add_plugin {
|
||||
char library[NEU_PLUGIN_LIBRARY_LEN];
|
||||
@@ -304,9 +305,9 @@ inline static nng_msg *neu_msg_gen(neu_reqresp_head_t *header, void *data)
|
||||
size_t data_size = 0;
|
||||
|
||||
switch (header->type) {
|
||||
case NEU_REQRESP_PERSISTENCE_LOAD:
|
||||
break;
|
||||
case NEU_REQ_NODE_INIT:
|
||||
case NEU_REQ_NODE_UNINIT:
|
||||
case NEU_RESP_NODE_UNINIT:
|
||||
data_size = sizeof(neu_req_node_init_t);
|
||||
break;
|
||||
case NEU_RESP_ERROR:
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <nng/nng.h>
|
||||
#include <nng/supplemental/http/http.h>
|
||||
|
||||
#include "dummy.h"
|
||||
#include "plugin.h"
|
||||
#include "utils/log.h"
|
||||
|
||||
#define neu_plugin_module default_dummy_plugin_module
|
||||
|
||||
struct neu_plugin {
|
||||
neu_plugin_common_t common;
|
||||
};
|
||||
|
||||
static neu_plugin_t *dummy_plugin_open()
|
||||
{
|
||||
neu_plugin_t *plugin = calloc(1, sizeof(neu_plugin_t));
|
||||
|
||||
neu_plugin_common_init(&plugin->common);
|
||||
|
||||
nlog_info("Success to create plugin: %s", neu_plugin_module.module_name);
|
||||
return plugin;
|
||||
}
|
||||
|
||||
static int dummy_plugin_close(neu_plugin_t *plugin)
|
||||
{
|
||||
free(plugin);
|
||||
nlog_info("Success to free plugin: %s", neu_plugin_module.module_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_plugin_init(neu_plugin_t *plugin)
|
||||
{
|
||||
int rv = 0;
|
||||
|
||||
(void) plugin;
|
||||
|
||||
nlog_info("Initialize plugin: %s", neu_plugin_module.module_name);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int dummy_plugin_uninit(neu_plugin_t *plugin)
|
||||
{
|
||||
int rv = 0;
|
||||
|
||||
(void) plugin;
|
||||
|
||||
nlog_info("Uninitialize plugin: %s", neu_plugin_module.module_name);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int dummy_plugin_config(neu_plugin_t *plugin, const char *configs)
|
||||
{
|
||||
int rv = 0;
|
||||
|
||||
(void) plugin;
|
||||
(void) configs;
|
||||
|
||||
nlog_info("config plugin: %s", neu_plugin_module.module_name);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int dummy_plugin_request(neu_plugin_t *plugin, neu_reqresp_head_t *head,
|
||||
void *data)
|
||||
{
|
||||
(void) plugin;
|
||||
(void) head;
|
||||
(void) data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_plugin_start(neu_plugin_t *plugin)
|
||||
{
|
||||
(void) plugin;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_plugin_stop(neu_plugin_t *plugin)
|
||||
{
|
||||
(void) plugin;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const neu_plugin_intf_funs_t plugin_intf_funs = {
|
||||
.open = dummy_plugin_open,
|
||||
.close = dummy_plugin_close,
|
||||
.init = dummy_plugin_init,
|
||||
.uninit = dummy_plugin_uninit,
|
||||
.start = dummy_plugin_start,
|
||||
.stop = dummy_plugin_stop,
|
||||
.setting = dummy_plugin_config,
|
||||
.request = dummy_plugin_request,
|
||||
};
|
||||
|
||||
#define DEFAULT_DUMMY_PLUGIN_DESCR "A plugin that does nothing"
|
||||
|
||||
const neu_plugin_module_t default_dummy_plugin_module = {
|
||||
.version = NEURON_PLUGIN_VER_1_0,
|
||||
.module_name = "neuron-default-dummy",
|
||||
.module_descr = DEFAULT_DUMMY_PLUGIN_DESCR,
|
||||
.intf_funs = &plugin_intf_funs,
|
||||
.kind = NEU_PLUGIN_KIND_STATIC,
|
||||
.type = NEU_NA_TYPE_APP,
|
||||
};
|
||||
+3
-3
@@ -519,10 +519,10 @@ static int mqtt_plugin_request(neu_plugin_t *plugin, neu_reqresp_head_t *head,
|
||||
error = trans_data(plugin, data);
|
||||
break;
|
||||
case NEU_REQ_APP_SUBSCRIBE_GROUP: {
|
||||
neu_req_app_subscribe_group_t *sub =
|
||||
(neu_req_app_subscribe_group_t *) data;
|
||||
// neu_req_app_subscribe_group_t *sub =
|
||||
//(neu_req_app_subscribe_group_t *) data;
|
||||
|
||||
utarray_free(sub->tags);
|
||||
// utarray_free(sub->tags);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
+498
-678
File diff suppressed because it is too large
Load Diff
@@ -30,62 +30,51 @@
|
||||
#include "adapter_info.h"
|
||||
#include "core/manager.h"
|
||||
|
||||
typedef enum adapter_state {
|
||||
ADAPTER_STATE_IDLE = 0,
|
||||
ADAPTER_STATE_INIT,
|
||||
ADAPTER_STATE_READY,
|
||||
ADAPTER_STATE_RUNNING,
|
||||
ADAPTER_STATE_STOPPED,
|
||||
} adapter_state_e;
|
||||
|
||||
struct neu_adapter {
|
||||
adapter_state_e state;
|
||||
char * name;
|
||||
neu_manager_t * manager;
|
||||
char *name;
|
||||
char *setting;
|
||||
|
||||
uint32_t req_id;
|
||||
neu_node_running_state_e state;
|
||||
|
||||
neu_persister_t * persister;
|
||||
adapter_callbacks_t cb_funs;
|
||||
char * setting;
|
||||
|
||||
struct {
|
||||
void * handle; // handle of dynamic lib
|
||||
neu_plugin_module_t *module;
|
||||
neu_plugin_t * plugin;
|
||||
} plugin_info;
|
||||
void * handle;
|
||||
neu_plugin_module_t *module;
|
||||
neu_plugin_t * plugin;
|
||||
|
||||
struct {
|
||||
nng_socket sock;
|
||||
nng_dialer dialer;
|
||||
nng_mtx * mtx;
|
||||
nng_mtx * sub_grp_mtx;
|
||||
} nng;
|
||||
nng_socket sock;
|
||||
nng_dialer dialer;
|
||||
|
||||
neu_events_t * events;
|
||||
neu_event_io_t *nng_io;
|
||||
int recv_fd;
|
||||
};
|
||||
|
||||
neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info,
|
||||
neu_manager_t * manager);
|
||||
void neu_adapter_destroy(neu_adapter_t *adapter);
|
||||
int neu_adapter_start(neu_adapter_t *adapter);
|
||||
int neu_adapter_stop(neu_adapter_t *adapter);
|
||||
int neu_adapter_init(neu_adapter_t *adapter);
|
||||
int neu_adapter_uninit(neu_adapter_t *adapter);
|
||||
typedef void (*adapter_handler)(neu_adapter_t * adapter,
|
||||
neu_reqresp_head_t *header);
|
||||
typedef struct adapter_msg_handler {
|
||||
neu_reqresp_type_e type;
|
||||
adapter_handler handler;
|
||||
} adapter_msg_handler_t;
|
||||
|
||||
neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info, bool start);
|
||||
void neu_adapter_init(neu_adapter_t *adapter);
|
||||
|
||||
int neu_adapter_start(neu_adapter_t *adapter);
|
||||
int neu_adapter_stop(neu_adapter_t *adapter);
|
||||
|
||||
int neu_adapter_uninit(neu_adapter_t *adapter);
|
||||
void neu_adapter_destroy(neu_adapter_t *adapter);
|
||||
|
||||
neu_event_timer_t *neu_adapter_add_timer(neu_adapter_t * adapter,
|
||||
neu_event_timer_param_t param);
|
||||
void neu_adapter_del_timer(neu_adapter_t *adapter, neu_event_timer_t *timer);
|
||||
|
||||
const char * neu_adapter_get_name(neu_adapter_t *adapter);
|
||||
neu_manager_t * neu_adapter_get_manager(neu_adapter_t *adapter);
|
||||
neu_adapter_type_e neu_adapter_get_type(neu_adapter_t *adapter);
|
||||
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);
|
||||
neu_node_running_state_e
|
||||
neu_adapter_state_to_plugin_state(neu_adapter_t *adapter);
|
||||
|
||||
int neu_adapter_validate_tag(neu_adapter_t *adapter, neu_datatag_t *tag);
|
||||
|
||||
#endif
|
||||
|
||||
+16
-25
@@ -128,13 +128,10 @@ static void update(neu_adapter_t *adapter, const char *group, const char *tag,
|
||||
}
|
||||
}
|
||||
|
||||
neu_adapter_driver_t *neu_adapter_driver_create(neu_adapter_t *adapter)
|
||||
neu_adapter_driver_t *neu_adapter_driver_create()
|
||||
{
|
||||
neu_adapter_driver_t *driver = calloc(1, sizeof(neu_adapter_driver_t));
|
||||
|
||||
driver->adapter = *adapter;
|
||||
free(adapter);
|
||||
|
||||
nng_mtx_alloc(&driver->mtx);
|
||||
driver->cache = neu_driver_cache_new();
|
||||
driver->driver_events = neu_event_new();
|
||||
@@ -265,9 +262,8 @@ void neu_adapter_driver_write_tag(neu_adapter_driver_t *driver,
|
||||
break;
|
||||
}
|
||||
|
||||
driver->adapter.plugin_info.module->intf_funs->driver.write_tag(
|
||||
driver->adapter.plugin_info.plugin, (void *) req, tag,
|
||||
cmd->value.value);
|
||||
driver->adapter.module->intf_funs->driver.write_tag(
|
||||
driver->adapter.plugin, (void *) req, tag, cmd->value.value);
|
||||
free(tag->address);
|
||||
free(tag->name);
|
||||
free(tag->description);
|
||||
@@ -341,8 +337,8 @@ int neu_adapter_driver_del_group(neu_adapter_driver_t *driver, const char *name)
|
||||
neu_group_destroy(find->group);
|
||||
free(find);
|
||||
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin_info.plugin)
|
||||
->tag_size -= tag_size;
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin)->tag_size -=
|
||||
tag_size;
|
||||
ret = NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -406,8 +402,8 @@ int neu_adapter_driver_add_tag(neu_adapter_driver_t *driver, const char *group,
|
||||
int ret = NEU_ERR_SUCCESS;
|
||||
group_t *find = NULL;
|
||||
|
||||
ret = driver->adapter.plugin_info.module->intf_funs->driver.validate_tag(
|
||||
driver->adapter.plugin_info.plugin, tag);
|
||||
ret = driver->adapter.module->intf_funs->driver.validate_tag(
|
||||
driver->adapter.plugin, tag);
|
||||
if (ret != NEU_ERR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
@@ -422,8 +418,7 @@ int neu_adapter_driver_add_tag(neu_adapter_driver_t *driver, const char *group,
|
||||
nng_mtx_unlock(driver->mtx);
|
||||
|
||||
if (ret == NEU_ERR_SUCCESS) {
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin_info.plugin)
|
||||
->tag_size += 1;
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin)->tag_size += 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -445,8 +440,7 @@ int neu_adapter_driver_del_tag(neu_adapter_driver_t *driver, const char *group,
|
||||
nng_mtx_unlock(driver->mtx);
|
||||
|
||||
if (ret == NEU_ERR_SUCCESS) {
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin_info.plugin)
|
||||
->tag_size -= 1;
|
||||
neu_plugin_to_plugin_common(driver->adapter.plugin)->tag_size -= 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -458,8 +452,8 @@ int neu_adapter_driver_update_tag(neu_adapter_driver_t *driver,
|
||||
int ret = NEU_ERR_SUCCESS;
|
||||
group_t *find = NULL;
|
||||
|
||||
ret = driver->adapter.plugin_info.module->intf_funs->driver.validate_tag(
|
||||
driver->adapter.plugin_info.plugin, tag);
|
||||
ret = driver->adapter.module->intf_funs->driver.validate_tag(
|
||||
driver->adapter.plugin, tag);
|
||||
if (ret != NEU_ERR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
@@ -514,8 +508,7 @@ static int report_callback(void *usr_data)
|
||||
{
|
||||
group_t * group = (group_t *) usr_data;
|
||||
neu_reqresp_head_t header = { 0 };
|
||||
neu_node_running_state_e state =
|
||||
neu_adapter_state_to_plugin_state((neu_adapter_t *) group->driver);
|
||||
neu_node_running_state_e state = group->driver->adapter.state;
|
||||
if (state != NEU_NODE_RUNNING_STATE_RUNNING) {
|
||||
return 0;
|
||||
}
|
||||
@@ -531,7 +524,7 @@ static int report_callback(void *usr_data)
|
||||
sizeof(neu_reqresp_trans_data_t) +
|
||||
utarray_len(tags) * sizeof(neu_resp_tag_value_t));
|
||||
|
||||
strcpy(data->driver, neu_adapter_get_name((neu_adapter_t *) group->driver));
|
||||
strcpy(data->driver, group->driver->adapter.name);
|
||||
strcpy(data->group, group->name);
|
||||
data->n_tag = utarray_len(tags);
|
||||
read_group(group->driver->cache, group->name, tags,
|
||||
@@ -580,8 +573,7 @@ static void group_change(void *arg, int64_t timestamp, UT_array *tags,
|
||||
static int read_callback(void *usr_data)
|
||||
{
|
||||
group_t * group = (group_t *) usr_data;
|
||||
neu_node_running_state_e state =
|
||||
neu_adapter_state_to_plugin_state((neu_adapter_t *) group->driver);
|
||||
neu_node_running_state_e state = group->driver->adapter.state;
|
||||
if (state != NEU_NODE_RUNNING_STATE_RUNNING) {
|
||||
return 0;
|
||||
}
|
||||
@@ -589,9 +581,8 @@ static int read_callback(void *usr_data)
|
||||
nng_mtx_lock(group->driver->mtx);
|
||||
if (!neu_group_is_change(group->group, group->timestamp)) {
|
||||
if (group->grp.tags != NULL) {
|
||||
group->driver->adapter.plugin_info.module->intf_funs->driver
|
||||
.group_timer(group->driver->adapter.plugin_info.plugin,
|
||||
&group->grp);
|
||||
group->driver->adapter.module->intf_funs->driver.group_timer(
|
||||
group->driver->adapter.plugin, &group->grp);
|
||||
}
|
||||
} else {
|
||||
neu_group_change_test(group->group, group->timestamp, (void *) group,
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include "adapter.h"
|
||||
|
||||
neu_adapter_driver_t *neu_adapter_driver_create(neu_adapter_t *adapter);
|
||||
neu_adapter_driver_t *neu_adapter_driver_create();
|
||||
|
||||
void neu_adapter_driver_destroy(neu_adapter_driver_t *driver);
|
||||
int neu_adapter_driver_start(neu_adapter_driver_t *driver);
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
#include "utils/log.h"
|
||||
|
||||
#include "adapter_internal.h"
|
||||
#include "driver/driver_internal.h"
|
||||
#include "storage.h"
|
||||
|
||||
void adapter_storage_setting(neu_persister_t *persister, const char *node,
|
||||
const char *setting)
|
||||
{
|
||||
neu_persister_store_adapter_setting(persister, node, setting);
|
||||
}
|
||||
|
||||
void adapter_storage_add_group(neu_persister_t *persister, const char *node,
|
||||
const char *group, uint32_t interval)
|
||||
{
|
||||
neu_persist_group_config_info_t info = {
|
||||
.group_config_name = (char *) group,
|
||||
.read_interval = interval,
|
||||
.adapter_name = (char *) node,
|
||||
};
|
||||
|
||||
neu_persister_store_group_config(persister, node, &info);
|
||||
}
|
||||
|
||||
void adapter_storage_del_group(neu_persister_t *persister, const char *node,
|
||||
const char *group)
|
||||
{
|
||||
neu_persister_delete_group_config(persister, node, group);
|
||||
}
|
||||
|
||||
void adapter_storage_tag(neu_persister_t *persister, neu_adapter_t *adapter,
|
||||
const char *node, const char *group)
|
||||
{
|
||||
UT_array *tags = NULL;
|
||||
|
||||
int rv = neu_adapter_driver_get_tag((neu_adapter_driver_t *) adapter, group,
|
||||
&tags);
|
||||
if (rv != 0) {
|
||||
nlog_warn("fail get tag infos");
|
||||
return;
|
||||
}
|
||||
|
||||
rv = neu_persister_store_datatags(persister, node, group, tags);
|
||||
if (0 != rv) {
|
||||
nlog_error("fail store adapter:%s grp:%s datatag infos", node, group);
|
||||
}
|
||||
|
||||
neu_persist_datatag_infos_free(tags);
|
||||
}
|
||||
|
||||
int adapter_load_setting(neu_persister_t *persister, const char *node,
|
||||
char **setting)
|
||||
{
|
||||
int rv = neu_persister_load_adapter_setting(persister, node,
|
||||
(const char **) setting);
|
||||
if (0 != rv) {
|
||||
nlog_info("load %s setting fail", node);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adapter_load_group_and_tag(neu_persister_t * persister,
|
||||
neu_adapter_driver_t *driver)
|
||||
{
|
||||
UT_array * group_infos = NULL;
|
||||
neu_adapter_t *adapter = (neu_adapter_t *) driver;
|
||||
|
||||
int rv = neu_persister_load_group_configs(persister, adapter->name,
|
||||
&group_infos);
|
||||
if (0 != rv) {
|
||||
nlog_warn("load %s group fail", adapter->name);
|
||||
return rv;
|
||||
}
|
||||
|
||||
utarray_foreach(group_infos, neu_persist_group_config_info_t *, p)
|
||||
{
|
||||
UT_array *tags = NULL;
|
||||
neu_adapter_driver_add_group(driver, p->group_config_name,
|
||||
p->read_interval);
|
||||
|
||||
rv = neu_persister_load_datatags(persister, adapter->name,
|
||||
p->group_config_name, &tags);
|
||||
if (0 != rv) {
|
||||
nlog_warn("load %s:%s tags fail", adapter->name,
|
||||
p->group_config_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
utarray_foreach(tags, neu_datatag_t *, tag)
|
||||
{
|
||||
neu_adapter_driver_add_tag(driver, p->group_config_name, tag);
|
||||
}
|
||||
|
||||
neu_persist_datatag_infos_free(tags);
|
||||
}
|
||||
|
||||
neu_persist_group_config_infos_free(group_infos);
|
||||
return rv;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
#ifndef ADAPTER_STORAGE_H
|
||||
#define ADAPTER_STORAGE_H
|
||||
|
||||
#include "persist/persist.h"
|
||||
|
||||
#include "adapter_internal.h"
|
||||
|
||||
void adapter_storage_setting(neu_persister_t *persister, const char *node,
|
||||
const char *setting);
|
||||
void adapter_storage_add_group(neu_persister_t *persister, const char *node,
|
||||
const char *group, uint32_t interval);
|
||||
void adapter_storage_del_group(neu_persister_t *persister, const char *node,
|
||||
const char *group);
|
||||
void adapter_storage_tag(neu_persister_t *persister, neu_adapter_t *adapter,
|
||||
const char *node, const char *group);
|
||||
|
||||
int adapter_load_setting(neu_persister_t *persister, const char *node,
|
||||
char **setting);
|
||||
int adapter_load_group_and_tag(neu_persister_t * persister,
|
||||
neu_adapter_driver_t *driver);
|
||||
|
||||
#endif
|
||||
+189
-277
@@ -17,6 +17,7 @@
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <nng/nng.h>
|
||||
#include <nng/protocol/pair1/pair.h>
|
||||
@@ -33,6 +34,7 @@
|
||||
|
||||
#include "node_manager.h"
|
||||
#include "plugin_manager.h"
|
||||
#include "storage.h"
|
||||
#include "subscribe.h"
|
||||
|
||||
#include "manager.h"
|
||||
@@ -40,7 +42,6 @@
|
||||
|
||||
// definition for adapter names
|
||||
#define DEFAULT_DASHBOARD_ADAPTER_NAME DEFAULT_DASHBOARD_PLUGIN_NAME
|
||||
#define DEFAULT_PERSIST_ADAPTER_NAME DEFAULT_DUMMY_PLUGIN_NAME
|
||||
|
||||
static const char *const url = "inproc://neu_manager";
|
||||
|
||||
@@ -52,7 +53,6 @@ inline static void forward_msg_dup(neu_manager_t *manager, nng_msg *msg,
|
||||
inline static void forward_msg(neu_manager_t *manager, nng_msg *msg,
|
||||
const char *ndoe);
|
||||
static void start_static_adapter(neu_manager_t *manager, const char *name);
|
||||
static void stop_static_adapter(neu_manager_t *manager, const char *name);
|
||||
|
||||
neu_manager_t *neu_manager_create()
|
||||
{
|
||||
@@ -67,7 +67,7 @@ neu_manager_t *neu_manager_create()
|
||||
manager->plugin_manager = neu_plugin_manager_create();
|
||||
manager->node_manager = neu_node_manager_create();
|
||||
manager->subscribe_manager = neu_subscribe_manager_create();
|
||||
manager->stop = false;
|
||||
manager->persister = neu_persister_create("persistence");
|
||||
|
||||
nng_pair1_open_poly(&manager->socket);
|
||||
|
||||
@@ -78,17 +78,41 @@ neu_manager_t *neu_manager_create()
|
||||
manager->loop = neu_event_add_io(manager->events, param);
|
||||
|
||||
start_static_adapter(manager, DEFAULT_DASHBOARD_PLUGIN_NAME);
|
||||
start_static_adapter(manager, DEFAULT_DUMMY_PLUGIN_NAME);
|
||||
|
||||
if (manager_load_plugin(manager) != 0) {
|
||||
nlog_warn("load plugin error");
|
||||
} else {
|
||||
manager_load_node(manager);
|
||||
manager_load_subscribe(manager);
|
||||
}
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
void neu_manager_destroy(neu_manager_t *manager)
|
||||
{
|
||||
stop_static_adapter(manager, DEFAULT_DASHBOARD_PLUGIN_NAME);
|
||||
stop_static_adapter(manager, DEFAULT_DUMMY_PLUGIN_NAME);
|
||||
neu_reqresp_head_t header = { .type = NEU_REQ_NODE_UNINIT };
|
||||
neu_req_node_init_t uninit = { 0 };
|
||||
nng_msg * uninit_msg = NULL;
|
||||
UT_array *pipes = neu_node_manager_get_pipes_all(manager->node_manager);
|
||||
|
||||
manager->stop = true;
|
||||
utarray_foreach(pipes, nng_pipe *, pipe)
|
||||
{
|
||||
uninit_msg = neu_msg_gen(&header, &uninit);
|
||||
nng_msg_set_pipe(uninit_msg, *pipe);
|
||||
|
||||
nng_sendmsg(manager->socket, uninit_msg, 0);
|
||||
}
|
||||
utarray_free(pipes);
|
||||
|
||||
while (1) {
|
||||
usleep(1000 * 100);
|
||||
if (neu_node_manager_size(manager->node_manager) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
neu_persister_destroy(manager->persister);
|
||||
neu_subscribe_manager_destroy(manager->subscribe_manager);
|
||||
neu_node_manager_destroy(manager->node_manager);
|
||||
neu_plugin_manager_destroy(manager->plugin_manager);
|
||||
@@ -101,9 +125,8 @@ void neu_manager_destroy(neu_manager_t *manager)
|
||||
nlog_warn("manager exit");
|
||||
}
|
||||
|
||||
const char *neu_manager_get_url(neu_manager_t *manager)
|
||||
const char *neu_manager_get_url()
|
||||
{
|
||||
(void) manager;
|
||||
return url;
|
||||
}
|
||||
|
||||
@@ -127,44 +150,52 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
|
||||
header = (neu_reqresp_head_t *) nng_msg_body(msg);
|
||||
|
||||
if (manager->stop) {
|
||||
nlog_warn("manager stopped, drop from %s msg: %d", header->sender,
|
||||
header->type);
|
||||
nng_msg_free(msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
nlog_info("manager recv msg from: %s, type: %d", header->sender,
|
||||
header->type);
|
||||
switch (header->type) {
|
||||
case NEU_REQRESP_TRANS_DATA: {
|
||||
neu_reqresp_trans_data_t *cmd = (neu_reqresp_trans_data_t *) &header[1];
|
||||
UT_array *apps = neu_subscribe_manager_find(manager->subscribe_manager,
|
||||
cmd->driver, cmd->group);
|
||||
if (apps != NULL) {
|
||||
utarray_foreach(apps, neu_app_subscribe_t *, app)
|
||||
{
|
||||
forward_msg_dup(manager, msg, app->pipe);
|
||||
nlog_debug("forward trans data to pipe: %d", app->pipe.id);
|
||||
}
|
||||
utarray_free(apps);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_UPDATE_LICENSE: {
|
||||
UT_array *pipes = neu_node_manager_get_pipes(manager->node_manager,
|
||||
NEU_NA_TYPE_DRIVER);
|
||||
|
||||
utarray_foreach(pipes, nng_pipe *, pipe)
|
||||
{
|
||||
forward_msg_dup(manager, msg, *pipe);
|
||||
nlog_info("forward license update to pipe: %d", pipe->id);
|
||||
}
|
||||
utarray_free(pipes);
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_NODE_INIT: {
|
||||
neu_req_node_init_t *init = (neu_req_node_init_t *) &header[1];
|
||||
nng_pipe pipe = nng_msg_get_pipe(msg);
|
||||
|
||||
neu_node_manager_update(manager->node_manager, init->node, pipe);
|
||||
nlog_notice("bind node %s to pipe(%d)", init->node, pipe.id);
|
||||
if (strcmp(DEFAULT_DUMMY_PLUGIN_NAME, init->node) == 0) {
|
||||
header->type = NEU_REQRESP_PERSISTENCE_LOAD;
|
||||
nng_msg *out_msg = neu_msg_gen(header, NULL);
|
||||
|
||||
manager->persist_pipe = pipe;
|
||||
nng_msg_set_pipe(out_msg, manager->persist_pipe);
|
||||
|
||||
nng_sendmsg(manager->socket, out_msg, 0);
|
||||
nlog_info("send persistence load to pipe: %d", pipe.id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_RESP_ERROR:
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
break;
|
||||
case NEU_REQ_ADD_PLUGIN: {
|
||||
neu_req_add_plugin_t *cmd = (neu_req_add_plugin_t *) &header[1];
|
||||
int error = neu_manager_add_plugin(manager, cmd->library);
|
||||
neu_resp_error_t e = { .error = error };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
manager_strorage_plugin(manager);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
@@ -177,6 +208,10 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
int error = neu_manager_del_plugin(manager, cmd->plugin);
|
||||
neu_resp_error_t e = { .error = error };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
manager_strorage_plugin(manager);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &e);
|
||||
@@ -197,7 +232,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
neu_resp_error_t e = { .error = error };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
manager_storage_add_node(manager, cmd->node);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
@@ -207,16 +242,31 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
}
|
||||
case NEU_REQ_DEL_NODE: {
|
||||
neu_req_del_node_t *cmd = (neu_req_del_node_t *) &header[1];
|
||||
int error = neu_manager_del_node(manager, cmd->node);
|
||||
neu_resp_error_t e = { .error = error };
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
strcpy(header->receiver, cmd->node);
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) !=
|
||||
NULL) {
|
||||
header->type = NEU_REQ_NODE_UNINIT;
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
} else {
|
||||
error.error = NEU_ERR_NODE_NOT_EXIST;
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_RESP_NODE_UNINIT: {
|
||||
neu_resp_node_uninit_t *cmd = (neu_resp_node_uninit_t *) &header[1];
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &e);
|
||||
neu_manager_del_node(manager, cmd->node);
|
||||
manager_storage_del_node(manager, cmd->node);
|
||||
if (strlen(header->receiver) > 0) {
|
||||
neu_resp_error_t error = { 0 };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_NODE: {
|
||||
@@ -229,137 +279,6 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
reply(manager, header, &resp);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_ADD_GROUP: {
|
||||
neu_req_add_group_t *cmd = (neu_req_add_group_t *) &header[1];
|
||||
int error = neu_manager_add_group(manager, cmd->driver, cmd->group,
|
||||
cmd->interval);
|
||||
neu_resp_error_t e = { .error = error };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &e);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_DEL_GROUP: {
|
||||
neu_req_del_group_t *cmd = (neu_req_del_group_t *) &header[1];
|
||||
int error = neu_manager_del_group(manager, cmd->driver, cmd->group);
|
||||
neu_resp_error_t e = { .error = error };
|
||||
|
||||
if (error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &e);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_GROUP: {
|
||||
neu_req_get_group_t *cmd = (neu_req_get_group_t *) &header[1];
|
||||
UT_array * groups = NULL;
|
||||
int ret = neu_manager_get_group(manager, cmd->driver, &groups);
|
||||
neu_resp_error_t e = { .error = ret };
|
||||
neu_resp_get_group_t resp = { .groups = groups };
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
if (ret != NEU_ERR_SUCCESS) {
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
header->type = NEU_RESP_GET_GROUP;
|
||||
reply(manager, header, &resp);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_ADD_TAG: {
|
||||
neu_req_add_tag_t *cmd = (neu_req_add_tag_t *) &header[1];
|
||||
neu_resp_add_tag_t resp = { 0 };
|
||||
|
||||
resp.error = neu_manager_add_tag(manager, cmd->driver, cmd->group,
|
||||
cmd->n_tag, cmd->tags, &resp.index);
|
||||
|
||||
if (resp.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
neu_manager_notify_app_sub_update(manager, cmd->driver, cmd->group);
|
||||
}
|
||||
for (int i = 0; i < cmd->n_tag; i++) {
|
||||
free(cmd->tags[i].address);
|
||||
free(cmd->tags[i].name);
|
||||
free(cmd->tags[i].description);
|
||||
}
|
||||
free(cmd->tags);
|
||||
|
||||
header->type = NEU_RESP_ADD_TAG;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &resp);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_DEL_TAG: {
|
||||
neu_req_del_tag_t *cmd = (neu_req_del_tag_t *) &header[1];
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
error.error = neu_manager_del_tag(manager, cmd->driver, cmd->group,
|
||||
cmd->n_tag, cmd->tags);
|
||||
|
||||
if (error.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
neu_manager_notify_app_sub_update(manager, cmd->driver, cmd->group);
|
||||
}
|
||||
for (int i = 0; i < cmd->n_tag; i++) {
|
||||
free(cmd->tags[i]);
|
||||
}
|
||||
free(cmd->tags);
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &error);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_UPDATE_TAG: {
|
||||
neu_req_update_tag_t *cmd = (neu_req_update_tag_t *) &header[1];
|
||||
neu_resp_update_tag_t resp = { 0 };
|
||||
|
||||
resp.error = neu_manager_update_tag(manager, cmd->driver, cmd->group,
|
||||
cmd->n_tag, cmd->tags, &resp.index);
|
||||
|
||||
if (resp.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
neu_manager_notify_app_sub_update(manager, cmd->driver, cmd->group);
|
||||
}
|
||||
for (int i = 0; i < cmd->n_tag; i++) {
|
||||
free(cmd->tags[i].address);
|
||||
free(cmd->tags[i].name);
|
||||
free(cmd->tags[i].description);
|
||||
}
|
||||
free(cmd->tags);
|
||||
|
||||
header->type = NEU_RESP_UPDATE_TAG;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &resp);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_TAG: {
|
||||
neu_req_get_tag_t *cmd = (neu_req_get_tag_t *) &header[1];
|
||||
UT_array * tags = NULL;
|
||||
int ret = neu_manager_get_tag(manager, cmd->driver, cmd->group, &tags);
|
||||
neu_resp_error_t e = { .error = ret };
|
||||
neu_resp_get_tag_t resp = { .tags = tags };
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
if (ret != NEU_ERR_SUCCESS) {
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
header->type = NEU_RESP_GET_TAG;
|
||||
reply(manager, header, &resp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_SUBSCRIBE_GROUP: {
|
||||
neu_req_subscribe_t *cmd = (neu_req_subscribe_t *) &header[1];
|
||||
neu_resp_error_t error = { 0 };
|
||||
@@ -368,7 +287,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
neu_manager_subscribe(manager, cmd->app, cmd->driver, cmd->group);
|
||||
|
||||
if (error.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
manager_storage_subscribe(manager, cmd->app);
|
||||
neu_manager_notify_app_sub(manager, cmd->app, cmd->driver,
|
||||
cmd->group);
|
||||
}
|
||||
@@ -386,7 +305,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
neu_manager_unsubscribe(manager, cmd->app, cmd->driver, cmd->group);
|
||||
|
||||
if (error.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
manager_storage_subscribe(manager, cmd->app);
|
||||
neu_manager_notify_app_unsub(manager, cmd->app, cmd->driver,
|
||||
cmd->group);
|
||||
}
|
||||
@@ -407,109 +326,111 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
reply(manager, header, &resp);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_NODE_SETTING: {
|
||||
neu_req_node_setting_t *cmd = (neu_req_node_setting_t *) &header[1];
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
error.error =
|
||||
neu_manager_node_setting(manager, cmd->node, cmd->setting);
|
||||
|
||||
if (error.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
} else {
|
||||
free(cmd->setting);
|
||||
}
|
||||
|
||||
header->type = NEU_RESP_ERROR;
|
||||
strcpy(header->receiver, header->sender);
|
||||
reply(manager, header, &error);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_NODE_SETTING: {
|
||||
neu_req_get_node_setting_t *cmd =
|
||||
(neu_req_get_node_setting_t *) &header[1];
|
||||
neu_resp_get_node_setting_t resp = { 0 };
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
error.error =
|
||||
neu_manager_node_get_setting(manager, cmd->ndoe, &resp.setting);
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
if (error.error != NEU_ERR_SUCCESS) {
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &error);
|
||||
} else {
|
||||
header->type = NEU_RESP_GET_NODE_SETTING;
|
||||
reply(manager, header, &resp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_NODE_STATE: {
|
||||
neu_req_get_node_state_t *cmd = (neu_req_get_node_state_t *) &header[1];
|
||||
neu_resp_get_node_state_t resp = { 0 };
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
error.error =
|
||||
neu_manager_get_node_state(manager, cmd->node, &resp.state);
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
if (error.error != NEU_ERR_SUCCESS) {
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &error);
|
||||
} else {
|
||||
header->type = NEU_RESP_GET_NODE_STATE;
|
||||
reply(manager, header, &resp);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_NODE_CTL: {
|
||||
neu_req_node_ctl_t *cmd = (neu_req_node_ctl_t *) &header[1];
|
||||
neu_resp_error_t error = { 0 };
|
||||
|
||||
error.error = neu_manager_node_ctl(manager, cmd->node, cmd->ctl);
|
||||
if (error.error == NEU_ERR_SUCCESS) {
|
||||
forward_msg_dup(manager, msg, manager->persist_pipe);
|
||||
}
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &error);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_NODE_SETTING:
|
||||
case NEU_REQ_READ_GROUP:
|
||||
case NEU_REQ_WRITE_TAG:
|
||||
case NEU_REQ_GET_NODE_STATE:
|
||||
case NEU_REQ_GET_GROUP:
|
||||
case NEU_REQ_GET_TAG:
|
||||
case NEU_REQ_NODE_CTL:
|
||||
case NEU_REQ_ADD_GROUP: {
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case NEU_REQ_DEL_GROUP: {
|
||||
neu_req_del_group_t *cmd = (neu_req_del_group_t *) &header[1];
|
||||
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
neu_subscribe_manager_remove(manager->subscribe_manager,
|
||||
cmd->driver, cmd->group);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_DEL_TAG: {
|
||||
neu_req_del_tag_t *cmd = (neu_req_del_tag_t *) &header[1];
|
||||
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
for (int i = 0; i < cmd->n_tag; i++) {
|
||||
free(cmd->tags[i]);
|
||||
}
|
||||
free(cmd->tags);
|
||||
} else {
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_UPDATE_TAG:
|
||||
case NEU_REQ_ADD_TAG: {
|
||||
neu_req_add_tag_t *cmd = (neu_req_add_tag_t *) &header[1];
|
||||
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
for (int i = 0; i < cmd->n_tag; i++) {
|
||||
free(cmd->tags[i].address);
|
||||
free(cmd->tags[i].name);
|
||||
free(cmd->tags[i].description);
|
||||
}
|
||||
free(cmd->tags);
|
||||
} else {
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_NODE_SETTING: {
|
||||
neu_req_node_setting_t *cmd = (neu_req_node_setting_t *) &header[1];
|
||||
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
free(cmd->setting);
|
||||
} else {
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case NEU_RESP_ADD_TAG:
|
||||
case NEU_RESP_UPDATE_TAG:
|
||||
case NEU_RESP_GET_TAG:
|
||||
case NEU_RESP_GET_GROUP:
|
||||
case NEU_RESP_GET_NODE_SETTING:
|
||||
case NEU_RESP_GET_NODE_STATE:
|
||||
case NEU_RESP_ERROR:
|
||||
case NEU_RESP_READ_GROUP:
|
||||
forward_msg(manager, msg, header->receiver);
|
||||
break;
|
||||
case NEU_REQ_UPDATE_LICENSE: {
|
||||
UT_array *pipes = neu_node_manager_get_pipes(manager->node_manager,
|
||||
NEU_NA_TYPE_DRIVER);
|
||||
|
||||
utarray_foreach(pipes, nng_pipe *, pipe)
|
||||
{
|
||||
forward_msg_dup(manager, msg, *pipe);
|
||||
nlog_info("forward license update to pipe: %d", pipe->id);
|
||||
}
|
||||
utarray_free(pipes);
|
||||
|
||||
break;
|
||||
}
|
||||
case NEU_REQRESP_TRANS_DATA: {
|
||||
neu_reqresp_trans_data_t *cmd = (neu_reqresp_trans_data_t *) &header[1];
|
||||
UT_array *apps = neu_subscribe_manager_find(manager->subscribe_manager,
|
||||
cmd->driver, cmd->group);
|
||||
if (apps != NULL) {
|
||||
utarray_foreach(apps, neu_app_subscribe_t *, app)
|
||||
{
|
||||
forward_msg_dup(manager, msg, app->pipe);
|
||||
nlog_debug("forward trans data to pipe: %d", app->pipe.id);
|
||||
}
|
||||
utarray_free(apps);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
assert(false);
|
||||
break;
|
||||
@@ -560,15 +481,6 @@ static void start_static_adapter(neu_manager_t *manager, const char *name)
|
||||
neu_adapter_start(adapter);
|
||||
}
|
||||
|
||||
static void stop_static_adapter(neu_manager_t *manager, const char *name)
|
||||
{
|
||||
neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, name);
|
||||
|
||||
neu_adapter_uninit(adapter);
|
||||
neu_adapter_destroy(adapter);
|
||||
neu_node_manager_del(manager->node_manager, name);
|
||||
}
|
||||
|
||||
inline static void reply(neu_manager_t *manager, neu_reqresp_head_t *header,
|
||||
void *data)
|
||||
{
|
||||
|
||||
+1
-1
@@ -29,6 +29,6 @@
|
||||
neu_manager_t *neu_manager_create();
|
||||
void neu_manager_destroy(neu_manager_t *manager);
|
||||
|
||||
const char *neu_manager_get_url(neu_manager_t *manager);
|
||||
const char *neu_manager_get_url(void);
|
||||
|
||||
#endif
|
||||
|
||||
+5
-237
@@ -66,7 +66,7 @@ int neu_manager_add_node(neu_manager_t *manager, const char *node_name,
|
||||
adapter_info.handle = instance.handle;
|
||||
adapter_info.module = instance.module;
|
||||
|
||||
adapter = neu_adapter_create(&adapter_info, manager);
|
||||
adapter = neu_adapter_create(&adapter_info, true);
|
||||
neu_node_manager_add(manager->node_manager, adapter);
|
||||
neu_adapter_init(adapter);
|
||||
|
||||
@@ -82,9 +82,7 @@ int neu_manager_del_node(neu_manager_t *manager, const char *node_name)
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
neu_adapter_uninit(adapter);
|
||||
neu_adapter_destroy(adapter);
|
||||
|
||||
neu_subscribe_manager_remove(manager->subscribe_manager, node_name, NULL);
|
||||
neu_node_manager_del(manager->node_manager, node_name);
|
||||
return NEU_ERR_SUCCESS;
|
||||
@@ -95,180 +93,6 @@ UT_array *neu_manager_get_nodes(neu_manager_t *manager, neu_node_type_e type)
|
||||
return neu_node_manager_get(manager->node_manager, type);
|
||||
}
|
||||
|
||||
int neu_manager_add_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint32_t interval)
|
||||
{
|
||||
if (interval < NEU_GROUP_INTERVAL_LIMIT) {
|
||||
return NEU_ERR_GROUP_PARAMETER_INVALID;
|
||||
}
|
||||
|
||||
if (strlen(group) > NEU_GROUP_NAME_LEN) {
|
||||
return NEU_ERR_GROUP_PARAMETER_INVALID;
|
||||
}
|
||||
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
return neu_adapter_driver_add_group((neu_adapter_driver_t *) adapter, group,
|
||||
interval);
|
||||
}
|
||||
|
||||
int neu_manager_del_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
neu_subscribe_manager_remove(manager->subscribe_manager, driver, group);
|
||||
return neu_adapter_driver_del_group((neu_adapter_driver_t *) adapter,
|
||||
group);
|
||||
}
|
||||
|
||||
int neu_manager_update_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint32_t interval)
|
||||
{
|
||||
if (interval < NEU_GROUP_INTERVAL_LIMIT) {
|
||||
return NEU_ERR_GROUP_PARAMETER_INVALID;
|
||||
}
|
||||
(void) manager;
|
||||
(void) driver;
|
||||
(void) group;
|
||||
(void) interval;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int neu_manager_get_group(neu_manager_t *manager, const char *driver,
|
||||
UT_array **groups)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
*groups = neu_adapter_driver_get_group((neu_adapter_driver_t *) adapter);
|
||||
|
||||
return NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int neu_manager_add_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag, neu_datatag_t *tags,
|
||||
uint16_t *index)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
*index = 0;
|
||||
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_tag; i++) {
|
||||
int ret = neu_adapter_driver_add_tag((neu_adapter_driver_t *) adapter,
|
||||
group, &tags[i]);
|
||||
if (ret == NEU_ERR_SUCCESS) {
|
||||
*index += 1;
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int neu_manager_del_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag, char **tags)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_tag; i++) {
|
||||
neu_adapter_driver_del_tag((neu_adapter_driver_t *) adapter, group,
|
||||
tags[i]);
|
||||
}
|
||||
|
||||
return NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int neu_manager_update_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag,
|
||||
neu_datatag_t *tags, uint16_t *index)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
*index = 0;
|
||||
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_tag; i++) {
|
||||
int ret = neu_adapter_driver_update_tag(
|
||||
(neu_adapter_driver_t *) adapter, group, &tags[i]);
|
||||
if (ret == NEU_ERR_SUCCESS) {
|
||||
*index += 1;
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int neu_manager_get_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, UT_array **tags)
|
||||
{
|
||||
neu_adapter_t *adapter =
|
||||
neu_node_manager_find(manager->node_manager, driver);
|
||||
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
if (adapter->plugin_info.module->type != NEU_NA_TYPE_DRIVER) {
|
||||
return NEU_ERR_GROUP_NOT_ALLOW;
|
||||
}
|
||||
|
||||
return neu_adapter_driver_get_tag((neu_adapter_driver_t *) adapter, group,
|
||||
tags);
|
||||
}
|
||||
|
||||
int neu_manager_subscribe(neu_manager_t *manager, const char *app,
|
||||
const char *driver, const char *group)
|
||||
{
|
||||
@@ -309,62 +133,6 @@ UT_array *neu_manager_get_sub_group(neu_manager_t *manager, const char *app)
|
||||
return neu_subscribe_manager_get(manager->subscribe_manager, app);
|
||||
}
|
||||
|
||||
int neu_manager_get_node_state(neu_manager_t *manager, const char *node,
|
||||
neu_node_state_t *state)
|
||||
{
|
||||
neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, node);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
*state = neu_adapter_get_state(adapter);
|
||||
|
||||
return NEU_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int neu_manager_node_ctl(neu_manager_t *manager, const char *node,
|
||||
neu_adapter_ctl_e ctl)
|
||||
{
|
||||
int ret = NEU_ERR_SUCCESS;
|
||||
neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, node);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
switch (ctl) {
|
||||
case NEU_ADAPTER_CTL_START:
|
||||
ret = neu_adapter_start(adapter);
|
||||
break;
|
||||
case NEU_ADAPTER_CTL_STOP:
|
||||
ret = neu_adapter_stop(adapter);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int neu_manager_node_setting(neu_manager_t *manager, const char *node,
|
||||
const char *setting)
|
||||
{
|
||||
neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, node);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
return neu_adapter_set_setting(adapter, setting);
|
||||
}
|
||||
|
||||
int neu_manager_node_get_setting(neu_manager_t *manager, const char *node,
|
||||
char **setting)
|
||||
{
|
||||
neu_adapter_t *adapter = neu_node_manager_find(manager->node_manager, node);
|
||||
if (adapter == NULL) {
|
||||
return NEU_ERR_NODE_NOT_EXIST;
|
||||
}
|
||||
|
||||
return neu_adapter_get_setting(adapter, setting);
|
||||
}
|
||||
|
||||
int neu_manager_get_adapter_info(neu_manager_t *manager, const char *name,
|
||||
neu_persist_adapter_info_t *info)
|
||||
{
|
||||
@@ -372,8 +140,8 @@ int neu_manager_get_adapter_info(neu_manager_t *manager, const char *name,
|
||||
|
||||
if (adapter != NULL) {
|
||||
info->name = strdup(name);
|
||||
info->type = adapter->plugin_info.module->type;
|
||||
info->plugin_name = strdup(adapter->plugin_info.module->module_name);
|
||||
info->type = adapter->module->type;
|
||||
info->plugin_name = strdup(adapter->module->module_name);
|
||||
info->state = adapter->state;
|
||||
return 0;
|
||||
}
|
||||
@@ -392,8 +160,8 @@ void neu_manager_notify_app_sub(neu_manager_t *manager, const char *app,
|
||||
header.type = NEU_REQ_APP_SUBSCRIBE_GROUP;
|
||||
strcpy(sub.driver, driver);
|
||||
strcpy(sub.group, group);
|
||||
int ret = neu_manager_get_tag(manager, driver, group, &sub.tags);
|
||||
assert(ret == 0);
|
||||
// int ret = neu_manager_get_tag(manager, driver, group, &sub.tags);
|
||||
// assert(ret == 0);
|
||||
|
||||
msg = neu_msg_gen(&header, (void *) &sub);
|
||||
nng_msg_set_pipe(msg, pipe);
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <nng/supplemental/util/platform.h>
|
||||
|
||||
#include "event/event.h"
|
||||
#include "persist/persist.h"
|
||||
|
||||
#include "node_manager.h"
|
||||
#include "plugin_manager.h"
|
||||
@@ -34,13 +35,11 @@ typedef struct neu_manager {
|
||||
neu_events_t * events;
|
||||
neu_event_io_t *loop;
|
||||
|
||||
bool stop;
|
||||
|
||||
neu_plugin_manager_t *plugin_manager;
|
||||
neu_node_manager_t * node_manager;
|
||||
neu_subscribe_mgr_t * subscribe_manager;
|
||||
|
||||
nng_pipe persist_pipe;
|
||||
neu_persister_t *persister;
|
||||
} neu_manager_t;
|
||||
|
||||
int neu_manager_add_plugin(neu_manager_t *manager, const char *library);
|
||||
@@ -52,42 +51,12 @@ int neu_manager_add_node(neu_manager_t *manager, const char *node_name,
|
||||
int neu_manager_del_node(neu_manager_t *manager, const char *node_name);
|
||||
UT_array *neu_manager_get_nodes(neu_manager_t *manager, neu_node_type_e type);
|
||||
|
||||
int neu_manager_add_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint32_t interval);
|
||||
int neu_manager_del_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group);
|
||||
int neu_manager_update_group(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint32_t interval);
|
||||
int neu_manager_get_group(neu_manager_t *manager, const char *driver,
|
||||
UT_array **groups);
|
||||
|
||||
int neu_manager_add_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag, neu_datatag_t *tags,
|
||||
uint16_t *index);
|
||||
int neu_manager_del_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag, char **tags);
|
||||
int neu_manager_update_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, uint16_t n_tag,
|
||||
neu_datatag_t *tags, uint16_t *index);
|
||||
int neu_manager_get_tag(neu_manager_t *manager, const char *driver,
|
||||
const char *group, UT_array **tags);
|
||||
|
||||
int neu_manager_subscribe(neu_manager_t *manager, const char *app,
|
||||
const char *driver, const char *group);
|
||||
int neu_manager_unsubscribe(neu_manager_t *manager, const char *app,
|
||||
const char *driver, const char *group);
|
||||
UT_array *neu_manager_get_sub_group(neu_manager_t *manager, const char *app);
|
||||
|
||||
int neu_manager_get_node_state(neu_manager_t *manager, const char *node,
|
||||
neu_node_state_t *state);
|
||||
int neu_manager_node_ctl(neu_manager_t *manager, const char *node,
|
||||
neu_adapter_ctl_e ctl);
|
||||
|
||||
int neu_manager_node_setting(neu_manager_t *manager, const char *node,
|
||||
const char *setting);
|
||||
int neu_manager_node_get_setting(neu_manager_t *manager, const char *node,
|
||||
char **setting);
|
||||
|
||||
int neu_manager_get_adapter_info(neu_manager_t *manager, const char *name,
|
||||
neu_persist_adapter_info_t *info);
|
||||
|
||||
|
||||
+25
-6
@@ -52,8 +52,6 @@ void neu_node_manager_destroy(neu_node_manager_t *mgr)
|
||||
HASH_ITER(hh, mgr->nodes, el, tmp)
|
||||
{
|
||||
HASH_DEL(mgr->nodes, el);
|
||||
neu_adapter_uninit(el->adapter);
|
||||
neu_adapter_destroy(el->adapter);
|
||||
free(el->name);
|
||||
free(el);
|
||||
}
|
||||
@@ -110,6 +108,11 @@ void neu_node_manager_del(neu_node_manager_t *mgr, const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t neu_node_manager_size(neu_node_manager_t *mgr)
|
||||
{
|
||||
return HASH_COUNT(mgr->nodes);
|
||||
}
|
||||
|
||||
UT_array *neu_node_manager_get(neu_node_manager_t *mgr, neu_node_type_e type)
|
||||
{
|
||||
UT_array * array = NULL;
|
||||
@@ -121,11 +124,10 @@ UT_array *neu_node_manager_get(neu_node_manager_t *mgr, neu_node_type_e type)
|
||||
HASH_ITER(hh, mgr->nodes, el, tmp)
|
||||
{
|
||||
if (!el->is_static) {
|
||||
if (el->adapter->plugin_info.module->type == type) {
|
||||
if (el->adapter->module->type == type) {
|
||||
neu_resp_node_info_t info = { 0 };
|
||||
strcpy(info.node, el->adapter->name);
|
||||
strcpy(info.plugin,
|
||||
el->adapter->plugin_info.module->module_name);
|
||||
strcpy(info.plugin, el->adapter->module->module_name);
|
||||
utarray_push_back(array, &info);
|
||||
}
|
||||
}
|
||||
@@ -159,7 +161,7 @@ UT_array *neu_node_manager_get_pipes(neu_node_manager_t *mgr,
|
||||
HASH_ITER(hh, mgr->nodes, el, tmp)
|
||||
{
|
||||
if (!el->is_static) {
|
||||
if (el->adapter->plugin_info.module->type == type) {
|
||||
if (el->adapter->module->type == type) {
|
||||
nng_pipe pipe = el->pipe;
|
||||
utarray_push_back(pipes, &pipe);
|
||||
}
|
||||
@@ -169,6 +171,23 @@ UT_array *neu_node_manager_get_pipes(neu_node_manager_t *mgr,
|
||||
return pipes;
|
||||
}
|
||||
|
||||
UT_array *neu_node_manager_get_pipes_all(neu_node_manager_t *mgr)
|
||||
{
|
||||
UT_icd icd = { sizeof(nng_pipe), NULL, NULL, NULL };
|
||||
UT_array * pipes = NULL;
|
||||
node_entity_t *el = NULL, *tmp = NULL;
|
||||
|
||||
utarray_new(pipes, &icd);
|
||||
|
||||
HASH_ITER(hh, mgr->nodes, el, tmp)
|
||||
{
|
||||
nng_pipe pipe = el->pipe;
|
||||
utarray_push_back(pipes, &pipe);
|
||||
}
|
||||
|
||||
return pipes;
|
||||
}
|
||||
|
||||
nng_pipe neu_node_manager_get_pipe(neu_node_manager_t *mgr, const char *name)
|
||||
{
|
||||
nng_pipe pipe = { 0 };
|
||||
|
||||
@@ -32,20 +32,22 @@ typedef struct neu_node_manager neu_node_manager_t;
|
||||
neu_node_manager_t *neu_node_manager_create();
|
||||
void neu_node_manager_destroy(neu_node_manager_t *mgr);
|
||||
|
||||
int neu_node_manager_add(neu_node_manager_t *mgr, neu_adapter_t *adapter);
|
||||
int neu_node_manager_add_static(neu_node_manager_t *mgr,
|
||||
neu_adapter_t * adapter);
|
||||
int neu_node_manager_update(neu_node_manager_t *mgr, const char *name,
|
||||
nng_pipe pipe);
|
||||
void neu_node_manager_del(neu_node_manager_t *mgr, const char *name);
|
||||
int neu_node_manager_add(neu_node_manager_t *mgr, neu_adapter_t *adapter);
|
||||
int neu_node_manager_add_static(neu_node_manager_t *mgr,
|
||||
neu_adapter_t * adapter);
|
||||
int neu_node_manager_update(neu_node_manager_t *mgr, const char *name,
|
||||
nng_pipe pipe);
|
||||
void neu_node_manager_del(neu_node_manager_t *mgr, const char *name);
|
||||
uint16_t neu_node_manager_size(neu_node_manager_t *mgr);
|
||||
|
||||
// neu_node_info array
|
||||
// neu_resp_node_info array
|
||||
UT_array *neu_node_manager_get(neu_node_manager_t *mgr, neu_node_type_e type);
|
||||
neu_adapter_t *neu_node_manager_find(neu_node_manager_t *mgr, const char *name);
|
||||
|
||||
// nng_pipe array
|
||||
UT_array *neu_node_manager_get_pipes(neu_node_manager_t *mgr,
|
||||
neu_node_type_e type);
|
||||
UT_array *neu_node_manager_get_pipes_all(neu_node_manager_t *mgr);
|
||||
nng_pipe neu_node_manager_get_pipe(neu_node_manager_t *mgr, const char *name);
|
||||
|
||||
#endif
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "adapter.h"
|
||||
#include "plugin.h"
|
||||
|
||||
#include "dummy/dummy.h"
|
||||
#include "restful/rest.h"
|
||||
|
||||
#include "plugin_manager.h"
|
||||
@@ -226,9 +225,6 @@ void neu_plugin_manager_load_static(neu_plugin_manager_t * mgr,
|
||||
instance->module =
|
||||
(neu_plugin_module_t *) &default_dashboard_plugin_module;
|
||||
}
|
||||
if (strcmp(DEFAULT_DUMMY_PLUGIN_NAME, plugin_name) == 0) {
|
||||
instance->module = (neu_plugin_module_t *) &default_dummy_plugin_module;
|
||||
}
|
||||
}
|
||||
|
||||
void neu_plugin_manager_destroy_instance(neu_plugin_manager_t * mgr,
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "plugin.h"
|
||||
|
||||
#define DEFAULT_DASHBOARD_PLUGIN_NAME "default-dashboard"
|
||||
#define DEFAULT_DUMMY_PLUGIN_NAME "default-dummy"
|
||||
|
||||
typedef struct neu_plugin_instance {
|
||||
void * handle;
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
#include "utils/log.h"
|
||||
|
||||
#include "storage.h"
|
||||
|
||||
void manager_strorage_plugin(neu_manager_t *manager)
|
||||
{
|
||||
UT_array *plugin_infos = NULL;
|
||||
|
||||
plugin_infos = neu_manager_get_plugins(manager);
|
||||
|
||||
int rv = neu_persister_store_plugins(manager->persister, plugin_infos);
|
||||
if (0 != rv) {
|
||||
nlog_error("failed to store plugins infos");
|
||||
}
|
||||
|
||||
neu_persist_plugin_infos_free(plugin_infos);
|
||||
return;
|
||||
}
|
||||
|
||||
void manager_storage_add_node(neu_manager_t *manager, const char *node)
|
||||
{
|
||||
int rv = 0;
|
||||
neu_persist_adapter_info_t adapter_info = {};
|
||||
|
||||
rv = neu_manager_get_adapter_info(manager, node, &adapter_info);
|
||||
if (0 != rv) {
|
||||
nlog_error("unable to get adapter:%s info", node);
|
||||
return;
|
||||
}
|
||||
|
||||
rv = neu_persister_store_adapter(manager->persister, &adapter_info);
|
||||
if (0 != rv) {
|
||||
nlog_error("failed to store adapter info");
|
||||
}
|
||||
|
||||
neu_persist_adapter_info_fini(&adapter_info);
|
||||
}
|
||||
|
||||
void manager_storage_del_node(neu_manager_t *manager, const char *node)
|
||||
{
|
||||
neu_persister_delete_adapter(manager->persister, node);
|
||||
}
|
||||
|
||||
void manager_storage_subscribe(neu_manager_t *manager, const char *app)
|
||||
{
|
||||
|
||||
UT_array *sub_infos = neu_manager_get_sub_group(manager, app);
|
||||
|
||||
int rv =
|
||||
neu_persister_store_subscriptions(manager->persister, app, sub_infos);
|
||||
if (0 != rv) {
|
||||
nlog_error("fail store adapter:%s subscription infos", app);
|
||||
}
|
||||
|
||||
utarray_free(sub_infos);
|
||||
}
|
||||
|
||||
int manager_load_plugin(neu_manager_t *manager)
|
||||
{
|
||||
UT_array *plugin_infos = NULL;
|
||||
|
||||
int rv = neu_persister_load_plugins(manager->persister, &plugin_infos);
|
||||
if (rv != 0) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
utarray_foreach(plugin_infos, char **, name)
|
||||
{
|
||||
rv = neu_manager_add_plugin(manager, *name);
|
||||
const char *ok_or_err = (0 == rv) ? "success" : "fail";
|
||||
nlog_info("load plugin %s, lib:%s", ok_or_err, *name);
|
||||
}
|
||||
|
||||
utarray_foreach(plugin_infos, char **, name) { free(*name); }
|
||||
utarray_free(plugin_infos);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int manager_load_node(neu_manager_t *manager)
|
||||
{
|
||||
UT_array *adapter_infos = NULL;
|
||||
int rv = 0;
|
||||
|
||||
rv = neu_persister_load_adapters(manager->persister, &adapter_infos);
|
||||
if (0 != rv) {
|
||||
nlog_error("failed to load adapter infos");
|
||||
return -1;
|
||||
}
|
||||
|
||||
utarray_foreach(adapter_infos, neu_persist_adapter_info_t *, adapter_info)
|
||||
{
|
||||
rv = neu_manager_add_node(manager, adapter_info->name,
|
||||
adapter_info->plugin_name);
|
||||
const char *ok_or_err = (0 == rv) ? "success" : "fail";
|
||||
nlog_info("load adapter %s type:%" PRId64 ", name:%s plugin:%s",
|
||||
ok_or_err, adapter_info->type, adapter_info->name,
|
||||
adapter_info->plugin_name);
|
||||
}
|
||||
|
||||
neu_persist_adapter_infos_free(adapter_infos);
|
||||
return rv;
|
||||
}
|
||||
|
||||
int manager_load_subscribe(neu_manager_t *manager)
|
||||
{
|
||||
UT_array *nodes =
|
||||
neu_node_manager_get(manager->node_manager, NEU_NA_TYPE_APP);
|
||||
|
||||
utarray_foreach(nodes, neu_resp_node_info_t *, node)
|
||||
{
|
||||
int rv = 0;
|
||||
UT_array *sub_infos = NULL;
|
||||
|
||||
rv = neu_persister_load_subscriptions(manager->persister, node->node,
|
||||
&sub_infos);
|
||||
if (0 != rv) {
|
||||
nlog_warn("load %s subscribetion infos error", node->node);
|
||||
} else {
|
||||
utarray_foreach(sub_infos, neu_persist_subscription_info_t *, info)
|
||||
{
|
||||
rv = neu_manager_subscribe(manager, info->sub_adapter_name,
|
||||
info->src_adapter_name,
|
||||
info->group_config_name);
|
||||
const char *ok_or_err = (0 == rv) ? "success" : "fail";
|
||||
nlog_info("%s load subscription app:%s driver:%s grp:%s",
|
||||
ok_or_err, info->sub_adapter_name,
|
||||
info->src_adapter_name, info->group_config_name);
|
||||
}
|
||||
|
||||
neu_persist_subscription_infos_free(sub_infos);
|
||||
}
|
||||
}
|
||||
|
||||
utarray_free(nodes);
|
||||
return 0;
|
||||
}
|
||||
@@ -17,11 +17,20 @@
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
#ifndef _NEU_PLUGIN_DUMMY_H_
|
||||
#define _NEU_PLUGIN_DUMMY_H_
|
||||
#ifndef _NEU_MANAGER_STORAGE_H_
|
||||
#define _NEU_MANAGER_STORAGE_H_
|
||||
|
||||
#include "plugin.h"
|
||||
#include "persist/persist.h"
|
||||
|
||||
extern const neu_plugin_module_t default_dummy_plugin_module;
|
||||
#include "manager_internal.h"
|
||||
|
||||
void manager_strorage_plugin(neu_manager_t *manager);
|
||||
void manager_storage_del_node(neu_manager_t *manager, const char *node);
|
||||
void manager_storage_add_node(neu_manager_t *manager, const char *node);
|
||||
void manager_storage_subscribe(neu_manager_t *manager, const char *node);
|
||||
|
||||
int manager_load_plugin(neu_manager_t *manager);
|
||||
int manager_load_node(neu_manager_t *manager);
|
||||
int manager_load_subscribe(neu_manager_t *manager);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user