diff mbox

[KVM-AUTOTEST,1/2] KVM test: add shutdown test

Message ID a295eb2502adecf55843f6142c4644d65f282d8b.1245137635.git.mgoldish@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Michael Goldish June 16, 2009, 7:37 a.m. UTC
The shutdown test logs into a VM and sends a shutdown command.
It serves two purposes:
- Test KVM's ability to shut down.
- Clean up after the other tests:
Currently VMs of the last test remain alive when Autotest finishes running.
When one guest finishes testing and another begins, the VM is automatically
shut down by the preprocessor because the QEMU command required for the next
guest differs from that of the guest that just finished.  In the case of the
final guest this doesn't happen because no guest follows it, so the preprocessor
must be explicitly instructed to kill the VM.
However, we have no easy way of knowing which test runs last because the user
usually selects a subset of the tests/guests.
The addition of a shutdown test can be a decent solution to this small problem:
by convention the shutdown test will always be the last to run, and if users
wish to clean up after the tests, they must select the shutdown test.

Note: it is beneficial to allow users to leave the VMs of the last test running
because it saves time when developing and testing tests. A test writer can run
the test once on a VM, and when the test exits, make some modifications to its
code and re-run it on the same living VM, and repeat this procedure without
having to shutdown/boot the VM every time.

Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
 client/tests/kvm/kvm.py       |    1 +
 client/tests/kvm/kvm_tests.py |   37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 0 deletions(-)

Comments

Alexey Eromenko June 16, 2009, 10:42 a.m. UTC | #1
Michael I don't fully understand why shutdown test is needed; Shutdown is tested during reboot, where GuestOS must de-init itself.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michael Goldish June 16, 2009, 11:05 a.m. UTC | #2
----- "Alexey Eromenko" <aeromenk@redhat.com> wrote:

> Michael I don't fully understand why shutdown test is needed; Shutdown
> is tested during reboot, where GuestOS must de-init itself.

The main motivation for a shutdown test is that it allows us to choose
whether VMs should be kept alive after the last test.  Including this test
in a job takes no more time than running the job without it, because
normally the preprocessor automatically shuts down guests (except for the
last one).

There's also a small difference between a complete shutdown and a reboot --
a shutdown is supposed to close the qemu process.  I'm not sure this
difference justifies the test, but the reason mentioned in the previous
paragraph does, in my opinion.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jason Wang June 17, 2009, 3:10 a.m. UTC | #3
Hello Michael:

The shutdown case is useful but the patch does really similar work to
vm.destroy(). Maybe we could simple let the preprocess progress to
shutdown all the vms just like:

    - shutdown:      install setup
        vms = ''

Michael Goldish 写道:
> The shutdown test logs into a VM and sends a shutdown command.
> It serves two purposes:
> - Test KVM's ability to shut down.
> - Clean up after the other tests:
> Currently VMs of the last test remain alive when Autotest finishes running.
> When one guest finishes testing and another begins, the VM is automatically
> shut down by the preprocessor because the QEMU command required for the next
> guest differs from that of the guest that just finished.  In the case of the
> final guest this doesn't happen because no guest follows it, so the preprocessor
> must be explicitly instructed to kill the VM.
> However, we have no easy way of knowing which test runs last because the user
> usually selects a subset of the tests/guests.
> The addition of a shutdown test can be a decent solution to this small problem:
> by convention the shutdown test will always be the last to run, and if users
> wish to clean up after the tests, they must select the shutdown test.
>
> Note: it is beneficial to allow users to leave the VMs of the last test running
> because it saves time when developing and testing tests. A test writer can run
> the test once on a VM, and when the test exits, make some modifications to its
> code and re-run it on the same living VM, and repeat this procedure without
> having to shutdown/boot the VM every time.
>
> Signed-off-by: Michael Goldish <mgoldish@redhat.com>
> ---
>  client/tests/kvm/kvm.py       |    1 +
>  client/tests/kvm/kvm_tests.py |   37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+), 0 deletions(-)
>
> diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
> index 9428162..aa727da 100644
> --- a/client/tests/kvm/kvm.py
> +++ b/client/tests/kvm/kvm.py
> @@ -48,6 +48,7 @@ class kvm(test.test):
>                  "steps":        test_routine("kvm_guest_wizard", "run_steps"),
>                  "stepmaker":    test_routine("stepmaker", "run_stepmaker"),
>                  "boot":         test_routine("kvm_tests", "run_boot"),
> +                "shutdown":     test_routine("kvm_tests", "run_shutdown"),
>                  "migration":    test_routine("kvm_tests", "run_migration"),
>                  "yum_update":   test_routine("kvm_tests", "run_yum_update"),
>                  "autotest":     test_routine("kvm_tests", "run_autotest"),
> diff --git a/client/tests/kvm/kvm_tests.py b/client/tests/kvm/kvm_tests.py
> index ffe9116..4c9653f 100644
> --- a/client/tests/kvm/kvm_tests.py
> +++ b/client/tests/kvm/kvm_tests.py
> @@ -57,6 +57,43 @@ def run_boot(test, params, env):
>      session.close()
>  
>  
> +def run_shutdown(test, params, env):
> +    """
> +    KVM shutdown test:
> +    1) Log into a guest
> +    2) Send a shutdown command to the guest
> +    3) Wait until it's down
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environment
> +    """
> +    vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
> +    if not vm:
> +        raise error.TestError("VM object not found in environment")
> +    if not vm.is_alive():
> +        raise error.TestError("VM seems to be dead; Test requires a living VM")
> +
> +    logging.info("Waiting for guest to be up...")
> +
> +    session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
> +    if not session:
> +        raise error.TestFail("Could not log into guest")
> +
> +    logging.info("Logged in")
> +
> +    # Send the VM's shutdown command
> +    session.sendline(vm.get_params().get("cmd_shutdown"))
> +    session.close()
> +
> +    logging.info("Shutdown command sent; waiting for guest to go down...")
> +
> +    if not kvm_utils.wait_for(vm.is_dead, 120, 0, 1):
> +        raise error.TestFail("Guest refuses to go down")
> +
> +    logging.info("Guest is down")
> +
> +
>  def run_migration(test, params, env):
>      """
>      KVM migration test:
>   

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lucas Meneghel Rodrigues June 18, 2009, 2:46 p.m. UTC | #4
On Tue, 2009-06-16 at 07:05 -0400, Michael Goldish wrote:
> ----- "Alexey Eromenko" <aeromenk@redhat.com> wrote:
> 
> > Michael I don't fully understand why shutdown test is needed; Shutdown
> > is tested during reboot, where GuestOS must de-init itself.
> 
> The main motivation for a shutdown test is that it allows us to choose
> whether VMs should be kept alive after the last test.  Including this test
> in a job takes no more time than running the job without it, because
> normally the preprocessor automatically shuts down guests (except for the
> last one).
> 
> There's also a small difference between a complete shutdown and a reboot --
> a shutdown is supposed to close the qemu process.  I'm not sure this
> difference justifies the test, but the reason mentioned in the previous
> paragraph does, in my opinion.

Fair enough, I agree. Will apply the patch.
Lucas Meneghel Rodrigues June 18, 2009, 3:06 p.m. UTC | #5
On Tue, 2009-06-16 at 10:37 +0300, Michael Goldish wrote:
> The shutdown test logs into a VM and sends a shutdown command.
> It serves two purposes:
> - Test KVM's ability to shut down.
> - Clean up after the other tests:
> Currently VMs of the last test remain alive when Autotest finishes running.
> When one guest finishes testing and another begins, the VM is automatically
> shut down by the preprocessor because the QEMU command required for the next
> guest differs from that of the guest that just finished.  In the case of the
> final guest this doesn't happen because no guest follows it, so the preprocessor
> must be explicitly instructed to kill the VM.
> However, we have no easy way of knowing which test runs last because the user
> usually selects a subset of the tests/guests.
> The addition of a shutdown test can be a decent solution to this small problem:
> by convention the shutdown test will always be the last to run, and if users
> wish to clean up after the tests, they must select the shutdown test.
> 
> Note: it is beneficial to allow users to leave the VMs of the last test running
> because it saves time when developing and testing tests. A test writer can run
> the test once on a VM, and when the test exits, make some modifications to its
> code and re-run it on the same living VM, and repeat this procedure without
> having to shutdown/boot the VM every time.

Ok, patch set applied. Thank you!

> Signed-off-by: Michael Goldish <mgoldish@redhat.com>
> ---
>  client/tests/kvm/kvm.py       |    1 +
>  client/tests/kvm/kvm_tests.py |   37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+), 0 deletions(-)
> 
> diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
> index 9428162..aa727da 100644
> --- a/client/tests/kvm/kvm.py
> +++ b/client/tests/kvm/kvm.py
> @@ -48,6 +48,7 @@ class kvm(test.test):
>                  "steps":        test_routine("kvm_guest_wizard", "run_steps"),
>                  "stepmaker":    test_routine("stepmaker", "run_stepmaker"),
>                  "boot":         test_routine("kvm_tests", "run_boot"),
> +                "shutdown":     test_routine("kvm_tests", "run_shutdown"),
>                  "migration":    test_routine("kvm_tests", "run_migration"),
>                  "yum_update":   test_routine("kvm_tests", "run_yum_update"),
>                  "autotest":     test_routine("kvm_tests", "run_autotest"),
> diff --git a/client/tests/kvm/kvm_tests.py b/client/tests/kvm/kvm_tests.py
> index ffe9116..4c9653f 100644
> --- a/client/tests/kvm/kvm_tests.py
> +++ b/client/tests/kvm/kvm_tests.py
> @@ -57,6 +57,43 @@ def run_boot(test, params, env):
>      session.close()
>  
> 
> +def run_shutdown(test, params, env):
> +    """
> +    KVM shutdown test:
> +    1) Log into a guest
> +    2) Send a shutdown command to the guest
> +    3) Wait until it's down
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environment
> +    """
> +    vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
> +    if not vm:
> +        raise error.TestError("VM object not found in environment")
> +    if not vm.is_alive():
> +        raise error.TestError("VM seems to be dead; Test requires a living VM")
> +
> +    logging.info("Waiting for guest to be up...")
> +
> +    session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
> +    if not session:
> +        raise error.TestFail("Could not log into guest")
> +
> +    logging.info("Logged in")
> +
> +    # Send the VM's shutdown command
> +    session.sendline(vm.get_params().get("cmd_shutdown"))
> +    session.close()
> +
> +    logging.info("Shutdown command sent; waiting for guest to go down...")
> +
> +    if not kvm_utils.wait_for(vm.is_dead, 120, 0, 1):
> +        raise error.TestFail("Guest refuses to go down")
> +
> +    logging.info("Guest is down")
> +
> +
>  def run_migration(test, params, env):
>      """
>      KVM migration test:
diff mbox

Patch

diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
index 9428162..aa727da 100644
--- a/client/tests/kvm/kvm.py
+++ b/client/tests/kvm/kvm.py
@@ -48,6 +48,7 @@  class kvm(test.test):
                 "steps":        test_routine("kvm_guest_wizard", "run_steps"),
                 "stepmaker":    test_routine("stepmaker", "run_stepmaker"),
                 "boot":         test_routine("kvm_tests", "run_boot"),
+                "shutdown":     test_routine("kvm_tests", "run_shutdown"),
                 "migration":    test_routine("kvm_tests", "run_migration"),
                 "yum_update":   test_routine("kvm_tests", "run_yum_update"),
                 "autotest":     test_routine("kvm_tests", "run_autotest"),
diff --git a/client/tests/kvm/kvm_tests.py b/client/tests/kvm/kvm_tests.py
index ffe9116..4c9653f 100644
--- a/client/tests/kvm/kvm_tests.py
+++ b/client/tests/kvm/kvm_tests.py
@@ -57,6 +57,43 @@  def run_boot(test, params, env):
     session.close()
 
 
+def run_shutdown(test, params, env):
+    """
+    KVM shutdown test:
+    1) Log into a guest
+    2) Send a shutdown command to the guest
+    3) Wait until it's down
+
+    @param test: kvm test object
+    @param params: Dictionary with the test parameters
+    @param env: Dictionary with test environment
+    """
+    vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
+    if not vm:
+        raise error.TestError("VM object not found in environment")
+    if not vm.is_alive():
+        raise error.TestError("VM seems to be dead; Test requires a living VM")
+
+    logging.info("Waiting for guest to be up...")
+
+    session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+    if not session:
+        raise error.TestFail("Could not log into guest")
+
+    logging.info("Logged in")
+
+    # Send the VM's shutdown command
+    session.sendline(vm.get_params().get("cmd_shutdown"))
+    session.close()
+
+    logging.info("Shutdown command sent; waiting for guest to go down...")
+
+    if not kvm_utils.wait_for(vm.is_dead, 120, 0, 1):
+        raise error.TestFail("Guest refuses to go down")
+
+    logging.info("Guest is down")
+
+
 def run_migration(test, params, env):
     """
     KVM migration test: