diff --git a/src/json2iris.c b/src/json2iris.c index 46a0c6d..774cb2b 100644 --- a/src/json2iris.c +++ b/src/json2iris.c @@ -25,11 +25,13 @@ #define MODULE_JSON2IRIS module_name_str("maat.json2iris") -#define MAX_COLUMN_NUM 32 -#define MAX_PATH_LINE 512 +#define MAX_COLUMN_NUM 32 +#define MAX_PATH_LINE 512 +#define MAX_BUFF_LEN 4096 +#define MAX_GROUP_ID_STR 128 const int json_version = 1; -const char *untitled_group_name="Untitled"; +const char *untitled_group_name = "Untitled"; long long untitled_group_id = 123456789; enum maat_group_relation { @@ -38,8 +40,10 @@ enum maat_group_relation { }; struct group_info { - int group_id; - char group_name[NAME_MAX]; + int group_id; + char group_name[NAME_MAX]; + UT_array *incl_group_ids; + UT_array *excl_group_ids; UT_hash_handle hh; }; @@ -197,6 +201,16 @@ static void clear_iris_descriptor(struct iris_description *iris_cfg) struct group_info *node = NULL; struct group_info *tmp = NULL; HASH_ITER(hh, iris_cfg->group_name_map, node, tmp) { + if (node->incl_group_ids != NULL) { + utarray_free(node->incl_group_ids); + node->incl_group_ids = NULL; + } + + if (node->excl_group_ids != NULL) { + utarray_free(node->excl_group_ids); + node->excl_group_ids = NULL; + } + HASH_DELETE(hh, iris_cfg->group_name_map, node); FREE(node); } @@ -294,11 +308,15 @@ static struct group_info *group_info_read(struct group_info *group_name_map, return node; } +UT_icd ut_json2iris_group_id_icd = {sizeof(int), NULL, NULL, NULL}; static struct group_info * group_info_add_unsafe(struct iris_description *p_iris, const char *group_name, long long group_id) { struct group_info *group_info = ALLOC(struct group_info, 1); + utarray_new(group_info->incl_group_ids, &ut_json2iris_group_id_icd); + utarray_new(group_info->excl_group_ids, &ut_json2iris_group_id_icd); + group_info->group_id = group_id; strncpy(group_info->group_name, group_name, sizeof(group_info->group_name)); @@ -701,23 +719,66 @@ static int write_group2compile_line(int *group_ids, size_t n_group_id, return 0; } -static int write_group2group_line(int sub_group_id, int super_group_id, int is_exclude, +static int write_group2group_line(int super_group_id, UT_array *incl_group_ids, + UT_array *excl_group_ids, struct iris_description *p_iris) { - char buff[4096] = {0}; + char buff[MAX_BUFF_LEN] = {0}; struct iris_table *table = p_iris->group2group_table; if (NULL == table) { return -1; } - snprintf(buff, sizeof(buff), "%d\t%d\t%d\t1\n", sub_group_id, - super_group_id, is_exclude); - - table->write_pos += memcat(&(table->buff), table->write_pos, - &(table->buff_sz), buff, strlen(buff)); - table->line_count++; + size_t i = 0, pos = 0; + char incl_id_str[MAX_BUFF_LEN] = {0}; + char excl_id_str[MAX_BUFF_LEN] = {0}; - return 0; + if (0 == utarray_len(incl_group_ids) && + 0 == utarray_len(excl_group_ids)) { + return 0; + } + + int *tmp_id = NULL; + char tmp_str[MAX_GROUP_ID_STR] = {0}; + for (i = 0; i < utarray_len(incl_group_ids); i++) { + tmp_id = (int *)utarray_eltptr(incl_group_ids, i); + sprintf(tmp_str, "%d,", *tmp_id); + sprintf(incl_id_str + pos, "%s", tmp_str); + pos += strlen(tmp_str); + } + + const char *null_str = "null"; + size_t str_len = strlen(incl_id_str); + if (str_len > 0) { + incl_id_str[str_len - 1] = '\0'; + } else { + memcpy(incl_id_str, null_str, strlen(null_str)); + } + + pos = 0; + memset(tmp_str, 0, sizeof(tmp_str)); + for (i = 0; i < utarray_len(excl_group_ids); i++) { + tmp_id = (int *)utarray_eltptr(excl_group_ids, i); + sprintf(tmp_str, "%d,", *tmp_id); + sprintf(excl_id_str + pos, "%s", tmp_str); + pos += strlen(tmp_str); + } + + str_len = strlen(excl_id_str); + if (str_len > 0) { + excl_id_str[str_len - 1] = '\0'; + } else { + memcpy(excl_id_str, null_str, strlen(null_str)); + } + + snprintf(buff, sizeof(buff), "%s\t%d\t%s\t1\n", incl_id_str, + super_group_id, excl_id_str); + + table->write_pos += memcat(&(table->buff), table->write_pos, + &(table->buff_sz), buff, strlen(buff)); + table->line_count++; + + return 0; } static int write_group_rule(cJSON *group_json, int parent_id, @@ -727,10 +788,9 @@ static int write_group_rule(cJSON *group_json, int parent_id, { int ret = 0; int group_not_flag = 0; - int clause_index = 0, is_exclude = 0; - const char *str_parent_type[2] = {"compile", "group"}; + int clause_index = 0; const char *group_name = NULL; - char group_name_array[32][MAX_NAME_STR_LEN] = {{0},}; + char group_name_array[32][MAX_NAME_STR_LEN]; size_t group_name_cnt = 0; long long group_id = -1; const char *virtual_table = NULL; @@ -763,13 +823,6 @@ static int write_group_rule(cJSON *group_json, int parent_id, group_id = item->valueint; } - item = cJSON_GetObjectItem(group_json, "is_exclude"); - if (NULL == item || item->type != cJSON_Number) { - is_exclude = 0; - } else { - is_exclude = item->valueint; - } - if (parent_type == PARENT_TYPE_COMPILE) { item = cJSON_GetObjectItem(group_json, "virtual_table"); if (NULL == item || item->type != cJSON_String) { @@ -797,8 +850,6 @@ static int write_group_rule(cJSON *group_json, int parent_id, g2c_table = query_table_info(p_iris, item->valuestring, TABLE_TYPE_GROUP2COMPILE); } - } else { - group_not_flag = 0; } if (group_name_cnt > 0) { @@ -877,19 +928,15 @@ static int write_group_rule(cJSON *group_json, int parent_id, ret = write_group2compile_line(&(group_info->group_id), 1, parent_id, group_not_flag, clause_index, virtual_table, p_iris, g2c_table); - } else { - ret = write_group2group_line(group_info->group_id, parent_id, - is_exclude, p_iris); - } + if (ret < 0) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] compile:%d write group error", + __FUNCTION__, __LINE__, parent_id); + return -1; + } + } } - if (ret < 0) { - log_fatal(logger, MODULE_JSON2IRIS, - "[%s:%d] %s rule %d write group error", - __FUNCTION__, __LINE__, str_parent_type[parent_type], parent_id); - return -1; - } - return 0; } @@ -1058,98 +1105,215 @@ static int write_index_file(struct iris_description *p_iris, return 0; } -static int write_iris(cJSON *json, struct iris_description *p_iris, - struct log_handle *logger) +int recursive_traverse_sub_groups(cJSON *group_obj, struct iris_description *p_iris, + struct log_handle *logger) { - int i=0; - int ret=0; - static struct group_info *parent_group = NULL; //TODO - - cJSON *plug_tables = cJSON_GetObjectItem(json, "plugin_table"); - if (plug_tables != NULL) { + cJSON *sub_group_array = cJSON_GetObjectItem(group_obj, "sub_groups"); + if (NULL == sub_group_array) { + return 0; + } + + cJSON *item = cJSON_GetObjectItem(group_obj, "group_name"); + if (NULL == item || item->type != cJSON_String) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] has no group_name before sub_groups."); + return -1; + } + + const char *parent_group_name = item->valuestring; + struct group_info *parent_group = group_info_read(p_iris->group_name_map, + item->valuestring); + if (NULL == parent_group) { + item = cJSON_GetObjectItem(group_obj, "group_id"); + if (NULL == item || item->type != cJSON_Number) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] group_name:%s has no group_id.", parent_group_name); + return -1; + } + parent_group = group_info_add_unsafe(p_iris, parent_group_name, item->valueint); + } + + cJSON *sub_group_obj = NULL; + cJSON_ArrayForEach(sub_group_obj, sub_group_array) { + cJSON *tmp_item1 = cJSON_GetObjectItem(sub_group_obj, "group_name"); + if (NULL == tmp_item1 || tmp_item1->type != cJSON_String) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d]group:%s's sub_groups has no group_name", + __FUNCTION__, __LINE__, parent_group_name); + return -1; + } + + int group_id = -1; + int is_exclude = 0; + cJSON *tmp_item2 = cJSON_GetObjectItem(sub_group_obj, "group_id"); + if (NULL == tmp_item2) { + struct group_info *group = group_info_read(p_iris->group_name_map, + tmp_item1->valuestring); + assert(group != NULL); + group_id = group->group_id; + } else { + group_id = tmp_item2->valueint; + } + + cJSON *tmp_item3 = cJSON_GetObjectItem(sub_group_obj, "is_exclude"); + if (tmp_item3 != NULL && tmp_item3->type == cJSON_Number) { + is_exclude = tmp_item3->valueint; + } + if (0 == is_exclude) { + utarray_push_back(parent_group->incl_group_ids, &group_id); + } else { + utarray_push_back(parent_group->excl_group_ids, &group_id); + } + + int ret = recursive_traverse_sub_groups(sub_group_obj, p_iris, logger); + if (ret < 0) { + return -1; + } + } + + return 0; +} + +static int write_group2group_rule(struct iris_description *p_iris, + struct log_handle *logger) +{ + int ret = 0; + struct group_info *group_info = NULL, *tmp_group_info = NULL; + + HASH_ITER(hh, p_iris->group_name_map, group_info, tmp_group_info) { + ret = write_group2group_line(group_info->group_id, group_info->incl_group_ids, + group_info->excl_group_ids, p_iris); + if (ret < 0) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] write group2group line failed for super_group:%d", + __FUNCTION__, __LINE__, group_info->group_id); + return -1; + } + } + + return 0; +} + +static int write_iris(cJSON *json, struct iris_description *p_iris, + struct log_handle *logger) +{ + int i = 0; + int ret = 0; + static struct group_info *parent_group = NULL; // TODO + + cJSON *plug_tables = cJSON_GetObjectItem(json, "plugin_table"); + if (plug_tables != NULL) { cJSON *each_plug_table = NULL; - cJSON_ArrayForEach(each_plug_table, plug_tables) { - write_plugin_line(each_plug_table, i, p_iris, logger); - i++; - } - } + cJSON_ArrayForEach(each_plug_table, plug_tables) { + write_plugin_line(each_plug_table, i, p_iris, logger); + i++; + } + } - cJSON *group_array = cJSON_GetObjectItem(json, "groups");//sub-group to group - if (group_array != NULL) { + cJSON *group_array = cJSON_GetObjectItem(json, "groups"); // sub-group to group + if (group_array != NULL) { cJSON *group_obj = NULL; - cJSON_ArrayForEach(group_obj, group_array) { + cJSON_ArrayForEach(group_obj, group_array) { const char *parent_group_name = NULL; - cJSON *item = cJSON_GetObjectItem(group_obj, "parent_group"); - if (NULL == item || item->type!=cJSON_String) { - parent_group_name = untitled_group_name; - } else { - parent_group_name = item->string; - } + cJSON *item = cJSON_GetObjectItem(group_obj, "parent_group"); + if (NULL == item || item->type != cJSON_String) { + parent_group_name = untitled_group_name; + } else { + parent_group_name = item->string; + } - parent_group = group_info_read(p_iris->group_name_map, parent_group_name); - if(NULL == parent_group) { - parent_group = group_info_add_unsafe(p_iris, parent_group_name, - untitled_group_id); - } + parent_group = group_info_read(p_iris->group_name_map, parent_group_name); + if (NULL == parent_group) { + parent_group = group_info_add_unsafe(p_iris, parent_group_name, + untitled_group_id); + } - ret = write_group_rule(group_obj, parent_group->group_id, - PARENT_TYPE_GROUP, 0, 0, p_iris, logger); + item = cJSON_GetObjectItem(group_obj, "group_id"); + if (NULL == item || item->type != cJSON_Number) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d]Global groups has group with no group_id.", + __FUNCTION__, __LINE__); + return -1; + } + + utarray_push_back(parent_group->incl_group_ids, &item->valueint); + ret = write_group_rule(group_obj, parent_group->group_id, + PARENT_TYPE_GROUP, 0, 0, p_iris, logger); if (ret < 0) { - return -1; - } - } - } + return -1; + } + } + } - int compile_cnt = 0; - cJSON *compile_array = cJSON_GetObjectItem(json, "rules"); - if (compile_array != NULL) { - compile_cnt = cJSON_GetArraySize(compile_array); - } + int compile_cnt = 0; + cJSON *compile_array = cJSON_GetObjectItem(json, "rules"); + if (compile_array != NULL) { + compile_cnt = cJSON_GetArraySize(compile_array); + } - if (compile_cnt > 0) { + if (compile_cnt > 0) { cJSON *compile_obj = NULL; - cJSON_ArrayForEach(compile_obj, compile_array) { - int compile_id = write_compile_line(compile_obj, p_iris, logger); - if (compile_id < 0) { - log_fatal(logger, MODULE_JSON2IRIS, "[%s:%d] In %d compile rule", - __FUNCTION__, __LINE__, i); - return -1; - } + cJSON_ArrayForEach(compile_obj, compile_array) { + int compile_id = write_compile_line(compile_obj, p_iris, logger); + if (compile_id < 0) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] In %d compile rule", + __FUNCTION__, __LINE__, i); + return -1; + } - group_array = cJSON_GetObjectItem(compile_obj, "groups"); - if (NULL == group_array) { - log_fatal(logger, MODULE_JSON2IRIS, - "[%s:%d] compile rule %d have no group", + group_array = cJSON_GetObjectItem(compile_obj, "groups"); + if (NULL == group_array) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] compile rule %d have no group", + __FUNCTION__, __LINE__, compile_id); + return -1; + } + + int group_cnt = cJSON_GetArraySize(group_array); + if (group_cnt <= 0) { + log_fatal(logger, MODULE_JSON2IRIS, + "[%s:%d] compile rule %d have no groups", __FUNCTION__, __LINE__, compile_id); - return -1; - } + return -1; + } - int group_cnt = cJSON_GetArraySize(group_array); - if (group_cnt <= 0) { - log_fatal(logger, MODULE_JSON2IRIS, - "[%s:%d] compile rule %d have no groups", - __FUNCTION__, __LINE__, compile_id); - return -1; - } - - i = 0; + i = 0; cJSON *group_obj = NULL; - cJSON_ArrayForEach(group_obj, group_array) { - ret = write_group_rule(group_obj, compile_id, PARENT_TYPE_COMPILE, + cJSON_ArrayForEach(group_obj, group_array) { + ret = write_group_rule(group_obj, compile_id, PARENT_TYPE_COMPILE, compile_id, i, p_iris, logger); - if (ret < 0) { - return -1; - } - i++; - } - } - } + if (ret < 0) { + return -1; + } + i++; + } + } - ret = write_index_file(p_iris, logger); + cJSON_ArrayForEach(compile_obj, compile_array) { + cJSON *group_array = cJSON_GetObjectItem(compile_obj, "groups"); + + cJSON *group_obj = NULL; + cJSON_ArrayForEach(group_obj, group_array) { + ret = recursive_traverse_sub_groups(group_obj, p_iris, logger); + if (ret < 0) { + return -1; + } + } + } + } + + ret = write_group2group_rule(p_iris, logger); if (ret < 0) { return -1; } - return 0; + + ret = write_index_file(p_iris, logger); + if (ret < 0) { + return -1; + } + + return 0; } int json2iris(const char *json_buff, const char *json_filename, diff --git a/src/maat_group.c b/src/maat_group.c index 27b277c..28c2b83 100644 --- a/src/maat_group.c +++ b/src/maat_group.c @@ -23,15 +23,15 @@ #define MODULE_GROUP module_name_str("maat.group") struct group2group_item { - UT_array *sub_group_ids; + UT_array *incl_group_ids; + UT_array *excl_group_ids; long long super_group_id; - int is_exclude; }; struct group2group_schema { - int group_id_column; + int incl_group_ids_column; int super_group_id_column; - int is_exclude_column; + int excl_group_ids_column; int table_id; struct table_manager *ref_tbl_mgr; }; @@ -111,12 +111,12 @@ void *group2group_schema_new(cJSON *json, struct table_manager *tbl_mgr, goto error; } - custom_item = cJSON_GetObjectItem(item, "group_id"); + custom_item = cJSON_GetObjectItem(item, "incl_group_ids"); if (custom_item != NULL && custom_item->type == cJSON_Number) { - g2g_schema->group_id_column = custom_item->valueint; + g2g_schema->incl_group_ids_column = custom_item->valueint; } else { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> schema has no group_id column", + "[%s:%d] g2g table:<%s> schema has no incl_group_ids column", __FUNCTION__, __LINE__, table_name); goto error; } @@ -131,12 +131,12 @@ void *group2group_schema_new(cJSON *json, struct table_manager *tbl_mgr, goto error; } - custom_item = cJSON_GetObjectItem(item, "is_exclude"); + custom_item = cJSON_GetObjectItem(item, "excl_group_ids"); if (custom_item != NULL && custom_item->type == cJSON_Number) { - g2g_schema->is_exclude_column = custom_item->valueint; + g2g_schema->excl_group_ids_column = custom_item->valueint; } else { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> schema has no is_exclude column", + "[%s:%d] g2g table:<%s> schema has no excl_group_ids column", __FUNCTION__, __LINE__, table_name); goto error; } @@ -326,13 +326,14 @@ group2group_item_new(const char *line, struct group2group_schema *g2g_schema, size_t column_offset = 0; size_t column_len = 0; struct group2group_item *g2g_item = ALLOC(struct group2group_item, 1); - utarray_new(g2g_item->sub_group_ids, &ut_group_id_icd); + utarray_new(g2g_item->incl_group_ids, &ut_group_id_icd); + utarray_new(g2g_item->excl_group_ids, &ut_group_id_icd); - int ret = get_column_pos(line, g2g_schema->group_id_column, + int ret = get_column_pos(line, g2g_schema->incl_group_ids_column, &column_offset, &column_len); if (ret < 0) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> has no group_id in line:%s", + "[%s:%d] g2g table:<%s> has no incl_group_ids in line:%s", __FUNCTION__, __LINE__, table_name, line); goto error; } @@ -340,17 +341,17 @@ group2group_item_new(const char *line, struct group2group_schema *g2g_schema, char group_ids_str[MAX_GROUP_IDS_STR_LEN] = {0}; memcpy(group_ids_str, line + column_offset, MIN(MAX_GROUP_IDS_STR_LEN, column_len)); - ret = ids_str2longlong_array(group_ids_str, g2g_item->sub_group_ids); + ret = ids_str2longlong_array(group_ids_str, g2g_item->incl_group_ids); if (ret < 0) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2c table:<%s> sub_group_ids str2longlong failed in line:%s", + "[%s:%d] g2c table:<%s> incl_group_ids str2longlong failed in line:%s", __FUNCTION__, __LINE__, table_name, line); goto error; } - if (utarray_len(g2g_item->sub_group_ids) > MAX_GROUP_CNT) { + if (utarray_len(g2g_item->incl_group_ids) > MAX_GROUP_CNT) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2c table:<%s> sub_group_ids exceed maximum:%d in line:%s", + "[%s:%d] g2c table:<%s> incl_group_ids exceed maximum:%d in line:%s", __FUNCTION__, __LINE__, table_name, MAX_GROUP_CNT, line); goto error; } @@ -365,29 +366,32 @@ group2group_item_new(const char *line, struct group2group_schema *g2g_schema, } g2g_item->super_group_id = atoll(line + column_offset); - ret = get_column_pos(line, g2g_schema->is_exclude_column, + ret = get_column_pos(line, g2g_schema->excl_group_ids_column, &column_offset, &column_len); if (ret < 0) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> has no is_exclude in line:%s", + "[%s:%d] g2g table:<%s> has no excl_group_ids in line:%s", __FUNCTION__, __LINE__, table_name, line); goto error; } - g2g_item->is_exclude = atoi(line + column_offset); - if (g2g_item->is_exclude != 0 && g2g_item->is_exclude != 1) { + memset(group_ids_str, 0, sizeof(group_ids_str)); + memcpy(group_ids_str, line + column_offset, MIN(MAX_GROUP_IDS_STR_LEN, column_len)); + + ret = ids_str2longlong_array(group_ids_str, g2g_item->excl_group_ids); + if (ret < 0) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> is_exclude:%d is illegal in line:%s", - __FUNCTION__, __LINE__, table_name, g2g_item->is_exclude, line); - goto error; + "[%s:%d] g2c table:<%s> excl_group_ids str2longlong failed in line:%s", + __FUNCTION__, __LINE__, table_name, line); + goto error; } - if (g2g_item->is_exclude != 0 && g2g_item->is_exclude != 1) { + if (utarray_len(g2g_item->excl_group_ids) > MAX_GROUP_CNT) { log_fatal(logger, MODULE_GROUP, - "[%s:%d] g2g table:<%s> is_exclude:%d is illegal in line:%s", - __FUNCTION__, __LINE__, table_name, g2g_item->is_exclude, line); - goto error; - } + "[%s:%d] g2c table:<%s> excl_group_ids exceed maximum:%d in line:%s", + __FUNCTION__, __LINE__, table_name, MAX_GROUP_CNT, line); + goto error; + } return g2g_item; error: @@ -401,9 +405,14 @@ static void group2group_item_free(struct group2group_item *g2g_item) return; } - if (g2g_item->sub_group_ids != NULL) { - utarray_free(g2g_item->sub_group_ids); - g2g_item->sub_group_ids = NULL; + if (g2g_item->incl_group_ids != NULL) { + utarray_free(g2g_item->incl_group_ids); + g2g_item->incl_group_ids = NULL; + } + + if (g2g_item->excl_group_ids != NULL) { + utarray_free(g2g_item->excl_group_ids); + g2g_item->excl_group_ids = NULL; } FREE(g2g_item); @@ -771,30 +780,48 @@ int group2group_runtime_update(void *g2g_runtime, void *g2g_schema, long long *tmp_group_id = NULL; if (0 == is_valid) { //delete - for (i = 0; i < utarray_len(g2g_item->sub_group_ids); i++) { - tmp_group_id = (long long *)utarray_eltptr(g2g_item->sub_group_ids, i); + for (i = 0; i < utarray_len(g2g_item->incl_group_ids); i++) { + tmp_group_id = (long long *)utarray_eltptr(g2g_item->incl_group_ids, i); ret = group_topology_del_group_from_group(g2g_rt->updating_group_topo, *tmp_group_id, - g2g_item->super_group_id, g2g_item->is_exclude); + g2g_item->super_group_id, 0); if (0 == ret) { g2g_rt->rule_num--; - if (1 == g2g_item->is_exclude) { - g2g_rt->excl_rule_num--; - } + } else { + g2g_rt->update_err_cnt++; + } + } + + for (i = 0; i < utarray_len(g2g_item->excl_group_ids); i++) { + tmp_group_id = (long long *)utarray_eltptr(g2g_item->excl_group_ids, i); + ret = group_topology_del_group_from_group(g2g_rt->updating_group_topo, *tmp_group_id, + g2g_item->super_group_id, 1); + if (0 == ret) { + g2g_rt->rule_num--; + g2g_rt->excl_rule_num--; } else { g2g_rt->update_err_cnt++; } } } else { //add - for (i = 0; i < utarray_len(g2g_item->sub_group_ids); i++) { - tmp_group_id = (long long *)utarray_eltptr(g2g_item->sub_group_ids, i); + for (i = 0; i < utarray_len(g2g_item->incl_group_ids); i++) { + tmp_group_id = (long long *)utarray_eltptr(g2g_item->incl_group_ids, i); ret = group_topology_add_group_to_group(g2g_rt->updating_group_topo, *tmp_group_id, - g2g_item->super_group_id, g2g_item->is_exclude); + g2g_item->super_group_id, 0); if (0 == ret) { g2g_rt->rule_num++; - if (1 == g2g_item->is_exclude) { - g2g_rt->excl_rule_num++; - } + } else { + g2g_rt->update_err_cnt++; + } + } + + for (i = 0; i < utarray_len(g2g_item->excl_group_ids); i++) { + tmp_group_id = (long long *)utarray_eltptr(g2g_item->excl_group_ids, i); + ret = group_topology_add_group_to_group(g2g_rt->updating_group_topo, *tmp_group_id, + g2g_item->super_group_id, 1); + if (0 == ret) { + g2g_rt->rule_num++; + g2g_rt->excl_rule_num++; } else { g2g_rt->update_err_cnt++; } diff --git a/src/maat_utils.c b/src/maat_utils.c index 9165dc2..70c2b60 100644 --- a/src/maat_utils.c +++ b/src/maat_utils.c @@ -597,6 +597,10 @@ int ip_format2range(int ip_type, enum ip_format format, const char *ip1, const c int ids_str2longlong_array(const char *ids_str, UT_array *ids_array) { + if (strcmp(ids_str, "null") == 0) { + return 0; + } + int counter = 0; char *str = NULL; char *saveptr = NULL; diff --git a/test/file_test_tableinfo.conf b/test/file_test_tableinfo.conf index a6fca94..5d0f4e2 100644 --- a/test/file_test_tableinfo.conf +++ b/test/file_test_tableinfo.conf @@ -38,11 +38,11 @@ "table_id":3, "table_name":"NTC_GROUP2GROUP", "table_type":"group2group", - "valid_column":3, + "valid_column":4, "custom": { - "group_id":1, + "incl_group_ids":1, "super_group_id":2, - "is_exclude":3 + "excl_group_ids":3 } }, { diff --git a/test/group_exclude/group_exclude_L3.conf b/test/group_exclude/group_exclude_L3.conf index d3a382c..6d5447f 100644 --- a/test/group_exclude/group_exclude_L3.conf +++ b/test/group_exclude/group_exclude_L3.conf @@ -1,101 +1,51 @@ { "add_items": [ { - "group_id": 8, + "incl_group_ids": "8", "super_group_id": 5, - "is_exclude": 0 + "excl_group_ids": "9" }, { - "group_id": 9, + "incl_group_ids": "6,9", "super_group_id": 1, - "is_exclude": 0 + "excl_group_ids": "5" }, { - "group_id": 6, - "super_group_id": 1, - "is_exclude": 0 - }, - { - "group_id": 11, + "incl_group_ids": "10,11", "super_group_id": 6, - "is_exclude": 0 + "excl_group_ids": "7" }, { - "group_id": 11, + "incl_group_ids": "11,12", "super_group_id": 7, - "is_exclude": 0 + "excl_group_ids": "10" }, { - "group_id": 12, - "super_group_id": 7, - "is_exclude": 0 - }, - { - "group_id": 7, + "incl_group_ids": "7", "super_group_id": 2, - "is_exclude": 0 + "excl_group_ids": "6" }, { - "group_id": 7, + "incl_group_ids": "7", "super_group_id": 4, - "is_exclude": 0 + "excl_group_ids": "13" }, { - "group_id": 13, + "incl_group_ids": "13", "super_group_id": 3, - "is_exclude": 0 - }, - { - "group_id": 9, - "super_group_id": 5, - "is_exclude": 1 - }, - { - "group_id": 5, - "super_group_id": 1, - "is_exclude": 1 - }, - { - "group_id": 10, - "super_group_id":6, - "is_exclude": 1 - }, - { - "group_id": 10, - "super_group_id": 7, - "is_exclude": 1 - }, - { - "group_id": 7, - "super_group_id": 6, - "is_exclude": 1 - }, - { - "group_id": 6, - "super_group_id": 2, - "is_exclude": 1 - }, - { - "group_id": 6, - "super_group_id": 3, - "is_exclude": 1 - }, - { - "group_id": 13, - "super_group_id": 4, - "is_exclude": 1 + "excl_group_ids": "6" } ], "del_items": [ { - "group_id": 7, + "incl_group_ids": "null", "super_group_id": 6, - "is_exclude": 1 + "excl_group_ids": "7" }, { - "group_id": 13, + "incl_group_ids": "null", "super_group_id": 4, - "is_exclude": 1 + "excl_group_ids": "13" } ] } \ No newline at end of file diff --git a/test/group_exclude/group_exclude_L4.conf b/test/group_exclude/group_exclude_L4.conf index a18c6bb..e2ae88d 100644 --- a/test/group_exclude/group_exclude_L4.conf +++ b/test/group_exclude/group_exclude_L4.conf @@ -1,136 +1,76 @@ { "add_items": [ { - "group_id": 14, + "incl_group_ids": "14", "super_group_id": 8, - "is_exclude": 0 + "excl_group_ids": "15" }, { - "group_id": 14, + "incl_group_ids": "14,16", "super_group_id": 9, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 8, + "incl_group_ids": "8", "super_group_id": 5, - "is_exclude": 0 + "excl_group_ids": "9" }, { - "group_id": 9, + "incl_group_ids": "6,9", "super_group_id": 1, - "is_exclude": 0 + "excl_group_ids": "5" }, { - "group_id": 16, - "super_group_id": 9, - "is_exclude": 0 - }, - { - "group_id": 16, + "incl_group_ids": "16", "super_group_id": 10, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 10, + "incl_group_ids": "10,12", "super_group_id": 7, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 7, + "incl_group_ids": "7,11", "super_group_id": 6, - "is_exclude": 0 + "excl_group_ids": "10" }, { - "group_id": 6, - "super_group_id": 1, - "is_exclude": 0 - }, - { - "group_id": 17, + "incl_group_ids": "17", "super_group_id": 11, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 17, + "incl_group_ids": "17", "super_group_id": 12, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 17, + "incl_group_ids": "17", "super_group_id":13, - "is_exclude": 0 + "excl_group_ids": "18" }, { - "group_id": 11, - "super_group_id": 6, - "is_exclude": 0 - }, - { - "group_id": 12, - "super_group_id": 7, - "is_exclude": 0 - }, - { - "group_id": 7, + "incl_group_ids": "7", "super_group_id": 2, - "is_exclude": 0 + "excl_group_ids": "6" }, { - "group_id": 7, + "incl_group_ids": "7", "super_group_id": 4, - "is_exclude": 0 + "excl_group_ids": "13" }, { - "group_id": 13, + "incl_group_ids": "13", "super_group_id": 3, - "is_exclude": 0 - }, - { - "group_id": 15, - "super_group_id": 8, - "is_exclude": 1 - }, - { - "group_id": 9, - "super_group_id": 5, - "is_exclude": 1 - }, - { - "group_id": 5, - "super_group_id": 1, - "is_exclude": 1 - }, - { - "group_id": 10, - "super_group_id": 6, - "is_exclude": 1 - }, - { - "group_id": 6, - "super_group_id": 2, - "is_exclude": 1 - }, - { - "group_id": 6, - "super_group_id": 3, - "is_exclude": 1 - }, - { - "group_id": 18, - "super_group_id":13, - "is_exclude": 1 - }, - { - "group_id": 13, - "super_group_id": 4, - "is_exclude": 1 + "excl_group_ids": "6" } ], "del_items": [ { - "group_id": 10, + "incl_group_ids": "null", "super_group_id": 6, - "is_exclude": 1 + "excl_group_ids": "10" } ] } \ No newline at end of file diff --git a/test/group_exclude/group_exclude_exceed.conf b/test/group_exclude/group_exclude_exceed.conf index f2d0776..a50cbca 100644 --- a/test/group_exclude/group_exclude_exceed.conf +++ b/test/group_exclude/group_exclude_exceed.conf @@ -1,76 +1,56 @@ { "add_items": [ { - "group_id": 6, + "incl_group_ids": "6", "super_group_id": 3, - "is_exclude": 0 + "excl_group_ids": "7" }, { - "group_id": 3, + "incl_group_ids": "3,7", "super_group_id": 1, - "is_exclude": 0 + "excl_group_ids": "4" }, { - "group_id": 7, - "super_group_id": 1, - "is_exclude": 0 - }, - { - "group_id": 7, - "super_group_id": 3, - "is_exclude": 1 - }, - { - "group_id": 13, + "incl_group_ids": "13", "super_group_id": 10, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 10, + "incl_group_ids": "10", "super_group_id": 11, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 11, + "incl_group_ids": "11", "super_group_id": 8, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 8, + "incl_group_ids": "8", "super_group_id": 5, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 5, + "incl_group_ids": "5", "super_group_id": 4, - "is_exclude": 0 + "excl_group_ids": "null" }, { - "group_id": 5, + "incl_group_ids": "5", "super_group_id": 12, - "is_exclude": 0 + "excl_group_ids": "2" }, { - "group_id": 4, + "incl_group_ids": "4", "super_group_id": 2, - "is_exclude": 0 - }, - { - "group_id": 4, - "super_group_id": 1, - "is_exclude": 1 - }, - { - "group_id": 2, - "super_group_id": 12, - "is_exclude": 1 + "excl_group_ids": "null" } ], "del_items": [ { - "group_id": 13, + "incl_group_ids": "13", "super_group_id": 10, - "is_exclude": 0 + "excl_group_ids": "null" } ] } \ No newline at end of file diff --git a/test/group_exclude/group_exclude_gtest.cpp b/test/group_exclude/group_exclude_gtest.cpp index 4d01b69..8e251cd 100644 --- a/test/group_exclude/group_exclude_gtest.cpp +++ b/test/group_exclude/group_exclude_gtest.cpp @@ -10,6 +10,7 @@ #define MODULE_GROUP_EXCLUDE_GTEST module_name_str("maat.group_exclude_gtest") +#define MAX_IDS_STR_LEN 64 #define MAX_ITEM_NUM 64 #define WAIT_FOR_EFFECTIVE_S 2 #define MAX_G2G_SCAN_TIMES (1000 * 1000) @@ -18,9 +19,9 @@ const char *table_info_path = "./group_exclude_table_info.conf"; const char *log_file = "./group_exclude_gtest.log"; struct group_item { - long long group_id; + char incl_ids_str[MAX_IDS_STR_LEN]; + char excl_ids_str[MAX_IDS_STR_LEN]; long long super_group_id; - int is_exclude; }; struct group2group_rule { @@ -30,6 +31,8 @@ struct group2group_rule { struct group_item del_items[MAX_ITEM_NUM]; }; +UT_icd ut_ex_group_id_icd = {sizeof(long long), NULL, NULL, NULL}; + static int parse_config_file(const char *filename, struct group2group_rule *rules) { unsigned char *json_buff = NULL; @@ -60,9 +63,10 @@ static int parse_config_file(const char *filename, struct group2group_rule *rule rule_cnt = cJSON_GetArraySize(items_array); for (size_t i = 0; i < rule_cnt; i++) { cJSON *item_obj = cJSON_GetArrayItem(items_array, i); - cJSON *tmp_item = cJSON_GetObjectItem(item_obj, "group_id"); - if (tmp_item != NULL && tmp_item->type == cJSON_Number) { - rules->add_items[i].group_id = tmp_item->valueint; + cJSON *tmp_item = cJSON_GetObjectItem(item_obj, "incl_group_ids"); + if (tmp_item != NULL && tmp_item->type == cJSON_String) { + memcpy(rules->add_items[i].incl_ids_str, tmp_item->valuestring, + strlen(tmp_item->valuestring)); } tmp_item = cJSON_GetObjectItem(item_obj, "super_group_id"); @@ -70,9 +74,10 @@ static int parse_config_file(const char *filename, struct group2group_rule *rule rules->add_items[i].super_group_id = tmp_item->valueint; } - tmp_item = cJSON_GetObjectItem(item_obj, "is_exclude"); - if (tmp_item != NULL && tmp_item->type == cJSON_Number) { - rules->add_items[i].is_exclude = tmp_item->valueint; + tmp_item = cJSON_GetObjectItem(item_obj, "excl_group_ids"); + if (tmp_item != NULL && tmp_item->type == cJSON_String) { + memcpy(rules->add_items[i].excl_ids_str, tmp_item->valuestring, + strlen(tmp_item->valuestring)); } } rules->n_add_item = rule_cnt; @@ -87,9 +92,10 @@ static int parse_config_file(const char *filename, struct group2group_rule *rule rule_cnt = cJSON_GetArraySize(items_array); for (size_t i = 0; i < rule_cnt; i++) { cJSON *item_obj = cJSON_GetArrayItem(items_array, i); - cJSON *tmp_item = cJSON_GetObjectItem(item_obj, "group_id"); - if (tmp_item != NULL && tmp_item->type == cJSON_Number) { - rules->del_items[i].group_id = tmp_item->valueint; + cJSON *tmp_item = cJSON_GetObjectItem(item_obj, "incl_group_ids"); + if (tmp_item != NULL && tmp_item->type == cJSON_String) { + memcpy(rules->del_items[i].incl_ids_str, tmp_item->valuestring, + strlen(tmp_item->valuestring)); } tmp_item = cJSON_GetObjectItem(item_obj, "super_group_id"); @@ -97,9 +103,10 @@ static int parse_config_file(const char *filename, struct group2group_rule *rule rules->del_items[i].super_group_id = tmp_item->valueint; } - tmp_item = cJSON_GetObjectItem(item_obj, "is_exclude"); - if (tmp_item != NULL && tmp_item->type == cJSON_Number) { - rules->del_items[i].is_exclude = tmp_item->valueint; + tmp_item = cJSON_GetObjectItem(item_obj, "excl_group_ids"); + if (tmp_item != NULL && tmp_item->type == cJSON_String) { + memcpy(rules->del_items[i].excl_ids_str, tmp_item->valuestring, + strlen(tmp_item->valuestring)); } } rules->n_del_item = rule_cnt; @@ -168,14 +175,15 @@ TEST_F(MaatGroupExclude, level_3_function) { assert(0); } + memset(&rules, 0, sizeof(rules)); int ret = parse_config_file("group_exclude_L3.conf", &rules); EXPECT_EQ(ret, 0); for (size_t i = 0; i < rules.n_add_item; i++) { memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.add_items[i].group_id, - rules.add_items[i].super_group_id, rules.add_items[i].is_exclude, 1); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.add_items[i].incl_ids_str, + rules.add_items[i].super_group_id, rules.add_items[i].excl_ids_str, 1); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); } @@ -191,8 +199,8 @@ TEST_F(MaatGroupExclude, level_3_function) { //delete group_id = 7, super_group_id = 6, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id, - rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[0].incl_ids_str, + rules.del_items[0].super_group_id, rules.del_items[0].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 2); @@ -205,8 +213,8 @@ TEST_F(MaatGroupExclude, level_3_function) { //delete group_id = 13, super_group_id = 4, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[1].group_id, - rules.del_items[1].super_group_id, rules.del_items[1].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[1].incl_ids_str, + rules.del_items[1].super_group_id, rules.del_items[1].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 3); @@ -232,14 +240,15 @@ TEST_F(MaatGroupExclude, level_3_perf) { assert(0); } + memset(&rules, 0, sizeof(rules)); int ret = parse_config_file("group_exclude_L3.conf", &rules); EXPECT_EQ(ret, 0); for (size_t i = 0; i < rules.n_add_item; i++) { memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.add_items[i].group_id, - rules.add_items[i].super_group_id, rules.add_items[i].is_exclude, 1); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.add_items[i].incl_ids_str, + rules.add_items[i].super_group_id, rules.add_items[i].excl_ids_str, 1); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); } @@ -262,8 +271,8 @@ TEST_F(MaatGroupExclude, level_3_perf) { //delete group_id = 7, super_group_id = 6, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id, - rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[0].incl_ids_str, + rules.del_items[0].super_group_id, rules.del_items[0].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 5); @@ -279,8 +288,8 @@ TEST_F(MaatGroupExclude, level_3_perf) { //delete group_id = 13, super_group_id = 4, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[1].group_id, - rules.del_items[1].super_group_id, rules.del_items[1].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[1].incl_ids_str, + rules.del_items[1].super_group_id, rules.del_items[1].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 6); @@ -308,14 +317,15 @@ TEST_F(MaatGroupExclude, level_4_function) { assert(0); } + memset(&rules, 0, sizeof(rules)); int ret = parse_config_file("group_exclude_L4.conf", &rules); EXPECT_EQ(ret, 0); for (size_t i = 0; i < rules.n_add_item; i++) { memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.add_items[i].group_id, - rules.add_items[i].super_group_id, rules.add_items[i].is_exclude, 1); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.add_items[i].incl_ids_str, + rules.add_items[i].super_group_id, rules.add_items[i].excl_ids_str, 1); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); } @@ -334,8 +344,8 @@ TEST_F(MaatGroupExclude, level_4_function) { //delete group_id = 10, super_group_id = 6, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id, - rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[0].incl_ids_str, + rules.del_items[0].super_group_id, rules.del_items[0].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 8); @@ -364,14 +374,15 @@ TEST_F(MaatGroupExclude, level_4_perf) { assert(0); } + memset(&rules, 0, sizeof(rules)); int ret = parse_config_file("group_exclude_L4.conf", &rules); EXPECT_EQ(ret, 0); for (size_t i = 0; i < rules.n_add_item; i++) { memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.add_items[i].group_id, - rules.add_items[i].super_group_id, rules.add_items[i].is_exclude, 1); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.add_items[i].incl_ids_str, + rules.add_items[i].super_group_id, rules.add_items[i].excl_ids_str, 1); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); } @@ -394,8 +405,8 @@ TEST_F(MaatGroupExclude, level_4_perf) { //delete group_id = 10, super_group_id = 6, is_exclude = 1 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id, - rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[0].incl_ids_str, + rules.del_items[0].super_group_id, rules.del_items[0].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 8); @@ -423,14 +434,15 @@ TEST_F(MaatGroupExclude, level_exceed_function) { assert(0); } + memset(&rules, 0, sizeof(rules)); int ret = parse_config_file("group_exclude_exceed.conf", &rules); EXPECT_EQ(ret, 0); for (size_t i = 0; i < rules.n_add_item; i++) { memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.add_items[i].group_id, - rules.add_items[i].super_group_id, rules.add_items[i].is_exclude, 1); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.add_items[i].incl_ids_str, + rules.add_items[i].super_group_id, rules.add_items[i].excl_ids_str, 1); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); } @@ -450,8 +462,8 @@ TEST_F(MaatGroupExclude, level_exceed_function) { //delete group_id = 13, super_group_id = 10, is_exclude = 0 memset(table_line, 0, sizeof(table_line)); - sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id, - rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0); + sprintf(table_line, "%s\t%lld\t%s\t%d", rules.del_items[0].incl_ids_str, + rules.del_items[0].super_group_id, rules.del_items[0].excl_ids_str, 0); group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4); group2group_runtime_commit(g2g_runtime, table_name, 9); diff --git a/test/group_exclude/group_exclude_table_info.conf b/test/group_exclude/group_exclude_table_info.conf index f938a4e..76925e0 100644 --- a/test/group_exclude/group_exclude_table_info.conf +++ b/test/group_exclude/group_exclude_table_info.conf @@ -3,9 +3,9 @@ "table_name":"EXCLUDE_GROUP2GROUP", "table_type":"group2group", "valid_column":4, - "custom": { - "group_id":1, + "custom": { + "incl_group_ids":1, "super_group_id":2, - "is_exclude":3 + "excl_group_ids":3 } } \ No newline at end of file diff --git a/test/table_info.conf b/test/table_info.conf index 01969dc..46ded71 100644 --- a/test/table_info.conf +++ b/test/table_info.conf @@ -95,9 +95,9 @@ "table_type":"group2group", "valid_column":4, "custom": { - "group_id":1, + "incl_group_ids":1, "super_group_id":2, - "is_exclude":3 + "excl_group_ids":3 } }, {