2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-21 07:08:12 +00:00
Files
2026-10-13 11:39:40 -03:00

101 lines
4.8 KiB
Perl

#!/usr/bin/env perl
use strict;
use warnings;
use File::Temp qw(tempdir);
use FindBin;
use lib "$FindBin::Bin/../lib";
use Test::More;
use XCAT::Test::File qw(repo_path);
use XCAT::Test::Package qw(run_in);
plan skip_all => 'requires Linux RPM tooling' unless $^O eq 'linux';
local %ENV = (%ENV, HOME => tempdir(CLEANUP => 1));
delete @ENV{qw(pcm fsm s390x)};
my @platforms = (
['EL7', 'rhel 7', 0], ['EL8', 'rhel 8', 1], ['EL9', 'rhel 9', 1],
['EL10', 'rhel 10', 1], ['Fedora', 'fedora 44', 1],
['SLES12', 'suse_version 1315', 0], ['SLES15', 'suse_version 1500', 1],
['openEuler', 'openEuler 2', 0],
);
my @images = map { "xCAT-genesis-openembedded-$_" } qw(x86_64 ppc64le riscv64 s390x);
my %legacy = (x86_64 => 'x86_64', ppc64le => 'ppc64', aarch64 => 'aarch64');
for my $platform (@platforms) {
my ($name, $macro, $weak) = @$platform;
for my $arch (qw(x86_64 ppc64le aarch64 riscv64 s390x)) {
for my $pkg (qw(xCAT xCATsn)) {
my $requires = query($pkg, $arch, $macro, '--requires');
my $recommends = query($pkg, $arch, $macro, '--recommends');
unlike($requires, qr/xCAT-genesis-openembedded-/, "$name $arch $pkg never requires optional images");
my @actual = sort grep { /^xCAT-genesis-openembedded-/ } split /\n/, $recommends;
is_deeply(\@actual, $weak ? [sort @images] : [], "$name $arch $pkg optional image recommendations");
my @scripts = grep { /^xCAT-genesis-scripts-/ } split /\n/, $requires;
is_deeply(\@scripts, $legacy{$arch}
? ["xCAT-genesis-scripts-$legacy{$arch} = 1:9.9.9-1"] : [],
"$name $arch $pkg required legacy Genesis scripts");
if ($arch eq 'riscv64') {
like($requires, $pkg eq 'xCAT' ? qr/^ipmitool-xcat >= 1\.8\.18-4$/m : qr/^ipmitool-xcat >= 1\.8\.17-1$/m,
"$name $pkg RISC-V IPMI dependency");
unlike($requires, qr/xCAT-genesis-scripts-|xnba-undi|syslinux-xcat|elilo-xcat|%\{/,
"$name $pkg RISC-V has no unavailable legacy payload or unresolved macro");
}
}
}
for my $s390 (0, 1) {
local $ENV{s390x} = $s390;
my $requires = query('xCAT-server', 'x86_64', $macro, '--requires');
like($requires, qr/^perl\(Digest::SHA\)$/m, "$name server s390x=$s390 requires Digest::SHA");
next if $s390;
my $recommends = query('xCAT-server', 'x86_64', $macro, '--recommends');
is(scalar(grep { $_ eq 'perl-DB_File' } split /\n/, $requires), $name eq 'EL10' ? 0 : 1,
"$name server hard DB_File dependency");
is(scalar(grep { $_ eq 'perl-DB_File' } split /\n/, $recommends), $name eq 'EL10' ? 1 : 0,
"$name server weak DB_File dependency");
like($requires, qr/^\Q$_\E$/m, "$name server keeps $_")
for qw(perl-Net-Telnet perl-Net-DNS perl-Crypt-CBC perl-Crypt-Rijndael);
}
}
for my $platform (@platforms) {
my ($name, $macro) = @$platform;
my ($rc, $filter, $err) = run_in(repo_path('.'), 'python3', '-c', <<'PY', repo_path('xCAT-server/xCAT-server.spec'), $macro);
import rpm, sys
for name in ('rhel', 'fedora', 'suse_version', 'openEuler'):
rpm.delMacro(name)
name, value = sys.argv[2].split()
rpm.addMacro(name, value)
rpm.addMacro('version', '9.9.9')
rpm.addMacro('release', '1')
rpm.addMacro('__requires_exclude', '^retained$')
rpm.spec(sys.argv[1])
print(rpm.expandMacro('%{?__requires_exclude}'))
PY
is($rc, 0, "$name parses server dependency generator policy") or die($err);
chomp $filter;
ok('retained' =~ /$filter/, "$name keeps an inherited dependency filter");
is('perl(DB_File)' =~ /$filter/ ? 1 : 0, $name eq 'EL10' ? 1 : 0,
"$name automatic DB_File dependency exclusion");
unlike('perl(Digest::SHA)', qr/$filter/, "$name keeps automatic Digest::SHA dependencies");
}
for my $case (['Linux', 'rhel 8', 'iproute'], ['SUSE', 'suse_version 1500', 'iproute2']) {
my ($name, $macro, $provider) = @$case;
my $requires = query('xCAT-probe', 'x86_64', $macro, '--requires');
my @providers = grep { /^iproute2?$/ } split /\n/, $requires;
is_deeply(\@providers, [$provider], "$name probe socket tool provider");
}
done_testing();
sub query {
my ($package, $arch, $macro, $relation) = @_;
my $format = $relation eq '--requires'
? '[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]'
: '[%{RECOMMENDNAME}\n]';
my ($rc, $out, $err) = run_in(repo_path('.'), 'rpmspec', '-q', '--target', $arch,
(map { ('--undefine', $_) } qw(rhel fedora suse_version openEuler)),
'--define', $macro, '--define', 'version 9.9.9', '--define', 'release 1',
'--qf', $format, repo_path("$package/$package.spec"));
die("$package $arch $macro: $err") if $rc;
$out =~ s/[^\S\n]+$//mg;
return $out;
}