diff mbox

[v4,3/3] block: qemu-iotests - test for live migration

Message ID 00e6dc1f12f865ee671b1fa5d724daa8bbcbece5.1398810229.git.jcody@redhat.com
State New
Headers show

Commit Message

Jeff Cody April 29, 2014, 10:39 p.m. UTC
This is an initial, simple live migration test from one
running VM to another, using monitor commands.

This is also an example of using the new common.qemu functions
for controlling multiple running qemu instances, for tests that
need a live qemu vm.

Signed-off-by: Jeff Cody <jcody@redhat.com>
---
 tests/qemu-iotests/091     | 102 +++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/091.out |  25 +++++++++++
 tests/qemu-iotests/group   |   1 +
 3 files changed, 128 insertions(+)
 create mode 100755 tests/qemu-iotests/091
 create mode 100644 tests/qemu-iotests/091.out

Comments

Fam Zheng April 30, 2014, 2:28 a.m. UTC | #1
On Tue, 04/29 18:39, Jeff Cody wrote:
> This is an initial, simple live migration test from one
> running VM to another, using monitor commands.
> 
> This is also an example of using the new common.qemu functions
> for controlling multiple running qemu instances, for tests that
> need a live qemu vm.
> 
> Signed-off-by: Jeff Cody <jcody@redhat.com>

Just some minor points below, but the code itself looks good,

Reviewed-by: Fam Zheng <famz@redhat.com>

> ---
>  tests/qemu-iotests/091     | 102 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/qemu-iotests/091.out |  25 +++++++++++
>  tests/qemu-iotests/group   |   1 +
>  3 files changed, 128 insertions(+)
>  create mode 100755 tests/qemu-iotests/091
>  create mode 100644 tests/qemu-iotests/091.out
> 
> diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091
> new file mode 100755
> index 0000000..7f6142f
> --- /dev/null
> +++ b/tests/qemu-iotests/091
> @@ -0,0 +1,102 @@
> +#!/bin/bash
> +#
> +# Live migration test
> +#
> +# Performs a migration from one VM to another via monitor commands
> +#
> +# Copyright (C) 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 <http://www.gnu.org/licenses/>.
> +#
> +
> +# creator
> +owner=jcody@redhat.com
> +
> +seq=`basename $0`
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +status=1    # failure is the default!
> +
> +MIG_FIFO="${TEST_DIR}/migrate"
> +
> +_cleanup()
> +{
> +    rm -f "${MIG_FIFO}"
> +    _cleanup_qemu
> +    _cleanup_test_img
> +}
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +# get standard environment, filters and checks
> +. ./common.rc
> +. ./common.filter
> +. ./common.qemu
> +
> +_supported_fmt qcow2
> +_supported_proto file
> +_supported_os Linux
> +
> +size=1G
> +
> +IMGOPTS="cluster_size=512" _make_test_img $size

Wondering why overrid cluster_size? If it matters for migration, should we
cover more values as well?

> +
> +mkfifo "${MIG_FIFO}"
> +
> +echo
> +echo === Starting QEMU VM1 ===
> +echo
> +
> +qemu_comm_method="monitor"
> +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk
> +h1=$QEMU_HANDLE
> +
> +echo
> +echo === Starting QEMU VM2 ===
> +echo
> +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk \
> +             -incoming "exec: cat '${MIG_FIFO}'"
> +h2=$QEMU_HANDLE
> +
> +echo
> +echo === VM 1: Migrate from VM1 to VM2  ===
> +echo
> +
> +silent=yes
> +_send_qemu_cmd $h1 'qemu-io disk "write 0 4M"' "(qemu)"

Maybe, write with a pattern and verify after migration?

> +echo "vm1: qemu-io disk write complete"
> +_send_qemu_cmd $h1 "migrate \"exec: cat > '${MIG_FIFO}'\"" "(qemu)"
> +echo "vm1: live migration started"
> +qemu_cmd_repeat=20 _send_qemu_cmd $h1 "info migrate" "completed"
> +echo "vm1: live migration completed"
> +
> +echo
> +echo === VM 2: Post-migration, write to disk, verify running ===
> +echo
> +
> +_send_qemu_cmd $h2 'qemu-io disk "write 4M 1M"' "(qemu)"
> +echo "vm2: qemu-io disk write complete"
> +qemu_cmd_repeat=20 _send_qemu_cmd $h2 "info status" "running"
> +echo "vm2: qemu process running successfully"
> +
> +echo "vm2: flush io, and quit"
> +_send_qemu_cmd $h2 'qemu-io disk flush' "(qemu)"
> +_send_qemu_cmd $h2 'quit' ""
> +
> +echo "Running 'qemu-img check -r all \$TEST_IMG'"
> +"${QEMU_IMG}" check -r all "${TEST_IMG}" 2>&1 | _filter_testdir | _filter_qemu
> +
> +echo "*** done"
> +rm -f $seq.full
> +status=0
> diff --git a/tests/qemu-iotests/091.out b/tests/qemu-iotests/091.out
> new file mode 100644
> index 0000000..06ea939
> --- /dev/null
> +++ b/tests/qemu-iotests/091.out
> @@ -0,0 +1,25 @@
> +QA output created by 091
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 

Unnecessary ending whitespace.

Thanks,
Fam
> +
> +=== Starting QEMU VM1 ===
> +
> +
> +=== Starting QEMU VM2 ===
> +
> +
> +=== VM 1: Migrate from VM1 to VM2 ===
> +
> +vm1: qemu-io disk write complete
> +vm1: live migration started
> +vm1: live migration completed
> +
> +=== VM 2: Post-migration, write to disk, verify running ===
> +
> +vm2: qemu-io disk write complete
> +vm2: qemu process running successfully
> +vm2: flush io, and quit
> +Running 'qemu-img check -r all $TEST_IMG'
> +No errors were found on the image.
> +10240/2097152 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters
> +Image end offset: 5642752
> +*** done
> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> index 864643d..7fa0c73 100644
> --- a/tests/qemu-iotests/group
> +++ b/tests/qemu-iotests/group
> @@ -95,3 +95,4 @@
>  086 rw auto quick
>  087 rw auto
>  088 rw auto
> +091 rw auto
> -- 
> 1.8.3.1
> 
>
Jeff Cody April 30, 2014, 12:40 p.m. UTC | #2
On Wed, Apr 30, 2014 at 10:28:11AM +0800, Fam Zheng wrote:
> On Tue, 04/29 18:39, Jeff Cody wrote:
> > This is an initial, simple live migration test from one
> > running VM to another, using monitor commands.
> > 
> > This is also an example of using the new common.qemu functions
> > for controlling multiple running qemu instances, for tests that
> > need a live qemu vm.
> > 
> > Signed-off-by: Jeff Cody <jcody@redhat.com>
> 
> Just some minor points below, but the code itself looks good,
> 
> Reviewed-by: Fam Zheng <famz@redhat.com>
> 
> > ---
> >  tests/qemu-iotests/091     | 102 +++++++++++++++++++++++++++++++++++++++++++++
> >  tests/qemu-iotests/091.out |  25 +++++++++++
> >  tests/qemu-iotests/group   |   1 +
> >  3 files changed, 128 insertions(+)
> >  create mode 100755 tests/qemu-iotests/091
> >  create mode 100644 tests/qemu-iotests/091.out
> > 
> > diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091
> > new file mode 100755
> > index 0000000..7f6142f
> > --- /dev/null
> > +++ b/tests/qemu-iotests/091
> > @@ -0,0 +1,102 @@
> > +#!/bin/bash
> > +#
> > +# Live migration test
> > +#
> > +# Performs a migration from one VM to another via monitor commands
> > +#
> > +# Copyright (C) 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 <http://www.gnu.org/licenses/>.
> > +#
> > +
> > +# creator
> > +owner=jcody@redhat.com
> > +
> > +seq=`basename $0`
> > +echo "QA output created by $seq"
> > +
> > +here=`pwd`
> > +status=1    # failure is the default!
> > +
> > +MIG_FIFO="${TEST_DIR}/migrate"
> > +
> > +_cleanup()
> > +{
> > +    rm -f "${MIG_FIFO}"
> > +    _cleanup_qemu
> > +    _cleanup_test_img
> > +}
> > +trap "_cleanup; exit \$status" 0 1 2 3 15
> > +
> > +# get standard environment, filters and checks
> > +. ./common.rc
> > +. ./common.filter
> > +. ./common.qemu
> > +
> > +_supported_fmt qcow2
> > +_supported_proto file
> > +_supported_os Linux
> > +
> > +size=1G
> > +
> > +IMGOPTS="cluster_size=512" _make_test_img $size
> 
> Wondering why overrid cluster_size? If it matters for migration, should we
> cover more values as well?
>

That is there from a copy-paste, it is not really needed.  I'll drop
it.

> > +
> > +mkfifo "${MIG_FIFO}"
> > +
> > +echo
> > +echo === Starting QEMU VM1 ===
> > +echo
> > +
> > +qemu_comm_method="monitor"
> > +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk
> > +h1=$QEMU_HANDLE
> > +
> > +echo
> > +echo === Starting QEMU VM2 ===
> > +echo
> > +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk \
> > +             -incoming "exec: cat '${MIG_FIFO}'"
> > +h2=$QEMU_HANDLE
> > +
> > +echo
> > +echo === VM 1: Migrate from VM1 to VM2  ===
> > +echo
> > +
> > +silent=yes
> > +_send_qemu_cmd $h1 'qemu-io disk "write 0 4M"' "(qemu)"
> 
> Maybe, write with a pattern and verify after migration?
> 

Sure, I will add that in, thanks.

> > +echo "vm1: qemu-io disk write complete"
> > +_send_qemu_cmd $h1 "migrate \"exec: cat > '${MIG_FIFO}'\"" "(qemu)"
> > +echo "vm1: live migration started"
> > +qemu_cmd_repeat=20 _send_qemu_cmd $h1 "info migrate" "completed"
> > +echo "vm1: live migration completed"
> > +
> > +echo
> > +echo === VM 2: Post-migration, write to disk, verify running ===
> > +echo
> > +
> > +_send_qemu_cmd $h2 'qemu-io disk "write 4M 1M"' "(qemu)"
> > +echo "vm2: qemu-io disk write complete"
> > +qemu_cmd_repeat=20 _send_qemu_cmd $h2 "info status" "running"
> > +echo "vm2: qemu process running successfully"
> > +
> > +echo "vm2: flush io, and quit"
> > +_send_qemu_cmd $h2 'qemu-io disk flush' "(qemu)"
> > +_send_qemu_cmd $h2 'quit' ""
> > +
> > +echo "Running 'qemu-img check -r all \$TEST_IMG'"
> > +"${QEMU_IMG}" check -r all "${TEST_IMG}" 2>&1 | _filter_testdir | _filter_qemu
> > +
> > +echo "*** done"
> > +rm -f $seq.full
> > +status=0
> > diff --git a/tests/qemu-iotests/091.out b/tests/qemu-iotests/091.out
> > new file mode 100644
> > index 0000000..06ea939
> > --- /dev/null
> > +++ b/tests/qemu-iotests/091.out
> > @@ -0,0 +1,25 @@
> > +QA output created by 091
> > +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 
> 
> Unnecessary ending whitespace.
>

The output itself that we are comparing against has the ending
whitespace, but I guess technically it is unnecessary since our
comparison in "check" ignores whitespace.

However, I think it best to keep the .out file matching the exact
expected output as much as possible.

> > +
> > +=== Starting QEMU VM1 ===
> > +
> > +
> > +=== Starting QEMU VM2 ===
> > +
> > +
> > +=== VM 1: Migrate from VM1 to VM2 ===
> > +
> > +vm1: qemu-io disk write complete
> > +vm1: live migration started
> > +vm1: live migration completed
> > +
> > +=== VM 2: Post-migration, write to disk, verify running ===
> > +
> > +vm2: qemu-io disk write complete
> > +vm2: qemu process running successfully
> > +vm2: flush io, and quit
> > +Running 'qemu-img check -r all $TEST_IMG'
> > +No errors were found on the image.
> > +10240/2097152 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters
> > +Image end offset: 5642752
> > +*** done
> > diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> > index 864643d..7fa0c73 100644
> > --- a/tests/qemu-iotests/group
> > +++ b/tests/qemu-iotests/group
> > @@ -95,3 +95,4 @@
> >  086 rw auto quick
> >  087 rw auto
> >  088 rw auto
> > +091 rw auto
> > -- 
> > 1.8.3.1
> > 
> >
Fam Zheng April 30, 2014, 12:53 p.m. UTC | #3
On Wed, 04/30 08:40, Jeff Cody wrote:
> On Wed, Apr 30, 2014 at 10:28:11AM +0800, Fam Zheng wrote:
> > On Tue, 04/29 18:39, Jeff Cody wrote:
> > > This is an initial, simple live migration test from one
> > > running VM to another, using monitor commands.
> > > 
> > > This is also an example of using the new common.qemu functions
> > > for controlling multiple running qemu instances, for tests that
> > > need a live qemu vm.
> > > 
> > > Signed-off-by: Jeff Cody <jcody@redhat.com>
> > 
> > Just some minor points below, but the code itself looks good,
> > 
> > Reviewed-by: Fam Zheng <famz@redhat.com>
> > 
> > > ---
> > >  tests/qemu-iotests/091     | 102 +++++++++++++++++++++++++++++++++++++++++++++
> > >  tests/qemu-iotests/091.out |  25 +++++++++++
> > >  tests/qemu-iotests/group   |   1 +
> > >  3 files changed, 128 insertions(+)
> > >  create mode 100755 tests/qemu-iotests/091
> > >  create mode 100644 tests/qemu-iotests/091.out
> > > 
> > > diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091
> > > new file mode 100755
> > > index 0000000..7f6142f
> > > --- /dev/null
> > > +++ b/tests/qemu-iotests/091
> > > @@ -0,0 +1,102 @@
> > > +#!/bin/bash
> > > +#
> > > +# Live migration test
> > > +#
> > > +# Performs a migration from one VM to another via monitor commands
> > > +#
> > > +# Copyright (C) 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 <http://www.gnu.org/licenses/>.
> > > +#
> > > +
> > > +# creator
> > > +owner=jcody@redhat.com
> > > +
> > > +seq=`basename $0`
> > > +echo "QA output created by $seq"
> > > +
> > > +here=`pwd`
> > > +status=1    # failure is the default!
> > > +
> > > +MIG_FIFO="${TEST_DIR}/migrate"
> > > +
> > > +_cleanup()
> > > +{
> > > +    rm -f "${MIG_FIFO}"
> > > +    _cleanup_qemu
> > > +    _cleanup_test_img
> > > +}
> > > +trap "_cleanup; exit \$status" 0 1 2 3 15
> > > +
> > > +# get standard environment, filters and checks
> > > +. ./common.rc
> > > +. ./common.filter
> > > +. ./common.qemu
> > > +
> > > +_supported_fmt qcow2
> > > +_supported_proto file
> > > +_supported_os Linux
> > > +
> > > +size=1G
> > > +
> > > +IMGOPTS="cluster_size=512" _make_test_img $size
> > 
> > Wondering why overrid cluster_size? If it matters for migration, should we
> > cover more values as well?
> >
> 
> That is there from a copy-paste, it is not really needed.  I'll drop
> it.
> 
> > > +
> > > +mkfifo "${MIG_FIFO}"
> > > +
> > > +echo
> > > +echo === Starting QEMU VM1 ===
> > > +echo
> > > +
> > > +qemu_comm_method="monitor"
> > > +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk
> > > +h1=$QEMU_HANDLE
> > > +
> > > +echo
> > > +echo === Starting QEMU VM2 ===
> > > +echo
> > > +_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk \
> > > +             -incoming "exec: cat '${MIG_FIFO}'"
> > > +h2=$QEMU_HANDLE
> > > +
> > > +echo
> > > +echo === VM 1: Migrate from VM1 to VM2  ===
> > > +echo
> > > +
> > > +silent=yes
> > > +_send_qemu_cmd $h1 'qemu-io disk "write 0 4M"' "(qemu)"
> > 
> > Maybe, write with a pattern and verify after migration?
> > 
> 
> Sure, I will add that in, thanks.
> 
> > > +echo "vm1: qemu-io disk write complete"
> > > +_send_qemu_cmd $h1 "migrate \"exec: cat > '${MIG_FIFO}'\"" "(qemu)"
> > > +echo "vm1: live migration started"
> > > +qemu_cmd_repeat=20 _send_qemu_cmd $h1 "info migrate" "completed"
> > > +echo "vm1: live migration completed"
> > > +
> > > +echo
> > > +echo === VM 2: Post-migration, write to disk, verify running ===
> > > +echo
> > > +
> > > +_send_qemu_cmd $h2 'qemu-io disk "write 4M 1M"' "(qemu)"
> > > +echo "vm2: qemu-io disk write complete"
> > > +qemu_cmd_repeat=20 _send_qemu_cmd $h2 "info status" "running"
> > > +echo "vm2: qemu process running successfully"
> > > +
> > > +echo "vm2: flush io, and quit"
> > > +_send_qemu_cmd $h2 'qemu-io disk flush' "(qemu)"
> > > +_send_qemu_cmd $h2 'quit' ""
> > > +
> > > +echo "Running 'qemu-img check -r all \$TEST_IMG'"
> > > +"${QEMU_IMG}" check -r all "${TEST_IMG}" 2>&1 | _filter_testdir | _filter_qemu
> > > +
> > > +echo "*** done"
> > > +rm -f $seq.full
> > > +status=0
> > > diff --git a/tests/qemu-iotests/091.out b/tests/qemu-iotests/091.out
> > > new file mode 100644
> > > index 0000000..06ea939
> > > --- /dev/null
> > > +++ b/tests/qemu-iotests/091.out
> > > @@ -0,0 +1,25 @@
> > > +QA output created by 091
> > > +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 
> > 
> > Unnecessary ending whitespace.
> >
> 
> The output itself that we are comparing against has the ending
> whitespace, but I guess technically it is unnecessary since our
> comparison in "check" ignores whitespace.
> 
> However, I think it best to keep the .out file matching the exact
> expected output as much as possible.

I noticed this as well before, qemu-img does add this ending whitespace, and we
are not very consistent in .out:

Counting the numbers, you win :)

    $ grep 'Formatting' tests/qemu-iotests/*.out | \
            sed -e 's/.* $/ENDING_WHITESPACE /g' \
                -e 's/.*[^ ]$/NO_ENDING_WHITESPACE/g' \
            | sort | uniq -c
        308 ENDING_WHITESPACE
         46 NO_ENDING_WHITESPACE

Thanks,
Fam

> 
> > > +
> > > +=== Starting QEMU VM1 ===
> > > +
> > > +
> > > +=== Starting QEMU VM2 ===
> > > +
> > > +
> > > +=== VM 1: Migrate from VM1 to VM2 ===
> > > +
> > > +vm1: qemu-io disk write complete
> > > +vm1: live migration started
> > > +vm1: live migration completed
> > > +
> > > +=== VM 2: Post-migration, write to disk, verify running ===
> > > +
> > > +vm2: qemu-io disk write complete
> > > +vm2: qemu process running successfully
> > > +vm2: flush io, and quit
> > > +Running 'qemu-img check -r all $TEST_IMG'
> > > +No errors were found on the image.
> > > +10240/2097152 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters
> > > +Image end offset: 5642752
> > > +*** done
> > > diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> > > index 864643d..7fa0c73 100644
> > > --- a/tests/qemu-iotests/group
> > > +++ b/tests/qemu-iotests/group
> > > @@ -95,3 +95,4 @@
> > >  086 rw auto quick
> > >  087 rw auto
> > >  088 rw auto
> > > +091 rw auto
> > > -- 
> > > 1.8.3.1
> > > 
> > >
diff mbox

Patch

diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091
new file mode 100755
index 0000000..7f6142f
--- /dev/null
+++ b/tests/qemu-iotests/091
@@ -0,0 +1,102 @@ 
+#!/bin/bash
+#
+# Live migration test
+#
+# Performs a migration from one VM to another via monitor commands
+#
+# Copyright (C) 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 <http://www.gnu.org/licenses/>.
+#
+
+# creator
+owner=jcody@redhat.com
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+status=1    # failure is the default!
+
+MIG_FIFO="${TEST_DIR}/migrate"
+
+_cleanup()
+{
+    rm -f "${MIG_FIFO}"
+    _cleanup_qemu
+    _cleanup_test_img
+}
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+. ./common.qemu
+
+_supported_fmt qcow2
+_supported_proto file
+_supported_os Linux
+
+size=1G
+
+IMGOPTS="cluster_size=512" _make_test_img $size
+
+mkfifo "${MIG_FIFO}"
+
+echo
+echo === Starting QEMU VM1 ===
+echo
+
+qemu_comm_method="monitor"
+_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk
+h1=$QEMU_HANDLE
+
+echo
+echo === Starting QEMU VM2 ===
+echo
+_launch_qemu -drive file="${TEST_IMG}",cache=none,id=disk \
+             -incoming "exec: cat '${MIG_FIFO}'"
+h2=$QEMU_HANDLE
+
+echo
+echo === VM 1: Migrate from VM1 to VM2  ===
+echo
+
+silent=yes
+_send_qemu_cmd $h1 'qemu-io disk "write 0 4M"' "(qemu)"
+echo "vm1: qemu-io disk write complete"
+_send_qemu_cmd $h1 "migrate \"exec: cat > '${MIG_FIFO}'\"" "(qemu)"
+echo "vm1: live migration started"
+qemu_cmd_repeat=20 _send_qemu_cmd $h1 "info migrate" "completed"
+echo "vm1: live migration completed"
+
+echo
+echo === VM 2: Post-migration, write to disk, verify running ===
+echo
+
+_send_qemu_cmd $h2 'qemu-io disk "write 4M 1M"' "(qemu)"
+echo "vm2: qemu-io disk write complete"
+qemu_cmd_repeat=20 _send_qemu_cmd $h2 "info status" "running"
+echo "vm2: qemu process running successfully"
+
+echo "vm2: flush io, and quit"
+_send_qemu_cmd $h2 'qemu-io disk flush' "(qemu)"
+_send_qemu_cmd $h2 'quit' ""
+
+echo "Running 'qemu-img check -r all \$TEST_IMG'"
+"${QEMU_IMG}" check -r all "${TEST_IMG}" 2>&1 | _filter_testdir | _filter_qemu
+
+echo "*** done"
+rm -f $seq.full
+status=0
diff --git a/tests/qemu-iotests/091.out b/tests/qemu-iotests/091.out
new file mode 100644
index 0000000..06ea939
--- /dev/null
+++ b/tests/qemu-iotests/091.out
@@ -0,0 +1,25 @@ 
+QA output created by 091
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 
+
+=== Starting QEMU VM1 ===
+
+
+=== Starting QEMU VM2 ===
+
+
+=== VM 1: Migrate from VM1 to VM2 ===
+
+vm1: qemu-io disk write complete
+vm1: live migration started
+vm1: live migration completed
+
+=== VM 2: Post-migration, write to disk, verify running ===
+
+vm2: qemu-io disk write complete
+vm2: qemu process running successfully
+vm2: flush io, and quit
+Running 'qemu-img check -r all $TEST_IMG'
+No errors were found on the image.
+10240/2097152 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters
+Image end offset: 5642752
+*** done
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 864643d..7fa0c73 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -95,3 +95,4 @@ 
 086 rw auto quick
 087 rw auto
 088 rw auto
+091 rw auto