Compare commits

...

14 Commits
4.8.2 ... 4.8.3

Author SHA1 Message Date
Felix Fontein
aa877fe0fb Release 4.8.3. 2022-06-20 20:37:43 +02:00
Felix Fontein
86f06cac4c Prepare 4.8.3 release. 2022-06-20 20:28:30 +02:00
patchback[bot]
b97737affd Remove myself from team_suse (#4860) (#4861)
I do not use `zypper` anymore and can thus not help with issues regarding the zypper module.

(cherry picked from commit 652392be27)

Co-authored-by: Dan Čermák <45594031+dcermak@users.noreply.github.com>
2022-06-20 19:04:28 +02:00
patchback[bot]
f8650f8d85 sudoers: fix handling of state: absent (#4852) (#4853) (#4857)
* sudoers: fix handling of state: absent (#4852)

* typo fixes

(cherry picked from commit 44e21dd407)

Co-authored-by: s-hamann <10639154+s-hamann@users.noreply.github.com>
2022-06-19 15:48:53 +02:00
Felix Fontein
48fbd69835 Skip Ansible 2.9 coverage reporting with new AZP container. (#4841)
ci_coverage
2022-06-14 21:31:43 +02:00
patchback[bot]
141f32c78b redhat_subscription: call 'remove' instead of 'unsubscribe' (#4809) (#4837)
The 'unsubscribe' command of 'subscription-manager' was deprecated
already in subscription-manager 1.11.3, shipped with RHEL 5.11.
As it was removed in subscription-manager 1.29.x, unsubscribing from
pools was thus broken.

The simple fix is to call the proper command, 'remove'.

(cherry picked from commit a45b90e93f)

Co-authored-by: Pino Toscano <ptoscano@redhat.com>
2022-06-14 07:53:46 +02:00
patchback[bot]
b3c99aea72 Bump AZP container version. (#4819) (#4825)
(cherry picked from commit 42c5024b0b)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-06-13 21:16:31 +02:00
patchback[bot]
3356c77f81 proxmox_kvm: fix typos (#4798) (#4831)
* Typofix

* Update plugins/modules/cloud/misc/proxmox_kvm.py

Co-authored-by: Felix Fontein <felix@fontein.de>

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit e51221896b)

Co-authored-by: Wouter Schoot <wouter@schoot.org>
2022-06-13 12:13:13 +02:00
patchback[bot]
23859e0ec3 nmcli: do not convert undefined lists to empty strings (#4813) (#4833)
* do not convert undefined lists to empty strings

* add changelog fragment (#4813)

(cherry picked from commit 72faebffc6)

Co-authored-by: geichelberger <35195803+geichelberger@users.noreply.github.com>
2022-06-13 12:13:02 +02:00
patchback[bot]
79d85cc83c Ensure managed sudoers config files have 0440 permissions (#4814) (#4827)
* Ensure sudoers config files are created with 0440 permissions to appease visudo validation

* Remove change not required by the bugfix

* Add changelog fragment for 4814 sudoers file permissions

* Update changelogs/fragments/4814-sudoers-file-permissions.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Have less oct casting

Co-authored-by: Felix Fontein <felix@fontein.de>

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 2d1e58663c)

Co-authored-by: Jon Ellis <ellis.jp@gmail.com>
2022-06-12 08:59:48 +02:00
patchback[bot]
a11b8fd517 requests drops support for older Python (#4818) (#4821)
* requests drops support for older Python.

* Work around CentOS 6 pip bugs.

(cherry picked from commit c8a2c5d375)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-06-12 08:15:10 +02:00
patchback[bot]
8a6b673fce CI: Disable repo URL test for OpenSuSE 15.4 (#4805) (#4807)
* Disable repo URL test for OpenSuSE 15.4.

* Forgot some places.

(cherry picked from commit dd24c98fe5)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-06-08 22:21:44 +02:00
patchback[bot]
7ec8b50361 ModuleHelperException module utils - improved exception initialization (#4755) (#4785)
* ModuleHelperException module utils - improved exception initialization

* added changelog fragment

* Update plugins/module_utils/mh/exceptions.py

Co-authored-by: Felix Fontein <felix@fontein.de>

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit b87edda3c7)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2022-06-06 10:58:28 +02:00
Felix Fontein
d91c6fedc2 Next expected release is 4.8.3. 2022-06-06 10:26:45 +02:00
17 changed files with 187 additions and 60 deletions

View File

@@ -47,7 +47,7 @@ variables:
resources:
containers:
- container: default
image: quay.io/ansible/azure-pipelines-test-container:1.9.0
image: quay.io/ansible/azure-pipelines-test-container:3.0.0
pool: Standard

View File

@@ -9,6 +9,10 @@ PATH="${PWD}/bin:${PATH}"
mkdir "${agent_temp_directory}/coverage/"
if [[ "$(ansible --version)" =~ \ 2\.9\. ]]; then
exit
fi
options=(--venv --venv-system-site-packages --color -v)
ansible-test coverage combine --group-by command --export "${agent_temp_directory}/coverage/" "${options[@]}"

View File

@@ -5,6 +5,10 @@ set -o pipefail -eu
PATH="${PWD}/bin:${PATH}"
if [[ "$(ansible --version)" =~ \ 2\.9\. ]]; then
exit
fi
if ! ansible-test --help >/dev/null 2>&1; then
# Install the devel version of ansible-test for generating code coverage reports.
# This is only used by Ansible Collections, which are typically tested against multiple Ansible versions (in separate jobs).

2
.github/BOTMETA.yml vendored
View File

@@ -1287,5 +1287,5 @@ macros:
team_rhn: FlossWare alikins barnabycourt vritant
team_scaleway: remyleone abarbare
team_solaris: bcoca fishman jasperla jpdasma mator scathatheworm troy2914 xen0l
team_suse: commel dcermak evrardjp lrupp toabctl AnderEnder alxgu andytom sealor
team_suse: commel evrardjp lrupp toabctl AnderEnder alxgu andytom sealor
team_virt: joshainglis karmab tleguern Thulium-Drake Ajpantuso

View File

@@ -6,6 +6,27 @@ Community General Release Notes
This changelog describes changes after version 3.0.0.
v4.8.3
======
Release Summary
---------------
Bugfix release.
Minor Changes
-------------
- ModuleHelper module utils - improved ``ModuleHelperException``, using ``to_native()`` for the exception message (https://github.com/ansible-collections/community.general/pull/4755).
Bugfixes
--------
- nmcli - fix error caused by adding undefined module arguments for list options (https://github.com/ansible-collections/community.general/issues/4373, https://github.com/ansible-collections/community.general/pull/4813).
- redhat_subscription - fix unsubscribing on RHEL 9 (https://github.com/ansible-collections/community.general/issues/4741).
- sudoers - ensure sudoers config files are created with the permissions requested by sudoers (0440) (https://github.com/ansible-collections/community.general/pull/4814).
- sudoers - fix incorrect handling of ``state: absent`` (https://github.com/ansible-collections/community.general/issues/4852).
v4.8.2
======

View File

@@ -1835,3 +1835,24 @@ releases:
- 4733-redis-fail.yml
- simplified-bsd-license.yml
release_date: '2022-06-06'
4.8.3:
changes:
bugfixes:
- nmcli - fix error caused by adding undefined module arguments for list options
(https://github.com/ansible-collections/community.general/issues/4373, https://github.com/ansible-collections/community.general/pull/4813).
- redhat_subscription - fix unsubscribing on RHEL 9 (https://github.com/ansible-collections/community.general/issues/4741).
- sudoers - ensure sudoers config files are created with the permissions requested
by sudoers (0440) (https://github.com/ansible-collections/community.general/pull/4814).
- 'sudoers - fix incorrect handling of ``state: absent`` (https://github.com/ansible-collections/community.general/issues/4852).'
minor_changes:
- ModuleHelper module utils - improved ``ModuleHelperException``, using ``to_native()``
for the exception message (https://github.com/ansible-collections/community.general/pull/4755).
release_summary: Bugfix release.
fragments:
- 4.8.3.yml
- 4755-mhexception-improvement.yml
- 4809-redhat_subscription-unsubscribe.yaml
- 4813-fix-nmcli-convert-list.yaml
- 4814-sudoers-file-permissions.yml
- 4852-sudoers-state-absent.yml
release_date: '2022-06-20'

View File

@@ -1,6 +1,6 @@
namespace: community
name: general
version: 4.8.2
version: 4.8.3
readme: README.md
authors:
- Ansible (https://github.com/ansible)

View File

@@ -6,17 +6,13 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.module_utils.common.text.converters import to_native
class ModuleHelperException(Exception):
@staticmethod
def _get_remove(key, kwargs):
if key in kwargs:
result = kwargs[key]
del kwargs[key]
return result
return None
def __init__(self, *args, **kwargs):
self.msg = self._get_remove('msg', kwargs) or "Module failed with exception: {0}".format(self)
self.update_output = self._get_remove('update_output', kwargs) or {}
def __init__(self, msg, update_output=None, *args, **kwargs):
self.msg = to_native(msg or "Module failed with exception: {0}".format(self))
if update_output is None:
update_output = {}
self.update_output = update_output
super(ModuleHelperException, self).__init__(*args)

View File

@@ -83,7 +83,7 @@ options:
version_added: 1.3.0
clone:
description:
- Name of VM to be cloned. If C(vmid) is setted, C(clone) can take arbitrary value but required for initiating the clone.
- Name of VM to be cloned. If I(vmid) is set, I(clone) can take an arbitrary value but is required for initiating the clone.
type: str
cores:
description:

View File

@@ -1742,7 +1742,10 @@ class Nmcli(object):
@staticmethod
def list_to_string(lst):
return ",".join(lst or [""])
if lst is None:
return None
else:
return ",".join(lst)
@staticmethod
def settings_type(setting):

View File

@@ -468,7 +468,7 @@ class Rhsm(RegistrationBase):
items = ["--all"]
if items:
args = [SUBMAN_CMD, 'unsubscribe'] + items
args = [SUBMAN_CMD, 'remove'] + items
rc, stderr, stdout = self.module.run_command(args, check_rc=True)
return serials

View File

@@ -115,6 +115,8 @@ from ansible.module_utils.common.text.converters import to_native
class Sudoers(object):
FILE_MODE = 0o440
def __init__(self, module):
self.check_mode = module.check_mode
self.name = module.params['name']
@@ -134,6 +136,8 @@ class Sudoers(object):
with open(self.file, 'w') as f:
f.write(self.content())
os.chmod(self.file, self.FILE_MODE)
def delete(self):
if self.check_mode:
return
@@ -145,7 +149,12 @@ class Sudoers(object):
def matches(self):
with open(self.file, 'r') as f:
return f.read() == self.content()
content_matches = f.read() == self.content()
current_mode = os.stat(self.file).st_mode & 0o777
mode_matches = current_mode == self.FILE_MODE
return content_matches and mode_matches
def content(self):
if self.user:
@@ -159,9 +168,12 @@ class Sudoers(object):
return "{owner} ALL={runas}{nopasswd} {commands}\n".format(owner=owner, runas=runas_str, nopasswd=nopasswd_str, commands=commands_str)
def run(self):
if self.state == 'absent' and self.exists():
self.delete()
return True
if self.state == 'absent':
if self.exists():
self.delete()
return True
else:
return False
if self.exists() and self.matches():
return False

View File

@@ -29,6 +29,11 @@
commands: /usr/local/bin/command
register: rule_1
- name: Stat my-sudo-rule-1 file
ansible.builtin.stat:
path: "{{ sudoers_path }}/my-sudo-rule-1"
register: rule_1_stat
- name: Grab contents of my-sudo-rule-1
ansible.builtin.slurp:
src: "{{ sudoers_path }}/my-sudo-rule-1"
@@ -130,8 +135,27 @@
register: revoke_rule_1_stat
- name: Revoke non-existing rule
community.general.sudoers:
name: non-existing-rule
state: absent
register: revoke_non_existing_rule
- name: Stat non-existing rule
ansible.builtin.stat:
path: "{{ sudoers_path }}/non-existing-rule"
register: revoke_non_existing_rule_stat
# Run assertions
- name: Check rule 1 file stat
ansible.builtin.assert:
that:
- rule_1_stat.stat.exists
- rule_1_stat.stat.isreg
- rule_1_stat.stat.mode == '0440'
- name: Check changed status
ansible.builtin.assert:
that:
@@ -139,6 +163,7 @@
- rule_1_again is not changed
- rule_5 is changed
- revoke_rule_1 is changed
- revoke_non_existing_rule is not changed
- name: Check contents
ansible.builtin.assert:
@@ -154,3 +179,4 @@
ansible.builtin.assert:
that:
- not revoke_rule_1_stat.stat.exists
- not revoke_non_existing_rule_stat.stat.exists

View File

@@ -207,50 +207,53 @@
that:
- remove_repo is changed
- name: add new repository via url to .repo file
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: present
register: added_by_repo_file
# For now, the URL does not work for 15.4
- when: ansible_distribution_version is version('15.4', '<')
block:
- name: add new repository via url to .repo file
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: present
register: added_by_repo_file
- name: get repository details from zypper
command: zypper lr systemsmanagement_Uyuni_Stable
register: get_repository_details_from_zypper
- name: get repository details from zypper
command: zypper lr systemsmanagement_Uyuni_Stable
register: get_repository_details_from_zypper
- name: verify adding via .repo file was successful
assert:
that:
- "added_by_repo_file is changed"
- "get_repository_details_from_zypper.rc == 0"
- "'/systemsmanagement:/Uyuni:/Stable/' in get_repository_details_from_zypper.stdout"
- name: verify adding via .repo file was successful
assert:
that:
- "added_by_repo_file is changed"
- "get_repository_details_from_zypper.rc == 0"
- "'/systemsmanagement:/Uyuni:/Stable/' in get_repository_details_from_zypper.stdout"
- name: add same repository via url to .repo file again to verify idempotency
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: present
register: added_again_by_repo_file
- name: add same repository via url to .repo file again to verify idempotency
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: present
register: added_again_by_repo_file
- name: verify nothing was changed adding a repo with the same .repo file
assert:
that:
- added_again_by_repo_file is not changed
- name: verify nothing was changed adding a repo with the same .repo file
assert:
that:
- added_again_by_repo_file is not changed
- name: remove repository via url to .repo file
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: absent
register: removed_by_repo_file
- name: remove repository via url to .repo file
community.general.zypper_repository:
repo: http://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/openSUSE_Leap_{{ ansible_distribution_version }}/systemsmanagement:Uyuni:Stable.repo
state: absent
register: removed_by_repo_file
- name: get list of files in /etc/zypp/repos.d/
command: ls /etc/zypp/repos.d/
changed_when: false
register: etc_zypp_reposd
- name: get list of files in /etc/zypp/repos.d/
command: ls /etc/zypp/repos.d/
changed_when: false
register: etc_zypp_reposd
- name: verify removal via .repo file was successful, including cleanup of local .repo file in /etc/zypp/repos.d/
assert:
that:
- "removed_by_repo_file"
- "'/systemsmanagement:/Uyuni:/Stable/' not in etc_zypp_reposd.stdout"
- name: verify removal via .repo file was successful, including cleanup of local .repo file in /etc/zypp/repos.d/
assert:
that:
- "removed_by_repo_file"
- "'/systemsmanagement:/Uyuni:/Stable/' not in etc_zypp_reposd.stdout"
- name: Copy test .repo file
copy:

View File

@@ -449,6 +449,17 @@ ipv6.ignore-auto-dns: no
ipv6.ignore-auto-routes: no
"""
TESTCASE_GENERIC_ZONE_ONLY = [
{
'type': 'generic',
'conn_name': 'non_existent_nw_device',
'ifname': 'generic_non_existant',
'state': 'present',
'zone': 'public',
'_ansible_check_mode': False,
}
]
TESTCASE_BOND = [
{
'type': 'bond',
@@ -1805,6 +1816,30 @@ def test_generic_connection_zone_unchanged(mocked_generic_connection_zone_unchan
assert not results['changed']
@pytest.mark.parametrize('patch_ansible_module', TESTCASE_GENERIC_ZONE_ONLY, indirect=['patch_ansible_module'])
def test_generic_connection_modify_zone_only(mocked_generic_connection_modify, capfd):
"""
Test : Generic connection modified with zone only
"""
with pytest.raises(SystemExit):
nmcli.main()
assert nmcli.Nmcli.execute_command.call_count == 1
arg_list = nmcli.Nmcli.execute_command.call_args_list
args, kwargs = arg_list[0]
assert 'connection.zone' in args[0]
assert 'ipv4.addresses' not in args[0]
assert 'ipv4.gateway' not in args[0]
assert 'ipv6.addresses' not in args[0]
assert 'ipv6.gateway' not in args[0]
out, err = capfd.readouterr()
results = json.loads(out)
assert not results.get('failed')
assert results['changed']
@pytest.mark.parametrize('patch_ansible_module', TESTCASE_CONNECTION, indirect=['patch_ansible_module'])
def test_zone_none(mocked_connection_exists, capfd):
"""

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Author: Jiri Hnidek (jhnidek@redhat.com)
#
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
@@ -118,7 +119,7 @@ TEST_CASES = [
(0, 'system identity: b26df632-25ed-4452-8f89-0308bfd167cb', '')
),
(
['/testbin/subscription-manager', 'unsubscribe', '--all'],
['/testbin/subscription-manager', 'remove', '--all'],
{'check_rc': True},
(0, '', '')
),
@@ -755,7 +756,7 @@ Entitlement Type: Physical
(
[
'/testbin/subscription-manager',
'unsubscribe',
'remove',
'--serial=7807912223970164816',
],
{'check_rc': True},

View File

@@ -23,6 +23,7 @@ pytest-forked < 1.0.2 ; python_version < '2.7' # pytest-forked 1.0.2 and later r
pytest-forked >= 1.0.2 ; python_version >= '2.7' # pytest-forked before 1.0.2 does not work with pytest 4.2.0+ (which requires python 2.7+)
ntlm-auth >= 1.3.0 # message encryption support using cryptography
requests < 2.20.0 ; python_version < '2.7' # requests 2.20.0 drops support for python 2.6
requests < 2.28 ; python_version >= '2.7' and python_version < '3.7' # requests 2.28.0 drops support for python 3.6 and before
requests-ntlm >= 1.1.0 # message encryption support
requests-credssp >= 0.1.0 # message encryption support
voluptuous >= 0.11.0 # Schema recursion via Self