#!/usr/bin/env bash # Clixon leaf default test # Check top-level default as https://github.com/clicon/clixon/issues/111 # Also check # Sanity check default value may not be in list key # RFC 7950: # 7.6.1 The usage of the default value depends on the leaf's closest ancestor node in the # schema tree that is not a non-presence container (see Section 7.5.1): # 7.8.2 any default values in the key leafs or their types are ignored. # v non-presence container (presence false) DEFAULT # ancestor--> ancestor --> leaf --> default # ^leafs closest ancestor that is not a non-presence container # Test has three parts where system is started three times: # 1) with init # 2) with startup: r1 only # 3) with startup: p4 only # Magic line must be first in script (see README.md) s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi APPNAME=example cfg=$dir/conf_yang.xml fyang=$dir/leafref.yang cat < $cfg $cfg ietf-netconf:startup $dir ${YANG_INSTALLDIR} $fyang /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/cli $APPNAME /usr/local/var/run/$APPNAME.sock /usr/local/var/run/$APPNAME.pidfile $dir EOF cat < $fyang module example{ yang-version 1.1; namespace "urn:example:clixon"; prefix ex; leaf r1 { description "Top level leaf"; type uint32; default 11; /* should be set */ } leaf r2 { description "Top level leaf"; type uint32; default 22; /* should be set on startup */ } container np3{ description "No presence container"; leaf s3 { type uint32; default 33; /* should be set on startup */ } container np31{ leaf s31 { type uint32; default 31; /* should be set on startup */ } } /* Extra rules to check when condition */ leaf npleaf{ when "../s3 = '99'"; type uint32; default 98; } container npcont{ when "../s3 = '99'"; leaf npext{ type uint32; default 99; } } } container p4{ presence "A presence container"; description "Not a no presence container"; leaf s4 { type uint32; default 44; } container np45{ description "No presence container"; leaf s5 { type uint32; default 45; } } } container xs-config { description "Typical contruct where a list element has a default leaf"; list x { key "name"; leaf name { type string; } container y { leaf inside { type boolean; default false; } } leaf outside { type boolean; default false; } } } } EOF # This is base default XML with all default values from root filled in XML='11223331' new "test params: -f $cfg" if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err fi new "start backend -s init -f $cfg" start_backend -s init -f $cfg fi new "wait backend" wait_backend new "get config" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "get config(report-all)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XML" new "Change default value r1" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "99" "" "" new "get config r1" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "99" new "get config(report-all) r1" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "" "99" new "Remove r1" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "99" "" "" new "get config" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "get config(report-all)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XML" new "Set x list element" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "a" "" "" new "get config (should not contain y/inside+outside)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "a" new "get config(report-all) (should contain y/inside+outside)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XMLafalsefalse" # Set s3 leaf to 99 triggering when condition for default values new "Set s3 to 99" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "99" "" "" new "commit" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "get config np3 with npleaf and npext" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "99" new "get config(report-all) np3 with npleaf and npext" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "" "99319899" if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi # kill backend stop_backend -f $cfg fi # From startup 1, only r1, all else should be filled in SXML='99' cat < $dir/startup_db <${DATASTORE_TOP}> $SXML EOF XML='99223331' if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err fi new "start backend -s startup -f $cfg" start_backend -s startup -f $cfg fi new "wait backend" wait_backend new "get startup config" # Should have all defaults, except r1 that is set to 99 expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "$SXML" new "get(report-all) startup config" # Should have all defaults, except r1 that is set to 99 expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XML" # permission kludges sudo chmod 666 $dir/running_db new "Check running no defaults: r1 only" # Running should have only non-defaults, ie only r1 that is set to 99 moreret=$(diff $dir/running_db <(echo "<${DATASTORE_TOP}> $SXML ")) if [ $? -ne 0 ]; then err "<${DATASTORE_TOP}>$SXML" "$moreret" fi new "Change default value r2" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "88" "" "" new "commit" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "Check running no defaults: r1 and r2" # Again, running should have only non-defaults, ie only r1 and r2 moreret=$(diff $dir/running_db <(echo "<${DATASTORE_TOP}> $SXML 88 ")) if [ $? -ne 0 ]; then err "<${DATASTORE_TOP}>$SXML88" "$moreret" fi if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi fi # From startup 2, only presence p4, s4/np5 should be filled in cat < $dir/startup_db <${DATASTORE_TOP}> EOF XML='112233314445' if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err fi new "start backend -s startup -f $cfg" start_backend -s startup -f $cfg fi new "wait backend" wait_backend new "get startup config with presence" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "get(report-all) startup config with presence" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XML" if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi fi # Only single x list element cat < $dir/startup_db <${DATASTORE_TOP}> a EOF XML='11223331' if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err fi new "start backend -s startup -f $cfg" start_backend -s startup -f $cfg fi new "wait backend" wait_backend new "get startup config with list default" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "a" new "get(report-all) startup config with list default" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "$XMLafalsefalse" if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi fi rm -rf $dir new "endtest" endtest