diff --git a/cmgd/cmgd_db.c b/cmgd/cmgd_db.c index 0e67d6fca32b..c261785de9e7 100644 --- a/cmgd/cmgd_db.c +++ b/cmgd/cmgd_db.c @@ -489,6 +489,35 @@ int cmgd_db_delete_data_nodes( return 0; } +int cmgd_db_load_config_from_file(const char * file_path, bool merge) +{ + struct lyd_node *iter; + LY_ERR ret; + cmgd_db_hndl_t candidate_db; + cmgd_db_ctxt_t parsed; + + ret = lyd_parse_data_path(ly_native_ctx, file_path, LYD_JSON, LYD_PARSE_STRICT, 0, &iter); + + if (ret != LY_SUCCESS) { + yang_dnode_free(iter); + return ret; + } + + parsed.root.cfg_root = nb_config_new(iter); + parsed.config_db = true; + + candidate_db = cmgd_db_get_hndl_by_id(cm, CMGD_DB_CANDIDATE); + + if (merge) + cmgd_db_merge_dbs((cmgd_db_hndl_t)&parsed, candidate_db); + else + cmgd_db_copy_dbs((cmgd_db_hndl_t)&parsed, candidate_db); + + nb_config_free(parsed.root.cfg_root); + + return 0; +} + int cmgd_db_iter_data( cmgd_db_hndl_t db_hndl, char *base_xpath, cmgd_db_node_iter_fn iter_fn, void *ctxt, bool donot_free_alloced) diff --git a/cmgd/cmgd_db.h b/cmgd/cmgd_db.h index a47f77a884b8..7c51ede017be 100644 --- a/cmgd/cmgd_db.h +++ b/cmgd/cmgd_db.h @@ -157,6 +157,8 @@ extern int cmgd_db_iter_data( cmgd_db_hndl_t db_hndl, char *base_xpath, cmgd_db_node_iter_fn iter_fn, void *ctxt, bool donot_free_alloced); +extern int cmgd_db_load_config_from_file(const char * file_path, bool merge); + extern int cmgd_db_hndl_send_get_data_req( cmgd_db_hndl_t db_hndl, cmgd_database_id_t db_id, cmgd_yang_getdata_req_t *data_req, int num_reqs); diff --git a/cmgd/cmgd_vty.c b/cmgd/cmgd_vty.c index dae46b9f111a..2a8d70bd26b7 100644 --- a/cmgd/cmgd_vty.c +++ b/cmgd/cmgd_vty.c @@ -485,6 +485,35 @@ DEFPY(show_cmgd_map_xpath, return CMD_SUCCESS; } +DEFPY(cmgd_load_config, + cmgd_load_config_cmd, + "cmgd load-config filepath WORD$path ", + CMGD_STR + "Load config from file\n" + "Path to the file\n" + "Path\n" + "Merge with candidate\n" + "Replace candidate") +{ + bool merge = false; + int idx_merge = 4; + int ret; + + if (strncmp(argv[idx_merge]->arg, "merge", sizeof("merge")) == 0) + merge = true; + else if (strncmp(argv[idx_merge]->arg, "replace", sizeof("replace")) == 0) + merge = false; + else { + vty_out(vty, "Chosen option: %s not valid\n", argv[idx_merge]->arg); + return CMD_SUCCESS; + } + + ret = cmgd_db_load_config_from_file(path, merge); + if (ret != 0) + vty_out(vty, "Error with parsing the file with error code %d\n", ret); + return CMD_SUCCESS; +} + DEFPY(cmgd_lock_db_candidate, cmgd_lock_db_cand_cmd, "cmgd lock-database candidate", @@ -540,6 +569,7 @@ void cmgd_vty_init(void) install_element(CONFIG_NODE, &cmgd_unlock_db_cand_cmd); install_element(CONFIG_NODE, &cmgd_set_config_data_cmd); install_element(CONFIG_NODE, &cmgd_delete_config_data_cmd); + install_element(CONFIG_NODE, &cmgd_load_config_cmd); /* * TODO: Register and handlers for auto-completion here.