mirror of
https://github.com/linux-system-roles/network.git
synced 2026-07-18 17:05:13 +00:00
The NetworkManager in Fedora 33 does not use ifcfg-rh plugin by default,
the CI will fail on Fedora 33 with:
```
TASK [assert that profile 'bond0' is present] **********************************
task path: /tmp/tmpaz9m374e/tests/playbooks/tasks/assert_profile_present.yml:4
fatal: [/cache/fedora-33.qcow2]: FAILED! => {
"assertion": "profile_stat.stat.exists",
"changed": false,
"evaluated_to": false,
"msg": "profile /etc/sysconfig/network-scripts/ifcfg-bond0 does not exist"
}
```
Previously, we are checking the existence of
`/etc/sysconfig/network-scripts/` to determine whether ifcfg-rh plugin
is enabled. This is incorrect on Fedora 33.
The fix is checking the FILENAME[1] used for storing the NetworkManager
connection, the profile is considered as exists when it exists and does
not contains `/run`.
Since we cannot tell which provider we are using, we just check both
initscripts files and NetworkManager connections.
[1]: nmcli -f NAME,FILENAME connection show
Signed-off-by: Gris Ge <fge@redhat.com>
128 lines
3.4 KiB
Python
128 lines
3.4 KiB
Python
# -*- coding: utf-8 -*
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
import logging
|
|
import os
|
|
import pytest
|
|
import subprocess
|
|
import sys
|
|
|
|
try:
|
|
from unittest import mock
|
|
except ImportError:
|
|
import mock
|
|
|
|
parentdir = os.path.normpath(os.path.join(os.path.dirname(__file__), "../../"))
|
|
with mock.patch.object(
|
|
sys,
|
|
"path",
|
|
[parentdir, os.path.join(parentdir, "module_utils/network_lsr")] + sys.path,
|
|
):
|
|
with mock.patch.dict(
|
|
"sys.modules",
|
|
{
|
|
"ansible": mock.Mock(),
|
|
"ansible.module_utils": __import__("module_utils"),
|
|
"ansible.module_utils.basic": mock.Mock(),
|
|
},
|
|
):
|
|
import library.network_connections as nc
|
|
|
|
|
|
class PytestRunEnvironment(nc.RunEnvironment):
|
|
def log(self, connections, idx, severity, msg, **kwargs):
|
|
if severity == nc.LogLevel.ERROR:
|
|
logging.error("Error: {}".format(connections[idx]))
|
|
raise RuntimeError(msg)
|
|
else:
|
|
logging.debug("Log: {}".format(connections[idx]))
|
|
|
|
def run_command(self, argv, encoding=None):
|
|
command = subprocess.Popen(
|
|
argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
|
|
)
|
|
return_code = command.wait()
|
|
out, err = command.communicate()
|
|
return return_code, out.decode("utf-8"), err.decode("utf-8")
|
|
|
|
def _check_mode_changed(self, *args, **kwargs):
|
|
pass
|
|
|
|
|
|
def _configure_network(connections, provider):
|
|
cmd = nc.Cmd.create(
|
|
provider,
|
|
run_env=PytestRunEnvironment(),
|
|
connections_unvalidated=connections,
|
|
connection_validator=nc.ArgValidator_ListConnections(),
|
|
)
|
|
cmd.run()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def provider(request):
|
|
return request.config.getoption("--provider")
|
|
|
|
|
|
@pytest.fixture
|
|
def testnic1():
|
|
veth_name = "testeth"
|
|
try:
|
|
subprocess.call(
|
|
[
|
|
"ip",
|
|
"link",
|
|
"add",
|
|
veth_name,
|
|
"type",
|
|
"veth",
|
|
"peer",
|
|
"name",
|
|
veth_name + "peer",
|
|
],
|
|
close_fds=True,
|
|
)
|
|
yield veth_name
|
|
finally:
|
|
subprocess.call(["ip", "link", "delete", veth_name])
|
|
|
|
|
|
def _get_ip_addresses(interface):
|
|
ip_address = subprocess.check_output(["ip", "address", "show", interface])
|
|
return ip_address.decode("UTF-8")
|
|
|
|
|
|
@pytest.fixture
|
|
def network_lsr_nm_mock():
|
|
with mock.patch.object(
|
|
sys,
|
|
"path",
|
|
[parentdir, os.path.join(parentdir, "module_utils/network_lsr/nm")] + sys.path,
|
|
):
|
|
with mock.patch.dict(
|
|
"sys.modules",
|
|
{
|
|
"ansible": mock.Mock(),
|
|
"ansible.module_utils": __import__("module_utils"),
|
|
"ansible.module_utils.basic": mock.Mock(),
|
|
},
|
|
):
|
|
yield
|
|
|
|
|
|
def test_static_ip_with_ethernet(testnic1, provider, network_lsr_nm_mock):
|
|
ip_address = "192.0.2.127/24"
|
|
connections = [
|
|
{
|
|
"name": testnic1,
|
|
"type": "ethernet",
|
|
"state": "up",
|
|
"ip": {"address": [ip_address]},
|
|
}
|
|
]
|
|
_configure_network(connections, provider)
|
|
assert ip_address in _get_ip_addresses(testnic1)
|
|
if provider == "initscripts":
|
|
assert os.path.exists("/etc/sysconfig/network-scripts/ifcfg-" + testnic1)
|
|
else:
|
|
subprocess.check_call(["nmcli", "connection", "show", testnic1])
|