network/tests/tasks/create_test_interfaces_with_dhcp.yml
Rich Megginson 39ac91d9af refactor: handle INJECT_FACTS_AS_VARS=false by using ansible_facts instead
Ansible 2.20 has deprecated the use of Ansible facts as variables.  For
example, `ansible_distribution` is now deprecated in favor of
`ansible_facts["distribution"]`.  This is due to making the default
setting `INJECT_FACTS_AS_VARS=false`.  For now, this will create WARNING
messages, but in Ansible 2.24 it will be an error.

See https://docs.ansible.com/projects/ansible/latest/porting_guides/porting_guide_core_2.20.html#inject-facts-as-vars

Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2026-01-07 18:43:15 -05:00

145 lines
5.5 KiB
YAML

# SPDX-License-Identifier: BSD-3-Clause
---
- name: Install dnsmasq
package:
name: dnsmasq
state: present
use: "{{ (__network_is_ostree | d(false)) |
ternary('ansible.posix.rhel_rpm_ostree', omit) }}"
register: __install_status
# sometimes the rpm download returns a 403 - I think it is when too
# many parallel jobs attempt the download from the same controller in
# too short a period of time, so the server throttles additional
# downloads - use a retry here to mitigate
until: __install_status is success
retries: 6
delay: 10
- name: Install pgrep, sysctl
package:
name: procps
state: present
use: "{{ (__network_is_ostree | d(false)) |
ternary('ansible.posix.rhel_rpm_ostree', omit) }}"
when:
- ansible_facts['os_family'] == 'RedHat'
- ansible_facts['distribution_major_version'] is version('6', '<=')
- name: Install pgrep, sysctl
package:
name: procps-ng
state: present
use: "{{ (__network_is_ostree | d(false)) |
ternary('ansible.posix.rhel_rpm_ostree', omit) }}"
when:
- ansible_facts['os_family'] == 'RedHat'
- ansible_facts['distribution_major_version'] is version('7', '>=')
- name: Create test interfaces
shell: |
set -euxo pipefail
exec 1>&2
ip link add {{ dhcp_interface1 }} type veth peer name {{ dhcp_interface1 }}p
ip link add {{ dhcp_interface2 }} type veth peer name {{ dhcp_interface2 }}p
if [ -n "$(pgrep NetworkManager)" ];then
nmcli d set {{ dhcp_interface1 }} managed true
nmcli d set {{ dhcp_interface2 }} managed true
# NetworkManager should not manage DHCP server ports
nmcli d set {{ dhcp_interface1 }}p managed false
nmcli d set {{ dhcp_interface2 }}p managed false
fi
ip link set {{ dhcp_interface1 }}p up
ip link set {{ dhcp_interface2 }}p up
# Create the 'testbr' - providing both 10.x ipv4 and 2620:52:0 ipv6 dhcp
ip link add name testbr type bridge forward_delay 0
if [ -n "$(pgrep NetworkManager)" ];then
# NetworkManager should not manage DHCP server ports
nmcli d set testbr managed false
fi
ip link set testbr up
timer=0
# The while loop following is a workaround for the NM bug, which can be
# tracked in https://bugzilla.redhat.com/show_bug.cgi?id=2079642
while ! ip addr show testbr | grep -q 'inet [1-9]'
do
let "timer+=1"
if [ $timer -eq 30 ]; then
echo ERROR - could not add testbr
ip addr
exit 1
fi
sleep 1
rc=0
ip addr add 192.0.2.1/24 dev testbr || rc="$?"
if [ "$rc" != 0 ]; then
echo NOTICE - could not add testbr - error code "$rc"
continue
fi
ip -6 addr add 2001:DB8::1/32 dev testbr || rc="$?"
if [ "$rc" != 0 ]; then
echo NOTICE - could not add testbr - error code "$rc"
continue
fi
done
if grep 'release 6' /etc/redhat-release; then
# We need bridge-utils and radvd only in rhel6
if ! rpm -q --quiet radvd; then yum -y install radvd; fi
if ! rpm -q --quiet bridge-utils; then yum -y install bridge-utils; fi
# We need to add iptables rule to allow dhcp request
iptables -I INPUT -i testbr -p udp --dport 67:68 --sport 67:68 -j ACCEPT
# Add {{ dhcp_interface1 }}, {{ dhcp_interface2 }} peers into the testbr
brctl addif testbr {{ dhcp_interface1 }}p
brctl addif testbr {{ dhcp_interface2 }}p
# in RHEL6 /run is not present
mkdir -p /run
# and dnsmasq does not support ipv6
dnsmasq \
--pid-file=/run/dhcp_testbr.pid \
--dhcp-leasefile=/run/dhcp_testbr.lease \
--dhcp-range=192.0.2.1,192.0.2.254,240 \
--interface=testbr --bind-interfaces
# start radvd for ipv6
echo 'interface testbr {' > /etc/radvd.conf
echo ' AdvSendAdvert on;' >> /etc/radvd.conf
echo ' prefix 2001:DB8::/64 { ' >> /etc/radvd.conf
echo ' AdvOnLink on; }; ' >> /etc/radvd.conf
echo ' }; ' >> /etc/radvd.conf
# enable ipv6 forwarding
sysctl -w net.ipv6.conf.all.forwarding=1
service radvd restart
else
ip link set {{ dhcp_interface1 }}p master testbr
ip link set {{ dhcp_interface2 }}p master testbr
# Run joint DHCP4/DHCP6 server with RA enabled in veth namespace
if systemctl is-active firewalld; then
for service in dhcp dhcpv6 dhcpv6-client; do
if ! firewall-cmd --query-service="$service"; then
firewall-cmd --add-service "$service"
fi
done
fi
# NOTE: When running tests with a qemu managed node, the dhcp
# used by qemu interferes with the dhcp used in the test, which
# can cause the test to hang. Exclude the qemu interfaces from
# using the test dhcp. Note that this only affects the qemu tests -
# testing farm and other tests with "real" machines will have a
# different mac address - the mac addresses used below are specific
# to qemu virtual devices.
dnsmasq \
--pid-file=/run/dhcp_testbr.pid \
--dhcp-leasefile=/run/dhcp_testbr.lease \
--dhcp-range=192.0.2.1,192.0.2.254,240 \
--dhcp-range=2001:DB8::10,2001:DB8::1FF,slaac,64,240 \
--enable-ra --interface=testbr --bind-interfaces \
--dhcp-host 52:54:00:12:34:56,ignore --dhcp-host 52:54:00:12:34:57,ignore
fi
changed_when: false