For ansible-core 2.11 compatability, replace the use of `ini_file`
with the yum/dnf config-manager command
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
The most used default value for ArgValidatorDict is
ArgValidator.DEFAULT, which means to generate the default value
based on the nested validators.
ArgValidator.DEFAULT is also a better default for the default_value.
Otherwise, it's a bit odd to have (and honor) ArgValidator.DEFAULT, if
that is not in fact the default default_value.
Signed-off-by: Thomas Haller <thaller@redhat.com>
Some dictionaries may wish to have a default value that is a dictionary
with the default of all keys.
Add a method to generate this.
This returns a callable instead of a plain dictionary. In practice, the
generated default value should always be the same. However, we also
expect that ArgValidator validation gives a result that is owned by the
caller. In case of mutable values (like a dictionary), we want a deep
clone.
Signed-off-by: Thomas Haller <thaller@redhat.com>
ArgValidatorDeprecated is used as a nested validator, it also should
subtype ArgValidator base class. Technially, in python you can do duck
typing and get away with a different class that merely behaves
sufficiently similar. But why?
That way, we also can set default_value=ArgValidator.MISSING.
As a result, we no longer need to special case ArgValidatorDeprecated
at various places, because the default value will indicate that
it should not be present.
Co-authored-by: Till Maas <opensource@till.name>
Signed-off-by: Thomas Haller <thaller@redhat.com>
"validator.deprecated_by" is user configuration of the validator. It depends on the
setup of the current ArgValidatorDict instance. It would be a bug if the user
references a non-existing validator.
Thus, use dictionary lookup instead of get() and fail early.
The previous code of course also didn't work, because the
returned None value would have led to an exception shortly after.
Signed-off-by: Thomas Haller <thaller@redhat.com>
self._default_value might be a callable, to get the actual default
value, self.get_default_value() must be called.
Signed-off-by: Thomas Haller <thaller@redhat.com>
The name "default_value" is also used as parameter name, which
means that searching the source for the term gives unrelated
results. Rename to give a unique name.
Also, the field is really private and should usually not be called
directly. Instead get_default_value() should be called.
Signed-off-by: Thomas Haller <thaller@redhat.com>
To be consistent with ArgValidator.MISSING, which serves a similar
purpose.
Also, replace the if-else python ternary, which I find hard to read.
Signed-off-by: Thomas Haller <thaller@redhat.com>
Enable WPA3 SAE support via:
```yaml
network_connections:
- name: wlan0
type: wireless
wireless:
ssid: "WIFI_SSID"
key_mgmt: "sae"
password: "p@55w0rD"
```
Integration test case was included for Fedora and CentOS. ( Failed in setting up the
mock wifi on RHEL, so skipped the integration test on RHEL)
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
Since network-scripts package will be dropped in rhel-9, disable all
the initscripts tests in rhel-9.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
To warrant the integration tests succeed when running with initscripts
provider, include task 'el_repo_setup.yml' to enable the base repo
support.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
Because ethtool features tests also support initscripts provider, move
ethtool features tests into NM_CONDITIONAL_TESTS.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
The `tests_bond_initscripts.yml` will leave the VM holding the testing
DNS entry (nameserver 192.0.2.1) which break network connection.
The root cause is initscript will use dhcp-client for bond DHCP testing
which override the /etc/resolv.conf file. After test bond interface been
removed, the initscript will not restore the DNS settings.
The fix is backup the /etc/resolv.conf and restore it on clean up for
initscript provider.
Signed-off-by: Gris Ge <fge@redhat.com>
The commit b4584c88a8 to skip
tests that use hostapd also removed the epel repo setup. This
breaks other platforms that require epel.
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
Using container to run `ansible-playbook` against localhost.
To debug it, try
```bash
sudo DEBUG=1 ./.github/run_test.sh tests_bond_nm.yml
```
Attached two container files for CentOS 8 and CentOS Stream 8.
The container image is stored under quay:
https://quay.io/organization/linux_system_roles
Only a small mount of tests has been chose in order to give stable CI
test feedback.
The github action CI will run two instances using above container image.
Signed-off-by: Gris Ge <fge@redhat.com>
The `tests_bond_nm.yml` test fails at 50% rate due to bond interface
failed to retrieve IP address from DHCP server.
The root cause of this is NetworkManager by default create default
connections for new managed interface which place the DHCP server
interfaces into IPv4.auto method which then prevent DHCP server running
on these ports.
The fix is mark DHCP server ports(veth endpoint and bridge) as
unmanaged before link up.
Signed-off-by: Gris Ge <fge@redhat.com>
The tests expect there is a hostapd package for doing wireless testing,
and that this package comes from EPEL on EL platforms. Since there
is no EPEL9, skip tests that require hostapd.
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
Previously when we run `tests_integration_pytest.yml` in RHEL 8, device
becoming unmanaged and NM `ifup` command failed to bring up the
connection when running pytest with initscripts, because network scripts
are deprecated in RHEL8 and they are no longer provided by default.
To fix that, install `network-scripts` package to utilize the legacy
`ifup` command.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
If present, use the newer API to avoid the deprecation warning:
$ pytest tests/unit/test_network_connections.py -v
...
tests/unit/test_network_connections.py::TestValidator::test_802_1x_1
/data/src/linux-system-roles-network/tests/unit/fake_env/network_connections.py:956: DeprecationWarning: NM.SettingEthtool.set_feature is deprecated
s_ethtool.set_feature(nm_feature, NM.Ternary.DEFAULT)
In tests/tasks/enable_epel.yml, if /etc/yum.repos.d/epel.repo exists
and it is not enabled, it's left disabled. Without the epel enabled,
it fails to install necessary modules such as python-mock, which
makes tests_unit.yml and tests_wireless_nm.yml fail.
This patch adds a task calling ini_file to ensure the repo is always
enabled. See also bz1980439
Signed-off-by: Noriko Hosoi <nhosoi@redhat.com>
When applying with `dhcp4: "no"` or `auto6: "no"`, we get incorrect
change indication even when network connection was not changed.
The root cause is the `NM.SettingIPConfig.clear_dns_options(True)` will
create an empty list which will be discard by ifcfg plugin.
The follow up `NM.Connection.compare()` will show configuration changed
as dns option entry missing.
Fixed by remove dns option completely before appending.
Signed-off-by: Gris Ge <fge@redhat.com>
When applying the same network connections twice, the second apply still
shows `changed: true`.
The root cause:
* When user never asked about ethtool configuration, network-role
will generate an all-default `NM.SettingEthtool` and pass it to
NetworkManager daemon. But NetworkManager discard it when saving to
ifcfg plugin as ifcfg plugin will not keep empty ethtool option.
* During second apply, the `NM.SimpleConnection.compare` will return
False indicating configuration changed because of on-disk connection
has no ethtool setting while pending connection does.
To fix it, we just remove the all-default `NM.SettingEthtool`.
Signed-off-by: Gris Ge <fge@redhat.com>
Running `tests_bond_deprecated_initscripts.yml` and
`tests_bond_initscripts.yml` consecutively will fail in the downstream
testing with error "Determining IP information for nm-bond...dhclient is already running - exiting.".
Because the two tests have the same controller device name and dhclient
will keep running for the controller device `nm-bond`.
A workaround for this bug is to change the controller device name
associated with `tests_bond_deprecated_initscripts.yml`.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
This avoids dumping all the parameters which can cause rather lengthy
output if multiple interfaces, routers, ... are configured.
The previous behaviour where all the params etc were displayed can
still be achieved by adding `-v` to the `ansible-playbook` command.
Resolves: #394
Signed-off-by: Kristof Wevers <kristof.wevers@infura.eu>
If enabled, a default route will be configured using the default gateway. If disabled,
the default route will be removed.
If this variable is not specified, the role will use the default behavior of the
`network_provider` selected.
Setting this option to `no` is equivalent to:
- `DEFROUTE = no` in initscripts, or
- `ipv4.never-default/ipv6.never-default yes` in nmcli
Signed-off-by: Jack Adolph <jack.adolph@gmail.com>
`ArgValidatorNum` would normalize boolean into int when
`self.numeric_type` is int, then `self.numeric_type(False)` is 0 and
`self.numeric_type(True)` is 1. Therefore, we need to fix
`ArgValidatorNum()` to reject boolean values when integer values are
expected for the setting. This bug fix potentially breaks previously
"working" playbooks (but realistically, they were not working, because
setting 0 or 1 was unlikely intended).
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
In python, bool is a subclass of int. Thus,
isinstance(value, self.numeric_type) would be True, with value being a
bool and numeric_type an int.
ArgValidatorNum should normalize the input values to be of type
self.numeric_type, except the default_value, which might be None (or
anything really).
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
`dns_search` and `dns_options` should not be specific to the address
family. Previously, `dns_search` and `dns_options` were only supported
for IPv4 nameservers, so we also need to support `dns_search` and
`dns_options` for IPv6 nameservers.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
Enable WPA3 OWE support via:
```yaml
network_connections:
- name: wlan0
type: wireless
wireless:
ssid: "WIFI_SSID"
key_mgmt: "owe"
```
Integration test case was included for Fedora and CentOS. ( Failed in setting up the
mock wifi on RHEL, so skipped the integration test on RHEL)
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
ETHTOOL Ring option is not supported by NetworkManager until
NM 1.25.2. Currently, ETHTOOL Ring option is not suppored by
Network role, so enable the support for ETHTOOL Ring option.
Configure ethtool ring option via:
```yaml
network_connections:
- name: testnic1
type: ethernet
state: up
ip:
dhcp4: no
auto6: no
ethtool:
ring:
rx: 128
rx_jumbo: 128
rx_mini: 128
tx: 128
```
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
- To properly run tests for features that are supported both in
initscripts and NM but require a specific NM version or other
condition, add a new test category for these tests.
- Use the new test category to enable testing coalesce support with
initscripts
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
To fix the CI failure - "Error: testnic1 - no such connection profile",
when testing ethtool coalesce setting with initscripts provider, bring
up the connection when the connection was created.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
To clearly explain to user why minimum version or extra running
condition is needed for certain "NM_ONLY_TESTS", include additional
comment support.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
There was recently an upgrade to python black which made function
documentation checking stricter. This caused network tox CI to
break. The fix is to format the function doc text in the manner
expected by black.
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
Previously, we would catch any kind of exception. We only want
to suppress an error if the default value is not a callable
(but instead a plain value).
Usually, in python they say it's easier to ask for forgiveness
than permission. However, that is often not true (the code here
this case becomes simpler, not more complicated). But more important,
in this case we only get a TypeError, which doesn't exactly tell
us what is wrong. We want to only suppress the error, if the
instance is not callable.
Signed-off-by: Thomas Haller <thaller@redhat.com>
- split the "if" block in two. It's easier to read to only
have one condition and to think about them independently.
- check "self.all_missing_during_validate" before getting the
default value.
Signed-off-by: Thomas Haller <thaller@redhat.com>
The auto update is creating merge commits instead of rebasing, therefore
it is not the right choice.
This reverts commit 81a602dd71.
Signed-off-by: Till Maas <opensource@till.name>