#!/usr/bin/env bash # Test hierarchical choices # See eg https://github.com/clicon/clixon/issues/342 # 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/choice.xml clidir=$dir/cli fyang=$dir/type.yang test -d ${clidir} || rm -rf ${clidir} mkdir $clidir cat < $cfg $cfg clixon-restconf:allow-auth-none $dir ${YANG_INSTALLDIR} $fyang /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/cli $APPNAME $clidir /usr/local/var/$APPNAME/$APPNAME.sock /usr/local/var/$APPNAME/$APPNAME.pidfile $dir EOF cat < $fyang module system{ yang-version 1.1; namespace "urn:example:config"; prefix ex; container c { choice top{ case topA { choice A{ mandatory true; case A1{ leaf A1x{ type string; } } case A2{ leaf A2x{ type string; } } } leaf Ay{ type string; } } case topB{ choice B{ case B1{ leaf B1x{ type string; } } case B2{ leaf B2x{ type string; } } } leaf By{ type string; } } } } } EOF cat < $clidir/ex.cli # Clixon example specification CLICON_MODE="example"; CLICON_PROMPT="%U@%H %W> "; CLICON_PLUGIN="example_cli"; # Autocli syntax tree operations set @datamodel, cli_auto_set(); delete("Delete a configuration item") { @datamodel, cli_auto_del(); all("Delete whole candidate configuration"), delete_all("candidate"); } validate("Validate changes"), cli_validate(); commit("Commit the changes"), cli_commit(); quit("Quit"), cli_quit(); discard("Discard edits (rollback 0)"), discard_changes(); show("Show a particular state of the system"){ configuration("Show configuration"), cli_show_auto_mode("candidate", "xml", false, false); } EOF 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 sudo pkill -f clixon_backend # to be sure new "start backend -s init -f $cfg" start_backend -s init -f $cfg fi new "wait backend" wait_backend new "cli set 1st A stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c A1x aaa)" 0 "^$" new "netconf validate ok" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "show config" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^aaa$" new "cli set 2nd A stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c A2x bbb)" 0 "^$" new "netconf validate ok" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "show config, only A2x" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^bbb$" new "cli set 3rd A stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c Ay ccc)" 0 "^$" new "show config: A2x + Ay" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^bbbccc$" new "cli set 1st B stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c B1x ddd)" 0 "^$" new "show config: B1x" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^ddd$" new "cli set 3rd A stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c Ay ccc)" 0 "^$" new "netconf validate fail (choice A is mandatory)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "applicationmissing-elementAerrorMandatory variable A in module system" new "show config: Ay" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^ccc$" new "cli set 3rd B stmt" expectpart "$($clixon_cli -1 -f $cfg -l o set c By fff)" 0 "^$" new "show config: By" expectpart "$($clixon_cli -1 -f $cfg -l o show config)" 0 "^fff$" 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 rm -rf $dir new "endtest" endtest