The test case will be valid only when the Sys::Virt::TCK connection object is "qemu:///system" or "lxc:///", because currently libvirt only support hooks for QEMU and LXC domain. Also update scripts/hooks/051-daemon-hook.t, replace "$hook->foo" with "$hook->foo()". --- lib/Sys/Virt/TCK/Hooks.pm | 8 +- scripts/hooks/051-daemon-hook.t | 36 ++++---- scripts/hooks/052-domain-hook.t | 183 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 22 deletions(-) create mode 100644 scripts/hooks/052-domain-hook.t diff --git a/lib/Sys/Virt/TCK/Hooks.pm b/lib/Sys/Virt/TCK/Hooks.pm index 7d20fa4..eb5e8f9 100644 --- a/lib/Sys/Virt/TCK/Hooks.pm +++ b/lib/Sys/Virt/TCK/Hooks.pm @@ -35,7 +35,7 @@ sub new { conf_dir => $params{conf_dir} ? $params{conf_dir} : $HOOKS_CONF_DIR, name => $params{conf_dir}.'/'.$params{type}, expect_result => $params{expect_result} ? $params{expect_result} : 0, - log_name => $params{log_name} ? $params{log_name} : "/tmp/$self->{type}.log", + log_name => $params{log_name} ? $params{log_name} : "/tmp/$params{type}.log", libvirtd_status => undef, domain_name => undef, domain_state => undef, @@ -144,13 +144,13 @@ sub expect_log { } } } elsif ($self->{type} eq 'qemu' or $self->{type} eq 'lxc') { - if ($domain_state eq 'running') { - if ($action eq 'stop') { + if ($domain_state eq &Sys::Virt::Domain::STATE_RUNNING) { + if ($action eq 'destroy') { $expect_log = "$hook $domain_name stopped end -"; } else { die "hooks testing doesn't support $action running domain"; } - } elsif ($domain_state eq 'shut off') { + } elsif ($domain_state eq &Sys::Virt::Domain::STATE_SHUTOFF) { if ($action eq 'start') { $expect_log = "$hook $domain_name start begin -"; } else { diff --git a/scripts/hooks/051-daemon-hook.t b/scripts/hooks/051-daemon-hook.t index c378bd0..5218d24 100644 --- a/scripts/hooks/051-daemon-hook.t +++ b/scripts/hooks/051-daemon-hook.t @@ -50,24 +50,24 @@ SKIP: { conf_dir => '/etc/libvirt/hooks', log_name => '/tmp/daemon.log'); - $hook->libvirtd_status; + $hook->libvirtd_status(); BAIL_OUT "libvirtd is not running, Exit..." if ($hook->{libvirtd_status} eq 'stopped'); - eval { $hook->prepare; }; + eval { $hook->prepare(); }; BAIL_OUT "failed to setup hooks testing ENV: $@" if $@; - diag "restart libvirtd for hooks scripts taking effect"; - $hook->action('restart'); - $hook->service_libvirtd; + diag "reload libvirtd for hooks scripts taking effect"; + $hook->action('reload'); + $hook->service_libvirtd(); unlink $hook->{log_name} unless -f $hook->{log_name}; # stop libvirtd $hook->action('stop'); - $hook->expect_log; + $hook->expect_log(); diag "$hook->{action} libvirtd"; - $hook->service_libvirtd; + $hook->service_libvirtd(); my $hook_data = slurp($hook->{name}); diag "hook script: $hook->{name} '$hook_data'"; @@ -82,17 +82,17 @@ SKIP: { diag "expected log:\n$hook->{expect_log}"; diag "check if the actual log is same with expected log"; - ok($hook->compare_log, "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); + ok($hook->compare_log(), "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); diag "check if libvirtd is stopped"; ok(`service libvirtd status` =~ /stopped/, "libvirtd is stopped"); # start libvirtd $hook->action('start'); - $hook->expect_log; + $hook->expect_log(); diag "$hook->{action} libvirtd"; - $hook->service_libvirtd; + $hook->service_libvirtd(); $hook_data = slurp($hook->{name}); diag "hook script: $hook->{name} '$hook_data'"; @@ -107,17 +107,17 @@ SKIP: { diag "expected log: \n$hook->{expect_log}"; diag "check if the actual log is same with expected log"; - ok($hook->compare_log, "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); + ok($hook->compare_log(), "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); diag "check if libvirtd is still running"; ok(`service libvirtd status` =~ /running/, "libvirtd is running"); # restart libvirtd $hook->action('restart'); - $hook->expect_log; + $hook->expect_log(); diag "$hook->{action} libvirtd"; - $hook->service_libvirtd; + $hook->service_libvirtd(); $hook_data = slurp($hook->{name}); diag "hook script: $hook->{name} '$hook_data'"; @@ -132,17 +132,17 @@ SKIP: { diag "expected log: \n$hook->{expect_log}"; diag "check if the actual log is same with expected log"; - ok($hook->compare_log, "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); + ok($hook->compare_log(), "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); diag "check if libvirtd is still running"; ok(`service libvirtd status` =~ /running/, "libvirtd is running"); # reload libvirtd $hook->action('reload'); - $hook->expect_log; + $hook->expect_log(); diag "$hook->{action} libvirtd"; - $hook->service_libvirtd; + $hook->service_libvirtd(); $hook_data = slurp($hook->{name}); diag "hook script: $hook->{name} '$hook_data'"; @@ -157,11 +157,11 @@ SKIP: { diag "expected log: \n$hook->{expect_log}"; diag "check if the actual log is same with expected log"; - ok($hook->compare_log, "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); + ok($hook->compare_log(), "$hook->{name} is invoked correctly while $hook->{action} libvirtd"); diag "check if libvirtd is still running"; ok(`service libvirtd status` =~ /running/, "libvirtd is running"); - $hook->cleanup; + $hook->cleanup(); }; diff --git a/scripts/hooks/052-domain-hook.t b/scripts/hooks/052-domain-hook.t new file mode 100644 index 0000000..e82aeb9 --- /dev/null +++ b/scripts/hooks/052-domain-hook.t @@ -0,0 +1,183 @@ +# -*- perl -*- +# +# Copyright (C) 2010 Red Hat, Inc. +# Copyright (C) 2010 Osier Yang +# +# This program is free software; You can redistribute it and/or modify +# it under the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any +# later version +# +# The file "LICENSE" distributed along with this file provides full +# details of the terms and conditions +# + +=pod + +=head1 NAME + +domain/052-domain-hook.t - domain hook testing + +=head1 DESCRIPTION + +This test case validates that the hook for QEMU or LXC domain is +invoked correctly while start/stop domain, and if the exit status +of testing hook script is 0, it expects domain could be started and +stopped successfully. Otherwise, it expects domain 'start' will be +failed, 'stop' is fine. + +=cut + +use strict; +use warnings; + +use Slurp; + +use Test::More tests => 12; + +use Sys::Virt::TCK; +use Sys::Virt::TCK::Hooks; + +my $tck = Sys::Virt::TCK->new(); +my $conn = eval { $tck->setup(); }; +BAIL_OUT "failed to setup test harness: $@" if $@; +END { $tck->cleanup if $tck; } + +SKIP: { + my $uri = $conn->get_uri(); + + skip 12, "Not using QEMU/LXC driver" unless + $uri eq "qemu:///system" or $uri eq "lxc:///"; + + my $xml = $tck->generic_domain("tck")->as_xml; + + diag "Creating a new persistent domain"; + my $dom; + ok_domain(sub { $dom = $conn->define_domain($xml) }, "created persistent domain object"); + + my $hook_type = $uri eq "qemu:///system" ? 'qemu' : 'lxc'; + + my $hook = Sys::Virt::TCK::Hooks->new(type => $hook_type, + conf_dir => '/etc/libvirt/hooks', + expect_result => 0); + eval { $hook->prepare(); }; + BAIL_OUT "failed to setup hooks testing ENV: $@" if $@; + + diag "reload libvirtd for hooks scripts taking effect"; + $hook->action('reload'); + $hook->service_libvirtd(); + + # start domain + my $domain_state = $dom->get_info()->{state}; + my $domain_name = $dom->get_name(); + + $hook->domain_name($domain_name); + $hook->domain_state($domain_state); + $hook->action('start'); + $hook->expect_log(); + + diag "start $domain_name"; + $dom->create(); + + diag "check if the domain is running"; + $domain_state = $dom->get_info()->{state}; + ok($domain_state eq &Sys::Virt::Domain::STATE_RUNNING, "domain is running"); + + my $hook_data = slurp($hook->{name}); + diag "hook script: $hook->{name} '$hook_data'"; + + diag "check if $hook->{name} is invoked"; + ok(-f "$hook->{name}", "$hook->{name} is invoked"); + + my $actual_log_data = slurp($hook->{log_name}); + diag "acutal log: $hook->{log_name} '$actual_log_data'"; + + diag "expect log:\n $hook->{expect_log}"; + + diag "check if the actual log is same with expected log"; + ok($hook->compare_log, "$hook->{name} is invoked correctly while start $domain_name"); + + diag "truncate $hook->{log_name}"; + truncate $hook->{log_name}, 0 if -f $hook->{log_name}; + + # stop domain + $domain_state = $dom->get_info()->{state}; + + $hook->domain_state($domain_state); + $hook->action('destroy'); + $hook->expect_log(); + + diag "destroy $domain_name"; + $dom->destroy(); + + diag "check if the domain is shut off"; + $domain_state = $dom->get_info()->{state}; + ok($domain_state eq &Sys::Virt::Domain::STATE_SHUTOFF, "domain is shut off"); + + $hook_data = slurp($hook->{name}); + diag "hook script: $hook->{name} '$hook_data'"; + + diag "check if $hook->{name} is invoked"; + ok(-f "$hook->{name}", "$hook->{name} is invoked"); + + $actual_log_data = slurp($hook->{log_name}); + diag "acutal log: $hook->{log_name} '$actual_log_data'"; + + diag "expect log:\n $hook->{expect_log}"; + + diag "check if the actual log is same with expected log"; + ok($hook->compare_log(), "$hook->{name} is invoked correctly while start $domain_name"); + + $hook->cleanup(); + + # Create a new testing hook script with exit status is 1. + $hook = Sys::Virt::TCK::Hooks->new(type => $hook_type, + conf_dir => '/etc/libvirt/hooks', + expect_result => 1); + eval { $hook->prepare(); }; + BAIL_OUT "failed to setup hooks testing ENV: $@" if $@; + + diag "reload libvirtd for hooks scripts taking effect"; + $hook->action('reload'); + $hook->service_libvirtd(); + + # start domain once more after the testing hook script is changed. + $domain_state = $dom->get_info()->{state}; + $domain_name = $dom->get_name(); + + $hook->domain_name($domain_name); + $hook->domain_state($domain_state); + $hook->action('start'); + $hook->expect_log(); + + diag "start $domain_name"; + eval { $dom->create(); }; + ok($@, $@); + + diag "check if the domain is running"; + $domain_state = $dom->get_info()->{state}; + ok($domain_state eq &Sys::Virt::Domain::STATE_SHUTOFF, "domain is not started "); + + $hook_data = slurp($hook->{name}); + diag "hook script: $hook->{name} '$hook_data'"; + + diag "check if $hook->{name} is invoked"; + ok(-f "$hook->{name}", "$hook->{name} is invoked"); + + $actual_log_data = slurp($hook->{log_name}); + diag "acutal log: $hook->{log_name} '$actual_log_data'"; + + diag "expect log:\n $hook->{expect_log}"; + + diag "check if the actual log is same with expected log"; + ok($hook->compare_log, "$hook->{name} is invoked correctly while start $domain_name"); + + # undefine domain + diag "undefine $domain_name"; + $dom->undefine(); + + ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain", + Sys::Virt::Error::ERR_NO_DOMAIN); + + $hook->cleanup(); +}; -- 1.7.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list