* Follow-up on [restconf GET json response does not encode top level node with namespace as per rfc #303](https://github.com/clicon/clixon/issues/303)

* Load/save JSON config file did not work
* Added rfc7951 parameter to `clixon_json_parse_string()` and `clixon_json_parse_file()`
  * If set, honor RFC 7951: JSON Encoding of Data Modeled with YANG, eg it requires module name prefixes
  * If not set, parse as regular JSON
* Test: added test_db.sh for datastore format tests
This commit is contained in:
Olof hagsand 2022-02-22 13:14:30 +01:00
parent 31719b5ef4
commit 97316e0bfa
13 changed files with 281 additions and 43 deletions

View file

@ -794,25 +794,31 @@ load_config_file(clicon_handle h,
cvec *cvv,
cvec *argv)
{
int ret = -1;
struct stat st;
char *filename = NULL;
int replace;
cg_var *cv;
char *opstr;
char *varstr;
FILE *fp = NULL;
cxobj *xt = NULL;
cxobj *x;
cbuf *cbxml;
char *formatstr = NULL;
enum format_enum format = FORMAT_XML;
int ret = -1;
struct stat st;
char *filename = NULL;
int replace;
cg_var *cv;
char *opstr;
char *varstr;
FILE *fp = NULL;
cxobj *xt = NULL;
cxobj *x;
cbuf *cbxml;
char *formatstr = NULL;
enum format_enum format = FORMAT_XML;
yang_stmt *yspec;
cxobj *xerr = NULL;
if (cvec_len(argv) < 2 || cvec_len(argv) > 4){
clicon_err(OE_PLUGIN, EINVAL, "Received %d arguments. Expected: <dbname>,<varname>[,<format>]",
cvec_len(argv));
goto done;
}
if ((yspec = clicon_dbspec_yang(h)) == NULL){
clicon_err(OE_FATAL, 0, "No DB_SPEC");
goto done;
}
if (cvec_len(argv) > 2){
formatstr = cv_string_get(cvec_i(argv, 2));
if ((int)(format = format_str2int(formatstr)) < 0){
@ -846,12 +852,20 @@ load_config_file(clicon_handle h,
}
switch (format){
case FORMAT_XML:
if (clixon_xml_parse_file(fp, YB_NONE, NULL, &xt, NULL) < 0)
if ((ret = clixon_xml_parse_file(fp, YB_NONE, yspec, &xt, &xerr)) < 0)
goto done;
if (ret == 0){
clixon_netconf_error(xerr, "Loading", filename);
goto done;
}
break;
case FORMAT_JSON:
if (clixon_json_parse_file(fp, YB_NONE, NULL, &xt, NULL) < 0)
if ((ret = clixon_json_parse_file(fp, 1, YB_NONE, yspec, &xt, &xerr)) < 0)
goto done;
if (ret == 0){
clixon_netconf_error(xerr, "Loading", filename);
goto done;
}
break;
default:
clicon_err(OE_PLUGIN, 0, "format: %s not implemented", formatstr);
@ -874,9 +888,10 @@ load_config_file(clicon_handle h,
cbuf_get(cbxml)) < 0)
goto done;
cbuf_free(cbxml);
// }
ret = 0;
done:
if (xerr)
xml_free(xerr);
if (xt)
xml_free(xt);
if (fp)

View file

@ -333,7 +333,7 @@ api_data_write(clicon_handle h,
}
break;
case YANG_DATA_JSON:
if ((ret = clixon_json_parse_string(data, yb, yspec, &xdata0, &xerr)) < 0){
if ((ret = clixon_json_parse_string(data, 1, yb, yspec, &xdata0, &xerr)) < 0){
if (netconf_malformed_message_xml(&xerr, clicon_err_reason) < 0)
goto done;
if (api_return_err0(h, req, xerr, pretty, media_out, 0) < 0)

View file

@ -783,7 +783,7 @@ api_data_yang_patch(clicon_handle h,
ret = clixon_xml_parse_string(data, YB_MODULE, yspec, &xpatch, &xerr);
break;
case YANG_PATCH_JSON: /* RFC 8072 patch */
ret = clixon_json_parse_string(data, YB_MODULE, yspec, &xpatch, &xerr);
ret = clixon_json_parse_string(data, 1, YB_MODULE, yspec, &xpatch, &xerr);
break;
default:
restconf_unsupported_media(h, req, pretty, media_out);

View file

@ -250,7 +250,7 @@ api_data_post(clicon_handle h,
}
break;
case YANG_DATA_JSON:
if ((ret = clixon_json_parse_string(data, yb, yspec, &xbot, &xerr)) < 0){
if ((ret = clixon_json_parse_string(data, 1, yb, yspec, &xbot, &xerr)) < 0){
if (netconf_malformed_message_xml(&xerr, clicon_err_reason) < 0)
goto done;
if (api_return_err0(h, req, xerr, pretty, media_out, 0) < 0)
@ -461,7 +461,7 @@ api_operations_post_input(clicon_handle h,
case YANG_DATA_JSON:
/* XXX: Here data is on the form: {"clixon-example:input":null} and has no proper yang binding
* support */
if ((ret = clixon_json_parse_string(data, YB_NONE, yspec, &xdata, &xerr)) < 0){
if ((ret = clixon_json_parse_string(data, 1, YB_NONE, yspec, &xdata, &xerr)) < 0){
if (netconf_malformed_message_xml(&xerr, clicon_err_reason) < 0)
goto done;
if (api_return_err0(h, req, xerr, pretty, media_out, 0) < 0)