Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
8.1 KiB
279 lines
8.1 KiB
#!/usr/bin/perl
|
|
|
|
# This file was copied from the smolder distribution and modified.
|
|
# the copyright and license from the original distribution are
|
|
# included below.
|
|
#
|
|
# Copyright (c) 2007, Michael Peters
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
#
|
|
# * Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# * Neither the name of the Smolder nor the names of its
|
|
# contributors may be used to endorse or promote products derived from
|
|
# this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Getopt::Long;
|
|
use Pod::Usage;
|
|
use File::Spec::Functions qw(catdir catfile splitdir);
|
|
use File::Basename;
|
|
|
|
BEGIN {
|
|
eval { require WWW::Mechanize };
|
|
if( $@ ) {
|
|
warn "\nCannot load WWW::Mechanize. " .
|
|
"\nPlease install it before using smolder_smoke_signal.\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
smolder_smoke_signal
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
./bin/smolder_smoke_signal --server smolder.foo.com \
|
|
--username myself --password s3cr3t --file test_report.xml \
|
|
--project MyProject
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Script used to upload a Smoke test report to a running smolder server.
|
|
This is extremely useful for scripted/automatic test runs but also
|
|
helpful when using a CLI makes things faster.
|
|
|
|
=head1 OPTIONS
|
|
|
|
=head2 REQUIRED
|
|
|
|
=over
|
|
|
|
=item server
|
|
|
|
This is the hostname (and port if not 80) of the running Smolder server.
|
|
|
|
=item project
|
|
|
|
The name of the Smolder project to use for the upload.
|
|
|
|
=item file
|
|
|
|
The name of the file to upload. Please see F<docs/upload_file_format.pod>
|
|
for more details about the format that Smolder expects this file to
|
|
take.
|
|
|
|
=back
|
|
|
|
=head2 OPTIONAL
|
|
|
|
=over
|
|
|
|
=item username
|
|
|
|
The name of the Smolder user to use for the upload.
|
|
|
|
=item password
|
|
|
|
The password for the Smolder user given by C<username>.
|
|
|
|
=item anonymous
|
|
|
|
This option takes no arguments and indicates that the report should be
|
|
submitted anonymously to a public project. Either the anonymous option
|
|
is required or C<username> and C<password> are required.
|
|
|
|
=item architecture
|
|
|
|
The architecture for the given smoke test run. If none is given
|
|
it will use the default architecture for the project.
|
|
|
|
=item platform
|
|
|
|
The platform for the given smoke test run. If none is given
|
|
it will use the default platform for the project.
|
|
|
|
=item tags
|
|
|
|
A comma separated list of tags that are given for this smoke report run.
|
|
|
|
./bin/smolder_smoke_signal --server smolder.foo.com \
|
|
--username myself --password s3cr3t --file test_report.xml \
|
|
--project MyProject --tags "Foo, My Bar"
|
|
|
|
=item comments
|
|
|
|
Any comments that you want to associate with the smoke test run.
|
|
|
|
=item verbose
|
|
|
|
Print verbose output of our actions to STDOUT.
|
|
|
|
=cut
|
|
|
|
# default options
|
|
our ( $server, $project, $user, $pw, $anonymous, $file, $arch, $platform, $tags, $comments, $verbose );
|
|
my ( $help, $man );
|
|
|
|
GetOptions(
|
|
'server=s' => \$server,
|
|
'project=s' => \$project,
|
|
'username=s' => \$user,
|
|
'password=s' => \$pw,
|
|
'anonymous' => \$anonymous,
|
|
'file=s' => \$file,
|
|
'architecture=s' => \$arch,
|
|
'platform=s' => \$platform,
|
|
'tags=s' => \$tags,
|
|
'comments=s' => \$comments,
|
|
'verbose!' => \$verbose,
|
|
'help' => \$help,
|
|
'man' => \$man,
|
|
)
|
|
|| pod2usage();
|
|
|
|
if ($help) {
|
|
pod2usage(
|
|
-exitval => 0,
|
|
-verbose => 1,
|
|
);
|
|
} elsif ($man) {
|
|
pod2usage(
|
|
-exitval => 0,
|
|
-verbose => 2,
|
|
);
|
|
}
|
|
|
|
# make sure all the required fields are there
|
|
_missing_required('server') unless $server;
|
|
_missing_required('project') unless $project;
|
|
_missing_required('username') unless $user or $anonymous;
|
|
_missing_required('password') unless $pw or $anonymous;
|
|
_missing_required('file') unless $file;
|
|
|
|
# make sure our file is there and is of the right type
|
|
if ( -r $file ) {
|
|
unless( $file =~ /\.tar(\.gz)?$/ ) {
|
|
warn "File '$file' is not of the correct type!\n";
|
|
exit(1);
|
|
}
|
|
} else {
|
|
warn "File '$file' does not exist, or is not readable!\n";
|
|
exit(1);
|
|
}
|
|
|
|
# try and reach the smolder server
|
|
print "Trying to reach Smolder server at $server.\n" if ($verbose);
|
|
my $mech = WWW::Mechanize->new();
|
|
my $base_url = "http://$server/app";
|
|
$mech->get($base_url);
|
|
unless ( $mech->status eq '200' ) {
|
|
warn "Could not reach $server successfully. Received status " . $mech->status . "\n";
|
|
exit(1);
|
|
}
|
|
|
|
my $content; # holds the content of the current page from $mech
|
|
if ( $user ) {
|
|
# now login
|
|
print "Trying to login with username '$user'.\n" if ($verbose);
|
|
$mech->get( $base_url . '/public_auth/login' );
|
|
my $form = $mech->form_name('login');
|
|
if ( $mech->status ne '200' || !$form ) {
|
|
warn "Could not reach Smolder login form. Are you sure $server is a Smolder server?\n";
|
|
exit(1);
|
|
}
|
|
$mech->set_fields(
|
|
username => $user,
|
|
password => $pw,
|
|
);
|
|
$mech->submit();
|
|
$content = $mech->content;
|
|
if ( $mech->status ne '200' || $content !~ /Welcome \Q$user\E/ ) {
|
|
warn "Could not login with username '$user' and password '$pw'!\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
# now go to this project's page
|
|
printf( "Retrieving project listing for %s\n", $user ? "user '$user'" : 'anonymous' ) if ($verbose);
|
|
$mech->get( $base_url . _url_base() );
|
|
$content = $mech->content;
|
|
$content =~ />\Q$project\E<!--ID:(\d+)-->/;
|
|
my $project_id = $1;
|
|
if ( $mech->status ne '200' || !$project_id ) {
|
|
warn
|
|
"Could not get your project listing, or you are not a member of the '$project' project!\n";
|
|
exit(1);
|
|
}
|
|
|
|
# now go to the add-smoke-report page for this project
|
|
print "Adding smoke report to project '$project' (id: #$project_id).\n" if ($verbose);
|
|
$mech->get( $base_url . _url_base() . "/add_report/$project_id" );
|
|
$content = $mech->content;
|
|
if ( $mech->status ne '200' || $content !~ /New Smoke Report/ ) {
|
|
warn "Could not reach the Add Smoke Report form!\n";
|
|
exit(1);
|
|
}
|
|
$mech->form_name('add_report');
|
|
my %fields = (report_file => $file);
|
|
$fields{platform} = $platform if ($platform);
|
|
$fields{architecture} = $arch if ($arch);
|
|
$fields{tags} = $tags if ($tags);
|
|
$fields{comments} = $comments if ($comments);
|
|
$mech->set_fields(%fields);
|
|
$mech->submit();
|
|
|
|
$content = $mech->content;
|
|
if ( $mech->status ne '200' || $content !~ /Recent Smoke Reports/ ) {
|
|
warn "Could not upload smoke report with the given information!\n";
|
|
exit(1);
|
|
}
|
|
$content =~ /#(\d+) Added/;
|
|
my $report_id = $1;
|
|
|
|
print "\nReport successfully uploaded as #$report_id.\n";
|
|
|
|
##########################################################
|
|
# helper methods
|
|
##########################################################
|
|
sub _missing_required {
|
|
my $field = shift;
|
|
warn "Missing required field '$field'!\n";
|
|
pod2usage();
|
|
}
|
|
|
|
# returns the piece of the URL that points to the appropriate part of
|
|
# the URL structure based on whether this is an anonymous submission
|
|
sub _url_base {
|
|
if ( $anonymous ) {
|
|
return '/public_projects';
|
|
} else {
|
|
return '/developer_projects';
|
|
}
|
|
}
|
|
|