diff --git a/changelogs/fragments/69601_fix_gather_facts_for_fqcn.yaml b/changelogs/fragments/69601_fix_gather_facts_for_fqcn.yaml new file mode 100644 index 00000000000..e401d70677f --- /dev/null +++ b/changelogs/fragments/69601_fix_gather_facts_for_fqcn.yaml @@ -0,0 +1,2 @@ +bugfixes: + - Fix gather_facts not working for network platforms when network_os is in FQCN format (https://github.com/ansible/ansible/pull/69601). diff --git a/lib/ansible/config/base.yml b/lib/ansible/config/base.yml index 2a5c7941fce..a5d1a248668 100644 --- a/lib/ansible/config/base.yml +++ b/lib/ansible/config/base.yml @@ -1304,13 +1304,30 @@ ERROR_ON_MISSING_HANDLER: CONNECTION_FACTS_MODULES: name: Map of connections to fact modules default: + asa: asa_facts + cisco.asa.asa: cisco.asa.asa_facts eos: eos_facts + arista.eos.eos: arista.eos.eos_facts frr: frr_facts + frr.frr.frr: frr.frr.frr_facts ios: ios_facts + cisco.ios.ios: cisco.ios.ios_facts iosxr: iosxr_facts + cisco.iosxr.iosxr: cisco.iosxr.iosxr_facts junos: junos_facts + junipernetworks.junos.junos: junipernetworks.junos.junos_facts nxos: nxos_facts + cisco.nxos.nxos: cisco.nxos.nxos_facts vyos: vyos_facts + vyos.vyos.vyos: vyos.vyos.vyos_facts + exos: exos_facts + extreme.exos.exos: extreme.exos.exos_facts + slxos: slxos_facts + extreme.slxos.slxos: extreme.slxos.slxos_facts + voss: voss_facts + extreme.voss.voss: extreme.voss.voss_facts + ironware: ironware_facts + community.network.ironware: community.network.ironware_facts description: "Which modules to run during a play's fact gathering stage based on connection" env: [{name: ANSIBLE_CONNECTION_FACTS_MODULES}] ini: diff --git a/test/units/plugins/action/test_gather_facts.py b/test/units/plugins/action/test_gather_facts.py index d65542fb64a..b550917e4a9 100644 --- a/test/units/plugins/action/test_gather_facts.py +++ b/test/units/plugins/action/test_gather_facts.py @@ -31,7 +31,6 @@ from units.mock.loader import DictDataLoader class TestNetworkFacts(unittest.TestCase): task = MagicMock(Task) - task_vars = {'ansible_network_os': 'ios'} play_context = MagicMock() play_context.check_mode = False connection = MagicMock() @@ -46,6 +45,7 @@ class TestNetworkFacts(unittest.TestCase): pass def test_network_gather_facts(self): + self.task_vars = {'ansible_network_os': 'ios'} self.task.action = 'gather_facts' self.task.async_val = False self.task.args = {'gather_subset': 'min'} @@ -62,3 +62,22 @@ class TestNetworkFacts(unittest.TestCase): facts_modules = C.config.get_config_value('FACTS_MODULES', variables=self.task_vars) self.assertEqual(facts_modules, ['ios_facts']) + + def test_network_gather_facts_fqcn(self): + self.fqcn_task_vars = {'ansible_network_os': 'cisco.ios.ios'} + self.task.action = 'gather_facts' + self.task.async_val = False + self.task.args = {'gather_subset': 'min'} + self.task.module_defaults = [{'cisco.ios.ios_facts': {'gather_subset': 'min'}}] + + plugin = ActionModule(self.task, self.connection, self.play_context, loader=None, templar=self.templar, shared_loader_obj=None) + plugin._execute_module = MagicMock() + + res = plugin.run(task_vars=self.fqcn_task_vars) + self.assertEqual(res['ansible_facts']['_ansible_facts_gathered'], True) + + mod_args = plugin._get_module_args('cisco.ios.ios_facts', task_vars=self.fqcn_task_vars) + self.assertEqual(mod_args['gather_subset'], 'min') + + facts_modules = C.config.get_config_value('FACTS_MODULES', variables=self.fqcn_task_vars) + self.assertEqual(facts_modules, ['cisco.ios.ios_facts'])