You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ansible/lib/ansible/module_utils/facts/default_collectors.py

179 lines
8.2 KiB
Python

# This code is part of Ansible, but is an independent component.
# This particular file snippet, and this file snippet only, is BSD licensed.
# Modules you write using this snippet, which is embedded dynamically by Ansible
# still belong to the author of the module, and may assign their own license
# to the complete work.
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
#
# (c) 2017 Red Hat Inc.
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
#
from __future__ import annotations
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
import ansible.module_utils.compat.typing as t
from ansible.module_utils.facts.collector import BaseFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.other.facter import FacterFactCollector
from ansible.module_utils.facts.other.ohai import OhaiFactCollector
from ansible.module_utils.facts.system.apparmor import ApparmorFactCollector
from ansible.module_utils.facts.system.caps import SystemCapabilitiesFactCollector
from ansible.module_utils.facts.system.chroot import ChrootFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.system.cmdline import CmdLineFactCollector
from ansible.module_utils.facts.system.distribution import DistributionFactCollector
from ansible.module_utils.facts.system.date_time import DateTimeFactCollector
from ansible.module_utils.facts.system.env import EnvFactCollector
from ansible.module_utils.facts.system.dns import DnsFactCollector
from ansible.module_utils.facts.system.fips import FipsFactCollector
from ansible.module_utils.facts.system.loadavg import LoadAvgFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.system.local import LocalFactCollector
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 OpenBSDPkgMgrFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.system.platform import PlatformFactCollector
from ansible.module_utils.facts.system.python import PythonFactCollector
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector
from ansible.module_utils.facts.system.ssh_pub_keys import SshPubKeyFactCollector
from ansible.module_utils.facts.system.systemd import SystemdFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.system.user import UserFactCollector
from ansible.module_utils.facts.hardware.base import HardwareCollector
from ansible.module_utils.facts.hardware.aix import AIXHardwareCollector
from ansible.module_utils.facts.hardware.darwin import DarwinHardwareCollector
from ansible.module_utils.facts.hardware.dragonfly import DragonFlyHardwareCollector
from ansible.module_utils.facts.hardware.freebsd import FreeBSDHardwareCollector
from ansible.module_utils.facts.hardware.hpux import HPUXHardwareCollector
from ansible.module_utils.facts.hardware.hurd import HurdHardwareCollector
from ansible.module_utils.facts.hardware.linux import LinuxHardwareCollector
from ansible.module_utils.facts.hardware.netbsd import NetBSDHardwareCollector
from ansible.module_utils.facts.hardware.openbsd import OpenBSDHardwareCollector
from ansible.module_utils.facts.hardware.sunos import SunOSHardwareCollector
from ansible.module_utils.facts.network.base import NetworkCollector
from ansible.module_utils.facts.network.aix import AIXNetworkCollector
from ansible.module_utils.facts.network.darwin import DarwinNetworkCollector
from ansible.module_utils.facts.network.dragonfly import DragonFlyNetworkCollector
from ansible.module_utils.facts.network.fc_wwn import FcWwnInitiatorFactCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.network.freebsd import FreeBSDNetworkCollector
from ansible.module_utils.facts.network.hpux import HPUXNetworkCollector
from ansible.module_utils.facts.network.hurd import HurdNetworkCollector
from ansible.module_utils.facts.network.linux import LinuxNetworkCollector
from ansible.module_utils.facts.network.iscsi import IscsiInitiatorNetworkCollector
from ansible.module_utils.facts.network.nvme import NvmeInitiatorNetworkCollector
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
from ansible.module_utils.facts.network.netbsd import NetBSDNetworkCollector
from ansible.module_utils.facts.network.openbsd import OpenBSDNetworkCollector
from ansible.module_utils.facts.network.sunos import SunOSNetworkCollector
from ansible.module_utils.facts.virtual.base import VirtualCollector
from ansible.module_utils.facts.virtual.dragonfly import DragonFlyVirtualCollector
from ansible.module_utils.facts.virtual.freebsd import FreeBSDVirtualCollector
from ansible.module_utils.facts.virtual.hpux import HPUXVirtualCollector
from ansible.module_utils.facts.virtual.linux import LinuxVirtualCollector
from ansible.module_utils.facts.virtual.netbsd import NetBSDVirtualCollector
from ansible.module_utils.facts.virtual.openbsd import OpenBSDVirtualCollector
from ansible.module_utils.facts.virtual.sunos import SunOSVirtualCollector
# these should always be first due to most other facts depending on them
_base = [
PlatformFactCollector,
DistributionFactCollector,
LSBFactCollector
] # type: t.List[t.Type[BaseFactCollector]]
# These restrict what is possible in others
_restrictive = [
SelinuxFactCollector,
ApparmorFactCollector,
ChrootFactCollector,
FipsFactCollector
] # type: t.List[t.Type[BaseFactCollector]]
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
# general info, not required but probably useful for other facts
_general = [
PythonFactCollector,
SystemCapabilitiesFactCollector,
PkgMgrFactCollector,
OpenBSDPkgMgrFactCollector,
ServiceMgrFactCollector,
CmdLineFactCollector,
DateTimeFactCollector,
EnvFactCollector,
LoadAvgFactCollector,
SshPubKeyFactCollector,
UserFactCollector,
SystemdFactCollector
] # type: t.List[t.Type[BaseFactCollector]]
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
# virtual, this might also limit hardware/networking
_virtual = [
VirtualCollector,
DragonFlyVirtualCollector,
FreeBSDVirtualCollector,
LinuxVirtualCollector,
OpenBSDVirtualCollector,
NetBSDVirtualCollector,
SunOSVirtualCollector,
HPUXVirtualCollector
] # type: t.List[t.Type[BaseFactCollector]]
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
_hardware = [
HardwareCollector,
AIXHardwareCollector,
DarwinHardwareCollector,
DragonFlyHardwareCollector,
FreeBSDHardwareCollector,
HPUXHardwareCollector,
HurdHardwareCollector,
LinuxHardwareCollector,
NetBSDHardwareCollector,
OpenBSDHardwareCollector,
SunOSHardwareCollector
] # type: t.List[t.Type[BaseFactCollector]]
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
_network = [
DnsFactCollector,
FcWwnInitiatorFactCollector,
NetworkCollector,
AIXNetworkCollector,
DarwinNetworkCollector,
DragonFlyNetworkCollector,
FreeBSDNetworkCollector,
HPUXNetworkCollector,
HurdNetworkCollector,
IscsiInitiatorNetworkCollector,
NvmeInitiatorNetworkCollector,
LinuxNetworkCollector,
NetBSDNetworkCollector,
OpenBSDNetworkCollector,
SunOSNetworkCollector
] # type: t.List[t.Type[BaseFactCollector]]
Facts Refresh (2.4 roadmap) (#23012) Facts Refresh (2.4 roadmap) This commit implements most of the 2.4 roadmap 'Facts Refresh' - move facts.py to facts/__init__.py - move facts Distribution() to its own class - add a facts/utils.py - move get_file_content and get_uname_version to facts/utils.py - move Facts() class from facts/__init__ to facts/facts.py - mv get_file_lines to facts/utils.py - mv Ohai()/Facter() class to facts/ohai.py and facter.py - Start moving fact Hardware() classes to facts/hardware/*.py - mv HPUX() hardware class to facts/hardware/hpux.py - move SunOSHardware() fact class to facts/hardware/sunos.py - move OpenBSDHardware() class to facts/hardware/openbsd.py - mv FreeBsdHardware() and DragonFlyHardware() to facts/hardware/ - mv NetBSDHardware() to facts/hardware/netbsd.py - mv Darwin() hardware class to facts/hardware/darwin.py - pep8/etc cleanups on facts/hardware/*.py - Mv network facts classes to facts/network/*.py - mv Virtual fact classes to facts/virtual - mv Hardware.get_sysctl to facts/sysctl.py:get_sysctl - Also mv get_uname_version from facts/utils.py -> distribution.py since distribution.py is the only thing using it. - add collector.py with new BaseFactCollector - add a subclass for AnsibleFactCollector - hook up dict key munging FactNamespaces - add some test cases for testing the names of facts - mv timeout stuff to facts.timeout - rm ansible_facts()/get_all_facts() etc - Instead of calling facts.ansible_facts(), fact collection api used by setup.py is now to create an AnsibleFactCollector() and call it's collect method. - replace Facts.get_user_facts with UserFactCollector - add a 'systems' facts package, mv UserFactCollector there - mv get_dns_facts to DnsFactCollector - mv get_env_facts to EnvFactCollector - include the timeout length in exception message - modules and module_utils that use AnsibleFactCollector can now theoretically set the 'valid_subsets' May be useful for network facts module that currently have to reimplement a good chunk of facts.py to get gather_subsets to work. - get_local_facts -> system/LocalFactCollector - get_date_time -> system/date_time.py - get_fips_facts -> system/fips.py - get_caps_facts() -> system/caps.py - get_apparmor_facts -> system/apparmor.py - get_selinux_facts -> system/selinux.py - get_lsb_facts -> system/lsb.py - get_service_mgr_facts -> system/service_mgr.py - Facts.is_systemd_managed -> system/service_mgr.py - get_pkg_mgr_facts -> system/pkg_mgr.py - Facts()._get_mount_size_facts() -> facts.utils.get_mount_size() - add unit test for EnvFactCollector - add a test case for minimal gather_subsets - add test case for collect_ids - Make gather_subset match existing behavior or '!all' If 'gather_subset' is provided as '!all', the existing behavior (in 2.2/2.3) is that means 'dont collect any facts except those from the Facts() class'. So 'skip everything except 'apparmor', 'caps', 'date_time', 'env', 'fips', 'local', 'lsb', 'pkg_mgr', 'python', 'selinux', 'service_mgr', 'user', 'platform', etc. The new facts setup was making '!all' mean no facts at all, since it can add/exclude at a finer granularity. Since that makes more sense for the ansible collector, and the set of minimal facts to collect is really more up to setup.py to decide we do just that. So if setup.py needs to always collect some gather_subset, even on !all, setup.py needs to have the that subset added to the list it passes as minimal_gather_subset. This should fix some intg tests that assume '!all' means that some facts are still collected (user info and env for example). If we want to make setup.py collect a more minimal set, we can do that. - force facts_dicts.keys() to a list so py3 works - split fact collector tests to test_collectors.py - convert Facter(Facts) -> other/facter.py:FacterFactCollector - add FactCollector.collect_with_namespace() regular .collect() will return a dict with the key names using the base names ('ip_address', 'service_mgr' etc) .collect_with_namespace() will return a dict where the key names have been transformed with the collectors namespace, if there is one. For most, this means a namespace that adds 'ansible_' to the start of the key name. For 'FacterFactCollector', the namespace transforms the key to 'facter_*'. - add test cases for collect_with_namespace - move all the concrete 'which facts does setup.py' stuff to setup.py The caller of AnsibleFactCollector.from_gather_subset() needs to pass in the list of collector classes now. - update system/setup.py to import all of the fact classes and pass in that list. - split the Distribution fact class up a bit extracted the 'distro release' file handling (ie, linux boxes with /etc/release, /etc/os-release etc) into its own class. - extract get_cmdline_facts -> cmdline.py - extract get_public_ssh_host_keys -> system/ssh_pub_keys.py - extract get_platform_facts -> system/platform.py platform.py may be a good candidate for further splitting. - rm test for plain Facts() base class - let the base class for Collector unit tests provide collected_facts some Collectors and/or their migrated Facts() subsclasses need to look at facts collected by other modules ('ansible_architecture' the main one...). Collector.collect() has the collected_facts arg for this, so add a class variable to BaseFactsTest so we can specify it. - mv Ohai to other/ohai.py and convert to Collector - update hardware/*.py to return facts (no side effects) - mv AnsibleFactCollector to setup.py - extra collector class gathering to module method in facts/__init__.py (collector_classes_from_gather_subset) - add a CollectorMetaDataCollector collector used to provide the 'gather_setup' fact - add unit test module for 'setup' module (test/units/modules/system/setup.py) - Collector init now doesnt need a module, but collect does An instance of a FactCollector() isnt tied to a AnsibleModule instance, but the collect() method can be, so optionally pass in module to FactCollector.collect() (everywhere) - add a default_collectors for list of default collectors import and use it from setup.py module eventually, would like to replace this with a plugin loader style class finder/loader - unit tests for module_utils/facts/__init__.py - add unit tests for ohai facts collector - remove self.facts side effect on populate() in hardware/sunos.py - convert OpenBSDHardware() to rm side effects on self.facts - try to rm some self.facts side effects in Network() plumb in collected_facts from populate() where it is needed. stop passing collected_facts into Network() [via cached_facts=, where it eventually becomes self.facts] - nothing provides Fact() cached_facts arg now, rm it Facts() should be internal only implementation so nothing should be using it. Of course, now someone will. - add a Collector.name attr to build a map of name->_fact_ids To properly exclude a gather_subset spec like '!hardware', we need to know that 'hardware' also means 'devices', 'dmi', etc. Before, '!hardware' would remove the 'hardware' collector name but not 'devices'. Since both would end up in id_collector_map, we would still end up with the HardwareCollector in the collector list. End result being that '!hardware' wouldn't stop hardware from being collected. So we need to be able to build that map, so add the Collector.name attribute that is the primary name (like 'hardware') and let Collector._fact_ids be the other fact ids that a collector is responsible for. Construct the aliases_map of Collector.name -> set of _fact_ids in fact/__init__.py get_collector_names, and use it when we are populating the exclude set. - refactor of distribution.py make the big OS_FAMILY literal a little easier to read Also keys can now be any string instead of python literals 99% sure the test for 'KDE Neon' was wrong I don't see how/where it should or could get 'Neon' instead of 'KDE Neon' as provided in os-release NAME= Use 'distribution' string for key to OS_MAP ie, we dont need to make it a valid python label anymore so dont. move _has_dist_file to module as _file_exists easier to mock without mucking with os.path mv platform.system() calls to within get_distribution_facts() instead of Distribution() init. - remove _json compat module The code in here was to support: -a 'json' python module that was not the standard one included with python since 2.6. - potentially fallback to simplejson if 'json' was not available. 'json' is available for all supported python versions now so no longer needed. - mv get_collector_names -> facts.collector - mv collector_classes_from_gather_subset -> facts.collector - mv collector tests from test_facts -> test_collector - Use six's reduce() in sunos/netbsd hardware facts - rm extraneous get_uname_version in utils only system/distribution.py uses it - Remove Facts() subclass metaclass usage - using fact_id and a platform id for matching collectors gut most of Facts() subclasses rm Facts() subclasses with weird metaclass only add collectors that match the fact_ids and the platform_info to the list of collectors used. atm, a collectors platform_id will default to 'Generic', and any platform matches 'Generic' goal is to select collector classes including matching the systems platform in collector.py, instead of relying on metaclasses in hardware/*. To finish this, the various Facts() subclasses will need to be replaced entirely with Collector() subclasses. use collector classmethod platform_match() to match the platform This lets the particular class decide if it is compatible with a given platform_info. platform_info is a dict like obj, so it could be expanded in the future. Add a default platform_match to BaseFactCollector that matches platform_info['system'] == cls._platform They were needed previously to trigger a module load on all the collector classes when we import facts/hardare so that the Hardware() and related classes that used __new__ and find_all_subclasses() would work. Now that is done in collectors based on platform matching at runtime we dont need to do it py module import/parse time. So the non empty __init__.pys are no longer needed and their is a more flexible mechanism for selection platform specific stuff. facts/facts.py is no longer used, rm'ed - if we dont find an implement class for gather spec.. just ignore it. Would be useful to add a warn to warn about this case. - Fix SD-UX typo (should be HP-UX) - Port fix for #21893 (0 sockets) to this branch This readds the change from 8ad182059d5a085e4f8ecfe8ae63bad14a7dc01c that got lost in merge/rebase Fixes #21893 - port sunos fact locale fix for #24542 to this branch based on e558ec19cd1fd9d00e299cf1938d4ca3cec85cda Fixes #24542 Solaris fact fix (#24793) ensure locale for solaris fact gathering fixes issue with locale interfering with proper reading of decimals - raise exceptions in the air like we just dont care. Pretty much ignore any not exit exception in facts collection. And add some test cases. - added new selinux fact to clarify python lib the selinux fact is boolean false when the library is not installed, a dictionary/hash otherwise, but this is ambigous added new fact so we can eventually remove the type dichtomy and normalize it as a dict Re-add of devel commit 85c7a7b844bf429fc9cc0ffce5dd9bf05ed47b5a to the new code layout, since it got removed in merge/rebase
7 years ago
# other fact sources
_extra_facts = [
LocalFactCollector,
FacterFactCollector,
OhaiFactCollector
] # type: t.List[t.Type[BaseFactCollector]]
# TODO: make config driven
collectors = _base + _restrictive + _general + _virtual + _hardware + _network + _extra_facts