* Changed return values in internal functions: netconf_trymerge, startup_module_state, yang_modules_state_get

This commit is contained in:
Olof hagsand 2019-05-07 13:26:34 +02:00
parent c529847790
commit 1cfb190ea9
6 changed files with 80 additions and 40 deletions

View file

@ -53,6 +53,9 @@
### API changes on existing features (you may need to change your code) ### API changes on existing features (you may need to change your code)
* Changed return values in internal functions
* These functions are affected: `netconf_trymerge`, `startup_module_state`, `yang_modules_state_get`
* They now comply to Clixon validation: Error: -1; Invalid: 0; OK: 1.
* New Clixon Yang RPC: ping. To check if backup is running. * New Clixon Yang RPC: ping. To check if backup is running.
* Try with `<rpc xmlns="http://clicon.org/lib"><ping/></rpc>]]>]]>` * Try with `<rpc xmlns="http://clicon.org/lib"><ping/></rpc>]]>]]>`
* Restconf with startup feature will now copy all edit changes to startup db (as it should according to RFC 8040) * Restconf with startup feature will now copy all edit changes to startup db (as it should according to RFC 8040)

View file

@ -158,8 +158,8 @@ backend_client_rm(clicon_handle h,
* @param[in] top Top symbol, ie netconf or restconf-state * @param[in] top Top symbol, ie netconf or restconf-state
* @param[in,out] xret Existing XML tree, merge x into this * @param[in,out] xret Existing XML tree, merge x into this
* @retval -1 Error (fatal) * @retval -1 Error (fatal)
* @retval 0 OK * @retval 0 Statedata callback failed
* @retval 1 Statedata callback failed * @retval 1 OK
*/ */
static int static int
client_get_streams(clicon_handle h, client_get_streams(clicon_handle h,
@ -174,6 +174,7 @@ client_get_streams(clicon_handle h,
yang_stmt *yns = NULL; /* yang namespace */ yang_stmt *yns = NULL; /* yang namespace */
cxobj *x = NULL; cxobj *x = NULL;
cbuf *cb = NULL; cbuf *cb = NULL;
int ret;
if ((ystream = yang_find(yspec, Y_MODULE, module)) == NULL){ if ((ystream = yang_find(yspec, Y_MODULE, module)) == NULL){
clicon_err(OE_YANG, 0, "%s yang module not found", module); clicon_err(OE_YANG, 0, "%s yang module not found", module);
@ -195,16 +196,22 @@ client_get_streams(clicon_handle h,
if (xml_parse_string(cbuf_get(cb), yspec, &x) < 0){ if (xml_parse_string(cbuf_get(cb), yspec, &x) < 0){
if (netconf_operation_failed_xml(xret, "protocol", clicon_err_reason)< 0) if (netconf_operation_failed_xml(xret, "protocol", clicon_err_reason)< 0)
goto done; goto done;
retval = 1; goto fail;
goto done;
} }
retval = netconf_trymerge(x, yspec, xret); if ((ret = netconf_trymerge(x, yspec, xret)) < 0)
goto done;
if (ret == 0)
goto fail;
retval = 1;
done: done:
if (cb) if (cb)
cbuf_free(cb); cbuf_free(cb);
if (x) if (x)
xml_free(x); xml_free(x);
return retval; return retval;
fail:
retval = 0;
goto done;
} }
/*! Get system state-data, including streams and plugins /*! Get system state-data, including streams and plugins
@ -212,8 +219,8 @@ client_get_streams(clicon_handle h,
* @param[in] xpath Xpath selection, not used but may be to filter early * @param[in] xpath Xpath selection, not used but may be to filter early
* @param[in,out] xret Existing XML tree, merge x into this * @param[in,out] xret Existing XML tree, merge x into this
* @retval -1 Error (fatal) * @retval -1 Error (fatal)
* @retval 0 OK * @retval 0 Statedata callback failed (clicon_err called)
* @retval 1 Statedata callback failed (clicon_err called) * @retval 1 OK
*/ */
static int static int
client_statedata(clicon_handle h, client_statedata(clicon_handle h,
@ -225,22 +232,34 @@ client_statedata(clicon_handle h,
size_t xlen; size_t xlen;
int i; int i;
yang_stmt *yspec; yang_stmt *yspec;
int ret;
if ((yspec = clicon_dbspec_yang(h)) == NULL){ if ((yspec = clicon_dbspec_yang(h)) == NULL){
clicon_err(OE_YANG, ENOENT, "No yang spec"); clicon_err(OE_YANG, ENOENT, "No yang spec");
goto done; goto done;
} }
if (clicon_option_bool(h, "CLICON_STREAM_DISCOVERY_RFC5277")) if (clicon_option_bool(h, "CLICON_STREAM_DISCOVERY_RFC5277")){
if ((retval = client_get_streams(h, yspec, xpath, "clixon-rfc5277", "netconf", xret)) != 0) if ((ret = client_get_streams(h, yspec, xpath, "clixon-rfc5277", "netconf", xret)) < 0)
goto done; goto done;
if (clicon_option_bool(h, "CLICON_STREAM_DISCOVERY_RFC8040")) if (ret == 0)
if ((retval = client_get_streams(h, yspec, xpath, "ietf-restconf-monitoring", "restconf-state", xret)) != 0) goto fail;
}
if (clicon_option_bool(h, "CLICON_STREAM_DISCOVERY_RFC8040")){
if ((ret = client_get_streams(h, yspec, xpath, "ietf-restconf-monitoring", "restconf-state", xret)) < 0)
goto done; goto done;
if (clicon_option_bool(h, "CLICON_MODULE_LIBRARY_RFC7895")) if (ret == 0)
if ((retval = yang_modules_state_get(h, yspec, xpath, 0, xret)) != 0) goto fail;
}
if (clicon_option_bool(h, "CLICON_MODULE_LIBRARY_RFC7895")){
if ((ret = yang_modules_state_get(h, yspec, xpath, 0, xret)) < 0)
goto done; goto done;
if ((retval = clixon_plugin_statedata(h, yspec, xpath, xret)) != 0) if (ret == 0)
goto fail;
}
if ((ret = clixon_plugin_statedata(h, yspec, xpath, xret)) < 0)
goto done; goto done;
if (ret == 0)
goto fail;
/* Code complex to filter out anything that is outside of xpath */ /* Code complex to filter out anything that is outside of xpath */
if (xpath_vec(*xret, "%s", &xvec, &xlen, xpath?xpath:"/") < 0) if (xpath_vec(*xret, "%s", &xvec, &xlen, xpath?xpath:"/") < 0)
goto done; goto done;
@ -259,12 +278,15 @@ client_statedata(clicon_handle h,
/* reset flag */ /* reset flag */
if (xml_apply(*xret, CX_ELMNT, (xml_applyfn_t*)xml_flag_reset, (void*)XML_FLAG_MARK) < 0) if (xml_apply(*xret, CX_ELMNT, (xml_applyfn_t*)xml_flag_reset, (void*)XML_FLAG_MARK) < 0)
goto done; goto done;
retval = 0; /* OK */ retval = 1; /* OK */
done: done:
clicon_debug(1, "%s %d", __FUNCTION__, retval); clicon_debug(1, "%s %d", __FUNCTION__, retval);
if (xvec) if (xvec)
free(xvec); free(xvec);
return retval; return retval;
fail:
retval = 0;
goto done;
} }
/*! Retrieve all or part of a specified configuration. /*! Retrieve all or part of a specified configuration.
@ -783,7 +805,7 @@ from_client_get(clicon_handle h,
clicon_err_reset(); clicon_err_reset();
if ((ret = client_statedata(h, xpath, &xret)) < 0) if ((ret = client_statedata(h, xpath, &xret)) < 0)
goto done; goto done;
if (ret == 1){ /* Error from callback (error in xret) */ if (ret == 0){ /* Error from callback (error in xret) */
if (clicon_xml2cbuf(cbret, xret, 0, 0) < 0) if (clicon_xml2cbuf(cbret, xret, 0, 0) < 0)
goto done; goto done;
goto ok; goto ok;

View file

@ -115,8 +115,8 @@ clixon_plugin_reset(clicon_handle h,
* @param[in] xpath String with XPATH syntax. or NULL for all * @param[in] xpath String with XPATH syntax. or NULL for all
* @param[in,out] xtop State XML tree is merged with existing tree. * @param[in,out] xtop State XML tree is merged with existing tree.
* @retval -1 Error * @retval -1 Error
* @retval 0 OK * @retval 0 Statedata callback failed (xret set with netconf-error)
* @retval 1 Statedata callback failed (xret set with netconf-error) * @retval 1 OK
* @note xtop can be replaced * @note xtop can be replaced
*/ */
int int
@ -136,24 +136,25 @@ clixon_plugin_statedata(clicon_handle h,
continue; continue;
if ((x = xml_new("config", NULL, NULL)) == NULL) if ((x = xml_new("config", NULL, NULL)) == NULL)
goto done; goto done;
if (fn(h, xpath, x) < 0){ if (fn(h, xpath, x) < 0)
retval = 1; goto fail; /* Dont quit here on user callbacks */
goto done; /* Dont quit here on user callbacks */ if ((ret = netconf_trymerge(x, yspec, xret)) < 0)
}
if ((ret = netconf_trymerge(x, yspec, xret)) != 0){
retval = ret;
goto done; goto done;
} if (ret == 0)
goto fail;
if (x){ if (x){
xml_free(x); xml_free(x);
x = NULL; x = NULL;
} }
} }
retval = 0; retval = 1;
done: done:
if (x) if (x)
xml_free(x); xml_free(x);
return retval; return retval;
fail:
retval = 0;
goto done;
} }
/*! Create and initialize transaction */ /*! Create and initialize transaction */

View file

@ -336,6 +336,8 @@ startup_failsafe(clicon_handle h)
/*! Init modules state of the backend (server). To compare with startup XML /*! Init modules state of the backend (server). To compare with startup XML
* Set the modules state as setopt to the datastore module. * Set the modules state as setopt to the datastore module.
* Only if CLICON_XMLDB_MODSTATE is enabled * Only if CLICON_XMLDB_MODSTATE is enabled
* @retval -1 Error
* @retval 0 OK
*/ */
int int
startup_module_state(clicon_handle h, startup_module_state(clicon_handle h,
@ -343,17 +345,23 @@ startup_module_state(clicon_handle h,
{ {
int retval = -1; int retval = -1;
cxobj *x = NULL; cxobj *x = NULL;
int ret;
if (!clicon_option_bool(h, "CLICON_XMLDB_MODSTATE")) if (!clicon_option_bool(h, "CLICON_XMLDB_MODSTATE"))
goto ok; goto ok;
/* Set up cache /* Set up cache
* Now, access brief module cache with clicon_modst_cache_get(h, 1) */ * Now, access brief module cache with clicon_modst_cache_get(h, 1) */
if (yang_modules_state_get(h, yspec, NULL, 1, &x) < 0) if ((ret = yang_modules_state_get(h, yspec, NULL, 1, &x)) < 0)
goto done; goto done;
if (ret == 0)
goto fail;
ok: ok:
retval = 0; retval = 1;
done: done:
if (x) if (x)
xml_free(x); xml_free(x);
return retval; return retval;
fail:
retval = 0;
goto done;
} }

View file

@ -1048,8 +1048,8 @@ netconf_minmax_elements(cbuf *cb,
* @param[in] yspec Yang spec * @param[in] yspec Yang spec
* @param[in,out] xret Existing XML tree, merge x into this * @param[in,out] xret Existing XML tree, merge x into this
* @retval -1 Error (fatal) * @retval -1 Error (fatal)
* @retval 0 OK * @retval 0 Statedata callback failed
* @retval 1 Statedata callback failed * @retval 1 OK
*/ */
int int
netconf_trymerge(cxobj *x, netconf_trymerge(cxobj *x,
@ -1072,18 +1072,19 @@ netconf_trymerge(cxobj *x,
xml_purge(xc); xml_purge(xc);
if (netconf_operation_failed_xml(xret, "rpc", reason)< 0) if (netconf_operation_failed_xml(xret, "rpc", reason)< 0)
goto done; goto done;
retval = 1; goto fail;
goto done;
} }
ok: ok:
retval = 0; retval = 1;
done: done:
if (reason) if (reason)
free(reason); free(reason);
return retval; return retval;
fail:
retval = 0;
goto done;
} }
/*! Load ietf netconf yang module and set enabled features /*! Load ietf netconf yang module and set enabled features
* The features added are (in order): * The features added are (in order):
* candidate (8.3) * candidate (8.3)

View file

@ -255,8 +255,8 @@ yms_build(clicon_handle h,
* @param[in] brief Just name, revision and uri (no cache) * @param[in] brief Just name, revision and uri (no cache)
* @param[in,out] xret Existing XML tree, merge x into this * @param[in,out] xret Existing XML tree, merge x into this
* @retval -1 Error (fatal) * @retval -1 Error (fatal)
* @retval 0 OK * @retval 0 Statedata callback failed
* @retval 1 Statedata callback failed * @retval 1 OK
* @notes NYI: schema, deviation * @notes NYI: schema, deviation
x +--ro modules-state x +--ro modules-state
x +--ro module-set-id string x +--ro module-set-id string
@ -288,6 +288,7 @@ yang_modules_state_get(clicon_handle h,
char *msid; /* modules-set-id */ char *msid; /* modules-set-id */
cxobj *x1; cxobj *x1;
cbuf *cb = NULL; cbuf *cb = NULL;
int ret;
msid = clicon_option_str(h, "CLICON_MODULE_SET_ID"); msid = clicon_option_str(h, "CLICON_MODULE_SET_ID");
if ((x = clicon_modst_cache_get(h, brief)) != NULL){ if ((x = clicon_modst_cache_get(h, brief)) != NULL){
@ -313,8 +314,7 @@ yang_modules_state_get(clicon_handle h,
if (xml_parse_string(cbuf_get(cb), yspec, &x) < 0){ if (xml_parse_string(cbuf_get(cb), yspec, &x) < 0){
if (netconf_operation_failed_xml(xret, "protocol", clicon_err_reason)< 0) if (netconf_operation_failed_xml(xret, "protocol", clicon_err_reason)< 0)
goto done; goto done;
retval = 1; goto fail;
goto done;
} }
if (xml_rootchild(x, 0, &x) < 0) if (xml_rootchild(x, 0, &x) < 0)
goto done; goto done;
@ -326,10 +326,12 @@ yang_modules_state_get(clicon_handle h,
/* Wrap x (again) with new top-level node "top" which merge wants */ /* Wrap x (again) with new top-level node "top" which merge wants */
if ((x = xml_wrap(x, "top")) < 0) if ((x = xml_wrap(x, "top")) < 0)
goto done; goto done;
if (netconf_trymerge(x, yspec, xret) < 0) if ((ret = netconf_trymerge(x, yspec, xret)) < 0)
goto done; goto done;
if (ret == 0)
goto fail;
} }
retval = 0; retval = 1;
done: done:
clicon_debug(1, "%s %d", __FUNCTION__, retval); clicon_debug(1, "%s %d", __FUNCTION__, retval);
if (cb) if (cb)
@ -337,6 +339,9 @@ yang_modules_state_get(clicon_handle h,
if (x) if (x)
xml_free(x); xml_free(x);
return retval; return retval;
fail:
retval = 0;
goto done;
} }
/*! For single module state with namespace, get revisions and send upgrade callbacks /*! For single module state with namespace, get revisions and send upgrade callbacks