mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Fix pkg_mgr fact on OpenBSD (#30725)
* Fix pkg_mgr fact on OpenBSD Add a OpenBSDPkgMgrFactCollector that hardcodes pkg_mgr to 'openbsd_pkg'. The ansible collector will choose the OpenBSD collector if the system is OpenBSD and the 'Generic' one otherwise. This removes PkgMgrFactCollectors depenency on the 'system' fact being in collected_facts, which also avoids ordering issues (if the pkg mgr fact is collected before the system fact...) Fixes #30623
This commit is contained in:
parent
d122a693d1
commit
12404f470a
4 changed files with 73 additions and 9 deletions
|
@ -33,6 +33,7 @@ from ansible.module_utils.facts.system.fips import FipsFactCollector
|
||||||
from ansible.module_utils.facts.system.local import LocalFactCollector
|
from ansible.module_utils.facts.system.local import LocalFactCollector
|
||||||
from ansible.module_utils.facts.system.lsb import LSBFactCollector
|
from ansible.module_utils.facts.system.lsb import LSBFactCollector
|
||||||
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector
|
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector
|
||||||
|
from ansible.module_utils.facts.system.pkg_mgr import OpenBSDPkgMgrFactCollector
|
||||||
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
||||||
from ansible.module_utils.facts.system.python import PythonFactCollector
|
from ansible.module_utils.facts.system.python import PythonFactCollector
|
||||||
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
||||||
|
@ -110,6 +111,7 @@ collectors = [ApparmorFactCollector,
|
||||||
SunOSNetworkCollector,
|
SunOSNetworkCollector,
|
||||||
|
|
||||||
PkgMgrFactCollector,
|
PkgMgrFactCollector,
|
||||||
|
OpenBSDPkgMgrFactCollector,
|
||||||
PlatformFactCollector,
|
PlatformFactCollector,
|
||||||
PythonFactCollector,
|
PythonFactCollector,
|
||||||
SelinuxFactCollector,
|
SelinuxFactCollector,
|
||||||
|
|
|
@ -50,20 +50,28 @@ PKG_MGRS = [{'path': '/usr/bin/yum', 'name': 'yum'},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class OpenBSDPkgMgrFactCollector(BaseFactCollector):
|
||||||
|
name = 'pkg_mgr'
|
||||||
|
_fact_ids = set()
|
||||||
|
_platform = 'OpenBSD'
|
||||||
|
|
||||||
|
def collect(self, module=None, collected_facts=None):
|
||||||
|
facts_dict = {}
|
||||||
|
|
||||||
|
facts_dict['pkg_mgr'] = 'openbsd_pkg'
|
||||||
|
return facts_dict
|
||||||
|
|
||||||
|
|
||||||
# the fact ends up being 'pkg_mgr' so stick with that naming/spelling
|
# the fact ends up being 'pkg_mgr' so stick with that naming/spelling
|
||||||
class PkgMgrFactCollector(BaseFactCollector):
|
class PkgMgrFactCollector(BaseFactCollector):
|
||||||
name = 'pkg_mgr'
|
name = 'pkg_mgr'
|
||||||
_fact_ids = set()
|
_fact_ids = set()
|
||||||
|
_platform = 'Generic'
|
||||||
|
|
||||||
def collect(self, module=None, collected_facts=None):
|
def collect(self, module=None, collected_facts=None):
|
||||||
facts_dict = {}
|
facts_dict = {}
|
||||||
collected_facts = collected_facts or {}
|
collected_facts = collected_facts or {}
|
||||||
|
|
||||||
pkg_mgr_name = None
|
|
||||||
if collected_facts.get('system') == 'OpenBSD':
|
|
||||||
facts_dict['pkg_mgr'] = 'openbsd_pkg'
|
|
||||||
return facts_dict
|
|
||||||
|
|
||||||
pkg_mgr_name = 'unknown'
|
pkg_mgr_name = 'unknown'
|
||||||
for pkg in PKG_MGRS:
|
for pkg in PKG_MGRS:
|
||||||
if os.path.exists(pkg['path']):
|
if os.path.exists(pkg['path']):
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# unit tests for ansible/module_utils/facts/__init__.py
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -22,7 +21,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
# for testing
|
# for testing
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import Mock
|
from ansible.compat.tests.mock import Mock, patch
|
||||||
|
|
||||||
from ansible.module_utils.facts import collector
|
from ansible.module_utils.facts import collector
|
||||||
from ansible.module_utils.facts import ansible_collector
|
from ansible.module_utils.facts import ansible_collector
|
||||||
|
@ -40,7 +39,7 @@ from ansible.module_utils.facts.system.dns import DnsFactCollector
|
||||||
from ansible.module_utils.facts.system.fips import FipsFactCollector
|
from ansible.module_utils.facts.system.fips import FipsFactCollector
|
||||||
from ansible.module_utils.facts.system.local import LocalFactCollector
|
from ansible.module_utils.facts.system.local import LocalFactCollector
|
||||||
from ansible.module_utils.facts.system.lsb import LSBFactCollector
|
from ansible.module_utils.facts.system.lsb import LSBFactCollector
|
||||||
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector
|
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector, OpenBSDPkgMgrFactCollector
|
||||||
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
||||||
from ansible.module_utils.facts.system.python import PythonFactCollector
|
from ansible.module_utils.facts.system.python import PythonFactCollector
|
||||||
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
||||||
|
@ -59,6 +58,7 @@ ALL_COLLECTOR_CLASSES = \
|
||||||
SystemCapabilitiesFactCollector,
|
SystemCapabilitiesFactCollector,
|
||||||
FipsFactCollector,
|
FipsFactCollector,
|
||||||
PkgMgrFactCollector,
|
PkgMgrFactCollector,
|
||||||
|
OpenBSDPkgMgrFactCollector,
|
||||||
ServiceMgrFactCollector,
|
ServiceMgrFactCollector,
|
||||||
LSBFactCollector,
|
LSBFactCollector,
|
||||||
DateTimeFactCollector,
|
DateTimeFactCollector,
|
||||||
|
@ -311,3 +311,34 @@ class TestOhaiCollectedFacts(TestCollectedFacts):
|
||||||
expected_facts = ['gather_subset',
|
expected_facts = ['gather_subset',
|
||||||
'module_setup']
|
'module_setup']
|
||||||
not_expected_facts = ['lsb']
|
not_expected_facts = ['lsb']
|
||||||
|
|
||||||
|
|
||||||
|
class TestPkgMgrFacts(TestCollectedFacts):
|
||||||
|
gather_subset = ['pkg_mgr']
|
||||||
|
min_fact_count = 1
|
||||||
|
max_fact_count = 10
|
||||||
|
expected_facts = ['gather_subset',
|
||||||
|
'module_setup',
|
||||||
|
'pkg_mgr']
|
||||||
|
|
||||||
|
|
||||||
|
class TestOpenBSDPkgMgrFacts(TestPkgMgrFacts):
|
||||||
|
def test_is_openbsd_pkg(self):
|
||||||
|
self.assertIn('pkg_mgr', self.facts)
|
||||||
|
self.assertEqual(self.facts['pkg_mgr'], 'openbsd_pkg')
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.patcher = patch('platform.system')
|
||||||
|
mock_platform = self.patcher.start()
|
||||||
|
mock_platform.return_value = 'OpenBSD'
|
||||||
|
|
||||||
|
mock_module = self._mock_module()
|
||||||
|
collectors = self._collectors(mock_module)
|
||||||
|
|
||||||
|
fact_collector = \
|
||||||
|
ansible_collector.AnsibleFactCollector(collectors=collectors,
|
||||||
|
namespace=ns)
|
||||||
|
self.facts = fact_collector.collect(module=mock_module)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.patcher.stop()
|
||||||
|
|
|
@ -32,7 +32,7 @@ from ansible.module_utils.facts.system.distribution import DistributionFactColle
|
||||||
from ansible.module_utils.facts.system.dns import DnsFactCollector
|
from ansible.module_utils.facts.system.dns import DnsFactCollector
|
||||||
from ansible.module_utils.facts.system.env import EnvFactCollector
|
from ansible.module_utils.facts.system.env import EnvFactCollector
|
||||||
from ansible.module_utils.facts.system.fips import FipsFactCollector
|
from ansible.module_utils.facts.system.fips import FipsFactCollector
|
||||||
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector
|
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector, OpenBSDPkgMgrFactCollector
|
||||||
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
from ansible.module_utils.facts.system.platform import PlatformFactCollector
|
||||||
from ansible.module_utils.facts.system.python import PythonFactCollector
|
from ansible.module_utils.facts.system.python import PythonFactCollector
|
||||||
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
|
||||||
|
@ -225,6 +225,29 @@ class TestPkgMgrFacts(BaseFactsTest):
|
||||||
fact_namespace = 'ansible_pkgmgr'
|
fact_namespace = 'ansible_pkgmgr'
|
||||||
collector_class = PkgMgrFactCollector
|
collector_class = PkgMgrFactCollector
|
||||||
|
|
||||||
|
def test_collect(self):
|
||||||
|
module = self._mock_module()
|
||||||
|
fact_collector = self.collector_class()
|
||||||
|
facts_dict = fact_collector.collect(module=module, collected_facts=self.collected_facts)
|
||||||
|
self.assertIsInstance(facts_dict, dict)
|
||||||
|
self.assertIn('pkg_mgr', facts_dict)
|
||||||
|
|
||||||
|
|
||||||
|
class TestOpenBSDPkgMgrFacts(BaseFactsTest):
|
||||||
|
__test__ = True
|
||||||
|
gather_subset = ['!all', 'pkg_mgr']
|
||||||
|
valid_subsets = ['pkg_mgr']
|
||||||
|
fact_namespace = 'ansible_pkgmgr'
|
||||||
|
collector_class = OpenBSDPkgMgrFactCollector
|
||||||
|
|
||||||
|
def test_collect(self):
|
||||||
|
module = self._mock_module()
|
||||||
|
fact_collector = self.collector_class()
|
||||||
|
facts_dict = fact_collector.collect(module=module, collected_facts=self.collected_facts)
|
||||||
|
self.assertIsInstance(facts_dict, dict)
|
||||||
|
self.assertIn('pkg_mgr', facts_dict)
|
||||||
|
self.assertEqual(facts_dict['pkg_mgr'], 'openbsd_pkg')
|
||||||
|
|
||||||
|
|
||||||
class TestPlatformFactCollector(BaseFactsTest):
|
class TestPlatformFactCollector(BaseFactsTest):
|
||||||
__test__ = True
|
__test__ = True
|
||||||
|
|
Loading…
Reference in a new issue