#!/bin/sh # Ensure that virsh option parsing doesn't regress # Copyright (C) 2011-2012, 2014 Red Hat, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see # . : ${srcdir=$(pwd)} : ${abs_top_srcdir=$(pwd)/..} : ${abs_top_builddir=$(pwd)/..} # If $abs_top_builddir/tools is not early in $PATH, put it there, # so that we can safely invoke "virsh" simply with its name. case $PATH in $abs_top_builddir/tools/src:$abs_top_builddir/tools:*) ;; $abs_top_builddir/tools:*) ;; *) PATH=$abs_top_builddir/tools:$PATH; export PATH ;; esac if test "$VERBOSE" = yes; then set -x virsh --version fi . "$srcdir/test-lib.sh" cat <<\EOF > exp-out || framework_failure setvcpus: trying as domain NAME setvcpus: count(optdata): 2 setvcpus: domain(optdata): test setvcpus: found option : test EOF fail=0 test_url=test:///default for args in \ 'test 2' \ '--domain test 2' \ '--domain=test 2' \ 'test --count 2' \ 'test --count=2' \ '--domain test --count 2' \ '--domain=test --count 2' \ '--domain test --count=2' \ '--domain=test --count=2' \ '--count 2 --domain test' \ '--count 2 --domain=test' \ '--count=2 --domain test' \ '--count=2 --domain=test' \ '--count 2 test' \ '--count=2 test' \ ; do virsh -k0 -d0 -c $test_url setvcpus $args >out 2>>err || fail=1 LC_ALL=C sort out | compare exp-out - || fail=1 done # Another complex parsing example cat <<\EOF > exp-out || framework_failure 1<2 EOF virsh -q -c $test_url snapshot-create-as --print-xml test \ --diskspec 'vda,file=a&b,,c,snapshot=external' --description '1<2' \ --diskspec vdb --memspec file=d,,e >out 2>>err || fail=1 compare exp-out out || fail=1 cat <<\EOF > exp-out || framework_failure name vda EOF virsh -q -c $test_url snapshot-create-as --print-xml test name vda vdb \ >out 2>>err || fail=1 compare exp-out out || fail=1 cat <<\EOF > exp-out || framework_failure name desc EOF for args in \ 'test name desc vda vdb' \ 'test name desc --diskspec vda vdb' \ 'test name desc --diskspec vda --diskspec vdb' \ 'test name desc vda vdb' \ 'test --diskspec vda name --diskspec vdb desc' \ '--description desc --name name --domain test vda vdb' \ '--description desc --diskspec vda --name name --domain test vdb' \ ; do virsh -q -c $test_url snapshot-create-as --print-xml $args \ >out 2>>err || fail=1 compare exp-out out || fail=1 done test -s err && fail=1 # Test a required argv cat <<\EOF > exp-err || framework_failure error: this function is not supported by the connection driver: virDomainQemuMonitorCommand EOF virsh -q -c $test_url qemu-monitor-command test a >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 ### Test a regular numeric option # Non-numeric value cat <<\EOF > exp-err || framework_failure error: Numeric value 'abc' for option is malformed or out of range EOF virsh -q -c $test_url cpu-stats test --start abc >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with invalid suffix cat <<\EOF > exp-err || framework_failure error: Numeric value '42WB' for option is malformed or out of range EOF virsh -q -c $test_url cpu-stats test --start 42WB >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with valid suffix. Suffixes are not supported for # regular numeric options, so this value is rejected cat <<\EOF > exp-err || framework_failure error: Numeric value '42MB' for option is malformed or out of range EOF virsh -q -c $test_url cpu-stats test --start 42MB >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value bigger than INT_MAX cat <<\EOF > exp-err || framework_failure error: Numeric value '2147483648' for option is malformed or out of range EOF virsh -q -c $test_url cpu-stats test --start 2147483648 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Negative numeric value. The value is not valid for the command # we're testing, but it has been parsed correctly cat <<\EOF > exp-err || framework_failure error: Invalid value for start CPU EOF virsh -q -c $test_url cpu-stats test --start -1 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Zero. The test driver doesn't support the operation so the command # fails, but the value has been parsed correctly cat <<\EOF > exp-err || framework_failure error: Failed to retrieve CPU statistics for domain 'test' error: this function is not supported by the connection driver: virDomainGetCPUStats EOF virsh -q -c $test_url cpu-stats test --start 0 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Valid numeric value. The test driver doesn't support the operation # so the command fails, but the value has been parsed correctly cat <<\EOF > exp-err || framework_failure error: Failed to retrieve CPU statistics for domain 'test' error: this function is not supported by the connection driver: virDomainGetCPUStats EOF virsh -q -c $test_url cpu-stats test --start 42 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 ### Test a scaled numeric option # Non-numeric value cat <<\EOF > exp-err || framework_failure error: Scaled numeric value 'abc' for option is malformed or out of range EOF virsh -q -c $test_url setmaxmem test abc >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with invalid suffix cat <<\EOF > exp-err || framework_failure error: Scaled numeric value '42WB' for option is malformed or out of range EOF virsh -q -c $test_url setmaxmem test 42WB >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with valid suffix virsh -q -c $test_url setmaxmem test 42MB >out 2>err || fail=1 test -s out && fail=1 test -s err && fail=1 # Numeric value bigger than INT_MAX. No failure here because # scaled numeric values are unsigned long long virsh -q -c $test_url setmaxmem test 2147483648 >out 2>err || fail=1 test -s out && fail=1 test -s err && fail=1 # Negative numeric value cat <<\EOF > exp-err || framework_failure error: Scaled numeric value '-1' for option is malformed or out of range EOF virsh -q -c $test_url setmaxmem test -1 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Zero. The value is not valid for the command we're testing, but # it has been parsed correctly cat <<\EOF > exp-err || framework_failure error: Unable to change MaxMemorySize error: memory in virDomainSetMaxMemory must not be zero EOF virsh -q -c $test_url setmaxmem test 0 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value virsh -q -c $test_url setmaxmem test 42 >out 2>err || fail=1 test -s out && fail=1 test -s err && fail=1 ### Test the option (numeric option converted to ms) # Non-numeric value cat <<\EOF > exp-err || framework_failure error: Numeric value 'abc' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout abc >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value that's too big to be converted to ms and still # fit inside an int cat <<\EOF > exp-err || framework_failure error: Numeric value '2147484' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout 2147484 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with invalid suffix cat <<\EOF > exp-err || framework_failure error: Numeric value '42WB' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout 42WB >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value with valid suffix. Suffixes are not supported for # the option, so this value is rejected cat <<\EOF > exp-err || framework_failure error: Numeric value '42MB' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout 42MB >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Negative value cat <<\EOF > exp-err || framework_failure error: Numeric value '-1' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout -1 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Zero. This is not a valid timeout, but the value is parsed # correctly cat <<\EOF > exp-err || framework_failure error: Numeric value '0' for option is malformed or out of range EOF virsh -q -c $test_url event --all --timeout 0 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 # Numeric value. No events will be received and the command will # fail after a second, but the value has been parsed correctly cat <<\EOF > exp-out || framework_failure event loop timed out events received: 0 EOF virsh -q -c $test_url event --all --timeout 1 >out 2>err && fail=1 test -s err && fail=1 compare exp-out out || fail=1 (exit $fail); exit $fail