1
0
mirror of https://pagure.io/fedora-qa/os-autoinst-distri-fedora.git synced 2024-12-22 10:23:09 +00:00
os-autoinst-distri-fedora/lib/tapnet.pm
Adam Williamson a5433c823d Quick fix for get_host_dns when resolv.conf points to resolved
The Fedora infra workers got changed so their resolv.conf doesn't
have the correct DNS server addresses in it any more, it just
has 127.0.0.53 (the systemd-resolved resolver address). We need
to query resolved to get the correct addresses.

This is quick and hacky; it doesn't accommodate anyone running
a worker host that *isn't* using resolved, and it doesn't handle
IPv6 server addresses correctly if any are present (in infra we
currently don't use any on the worker hosts). I'll try and find
time to refine it but need to deploy this for now to make the
tests pass again.

Signed-off-by: Adam Williamson <awilliam@redhat.com>
2022-05-18 18:05:26 -07:00

72 lines
2.3 KiB
Perl

package tapnet;
use strict;
use base 'Exporter';
use Exporter;
use testapi;
our @EXPORT = qw/clone_host_file setup_tap_static get_host_dns/;
sub clone_host_file {
# copy a given file from the host into the guest. Mainly used
# for networking config on tap tests. this is pretty crazy, but
# SUSE do almost the same thing...
my $file = shift;
my $text = '';
open(my $fh, '<', $file);
while (<$fh>) {
$text .= $_;
}
# escape any " characters in the text...
$text =~ s/"/\\"/g;
assert_script_run "printf \"$text\" > $file";
# for debugging...
assert_script_run "cat $file";
}
sub setup_tap_static {
# this is a common thing for tap tests, where we set up networking
# for the system with a static IP address and possibly a specific
# hostname
my $ip = shift;
my $hostname = shift || "";
if ($hostname) {
# assigning output of split to a single-item array gives us just
# the first split
my ($short) = split(/\./, $hostname);
# set hostname
assert_script_run "hostnamectl set-hostname $hostname";
# add entry to /etc/hosts
assert_script_run "echo '$ip $hostname $short' >> /etc/hosts";
}
# use host's name servers (this is usually going to be correct,
# tests which don't want this can overwrite resolv.conf)
my @dns = get_host_dns();
my $dnstext = 'ipv4.dns "' . join(", ", @dns) . '"';
# bring up network
# this gets us the name of the first connection in the list,
# which should be what we want
my $connection = script_output "nmcli --fields NAME con show | head -2 | tail -1";
assert_script_run "nmcli con mod '$connection' ipv4.method manual ipv4.addr $ip/24 ipv4.gateway 172.16.2.2 $dnstext";
assert_script_run "nmcli con down '$connection'";
assert_script_run "nmcli con up '$connection'";
# for debugging
assert_script_run "nmcli -t con show '$connection'";
}
sub get_host_dns {
# get DNS server addresses from the host. Assumes host uses
# systemd-resolved and doesn't use IPv6, for now
my @forwards;
my $result = `/usr/bin/resolvectl status | grep Servers | tail -1 | cut -d: -f2-`;
# FIXME this is gonna break when we have IPv6 DNS servers on the
# worker hosts
my @forwards = split(' ', $result);
return @forwards;
}
1;
# vim: set sw=4 et: