Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Facts refactor #23012

Merged
merged 1 commit into from
Jun 1, 2017
Merged

Facts refactor #23012

merged 1 commit into from
Jun 1, 2017

Conversation

alikins
Copy link
Contributor

@alikins alikins commented Mar 27, 2017

SUMMARY

Most of the Facts Refresh from
https://github.com/ansible/ansible/blob/devel/docs/docsite/rst/roadmap/ROADMAP_2_4.rst

Making facts.py more modular (using feature available via ansiballz and module_utils plugins) and testable. Also first steps towards pluggable facts.

Roadmap items:

  • Configurable list of ‘fact modules’ for gather_facts
  • Fact gathering policy finer grained
  • Make setup.py/facts more pluggable
  • Improve testing of setup.py/facts.py
ISSUE TYPE
  • Feature Pull Request
  • Bugfix Pull Request
COMPONENT NAME

lib/ansible/module_utils/facts.py

ANSIBLE VERSION
ansible 2.4.0 (facts_notes 8ebd5ab3ba) last updated 2017/03/27 16:52:56 (GMT -400)
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.13 (default, Jan 12 2017, 17:59:37) [GCC 6.3.1 20161221 (Red Hat 6.3.1-1)]

ADDITIONAL INFORMATION

@ansibot ansibot added WIP This issue/PR is a work in progress. Nevertheless it was shared for getting input from peers. affects_2.4 This issue/PR affects Ansible v2.4 c:module_utils/ c:module_utils/facts feature_pull_request needs_triage Needs a first human triage before being processed. labels Mar 27, 2017
@sivel
Copy link
Member

sivel commented Mar 27, 2017

You probably know this already, but a bunch of files are missing license headers. Any code that comes from facts.py originally needs to carry a GPLv3 license.

@ansibot
Copy link
Contributor

ansibot commented Mar 27, 2017

The test ansible-test sanity --test pep8 failed with the following errors:

contrib/inventory/lxd.py:26:29: E231 missing whitespace after ','
test/sanity/pep8/legacy-files.txt:108:1: A101 Remove "lib/ansible/module_utils/facts.py" since it does not exist

click here for bot help

@alikins
Copy link
Contributor Author

alikins commented Mar 28, 2017

@sivel re license header, yup, on the todo list

@ansibot
Copy link
Contributor

ansibot commented Mar 29, 2017

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:118:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:142:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:223:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:270:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/collector.py:7:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/collector.py:10:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/facts.py:130:9: E303 too many blank lines (2)
test/sanity/pep8/legacy-files.txt:108:1: A101 Remove "lib/ansible/module_utils/facts.py" since it does not exist

click here for bot help

@ansibot ansibot added c:module_utils/basic module This issue/PR relates to a module. labels Mar 29, 2017
@abadger abadger removed the needs_triage Needs a first human triage before being processed. label Mar 29, 2017
@ansibot
Copy link
Contributor

ansibot commented Mar 29, 2017

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:73:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:84:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:89:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:90:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:168:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:175:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/__init__.py:238:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/collector.py:79:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:85:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:86:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:93:1: W391 blank line at end of file
lib/ansible/module_utils/facts/facts.py:134:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/network/base.py:50:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/base.py:48:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/linux.py:8:1: E265 block comment should start with '# '
lib/ansible/module_utils/facts/virtual/linux.py:209:1: W391 blank line at end of file
test/sanity/pep8/legacy-files.txt:108:1: A101 Remove "lib/ansible/module_utils/facts.py" since it does not exist

click here for bot help

@ansibot ansibot added community_review In order to be merged, this PR must follow the community review workflow. new_module This PR includes a new module. labels Mar 30, 2017
@ansibot
Copy link
Contributor

ansibot commented Mar 30, 2017

The test ansible-test sanity --test empty-init failed with the following error:

Command "test/sanity/code-smell/empty-init.sh" returned exit status 1.
>>> Standard Output
lib/ansible/modules/system/__init__.py
One or more __init__.py file(s) listed above are non-empty.

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:87:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:98:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:103:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:104:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:182:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:189:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/__init__.py:253:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/collector.py:79:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:85:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:86:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:93:1: W391 blank line at end of file
lib/ansible/module_utils/facts/facts.py:121:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:549:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:559:1: W391 blank line at end of file
lib/ansible/module_utils/facts/network/base.py:50:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/__init__.py:45:38: E231 missing whitespace after ','
lib/ansible/module_utils/facts/system/__init__.py:51:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/env.py:35:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/user.py:28:22: E241 multiple spaces after ','
lib/ansible/module_utils/facts/virtual/base.py:48:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/linux.py:8:1: E265 block comment should start with '# '
lib/ansible/module_utils/facts/virtual/linux.py:209:1: W391 blank line at end of file
lib/ansible/modules/system/__init__.py:44:1: W391 blank line at end of file

click here for bot help

@ansibot ansibot added community_review In order to be merged, this PR must follow the community review workflow. and removed community_review In order to be merged, this PR must follow the community review workflow. labels Mar 30, 2017
@ansibot
Copy link
Contributor

ansibot commented Mar 31, 2017

The test ansible-test sanity --test empty-init failed with the following error:

Command "test/sanity/code-smell/empty-init.sh" returned exit status 1.
>>> Standard Output
lib/ansible/modules/system/__init__.py
One or more __init__.py file(s) listed above are non-empty.

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:90:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:101:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:106:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:107:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:185:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:192:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/__init__.py:269:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/__init__.py:297:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/__init__.py:322:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:117:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:123:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:124:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:131:1: W391 blank line at end of file
lib/ansible/module_utils/facts/facts.py:116:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:489:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:499:1: W391 blank line at end of file
lib/ansible/module_utils/facts/network/base.py:50:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/__init__.py:18:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/env.py:37:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/local.py:102:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/user.py:33:22: E241 multiple spaces after ','
lib/ansible/module_utils/facts/timeout.py:12:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/timeout.py:32:37: E241 multiple spaces after ','
lib/ansible/module_utils/facts/virtual/base.py:48:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/linux.py:8:1: E265 block comment should start with '# '
lib/ansible/module_utils/facts/virtual/linux.py:209:1: W391 blank line at end of file
lib/ansible/modules/system/__init__.py:44:1: W391 blank line at end of file

click here for bot help

@ansibot ansibot added community_review In order to be merged, this PR must follow the community review workflow. and removed community_review In order to be merged, this PR must follow the community review workflow. labels Mar 31, 2017
@ansibot
Copy link
Contributor

ansibot commented Apr 3, 2017

The test ansible-test sanity --test empty-init failed with the following error:

Command "test/sanity/code-smell/empty-init.sh" returned exit status 1.
>>> Standard Output
lib/ansible/modules/system/__init__.py
One or more __init__.py file(s) listed above are non-empty.

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:90:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/__init__.py:101:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:106:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:107:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:185:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:192:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/__init__.py:269:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/__init__.py:297:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/__init__.py:322:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:117:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:123:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:124:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:131:1: W391 blank line at end of file
lib/ansible/module_utils/facts/facts.py:116:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:489:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/facts.py:499:1: W391 blank line at end of file
lib/ansible/module_utils/facts/network/base.py:50:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/__init__.py:18:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/env.py:37:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/local.py:102:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/user.py:33:22: E241 multiple spaces after ','
lib/ansible/module_utils/facts/timeout.py:12:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/timeout.py:32:37: E241 multiple spaces after ','
lib/ansible/module_utils/facts/virtual/base.py:48:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/linux.py:8:1: E265 block comment should start with '# '
lib/ansible/module_utils/facts/virtual/linux.py:209:1: W391 blank line at end of file
lib/ansible/modules/system/__init__.py:44:1: W391 blank line at end of file

click here for bot help

@ansibot ansibot added community_review In order to be merged, this PR must follow the community review workflow. c:constants and removed community_review In order to be merged, this PR must follow the community review workflow. labels Apr 3, 2017
@ansibot
Copy link
Contributor

ansibot commented Apr 4, 2017

The test ansible-test sanity --test empty-init failed with the following error:

Command "test/sanity/code-smell/empty-init.sh" returned exit status 1.
>>> Standard Output
lib/ansible/modules/system/__init__.py
One or more __init__.py file(s) listed above are non-empty.

The test ansible-test sanity --test pep8 failed with the following errors:

lib/ansible/module_utils/facts/__init__.py:97:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:102:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:103:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/__init__.py:181:1: E303 too many blank lines (3)
lib/ansible/module_utils/facts/__init__.py:188:1: E302 expected 2 blank lines, found 3
lib/ansible/module_utils/facts/__init__.py:273:5: E303 too many blank lines (2)
lib/ansible/module_utils/facts/__init__.py:301:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/collector.py:117:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:123:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:124:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/collector.py:131:1: W391 blank line at end of file
lib/ansible/module_utils/facts/facts.py:53:9: E303 too many blank lines (2)
lib/ansible/module_utils/facts/network/base.py:50:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/__init__.py:18:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/apparmor.py:30:25: E222 multiple spaces after operator
lib/ansible/module_utils/facts/system/env.py:37:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/local.py:90:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/lsb.py:63:9: E265 block comment should start with '# '
lib/ansible/module_utils/facts/system/pkg_mgr.py:74:1: W391 blank line at end of file
lib/ansible/module_utils/facts/system/user.py:33:22: E241 multiple spaces after ','
lib/ansible/module_utils/facts/timeout.py:12:1: E302 expected 2 blank lines, found 1
lib/ansible/module_utils/facts/timeout.py:32:37: E241 multiple spaces after ','
lib/ansible/module_utils/facts/virtual/base.py:48:1: W391 blank line at end of file
lib/ansible/module_utils/facts/virtual/linux.py:8:1: E265 block comment should start with '# '
lib/ansible/module_utils/facts/virtual/linux.py:209:1: W391 blank line at end of file
lib/ansible/modules/system/__init__.py:44:1: W391 blank line at end of file
test/units/module_utils/test_facts.py:361:161: E501 line too long (190 > 160 characters)

click here for bot help

@ansibot ansibot added community_review In order to be merged, this PR must follow the community review workflow. and removed community_review In order to be merged, this PR must follow the community review workflow. labels Apr 4, 2017
@ansibot ansibot added core_review In order to be merged, this PR must follow the core review workflow. needs_rebase https://docs.ansible.com/ansible/devel/dev_guide/developing_rebasing.html and removed core_review In order to be merged, this PR must follow the core review workflow. needs_rebase https://docs.ansible.com/ansible/devel/dev_guide/developing_rebasing.html labels May 23, 2017
@ansibot ansibot removed the core_review In order to be merged, this PR must follow the core review workflow. label May 30, 2017
@alikins alikins changed the title [WIP] Facts refactor Facts refactor May 30, 2017
@ansibot ansibot added core_review In order to be merged, this PR must follow the core review workflow. and removed WIP This issue/PR is a work in progress. Nevertheless it was shared for getting input from peers. labels May 30, 2017
@ansibot
Copy link
Contributor

ansibot commented May 31, 2017

The test ansible-test sanity --test pylint failed with the following errors:

lib/ansible/plugins/callback/profile_tasks.py:141:23: too-few-format-args Not enough arguments for format string
lib/ansible/plugins/callback/profile_tasks.py:141:62: too-many-format-args Too many arguments for format string

click here for bot help

@ansibot ansibot added needs_revision This PR fails CI tests or a maintainer has requested a review/revision of the PR. core_review In order to be merged, this PR must follow the core review workflow. and removed core_review In order to be merged, this PR must follow the core review workflow. needs_revision This PR fails CI tests or a maintainer has requested a review/revision of the PR. labels May 31, 2017
This commit implements most of the 2.4 roadmap 'Facts Refresh'
from docs/docsite/rst/roadmap/ROADMAP_2_4.rst

- move facts code from facts.py to facts/*.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 8ad1820
    that got lost in merge/rebase

    Fixes #21893

- port sunos fact locale fix for #24542 to this branch

    based on e558ec1

    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 85c7a7b to
    the new code layout, since it got removed in merge/rebase

remove facts notes.txt
@alikins alikins merged commit 45a9f96 into ansible:devel Jun 1, 2017
@ansibot ansibot added feature This issue/PR relates to a feature request. and removed feature_pull_request labels Mar 4, 2018
@ansible ansible locked and limited conversation to collaborators Apr 26, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
affects_2.4 This issue/PR affects Ansible v2.4 c:constants c:module_utils/basic c:module_utils/facts c:module_utils/ core_review In order to be merged, this PR must follow the core review workflow. feature This issue/PR relates to a feature request. module This issue/PR relates to a module.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants