Fixed https://github.com/clicon/clixon/issues/46 Issue with empty values in leaf-list
Thanks achernavin22
This commit is contained in:
parent
b477e22d1e
commit
61869c8d44
5 changed files with 33 additions and 12 deletions
|
|
@ -94,6 +94,8 @@
|
||||||
* Added -l option for clixon_backend for directing syslog to stderr or stdout if running in foreground
|
* Added -l option for clixon_backend for directing syslog to stderr or stdout if running in foreground
|
||||||
|
|
||||||
### Corrected Bugs
|
### Corrected Bugs
|
||||||
|
* Fixed https://github.com/clicon/clixon/issues/46 Issue with empty values in leaf-list
|
||||||
|
* Thanks achernavin22
|
||||||
* Identity without any identityref:s caused SEGV
|
* Identity without any identityref:s caused SEGV
|
||||||
* Memory error in backend transaction revert
|
* Memory error in backend transaction revert
|
||||||
* Set dir /www-data with www-data as owner, see https://github.com/clicon/clixon/issues/37
|
* Set dir /www-data with www-data as owner, see https://github.com/clicon/clixon/issues/37
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ restconf_stream_cb(int s,
|
||||||
struct clicon_msg *reply = NULL;
|
struct clicon_msg *reply = NULL;
|
||||||
cxobj *xtop = NULL; /* top xml */
|
cxobj *xtop = NULL; /* top xml */
|
||||||
cxobj *xn; /* notification xml */
|
cxobj *xn; /* notification xml */
|
||||||
cbuf *cb;
|
cbuf *cb = NULL;
|
||||||
int pretty = 0; /* XXX should be via arg */
|
int pretty = 0; /* XXX should be via arg */
|
||||||
|
|
||||||
clicon_debug(1, "%s", __FUNCTION__);
|
clicon_debug(1, "%s", __FUNCTION__);
|
||||||
|
|
|
||||||
|
|
@ -74,12 +74,13 @@
|
||||||
int xml_child_sort = 1;
|
int xml_child_sort = 1;
|
||||||
|
|
||||||
|
|
||||||
/*! Given an XML object and a child name, return yang stmt of child
|
/*! Given a child name and an XML object, return yang stmt of child
|
||||||
* If no xml parent, find root yang stmt matching name
|
* If no xml parent, find root yang stmt matching name
|
||||||
* @param[in] name Name of child
|
* @param[in] x Child
|
||||||
* @param[in] xp XML parent, can be NULL.
|
* @param[in] xp XML parent, can be NULL.
|
||||||
* @param[in] yspec Yang specification (top level)
|
* @param[in] yspec Yang specification (top level)
|
||||||
* @param[out] yresult Pointer to yang stmt of result, or NULL, if not found
|
* @param[out] yresult Pointer to yang stmt of result, or NULL, if not found
|
||||||
|
* @note special rule for rpc, ie <rpc><foo>,look for top "foo" node.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
xml_child_spec(char *name,
|
xml_child_spec(char *name,
|
||||||
|
|
@ -108,6 +109,7 @@ xml_child_spec(char *name,
|
||||||
* @retval >0 if arg1 is greater than arg2
|
* @retval >0 if arg1 is greater than arg2
|
||||||
* @note args are pointer ot pointers, to fit into qsort cmp function
|
* @note args are pointer ot pointers, to fit into qsort cmp function
|
||||||
* @see xml_cmp1 Similar, but for one object
|
* @see xml_cmp1 Similar, but for one object
|
||||||
|
* @note empty value/NULL is smallest value
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
xml_cmp(const void* arg1,
|
xml_cmp(const void* arg1,
|
||||||
|
|
@ -144,7 +146,12 @@ xml_cmp(const void* arg1,
|
||||||
return 0; /* Ordered by user: maintain existing order */
|
return 0; /* Ordered by user: maintain existing order */
|
||||||
switch (y1->ys_keyword){
|
switch (y1->ys_keyword){
|
||||||
case Y_LEAF_LIST: /* Match with name and value */
|
case Y_LEAF_LIST: /* Match with name and value */
|
||||||
equal = strcmp(xml_body(x1), xml_body(x2));
|
if ((b1 = xml_body(x1)) == NULL)
|
||||||
|
equal = -1;
|
||||||
|
else if ((b2 = xml_body(x2)) == NULL)
|
||||||
|
equal = 1;
|
||||||
|
else
|
||||||
|
equal = strcmp(b1, b2);
|
||||||
break;
|
break;
|
||||||
case Y_LIST: /* Match with key values
|
case Y_LIST: /* Match with key values
|
||||||
* Use Y_LIST cache (see struct yang_stmt)
|
* Use Y_LIST cache (see struct yang_stmt)
|
||||||
|
|
@ -168,7 +175,7 @@ xml_cmp(const void* arg1,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Compare xml object
|
/*! Compare xml object
|
||||||
* @param[in] yangi Yang order
|
* @param[in] yangi Yang order
|
||||||
* @param[in] keynr Length of keyvec/keyval vector when applicable
|
* @param[in] keynr Length of keyvec/keyval vector when applicable
|
||||||
* @param[in] keyvec Array of of yang key identifiers
|
* @param[in] keyvec Array of of yang key identifiers
|
||||||
* @param[in] keyval Array of of yang key values
|
* @param[in] keyval Array of of yang key values
|
||||||
|
|
@ -203,8 +210,10 @@ xml_cmp1(cxobj *x,
|
||||||
case Y_LEAF_LIST: /* Match with name and value */
|
case Y_LEAF_LIST: /* Match with name and value */
|
||||||
if (userorder && yang_find((yang_node*)y, Y_ORDERED_BY, "user") != NULL)
|
if (userorder && yang_find((yang_node*)y, Y_ORDERED_BY, "user") != NULL)
|
||||||
*userorder=1;
|
*userorder=1;
|
||||||
b=xml_body(x);
|
if ((b=xml_body(x)) == NULL)
|
||||||
match = strcmp(keyval[0], b);
|
match = 1;
|
||||||
|
else
|
||||||
|
match = strcmp(keyval[0], b);
|
||||||
break;
|
break;
|
||||||
case Y_LIST: /* Match with array of key values */
|
case Y_LIST: /* Match with array of key values */
|
||||||
if (userorder && yang_find((yang_node*)y, Y_ORDERED_BY, "user") != NULL)
|
if (userorder && yang_find((yang_node*)y, Y_ORDERED_BY, "user") != NULL)
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,6 @@ APPNAME=example
|
||||||
# include err() and new() functions and creates $dir
|
# include err() and new() functions and creates $dir
|
||||||
. ./lib.sh
|
. ./lib.sh
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cfg=$dir/conf_yang.xml
|
cfg=$dir/conf_yang.xml
|
||||||
fyang=$dir/test.yang
|
fyang=$dir/test.yang
|
||||||
|
|
||||||
|
|
@ -91,8 +89,8 @@ expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><validate><source><candid
|
||||||
new "minmax: empty"
|
new "minmax: empty"
|
||||||
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><edit-config><target><candidate/></target><default-operation>replace</default-operation><config><c/></config></edit-config></rpc>]]>]]>" "^<rpc-reply><ok/></rpc-reply>]]>]]>$"
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><edit-config><target><candidate/></target><default-operation>replace</default-operation><config><c/></config></edit-config></rpc>]]>]]>" "^<rpc-reply><ok/></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
exit # NYI
|
# NYI
|
||||||
|
if false; then
|
||||||
new "minmax: validate should fail"
|
new "minmax: validate should fail"
|
||||||
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><validate><source><candidate/></source></validate></rpc>]]>]]>" "^<rpc-reply><rpc-error/></rpc-reply>]]>]]>$"
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><validate><source><candidate/></source></validate></rpc>]]>]]>" "^<rpc-reply><rpc-error/></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
|
|
@ -119,7 +117,7 @@ expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><edit-config><target><can
|
||||||
|
|
||||||
new "minmax: validate should fail"
|
new "minmax: validate should fail"
|
||||||
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><validate><source><candidate/></source></validate></rpc>]]>]]>" "^<rpc-reply><rpc-error/></rpc-reply>]]>]]>$"
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><validate><source><candidate/></source></validate></rpc>]]>]]>" "^<rpc-reply><rpc-error/></rpc-reply>]]>]]>$"
|
||||||
|
fi # NYI
|
||||||
|
|
||||||
|
|
||||||
# kill backend
|
# kill backend
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,18 @@ fi
|
||||||
new "cli defined extension"
|
new "cli defined extension"
|
||||||
expectfn "$clixon_cli -1f $cfg -y $fyang show version" 0 "3."
|
expectfn "$clixon_cli -1f $cfg -y $fyang show version" 0 "3."
|
||||||
|
|
||||||
|
new "empty values in leaf-list"
|
||||||
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><edit-config><target><candidate/></target><config><x><f><e>a</e></f></x></config></edit-config></rpc>]]>]]>" "^<rpc-reply><ok/></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
|
new "empty values in leaf-list2"
|
||||||
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><edit-config><target><candidate/></target><config><x><f><e/></f></x></config></edit-config></rpc>]]>]]>" "^<rpc-reply><ok/></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
|
new "netconf get config"
|
||||||
|
expecteof "$clixon_netconf -qf $cfg -y $fyang" 0 "<rpc><get-config><source><candidate/></source></get-config></rpc>]]>]]>" "^<rpc-reply><data><x><f><e/><e>a</e></f></x></data></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
|
new "netconf discard-changes"
|
||||||
|
expecteof "$clixon_netconf -qf $cfg" 0 "<rpc><discard-changes/></rpc>]]>]]>" "^<rpc-reply><ok/></rpc-reply>]]>]]>$"
|
||||||
|
|
||||||
new "cli not defined extension"
|
new "cli not defined extension"
|
||||||
# This text yields an error, but the test cannot detect the error message yet
|
# This text yields an error, but the test cannot detect the error message yet
|
||||||
#expectfn "$clixon_cli -1f $cfg -y $fyangerr show version" 0 "Yang error: Extension ex:not-defined not found"
|
#expectfn "$clixon_cli -1f $cfg -y $fyangerr show version" 0 "Yang error: Extension ex:not-defined not found"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue