Re: [kvm-unit-tests PATCH v4 1/2] Add the possibility to do simple migration tests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 22, 2017 at 09:28:06AM +0100, Thomas Huth wrote:
> To be able to do simple migration tests with kvm-unit-tests, too,
> add a helper script that does all the necessary work: Start two
> instances of QEMU (source and destination) with QMP sockets for
> sending commands to them, then trigger the migration from one
> instance to the other and finally signal the end of the migration
> to the guest by injecting an NMI.
> This helper script is now used automatically for powerpc tests
> if the test is put into the "migration" group in the unittests.cfg
> file.
> 
> Signed-off-by: Thomas Huth <thuth@xxxxxxxxxx>
> ---
>  powerpc/run           |  2 +-
>  scripts/arch-run.bash | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  scripts/runtime.bash  |  3 +++
>  3 files changed, 67 insertions(+), 1 deletion(-)
> 
> diff --git a/powerpc/run b/powerpc/run
> index 6269abb..d92608e 100755
> --- a/powerpc/run
> +++ b/powerpc/run
> @@ -46,7 +46,7 @@ M+=",accel=$ACCEL"
>  command="$qemu -nodefaults $M -bios $FIRMWARE"
>  [ -f "$ENV" ] && command+=" -initrd $ENV"
>  command+=" -display none -serial stdio -kernel"
> -command="$(timeout_cmd) $command"
> +command="$(migration_cmd) $(timeout_cmd) $command"
>  echo $command "$@"
>  
>  # powerpc tests currently exit with rtas-poweroff, which exits with 0.
> diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
> index 1610f3b..96bd5c4 100644
> --- a/scripts/arch-run.bash
> +++ b/scripts/arch-run.bash
> @@ -70,3 +70,66 @@ timeout_cmd ()
>  		echo "timeout -k 1s --foreground $TIMEOUT"
>  	fi
>  }
> +
> +qmp ()
> +{
> +	echo '{ "execute": "qmp_capabilities" }{ "execute":' "$2" '}' | nc -U $1
> +}
> +
> +run_migration ()
> +{
> +	if ! command -v nc >/dev/null 2>&1; then
> +		echo "$0 needs nc (netcat)" >&2
> +		exit 2

I would sort of still prefer $FUNCNAME over $0 here, but I don't feel
that strongly about it. Nice catch on the 'exit 2'. 2 is indeed our
designated error code for run-script failures.

> +	fi
> +
> +	qemu=$1
> +	shift
> +
> +	migsock=`mktemp -u -t mig-helper-socket.XXXXXXXXXX`
> +	migout1=`mktemp -t mig-helper-stdout1.XXXXXXXXXX`
> +	qmp1=`mktemp -u -t mig-helper-qmp1.XXXXXXXXXX`
> +	qmp2=`mktemp -u -t mig-helper-qmp2.XXXXXXXXXX`
> +	qmpout1=/dev/null
> +	qmpout2=/dev/null
> +
> +	trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2}' EXIT
> +
> +	$qemu "$@" -chardev socket,id=mon1,path=${qmp1},server,nowait \
> +		 -mon chardev=mon1,mode=control | tee ${migout1} &
> +
> +	$qemu "$@" -chardev socket,id=mon2,path=${qmp2},server,nowait \
> +		 -mon chardev=mon2,mode=control -incoming unix:${migsock} &
> +
> +	# The test must prompt the user to migrate, so wait for the "migrate" keyword
> +	while ! grep -q -i "migrate" < ${migout1} ; do
> +		sleep 1
> +	done
> +
> +	qmp ${qmp1} '"migrate", "arguments": { "uri": "unix:'${migsock}'" }' > ${qmpout1}
> +
> +	# Wait for the migration to complete
> +	migstatus=`qmp ${qmp1} '"query-migrate"' | grep return`
> +	while ! grep -q '"completed"' <<<"$migstatus" ; do
> +		sleep 1
> +		migstatus=`qmp ${qmp1} '"query-migrate"' | grep return`
> +		if grep -q '"failed"' <<<"$migstatus" ; then
> +			echo "ERROR: Migration failed." >&2
> +			qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
> +			qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
> +			exit 2

Also a nice improvement, ensuring the qemu processes quit.

> +		fi
> +	done
> +	qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
> +
> +	qmp ${qmp2} '"inject-nmi"'> ${qmpout2}
> +
> +	wait
> +}
> +
> +migration_cmd ()
> +{
> +	if [ "$MIGRATION" = "yes" ]; then
> +		echo "run_migration"
> +	fi
> +}
> diff --git a/scripts/runtime.bash b/scripts/runtime.bash
> index 98f1835..e630279 100644
> --- a/scripts/runtime.bash
> +++ b/scripts/runtime.bash
> @@ -99,6 +99,9 @@ function run()
>      }
>  
>      cmdline=$(get_cmdline $kernel)
> +    if grep -qw "migration" <<<$groups ; then
> +        cmdline="MIGRATION=yes $cmdline"
> +    fi
>      if [ "$verbose" = "yes" ]; then
>          echo $cmdline
>      fi
> -- 
> 1.8.3.1
>

Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx>



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux