To test daemon, qemu, lxc hook. * lib/Sys/Virt/TCK/Hooks.pm --- lib/Sys/Virt/TCK/Hooks.pm | 262 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 262 insertions(+), 0 deletions(-) create mode 100644 lib/Sys/Virt/TCK/Hooks.pm
diff --git a/lib/Sys/Virt/TCK/Hooks.pm b/lib/Sys/Virt/TCK/Hooks.pm new file mode 100644 index 0000000..2f9a259 --- /dev/null +++ b/lib/Sys/Virt/TCK/Hooks.pm @@ -0,0 +1,262 @@ +# +# Copyright (C) 2010 Red Hat, Inc. +# Copyright (C) 2010 Osier Yang <jy...@redhat.com> +# +# 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 +# + +package Sys::Virt::TCK::Hooks; + +use strict; +use warnings; + +use Fcntl ':mode'; +use POSIX qw(strftime); + +my $HOOKS_CONF_DIR="/etc/libvirt/hooks"; + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + my %params = @_; + my $self = {}; + + my $type = $params{type} ? $params{type} : die "type parameter is required"; + + $self = { + type => $type, + 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", + libvirtd_status => undef, + domain_name => undef, + domain_state => undef, + expect_log => undef, + action => undef, + }; + + bless $self, $class; + + return $self; +} + +sub log_name { + my $self = shift; + my $log_name = shift; + + die "log_name parameter is required" unless $log_name; + + $self->{log_name} = $log_name; +} + +sub expect_result { + my $self = shift; + my $expect_result = shift; + + die "expect_result parameter is required" unless $expect_result; + + $self->{expect_result} = $expect_result; + + return $self; +} + +sub libvirtd_status { + my $self = shift; + my $status = `service libvirtd status`; + my $_ = $status; + + if (/running/) { + $self->{libvirtd_status} = 'running'; + } elsif (/stopped/) { + $self->{libvirtd_status} = 'stopped'; + } + + return $self; +} + +sub domain_name { + my $self = shift; + my $domain_name = shift; + + die "domain_name parameter is required" unless $domain_name; + + $self->{domain_name} = $domain_name; + + return $self; +} + +sub domain_state { + my $self = shift; + my $domain_state = shift; + + die "domain_state parameter is required" unless $domain_state; + + $self->{domain_state} = $domain_state; + + return $self; +} + +sub action { + my $self = shift; + my $action = shift; + + die "action parameter is required" unless $action; + + $self->{action} = $action; + + return $self; +} + +sub expect_log { + my $self = shift; + my $expect_log = undef; + + my $hook = $self->{name}; + my $action = $self->{action}; + my $domain_name = $self->{domain_name}; + my $domain_state = $self->{domain_state}; + my $libvirtd_status = $self->{libvirtd_status}; + + if ($self->{type} eq 'daemon') { + if ($libvirtd_status eq 'running') { + if ($action eq 'stop') { + $expect_log = "$hook - shutdown - shutdown"; + } elsif ($action eq 'restart') { + $expect_log = "$hook - shutdown - shutdown\n$hook - start - start"; + } elsif ($action eq 'reload') { + $expect_log = "$hook - reload begin SIGHUP"; + } else { + die "hooks testing doesn't support $action running libvirtd"; + } + } else { + if ($action eq 'start') { + $expect_log = "$hook - start - start"; + } else { + die "hooks testing doesn't support $action stopped libvirtd"; + } + } + } elsif ($self->{type} eq 'qemu' or $self->{type} eq 'lxc') { + if ($domain_state eq 'running') { + if ($action eq 'stop') { + $expect_log = "$hook $domain_name stopped end -"; + } else { + die "hooks testing doesn't support $action running domain"; + } + } elsif ($domain_state eq 'shut off') { + if ($action eq 'start') { + $expect_log = "$hook $domain_name start begin -"; + } else { + die "hooks testing doesn't support $action shutoff domain"; + } + + } else { + die "hooks testing doesn't support to test a domain in $domain_state state"; + } + } else { + die "hooks only support 'qemu' and 'lxc' currently"; + } + + $self->{expect_log} = $expect_log; + + return $self; +} + +sub create_hooks_dir { + my $self = shift; + + unless (-d $self->{conf_dir}) { + mkdir $self->{conf_dir} or die "failed to create $self->{conf_dir}: $!"; + } +} + +sub backup_hook { + my $self = shift; + my $date = undef; + + $date = strftime "%Y-%m-%d-%H:%M:%S", localtime; + my $orig = $self->{name}; + my $dest = $orig."-$date"; + + rename $orig, $dest; +} + +sub create_hook { + my $self = shift; + my $hook = $self->{name}; + + $self->backup_hook; + + open HOOK, "> $hook" or die "failed on opening $hook: $!"; + + my $str = <<EOF; +#! /bin/bash +echo "\$0" "\$@" >>$self->{log_name} +exit $self->{expect_result} +EOF + + print HOOK $str; + close HOOK; + + my $mode = (stat($hook))[2]; + chmod($mode | S_IXUSR, $hook) unless -x $hook; +} + +sub prepare { + my $self = shift; + + $self->create_hooks_dir; + $self->backup_hook; + $self->create_hook; + + unlink $self->{log_name} if -f $self->{log_name}; + + return $self; +} + +sub cleanup { + my $self = shift; + my $name = $self->{name}; + + unlink $name; + unlink $self->{log_name} if -f $self->{log_name}; +} + +sub service_libvirtd { + my $self = shift; + my $action = $self->{action}; + + truncate $self->{log_name}, 0 if -f $self->{log_name}; + + die "failed on $action daemon" if system "service libvirtd $action"; + + $self->libvirtd_status; +} + +sub compare_log { + my $self = shift; + + my $expect_log = $self->{expect_log}; + my $log_name = $self->{log_name}; + + open LOG, "< $log_name" or die "failed on opening $log_name: $!"; + + my @lines = <LOG>; + + return 0 unless @lines; + + chomp foreach @lines; + my $actual_log = join "\n", @lines; + + close LOG; + + ($expect_log eq $actual_log) ? 1 : 0; +} + +1; -- 1.7.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list