Skip to content

Commit

Permalink
fix: Use tuned files instead of using it as a module
Browse files Browse the repository at this point in the history
The previous version of the kernel_settings role used `tuned` as
a python library, and had a `kernel_settings` module which was a
wrapper around this code.  However, `tuned` version 2.23 has changed
its internal API and it is no longer possible to use it as a python
library.  Instead, the kernel_settings role has been refactored to
read/write `tuned` config files, and let the `tuned` daemon manage
the settings.

In addition, `tuned` 2.23 changed the location of the profile directory,
so the kernel_settings role will now determine the location of the
profile directory depending on the `tuned` version.

The old `kernel_settings` module is removed, along with all of the
python unit testing code.

A new `kernel_settings_get_config` module has been created which will
simply parse and return the given config file as a `dict`.

Signed-off-by: Rich Megginson <[email protected]>
  • Loading branch information
richm committed Aug 9, 2024
1 parent c3bffe4 commit 7abfaf2
Show file tree
Hide file tree
Showing 38 changed files with 739 additions and 2,217 deletions.
6 changes: 0 additions & 6 deletions .github/config/ubuntu-requirements.txt

This file was deleted.

2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.10.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.11.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.12.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.13.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.14.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.15.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.16.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.17.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
2 changes: 1 addition & 1 deletion .sanity-ansible-ignore-2.9.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
plugins/modules/kernel_settings.py validate-modules:missing-gplv3-license
plugins/modules/kernel_settings_get_config.py validate-modules:missing-gplv3-license
3 changes: 0 additions & 3 deletions ansible_pytest_extra_requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# SPDX-License-Identifier: MIT

# ansible and dependencies for all supported platforms
ansible ; python_version > "2.6"
idna<2.8 ; python_version < "2.7"
PyYAML<5.1 ; python_version < "2.7"
115 changes: 0 additions & 115 deletions contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,118 +19,3 @@ are likely to be suitable for new contributors!

**Code** is managed on [Github](https://github.com/linux-system-roles/kernel_settings), using
[Pull Requests](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests).

## Python Code

The Python code needs to be **compatible with the Python versions supported by
the role platform**.

For example, see [meta](https://github.com/linux-system-roles/kernel_settings/blob/main/meta/main.yml)
for the platforms supported by the role.

If the role provides Ansible modules (code in `library/` or `module_utils/`) -
these run on the *managed* node, and typically[1] use the default system python:

* EL6 - python 2.6
* EL7 - python 2.7 or python 3.6 in some cases
* EL8 - python 3.6
* EL9 - python 3.9

If the role provides some other sort of Ansible plugin such as a filter, test,
etc. - these run on the *control* node and typically use whatever version of
python that Ansible uses, which in many cases is *not* the system python, and
may be a modularity release such as python311.

In general, it is a good idea to ensure the role python code works on all
versions of python supported by `tox-lsr` from py36 on, and on py27 if the role
supports EL7, and on py26 if the role supports EL6.[1]

[1] Advanced users may set
[ansible_python_interpreter](https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#term-ansible_python_interpreter)
to use a non-system python on the managed node, so it is a good idea to ensure
your code has broad python version compatibility, and do not assume your code
will only ever be run with the default system python.

## Testing kernel_settings modules

It is recommended to use `tox` to set up your `virtualenv` for
development/testing purposes:

```bash
dnf/yum install python-tox
tox -e py38
```

You can also use the virtualenv created by `tox` just like any
other virtualenv created by `python-virtualenv`:

```bash
. .tox/env-py38/bin/activate
python
>>> import package.that.only.exists.in.venv
```

The unit tests and other tests are run by default when you use `tox` by itself
or `tox -e py38` for a specific python versioned environment. Note that other
operating system packages may be required to be installed in order for `tox`
to use `pip` to install python dependencies e.g. for python packages which
have native components.

I would also strongly encourage you to use an IDE for development. For example,
Visual Studio code python extension auto-discovers tests and allows you to
run and debug unit tests. However, you may need to create a `.env` file like
this, in order for code navigation, auto-completion, and test discovery to
work correctly:

```bash
PYTHONPATH=/full/path/to/tuned:/full/path/to/linux-system-roles/kernel_settings/library
```

### Testing the module

[Ansible Module Development Guide](https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html)

Using a tox python virtualenv from the `kernel_settings` directory:

```bash
. .tox/env-py38/bin/activate
TESTING=true [TEST_PROFILE=kernel_settings] python \
library/kernel_settings.py args.json
```

looks for test profiles under `tests/tuned/etc/tuned`

to run the code in the debugger:

```bash
TESTING=true [TEST_PROFILE=kernel_settings] python -mpdb \
library/kernel_settings.py args.json
```

Where `args.json` looks like this:

```json
{
"ANSIBLE_MODULE_ARGS": {
"name": "kernel_settings",
"sysctl": [
{"name": "fs.inotify.max_user_watches", "value": 524288},
{"name": "kernel.threads-max", "value": 30001}
],
"sysfs": [
{"name": "/sys/kernel/kexec_crash_size", "value": 337641472}
],
"bootloader": [
{"name": "cmdline", "value": [
{"name": "mitigations", "value": "on"},
{"name": "another"}
]
}
],
"selinux": [
{"name": "avc_cache_threshold", "value": 512}
],
"purge": false
}
}
```
Loading

0 comments on commit 7abfaf2

Please sign in to comment.