From 0d25d392aa58789b44b9d22216c912bba55a9c91 Mon Sep 17 00:00:00 2001 From: Fernando Correia Date: Mon, 26 Apr 2021 08:20:33 -0700 Subject: [PATCH] Detect Homebrew on Mac M1 (Apple Silicon) (#74378) (#74400) Homebrew's default install location for macOS on ARM is /opt/homebrew. Source: https://docs.brew.sh/FAQ On a Mac M1 (Apple Silicon), homebrew will be installed at /opt/homebrew/bin/brew. --- .../fragments/73887.mac-m1-homebrew.yaml | 3 ++ .../module_utils/facts/system/pkg_mgr.py | 1 + .../module_utils/facts/test_collectors.py | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 changelogs/fragments/73887.mac-m1-homebrew.yaml diff --git a/changelogs/fragments/73887.mac-m1-homebrew.yaml b/changelogs/fragments/73887.mac-m1-homebrew.yaml new file mode 100644 index 00000000000..08cfd6911c7 --- /dev/null +++ b/changelogs/fragments/73887.mac-m1-homebrew.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - facts - detect homebrew installed at /opt/homebrew/bin/brew diff --git a/lib/ansible/module_utils/facts/system/pkg_mgr.py b/lib/ansible/module_utils/facts/system/pkg_mgr.py index be9f029f55a..bf6b75721f0 100644 --- a/lib/ansible/module_utils/facts/system/pkg_mgr.py +++ b/lib/ansible/module_utils/facts/system/pkg_mgr.py @@ -25,6 +25,7 @@ PKG_MGRS = [{'path': '/usr/bin/yum', 'name': 'yum'}, {'path': '/opt/tools/bin/pkgin', 'name': 'pkgin'}, {'path': '/opt/local/bin/port', 'name': 'macports'}, {'path': '/usr/local/bin/brew', 'name': 'homebrew'}, + {'path': '/opt/homebrew/bin/brew', 'name': 'homebrew'}, {'path': '/sbin/apk', 'name': 'apk'}, {'path': '/usr/sbin/pkg', 'name': 'pkgng'}, {'path': '/usr/sbin/swlist', 'name': 'swdepot'}, diff --git a/test/units/module_utils/facts/test_collectors.py b/test/units/module_utils/facts/test_collectors.py index d9fe79bffa2..83d5487105a 100644 --- a/test/units/module_utils/facts/test_collectors.py +++ b/test/units/module_utils/facts/test_collectors.py @@ -238,6 +238,46 @@ class TestPkgMgrFacts(BaseFactsTest): self.assertIn('pkg_mgr', facts_dict) +class TestMacOSXPkgMgrFacts(BaseFactsTest): + __test__ = True + gather_subset = ['!all', 'pkg_mgr'] + valid_subsets = ['pkg_mgr'] + fact_namespace = 'ansible_pkgmgr' + collector_class = PkgMgrFactCollector + collected_facts = { + "ansible_distribution": "MacOSX", + "ansible_distribution_major_version": "11", + "ansible_os_family": "Darwin" + } + + @patch('ansible.module_utils.facts.system.pkg_mgr.os.path.exists', side_effect=lambda x: x == '/opt/homebrew/bin/brew') + def test_collect_opt_homebrew(self, p_exists): + 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'], 'homebrew') + + @patch('ansible.module_utils.facts.system.pkg_mgr.os.path.exists', side_effect=lambda x: x == '/usr/local/bin/brew') + def test_collect_usr_homebrew(self, p_exists): + 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'], 'homebrew') + + @patch('ansible.module_utils.facts.system.pkg_mgr.os.path.exists', side_effect=lambda x: x == '/opt/local/bin/port') + def test_collect_macports(self, p_exists): + 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'], 'macports') + + def _sanitize_os_path_apt_get(path): if path == '/usr/bin/apt-get': return True