Commit graph

574 commits

Author SHA1 Message Date
Rich Megginson
867482d35b replace ini_file with yum/dnf
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>
2021-09-16 08:39:37 -06:00
Rich Megginson
81248c01c4 use apt-get install -y
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2021-09-15 16:17:55 -06:00
Rich Megginson
9ce48eb05a replace json_query with selectattr
In order to work with ansible-core, json_query is replaced
with selectattr.

Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2021-09-14 07:49:16 -06:00
Rich Megginson
fca9ca5f36 use tox-lsr 2.5.1
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2021-09-13 09:58:18 -06:00
Thomas Haller
7a1683848c arg_validator: make ArgValidator.DEFAULT the default for dictionary's default value
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
63ddf64a41 arg_validator: use DEFAULT argument to generate default value for dictionaries
The previous solution was ugly, as it hacked the private
self._default_value of the parent.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2021-08-26 16:30:09 +08:00
Thomas Haller
e01e550c59 arg_validator: support generating default value for ArgValidatorDict
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
e0a1b6af68 arg_validator: make ArgValidatorDeprecated a subclass of ArgValidator
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
a262c77c26 arg_validator: expect ArgValidatorDeprecated.deprecated_by setting to be valid
"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>
2021-08-26 16:30:09 +08:00
Thomas Haller
72319a1294 arg_validator: call get_default_value() for getting the default value
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
8a00e7fab2 arg_validator: rename "default_value" field to "_default_value"
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
4afa81cdd0 arg_validator: rename ArgValidator.DEFAULT_SENTINEL to DEFAULT
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>
2021-08-26 16:30:09 +08:00
Thomas Haller
03833e8ac2 arg_validator: drop wrong default value for ArgValidatorIPRoute
The parameter is not used (neither by callers not the implementation).
It also makes not sense.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2021-08-26 16:30:09 +08:00
Thomas Haller
6e53bcf65f arg_validator: drop wrong default value for ArgValidatorIPAddr
The parameter is not used (neither by callers not the implementation).
It also makes not sense.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2021-08-26 16:30:09 +08:00
Wen Liang
647080eade CHANGELOG: update changelog for 1.4.0 release
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
2021-08-12 11:21:26 -04:00
Sergei Petrosian
133672663d Drop support for Ansible 2.8 by bumping the Ansible version to 2.9
Bug 1989197 - drop support for Ansible 2.8
https://bugzilla.redhat.com/show_bug.cgi?id=1989197

Signed-off-by: Sergei Petrosian <spetrosi@redhat.com>
2021-08-12 17:08:05 +08:00
Wen Liang
a2af42d0f2 wifi: Add Simultaneous Authentication of Equals(SAE) support
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>
2021-08-09 09:59:22 +08:00
Wen Liang
b08a0b3748 Disable initscripts tests in rhel-9
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>
2021-07-29 16:44:44 -04:00
Wen Liang
0bfd29c029 Include task 'el_repo_setup.yml' for initscripts provider
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>
2021-07-29 16:44:44 -04:00
Wen Liang
529ca94b81 fix: move ethtool features tests into NM_CONDITIONAL_TESTS
Because ethtool features tests also support initscripts provider, move
ethtool features tests into NM_CONDITIONAL_TESTS.

Signed-off-by: Wen Liang <liangwen12year@gmail.com>
2021-07-29 16:44:44 -04:00
Gris Ge
0cc8e46dc8 CI: Fix the correct container image name.
Prefer pre-existing https://quay.io/organization/linux-system-roles over
newly created https://quay.io/organization/linux_system_roles one.

Signed-off-by: Gris Ge <fge@redhat.com>
2021-07-29 11:50:11 +08:00
Gris Ge
95924e05f5 test: Restore the resolv.conf for bond dhcp test
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>
2021-07-29 10:17:51 +08:00
Rich Megginson
4b7f5d51fc fix yamllint issue - indentation
Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2021-07-29 00:40:40 +08:00
Rich Megginson
0fcce91919 should not have removed epel setup from 802 tests
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>
2021-07-29 00:40:40 +08:00
Gris Ge
daac665933 CI: Enable integration test in Github Action
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>
2021-07-28 19:50:09 +08:00
Gris Ge
c1ad6925b7 test: Fix the bond test on DHCP
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>
2021-07-28 19:50:09 +08:00
Rich Megginson
b4584c88a8 Skip tests on RHEL9 that use hostapd
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>
2021-07-28 13:44:48 +08:00
Wen Liang
e10919ec62 fix: pytest not reproducible in RHEL8
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>
2021-07-22 21:23:09 +08:00
Thomas Haller
a9f9c04a0b connections: workaround DeprecationWarning for NM.SettingEthtool.set_feature()
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)
2021-07-20 15:54:45 +08:00
Noriko Hosoi
1f25fbb4fc EPEL yum repository configuration for tests
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>
2021-07-16 06:11:05 +08:00
Gris Ge
245ff58e25 nm: Fix the incorrect change indication for dns option
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>
2021-07-05 20:15:57 +08:00
Gris Ge
f538865c68 nm: Fix the incorrect change indication when apply the same config twice
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>
2021-07-05 20:15:57 +08:00
Wen Liang
833b6f3075 fix: dhclient is already running for nm-bond
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>
2021-07-01 22:42:59 +02:00
Kristof Wevers
85b75b6c8c Only show stderr_lines by default
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>
2021-06-11 06:03:23 +08:00
Jack Adolph
b368bce8aa Add 'auto_gateway' option
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>
2021-06-04 07:07:13 +08:00
Jakub Haruda
6fdac168a9 CI: Add support for RHEL-9
Signed-off-by: Jakub Haruda <jharuda@redhat.com>
2021-05-28 06:06:51 +08:00
Wen Liang
a6c98bd660 arg_validator: reject bool arguments from ArgValidatorNum
`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>
2021-05-24 18:51:54 +08:00
Wen Liang
dfacbf72f7 arg_validator: normalize numeric value for ArgValidatorNum
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>
2021-05-24 18:51:54 +08:00
Wen Liang
93e509b533 Fix: support dns_search and dns_options for all address family
`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>
2021-05-24 15:34:52 +08:00
Wen Liang
2444e27cce wifi: Add Opportunistic Wireless Encryption (OWE) support
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>
2021-05-24 10:51:01 +08:00
Wen Liang
ae2d60a0b2 Add support for ETHTOOL Ring option
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>
2021-05-11 18:19:16 +02:00
Wen Liang
13e7f8a333 Support conditional testing for NM provider
- 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>
2021-05-09 07:04:46 +02:00
Wen Liang
1172c9ca85 Fix ethtool coalesce testing CI failures
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>
2021-05-09 07:04:46 +02:00
Rich Megginson
570246bad3 no need for __init__.py in module_utils/
The file module_utils/__init__.py is not needed.

Signed-off-by: Rich Megginson <rmeggins@redhat.com>
2021-05-06 11:15:11 +02:00
Wen Liang
eb023ddfa7 Enable comment support for "NM_ONLY_TESTS"
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>
2021-05-04 08:09:04 +02:00
Rich Megginson
c1b0002bc9 fix python black issues
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>
2021-05-03 18:41:05 +02:00
Thomas Haller
c2e83b1d82 argval: use callable() check in get_default_value()
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>
2021-04-16 12:09:43 +02:00
Thomas Haller
bf9933e482 argval: cleanup default values in ArgValidatorDict._validate_impl()
- 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>
2021-04-16 12:09:43 +02:00
Till Maas
16f1898894 Revert "Add auto update GitHub action"
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>
2021-04-15 21:16:32 +02:00
Wen Liang
4f62185714 Document gateway4 and gateway6 setting in README.md
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
2021-04-15 21:15:54 +02:00