2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-22 15:48:14 +00:00
Files
2026-10-17 02:57:05 -03:00

92 lines
3.9 KiB
Perl

package XCAT::Test::RPM;
use strict;
use warnings;
use parent 'XCAT::Test::Lifecycle';
use Carp qw(croak);
use File::Basename qw(basename);
use File::Copy qw(copy);
use File::Path qw(make_path);
use File::Temp qw(tempdir);
use XCAT::Test::File qw(repo_path slurp_repo_file);
use lib repo_path('build-utils/lib');
use XCAT::BuildUtils qw(stage_xcatsn_templates);
sub build {
my ($class, $package, $release, @defines) = @_;
my $top = tempdir(CLEANUP => 1);
make_path("$top/SOURCES");
my $version = slurp_repo_file('Version');
chomp $version;
XCAT::Test::Lifecycle::checked('tar', '-czf', "$top/SOURCES/$package-$version.tar.gz",
'-C', repo_path('.'), $package);
if ($package eq 'xCAT-genesis-scripts') {
XCAT::Test::Lifecycle::checked('tar', '-cjf', "$top/SOURCES/$package.tar.bz2",
'-C', repo_path('.'), $package);
}
if ($package eq 'xCAT' || $package eq 'xCATsn') {
for my $source (glob(repo_path('xCAT/*.lua')), glob(repo_path('xCAT/*.sh'))) {
copy($source, "$top/SOURCES/" . basename($source)) or croak "copy $source: $!";
}
XCAT::Test::Lifecycle::checked('/bin/sh', repo_path('build-utils/sync-xcat-apache-configs'), '--stage', "$top/SOURCES");
stage_xcatsn_templates(repo_path('.'), "$top/SOURCES", 0);
XCAT::Test::Lifecycle::checked('tar', '-czf', "$top/SOURCES/etc.tar.gz", '-C', repo_path('xCAT'), 'etc');
if ($package eq 'xCAT') {
XCAT::Test::Lifecycle::checked('tar', '--exclude', 'upflag', '-czf', "$top/SOURCES/postscripts.tar.gz",
'-C', repo_path('xCAT'), 'postscripts', 'LICENSE.html');
for my $source (qw(prescripts winpostscripts)) {
XCAT::Test::Lifecycle::checked('tar', '-czf', "$top/SOURCES/$source.tar.gz", '-C', repo_path('xCAT'), $source);
}
copy(repo_path('xCAT/xCATMN'), "$top/SOURCES/xCATMN") or die "copy xCATMN: $!";
} else {
XCAT::Test::Lifecycle::checked('tar', '-czf', "$top/SOURCES/license.tar.gz", '-C', repo_path('xCATsn'), 'LICENSE.html');
copy(repo_path('xCATsn/xCATSN'), "$top/SOURCES/xCATSN") or die "copy xCATSN: $!";
}
}
XCAT::Test::Lifecycle::checked('rpmbuild', '-bb', '--nodeps',
'--define', "_topdir $top", '--define', "version $version",
'--define', "release $release", @defines, repo_path("$package/$package.spec"));
my @rpms = glob "$top/RPMS/*/*.rpm";
die "Expected one $package RPM, found @rpms" unless @rpms == 1;
return $rpms[0];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new;
make_path(map { $self->path("/etc/rc.d/rc$_.d") } 0..6);
make_path($self->path('/etc/rc.d/init.d'));
unless ($options{init_directory}) {
rmdir $self->path('/etc/init.d') or die "rmdir init.d: $!";
symlink('rc.d/init.d', $self->path('/etc/init.d')) or die "symlink: $!";
}
for my $level (0..6) {
symlink("rc.d/rc$level.d", $self->path("/etc/rc$level.d")) or die "symlink: $!";
}
my $sysimage = $self->path('/usr/lib/sysimage');
unlink($sysimage) or die "unlink sysimage link: $!" if -l $sysimage;
make_path("$sysimage/rpm");
my ($status, $out, $err) = $self->run('rpm', '--initdb');
die "Initializing RPM database failed: $out$err" if $status;
return $self;
}
sub build_fixture {
my ($class, $name, @defines) = @_;
my $top = tempdir(CLEANUP => 1);
XCAT::Test::Lifecycle::checked('rpmbuild', '-bb', '--define', "_topdir $top",
'--define', 'xcat_source ' . repo_path('.'), @defines,
repo_path("xCAT-test/fixtures/package-lifecycle/$name.spec"));
my @rpms = glob "$top/RPMS/*/*.rpm";
die 'Expected one fixture RPM' unless @rpms == 1;
return $rpms[0];
}
sub install {
my ($self, $rpm, @options) = @_;
copy($rpm, $self->path('/tmp/package.rpm')) or die "copy RPM: $!";
return $self->run('rpm', '--nodeps', '-U', @options, '/tmp/package.rpm');
}
1;