#!/usr/bin/env bash # RFC 6241: # 7.3 - Even if it advertises the :writable-running capability, a device # MAY choose not to support the configuration datastore # as the parameter of a operation. # - If the and parameters identify the same URL or # configuration datastore, an error MUST be returned with an error- # tag containing "invalid-value". # 8.3.5.1 The candidate configuration can be used as a source or target # 8.4.1 If :startup capability is advertized, from running to # startup is also necessary # 8.8.5.2 :url capability accepts element as value of # the and the parameters. # # The test checks that these are allowed: # running->startup # running->candidate # candidate->startup # startup->candidate # And checks that copying to running is not allowed # 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 # include err() and new() functions and creates $dir cfg=$dir/conf_yang.xml fyang=$dir/ietf-interfaces@2019-03-04.yang # Define default restconfig config: RESTCONFIG RESTCONFIG=$(restconf_config none true) cat < $cfg $cfg ietf-netconf:startup clixon-restconf:allow-auth-none 42 ${YANG_INSTALLDIR} $fyang /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/backend example_backend.so$ /usr/local/lib/$APPNAME/netconf /usr/local/lib/$APPNAME/restconf /usr/local/lib/$APPNAME/cli $APPNAME $dir/$APPNAME.sock /usr/local/var/run/$APPNAME.pidfile $dir $RESTCONFIG EOF # Stub ietf-interfaces for test cat < $fyang module ietf-interfaces { yang-version 1.1; namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces"; prefix if; revision "2019-03-04"; identity interface-type { description "Base identity from which specific interface types are derived."; } identity fddi { base interface-type; } container interfaces { description "Interface parameters."; list interface { key "name"; leaf name { type string; } leaf type { type identityref { base interface-type; } mandatory true; } leaf enabled { type boolean; default "true"; } } } } EOF # Create empty startup cat < $dir/startup_db <${DATASTORE_TOP}/> EOF # rm candidate and running rm -f $dir/running_db rm -f $dir/candidate_db new "test params: -f $cfg" # Bring your own backend if [ $BE -ne 0 ]; then # kill old backend (if any) 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 if [ $RC -ne 0 ]; then new "kill old restconf daemon" stop_restconf_pre new "start restconf daemon" start_restconf -f $cfg fi new "wait restconf" wait_restconf new "Add config to candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "eth/0/0if:fddinone " "" "" new "netconf commit to running" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "Delete candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "eth/0/0if:fddinone " "" "" # Here startup and candidate are empty, only running has content # test running->startup and running->candidate new "Check candidate empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "Check startup empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "copy running->startup" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "copy running->candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" # Here startup and candidate have content new "Check candidate content" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "eth/0/0if:fddi" new "Check startup content" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "eth/0/0if:fddi" new "Delete startup" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" # Here startup is empty and candidate has content # test candidate->startup new "Check startup empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "copy candidate->startup" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "Check startup content xxx" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "eth/0/0if:fddi" new "Delete candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "eth/0/0if:fddinone " "" "" # Here candidate is empty and startup has content # test startup->candidate new "Check candidate empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "copy startup->candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" new "Check candidate content" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "eth/0/0if:fddi" # Negative test: check copying to running is not allowed new "Delete candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "eth/0/0if:fddinone " "" "" new "netconf commit to running" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" # Here running is empty new "Check running empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" # Add to candidate new "copy startup->candidate" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" if ! $YANG_UNKNOWN_ANYDATA ; then new "copy startup->running not allowed" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "applicationunknown-elementrunningerrorFailed to find YANG spec of XML node: running with parent: target in namespace: urn:ietf:params:xml:ns:netconf:base:1.0" fi # restconf copy new "restconf copy-config smoketest, json" expectpart "$(curl $CURLOPTS -X POST -H "Content-Type: application/yang-data+json" $RCPROTO://127.0.0.1/restconf/operations/ietf-netconf:copy-config -d '{"ietf-netconf:input": {"target": {"startup": [null]},"source": {"running": [null]}}}')" 0 "HTTP/$HVER 204" new "restconf copy-config smoketest, xml" expectpart "$(curl $CURLOPTS -X POST -H "Content-Type: application/yang-data+xml" $RCPROTO://127.0.0.1/restconf/operations/ietf-netconf:copy-config -d '')" 0 "HTTP/$HVER 204" # Here running is empty new "Check running empty" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" if [ $RC -ne 0 ]; then new "Kill restconf daemon" stop_restconf 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 # kill backend stop_backend -f $cfg fi new "Endtest" endtest rm -rf $dir