This article describes how to set a custom Error message in case the EDIT callback reports an error.
For example, assume we have the following simplified but functional YANG module and we are making a SIL-SA code for this module as follow:
> make_sil_sa_dir error-example --sil-edit2 --sil-get2
module error-example {
namespace "http://netconfcentral.org/ns/error-example";
prefix "err";
revision 2021-11-19 {
description
"Example module";
}
container test-silsa-errors { // EDIT2 CB
presence "Presence";
leaf test-error {
type string;
}
}
}In order to set a custom Error Message to be sent to the server the following API can be used:
/* Typedef of the Set Error Message API */
void
sil_sa_set_error_msg (rpc_msg_t *msg,
const xmlChar *strval)EXAMPLE
Assume the SIL-SA code reports an error in case the test-error leaf creation and when the value of a new leaf is force-error.
In this case there is an API sil_sa_set_error_msg() to set up a custom error to be returned to the server.
if (child_val &&
!xml_strcmp(VAL_STR(child_val), (const xmlChar *)"force-error")) {
/* TRIGGER ERROR */
res = ERR_NCX_OPERATION_NOT_SUPPORTED;
sil_sa_set_error_msg(msg,
(const xmlChar *)"SOME CUSTOM ERROR MSG");
}Thus, as a result of the following operation the SIL-SA agent will produce an error with a custom error message:
<edit-config>
<target>
<candidate/>
</target>
<config>
<test-silsa-errors xmlns="http://netconfcentral.org/ns/error-example">
<test-error>force-error</test-error>
</test-silsa-errors>
</config>
</edit-config>After the final <commit> operation the SIL-SA code will be invoked and the SIL-SA code will return an error to the server with a custom error message as can be seen in the following log from the server:
agt_ycontrol: Got <ycontrol> message:
yctl:ycontrol {
message-id 4
message-type subsys-response
server-id server1
subsys-id subsys1
service-id sil-sa
error {
error-number 273
transaction-id 1476838
error-message 'SOME CUSTOM ERROR MSG'
error-index 1
}
}
ycontrol_msg: sending server-event # 5 for sil-sa
ses_msg: send 1.1 buff:479for s:3
trace_buff:
#469
<?xml version="1.0" encoding="UTF-8"?>
<ycontrol xmlns="http://yumaworks.com/ns/yumaworks-ycontrol">
<message-id>5</message-id>
<message-type>server-event</message-type>
<server-id>server1</server-id>
<subsys-id>subsys1</subsys-id>
<service-id>sil-sa</service-id>
<payload>
<sil-sa xmlns="http://yumaworks.com/ns/yumaworks-sil-sa">
<cancel-transaction>
<transaction-id>1476838</transaction-id>
</cancel-transaction>
</sil-sa>
</payload>
</ycontrol>
agt_sil: send <cancel-transaction> to subsys 'subsys1' OK
agt_top: end dispatch yumaworks-ycontrol:ycontrol
ses_msg: free msg 0x7f70ac000f90 for session 3
ycontrol_mode_done for TXID '1476838'
agt_val: exit ncxserver YControl mode
agt_record_error for session 5:
agt_val: remote SIL commit phase failed (operation not supported)
agt_val: Finished remote SIL commit phase
Start full rollback of transaction 1476838: 1 edit on running config
Rollback transaction 1476838, create edit on error-example:test-silsa-errors
SIL-SA Rollback Complete callbacks OK
agt_sil: end transaction NULL txcb
ses_msg: send 1.0 buff:412 for s:5
trace_buff:
Content-Type: application/json
Status: 501 Not Implemented
Cache-Control: no-cache
Pragma: no-cache
{
"ietf-restconf:errors": {
"error": [
{
"error-type":"application",
"error-tag":"operation-not-supported",
"error-app-tag":"no-support",
"error-path":"/err:test-silsa-errors",
"error-message":"SOME CUSTOM ERROR MSG",
"error-info": {
"error-number":273
}
}
]
}
}
agt_cb: Enter run_command_complete
agt_cb: Enter run_trans_completeFor complete example SIL-SA code, refer to the attachments.