FC6243 with-defaults=report-all-tagged test cases and implementation added
This commit is contained in:
parent
8154943380
commit
2f0f1ef5a7
5 changed files with 92 additions and 11 deletions
|
|
@ -680,6 +680,68 @@ get_list_pagination(clicon_handle h,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! Set flag on node having schema default value.
|
||||||
|
* @param[in] x XML node
|
||||||
|
* @param[in] flag Flag to be used
|
||||||
|
* @retval 0 OK
|
||||||
|
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
xml_flag_default_value(cxobj *x, uint16_t flag)
|
||||||
|
{
|
||||||
|
yang_stmt *y;
|
||||||
|
cg_var *cv;
|
||||||
|
char *yv;
|
||||||
|
char *xv;
|
||||||
|
|
||||||
|
xml_flag_reset(x, flag); /* Assume not default value */
|
||||||
|
if ((xv = xml_body(x)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if ((y = xml_spec(x)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if ((cv = yang_cv_get(y)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if ((cv = yang_cv_get(y)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if (cv_name_get(cv) == NULL)
|
||||||
|
goto done;
|
||||||
|
if ((yv = cv2str_dup(cv)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if (strcmp(xv, yv) == 0)
|
||||||
|
xml_flag_set(x, flag); /* Actual value same as default value */
|
||||||
|
free(yv);
|
||||||
|
|
||||||
|
done:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Add default attribute to node with default value.
|
||||||
|
* @param[in] x XML node
|
||||||
|
* @param[in] flags Flags indicatiing default nodes
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
xml_add_default_tag(cxobj *x, uint16_t flags)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
cxobj *xattr;
|
||||||
|
|
||||||
|
if (xml_flag(x, flags)) {
|
||||||
|
/* set default attribute */
|
||||||
|
if ((xattr = xml_new("default", x, CX_ATTR)) == NULL)
|
||||||
|
goto done;
|
||||||
|
if (xml_value_set(xattr, "true") < 0)
|
||||||
|
goto done;
|
||||||
|
if (xml_prefix_set(xattr, "wd") < 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
retval = 0;
|
||||||
|
done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! Common get/get-config code for retrieving configuration and state information.
|
/*! Common get/get-config code for retrieving configuration and state information.
|
||||||
*
|
*
|
||||||
* @param[in] h Clicon handle
|
* @param[in] h Clicon handle
|
||||||
|
|
@ -846,23 +908,39 @@ get_common(clicon_handle h,
|
||||||
/* rfc6243 Handle with-defaults. */
|
/* rfc6243 Handle with-defaults. */
|
||||||
if ((xfind = xml_find(xe, "with-defaults")) != NULL) {
|
if ((xfind = xml_find(xe, "with-defaults")) != NULL) {
|
||||||
if ((with_defaults = xml_find_value(xfind, "body")) != NULL) {
|
if ((with_defaults = xml_find_value(xfind, "body")) != NULL) {
|
||||||
|
|
||||||
if (strcmp(with_defaults, "explicit") == 0) {
|
if (strcmp(with_defaults, "explicit") == 0) {
|
||||||
/* Clear marked nodes */
|
/* Clear marked nodes */
|
||||||
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;
|
||||||
/* Traverse XML and mark state nodes */
|
/* Mark state nodes */
|
||||||
if (xml_non_config_data(xret, NULL) < 0)
|
if (xml_non_config_data(xret, NULL) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
/* Remove default configuration nodes from XML */
|
/* Remove default configuration nodes*/
|
||||||
if (xml_tree_prune_flags(xret, XML_FLAG_DEFAULT, XML_FLAG_MARK|XML_FLAG_DEFAULT) < 0)
|
if (xml_tree_prune_flags(xret, XML_FLAG_DEFAULT, XML_FLAG_MARK|XML_FLAG_DEFAULT) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
/* TODO. Remove empty containers */
|
||||||
}
|
}
|
||||||
else if (strcmp(with_defaults, "trim") == 0) {
|
else if (strcmp(with_defaults, "trim") == 0) {
|
||||||
/* Remove default nodes from XML */
|
/* Remove default nodes from XML */
|
||||||
if (xml_tree_prune_flags(xret, XML_FLAG_DEFAULT, XML_FLAG_DEFAULT) < 0)
|
if (xml_tree_prune_flags(xret, XML_FLAG_DEFAULT, XML_FLAG_DEFAULT) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
/* Mark and remove nodes having schema default values */
|
||||||
|
if (xml_apply(xret, CX_ELMNT, (xml_applyfn_t*)xml_flag_default_value, (void*)XML_FLAG_MARK) < 0)
|
||||||
|
goto done;
|
||||||
|
if (xml_tree_prune_flags(xret, XML_FLAG_MARK, XML_FLAG_MARK) < 0)
|
||||||
|
goto done;
|
||||||
|
/* TODO. Remove empty containers */
|
||||||
}
|
}
|
||||||
else if (strcmp(with_defaults, "report-all") == 0) {
|
else if (strcmp(with_defaults, "report-all-tagged") == 0) {
|
||||||
|
/* Mark nodes having default schema values */
|
||||||
|
if (xml_apply(xret, CX_ELMNT, (xml_applyfn_t*)xml_flag_default_value, (void*)XML_FLAG_MARK) < 0)
|
||||||
|
goto done;
|
||||||
|
/* Add tag attributes to default nodes */
|
||||||
|
if (xml_apply(xret, CX_ELMNT, (xml_applyfn_t*)xml_add_default_tag, (void*)(XML_FLAG_DEFAULT | XML_FLAG_MARK)) < 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
else if (strcmp(with_defaults, "report-all") == 0) {
|
||||||
/* Accept mode, do nothing */
|
/* Accept mode, do nothing */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -1725,7 +1725,7 @@ netconf_hello_server(clicon_handle h,
|
||||||
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:xpath:1.0</capability>");
|
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:xpath:1.0</capability>");
|
||||||
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>");
|
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>");
|
||||||
/* rfc6243 with-defaults capability modes */
|
/* rfc6243 with-defaults capability modes */
|
||||||
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,trim</capability>");
|
cprintf(cb, "<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,trim,report-all-tagged</capability>");
|
||||||
cprintf(cb, "</capabilities>");
|
cprintf(cb, "</capabilities>");
|
||||||
if (session_id)
|
if (session_id)
|
||||||
cprintf(cb, "<session-id>%lu</session-id>", (long unsigned int)session_id);
|
cprintf(cb, "<session-id>%lu</session-id>", (long unsigned int)session_id);
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ new "Netconf snd hello with prefix"
|
||||||
expecteof "$clixon_netconf -qef $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><nc:hello xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><nc:capabilities><nc:capability>urn:ietf:params:netconf:base:1.1</nc:capability></nc:capabilities></nc:hello>]]>]]>" '^$'
|
expecteof "$clixon_netconf -qef $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><nc:hello xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><nc:capabilities><nc:capability>urn:ietf:params:netconf:base:1.1</nc:capability></nc:capabilities></nc:hello>]]>]]>" '^$'
|
||||||
|
|
||||||
new "netconf snd + rcv hello"
|
new "netconf snd + rcv hello"
|
||||||
expecteof "$clixon_netconf -f $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability></capabilities></hello>]]>]]>" "^<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2019-01-04&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability><capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&also-supported=explicit,trim</capability></capabilities><session-id>[0-9]*</session-id></hello>]]>]]>$" '^$'
|
expecteof "$clixon_netconf -f $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability></capabilities></hello>]]>]]>" "^<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2019-01-04&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability><capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,trim,report-all-tagged</capability></capabilities><session-id>[0-9]*</session-id></hello>]]>]]>$" '^$'
|
||||||
|
|
||||||
new "Netconf snd hello with extra element"
|
new "Netconf snd hello with extra element"
|
||||||
expecteof "$clixon_netconf -qef $cfg" 0 "<hello $DEFAULTNS><capabilities><extra-element/><capability>urn:ietf:params:netconf:base:1.1</capability></capabilities></hello>]]>]]>" '^<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="42"><rpc-error><error-type>protocol</error-type><error-tag>unknown-element</error-tag><error-info><bad-element>extra-element</bad-element></error-info><error-severity>error</error-severity><error-message>Unrecognized hello/capabilities element</error-message></rpc-error></rpc-reply>]]>]]>$' '^$'
|
expecteof "$clixon_netconf -qef $cfg" 0 "<hello $DEFAULTNS><capabilities><extra-element/><capability>urn:ietf:params:netconf:base:1.1</capability></capabilities></hello>]]>]]>" '^<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="42"><rpc-error><error-type>protocol</error-type><error-tag>unknown-element</error-tag><error-info><bad-element>extra-element</bad-element></error-info><error-severity>error</error-severity><error-message>Unrecognized hello/capabilities element</error-message></rpc-error></rpc-reply>]]>]]>$' '^$'
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ EOF
|
||||||
new "Start Listener client"
|
new "Start Listener client"
|
||||||
echo "ssh -s -F $sshcfg -v -i $key -o ProxyUseFdpass=yes -o ProxyCommand=\"clixon_netconf_ssh_callhome_client -a 127.0.0.1\" . netconf"
|
echo "ssh -s -F $sshcfg -v -i $key -o ProxyUseFdpass=yes -o ProxyCommand=\"clixon_netconf_ssh_callhome_client -a 127.0.0.1\" . netconf"
|
||||||
#-F $sshcfg
|
#-F $sshcfg
|
||||||
expectpart "$(ssh -s -F $sshcfg -v -i $key -o ProxyUseFdpass=yes -o ProxyCommand="${clixon_netconf_ssh_callhome_client} -a 127.0.0.1" . netconf < $rpccmd)" 0 "<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2019-01-04&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability><capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&also-supported=explicit,trim</capability></capabilities><session-id>2</session-id></hello>" "<rpc-reply $DEFAULTNS><data/></rpc-reply>"
|
expectpart "$(ssh -s -F $sshcfg -v -i $key -o ProxyUseFdpass=yes -o ProxyCommand="${clixon_netconf_ssh_callhome_client} -a 127.0.0.1" . netconf < $rpccmd)" 0 "<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.1</capability><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2019-01-04&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability><capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,trim,report-all-tagged</capability></capabilities><session-id>2</session-id></hello>" "<rpc-reply $DEFAULTNS><data/></rpc-reply>"
|
||||||
|
|
||||||
# Wait
|
# Wait
|
||||||
wait
|
wait
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ wait_restconf
|
||||||
|
|
||||||
new "rfc4243 4.3. Capability Identifier"
|
new "rfc4243 4.3. Capability Identifier"
|
||||||
expecteof "$clixon_netconf -ef $cfg" 0 "$DEFAULTHELLO" \
|
expecteof "$clixon_netconf -ef $cfg" 0 "$DEFAULTHELLO" \
|
||||||
"<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&also-supported=explicit,trim</capability>"
|
"<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,trim,report-all-tagged</capability>"
|
||||||
|
|
||||||
new "rfc6243 3.1. 'report-all' Retrieval Mode"
|
new "rfc6243 3.1. 'report-all' Retrieval Mode"
|
||||||
expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
||||||
|
|
@ -195,7 +195,7 @@ expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
||||||
<interface><name>eth0</name><mtu>8192</mtu></interface>\
|
<interface><name>eth0</name><mtu>8192</mtu></interface>\
|
||||||
<interface><name>eth1</name></interface>\
|
<interface><name>eth1</name></interface>\
|
||||||
<interface><name>eth2</name><mtu>9000</mtu><status>not feeling so good</status></interface>\
|
<interface><name>eth2</name><mtu>9000</mtu><status>not feeling so good</status></interface>\
|
||||||
<interface><name>eth3</name><mtu>1500</mtu><status>waking up</status></interface>\
|
<interface><name>eth3</name><status>waking up</status></interface>\
|
||||||
</interfaces></data></rpc-reply>"
|
</interfaces></data></rpc-reply>"
|
||||||
|
|
||||||
new "rfc6243 3.3. 'explicit' Retrieval Mode"
|
new "rfc6243 3.3. 'explicit' Retrieval Mode"
|
||||||
|
|
@ -215,9 +215,12 @@ expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
||||||
"<rpc $DEFAULTNS><get><filter type=\"subtree\"><interfaces $EXAMPLENS/></filter>\
|
"<rpc $DEFAULTNS><get><filter type=\"subtree\"><interfaces $EXAMPLENS/></filter>\
|
||||||
<with-defaults xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\">report-all-tagged</with-defaults></get></rpc>" \
|
<with-defaults xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\">report-all-tagged</with-defaults></get></rpc>" \
|
||||||
"" \
|
"" \
|
||||||
"<rpc-reply $DEFAULTNS><rpc-error><error-type>application</error-type><error-tag>operation-not-supported</error-tag>\
|
"<rpc-reply $DEFAULTNS><data><interfaces $EXAMPLENS>\
|
||||||
<error-severity>error</error-severity>\
|
<interface><name>eth0</name><mtu>8192</mtu><status wd:default=\"true\">ok</status></interface>\
|
||||||
<error-message>with-defaults retrieval mode \"report-all-tagged\" is not supported</error-message></rpc-error></rpc-reply>"
|
<interface><name>eth1</name><mtu wd:default=\"true\">1500</mtu><status wd:default=\"true\">ok</status></interface>\
|
||||||
|
<interface><name>eth2</name><mtu>9000</mtu><status>not feeling so good</status></interface>\
|
||||||
|
<interface><name>eth3</name><mtu wd:default=\"true\">1500</mtu><status>waking up</status></interface>\
|
||||||
|
</interfaces></data></rpc-reply>"
|
||||||
|
|
||||||
new "rfc6243 2.3.1. 'explicit' Basic Mode Retrieval"
|
new "rfc6243 2.3.1. 'explicit' Basic Mode Retrieval"
|
||||||
expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue