amd-node-scraper 1.1.5__tar.gz → 1.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/PKG-INFO +5 -3
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/README.md +1 -1
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/amd_node_scraper.egg-info/PKG-INFO +5 -3
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/amd_node_scraper.egg-info/SOURCES.txt +9 -1
- amd_node_scraper-1.1.6/amd_node_scraper.egg-info/entry_points.txt +6 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/PLUGIN_DOC.md +2 -1
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/cli.py +14 -15
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/helper.py +2 -2
- amd_node_scraper-1.1.6/nodescraper/configregistry.py +183 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/pluginconfig.py +31 -1
- amd_node_scraper-1.1.6/nodescraper/pluginrecipe/__init__.py +51 -0
- amd_node_scraper-1.1.6/nodescraper/pluginrecipe/all_plugins.py +24 -0
- amd_node_scraper-1.1.6/nodescraper/pluginrecipe/discovery.py +98 -0
- amd_node_scraper-1.1.6/nodescraper/pluginrecipe/node_status.py +38 -0
- amd_node_scraper-1.1.6/nodescraper/pluginrecipe/pluginrecipe.py +177 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/amdsmi_analyzer.py +237 -17
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/amdsmi_collector.py +82 -19
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/amdsmidata.py +270 -66
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/analyzer_args.py +7 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/pyproject.toml +6 -2
- amd_node_scraper-1.1.6/test/functional/fixtures/amdsmi_plugin_config.json +14 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_plugin_configs.py +1 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/cli/test_plugin_configs_cli.py +5 -9
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_cli_helper.py +4 -1
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_config_registry.py +2 -1
- amd_node_scraper-1.1.6/test/unit/framework/test_config_registry_entry_points.py +163 -0
- amd_node_scraper-1.1.6/test/unit/framework/test_pluginrecipe.py +130 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_amdsmi_analyzer.py +129 -11
- amd_node_scraper-1.1.6/test/unit/plugin/test_amdsmi_data.py +514 -0
- amd_node_scraper-1.1.5/amd_node_scraper.egg-info/entry_points.txt +0 -2
- amd_node_scraper-1.1.5/nodescraper/configregistry.py +0 -66
- amd_node_scraper-1.1.5/nodescraper/configs/node_status.json +0 -19
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/CODEOWNERS +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/pull_request_template.md +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/scripts/plugin_convention_warnings.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/workflows/code_quality_checks.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/workflows/functional-test.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/workflows/release-trusted-publisher.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/workflows/unit-test.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.github/workflows/update-plugin-docs.yml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.gitignore +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.mypy.ini +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/.pre-commit-config.yaml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/CONTRIBUTING.md +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/EXTENDING.md +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/LICENSE +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/SECURITY.md +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/amd_node_scraper.egg-info/dependency_links.txt +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/amd_node_scraper.egg-info/requires.txt +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/amd_node_scraper.egg-info/top_level.txt +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/dev-setup.sh +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/generate_plugin_doc_bundle.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/README.md +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/ext_nodescraper_plugins/sample/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/ext_nodescraper_plugins/sample/sample_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/ext_nodescraper_plugins/sample/sample_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/ext_nodescraper_plugins/sample/sample_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/ext_nodescraper_plugins/sample/sample_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/docs/node-scraper-external/pyproject.toml +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/inbandcollectortask.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/inbanddataplugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/oobanddataplugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/redfishcollectortask.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/base/regexanalyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/compare_runs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/constants.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/dynamicparserbuilder.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/embed.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/host_cli_embed.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/inputargtypes.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/cli/invocation.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/configbuilder.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/inband.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/inbandlocal.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/inbandmanager.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/inbandremote.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/inband/sshparams.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_connection.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_constants.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_manager.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_oem_diag.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_params.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/connection/redfish/redfish_path.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/constants.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/eventcategory.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/eventpriority.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/executionstatus.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/osfamily.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/systeminteraction.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/systemlocation.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/enums/taskstate.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/generictypes.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/helpers/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/connectionmanager.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/dataanalyzertask.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/datacollectortask.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/dataplugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/resultcollator.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/task.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/interfaces/taskresulthook.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/analyzerargs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/collectorargs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/connectionconfig.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/datamodel.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/datapluginresult.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/event.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/pluginresult.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/priority_override.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/systeminfo.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/taskresult.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/models/timerangeargs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/pluginexecutor.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/pluginregistry.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/amdsmi_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/amdsmi/cper.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/bios_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/bios_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/bios_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/bios/biosdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/cmdline_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/cmdline_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/cmdline_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/cmdlineconfig.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/cmdline/cmdlinedata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/device_enumeration_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/device_enumeration_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/device_enumeration_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/device_enumeration/deviceenumdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dimm/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dimm/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dimm/dimm_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dimm/dimm_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dimm/dimmdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/dkms_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/dkms_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/dkms_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dkms/dkmsdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/dmesg_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/dmesg_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/dmesg_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/dmesgdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/dmesg/run_compare.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/fabrics/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/fabrics/fabrics_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/fabrics/fabrics_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/fabrics/fabricsdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/journal_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/journal_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/journal_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/journal/journaldata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/kernel_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/kernel_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/kernel_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel/kerneldata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/kernel_module_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/kernel_module_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/kernel_module_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/kernel_module/kernel_module_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/memory_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/memory_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/memory_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/memory/memorydata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/ethtool_vendor.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/network_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/network_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/network_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/network/networkdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/nic_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/nic_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/nic_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nic/nic_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nvme/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nvme/nvme_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nvme/nvme_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/nvme/nvmedata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/os_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/os_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/os_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/os/osdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/package_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/package_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/package_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/package/packagedata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/pcie_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/pcie_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/pcie_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/pcie/pcie_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/process_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/process_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/process_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/process/processdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rdma/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rdma/rdma_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rdma/rdma_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rdma/rdma_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rdma/rdmadata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/rocm_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/rocm_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/rocm_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/rocm/rocmdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/storage_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/storage_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/storage_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/storage/storagedata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/sys_settings_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/sys_settings_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/sys_settings_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sys_settings/sys_settings_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/sysctl_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/sysctl_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/sysctl_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/sysctl/sysctldata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/syslog/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/syslog/syslog_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/syslog/syslog_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/syslog/syslogdata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/uptime/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/uptime/uptime_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/uptime/uptime_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/inband/uptime/uptimedata.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/endpoint_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/endpoint_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/endpoint_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_endpoint/endpoint_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/collector_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/oem_diag_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/oem_diag_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/oem_diag_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/ooband/redfish_oem_diag/oem_diag_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/regex_search/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/regex_search/analyzer_args.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/regex_search/regex_search_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/regex_search/regex_search_data.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/plugins/regex_search/regex_search_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/resultcollators/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/resultcollators/tablesummary.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/serialization.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/taskresulthooks/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/taskresulthooks/filesystemloghook.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/typeutils.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/nodescraper/utils.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/pytest.ini +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/setup.cfg +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/setup.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/__init__.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/conftest.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/bios_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/cmdline_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dimm_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dkms_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dmesg_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dmesg_plugin_config_custom_regex.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dmesg_sample.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/dmesg_sample_with_collapsing.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/fabrics_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/journal_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/kernel_module_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/kernel_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/memory_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/network_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/nic_plugin_config_full_analyzer_args.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/niccli_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/nvme_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/os_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/package_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/pcie_plugin_advanced_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/pcie_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/process_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/rdma_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/redfish_connection_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/redfish_endpoint_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/redfish_endpoint_plugin_config_full_args.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/regex_search_multi_logs/app_error.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/regex_search_multi_logs/no_errors.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/regex_search_multi_logs/storage_warn.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/regex_search_sample.log +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/rocm_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/storage_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/sys_settings_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/sysctl_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/syslog_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/fixtures/uptime_plugin_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_cli_describe.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_cli_help.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_cli_no_console_log.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_fabrics_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_network_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_nic_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_pcie_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_plugin_registry.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_rdma_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_redfish_endpoint_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_reference_config_workflow.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_run_plugins.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/functional/test_sys_settings_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/cli/test_build_global_argument_parser.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/cli/test_cli_embed_api.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/cli/test_cli_no_console_stdout.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/cli/test_host_cli_embed.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/conftest.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/connection/redfish/test_redfish_connection_paging.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/connection/redfish/test_redfish_oem_diag.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/common/shared_utils.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/compare_runs_sysctl/run1/sysctl_plugin/sysctl_collector/result.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/compare_runs_sysctl/run1/sysctl_plugin/sysctl_collector/sysctldatamodel.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/compare_runs_sysctl/run2/sysctl_plugin/sysctl_collector/result.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/compare_runs_sysctl/run2/sysctl_plugin/sysctl_collector/sysctldatamodel.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/example.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/example_config.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/invalid.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/log_dir/collector/biosdatamodel.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/fixtures/log_dir/collector/result.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_analyzerargs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_cli.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_compare_runs.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_config_builder.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_connection_manager_entrypoints.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_dataanalyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_datacollector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_dataplugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_file_artifact.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_plugin_executor.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_regexanalyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/framework/test_type_utils.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/fixtures/package_commands.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/fixtures/rdma_link_example_data.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/fixtures/rdma_statistic_example_data.json +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_amdsmi_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_analyzer_args_build_from_model.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_bios_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_bios_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_cmdline_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_cmdline_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_device_enumeration_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_device_enumeration_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_dimms_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_dkms_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_dkms_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_dmesg_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_dmesg_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_fabrics_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_journal_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_kernel_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_kernel_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_kernel_module_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_kernel_module_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_memory_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_memory_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_network_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_network_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_niccli_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_nvme_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_os_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_os_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_package_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_package_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_process_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_process_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_rdma_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_rdma_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_redfish_endpoint_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_redfish_endpoint_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_redfish_endpoint_plugin.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_redfish_oem_diag_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_redfish_oem_diag_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_regex_search_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_rocm_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_rocm_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_storage_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_storage_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_sys_settings_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_sys_settings_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_sysctl_analyzer.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_sysctl_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_syslog_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/plugin/test_uptime_collector.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/test_serialization.py +0 -0
- {amd_node_scraper-1.1.5 → amd_node_scraper-1.1.6}/test/unit/test_version.py +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: amd-node-scraper
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.6
|
|
4
4
|
Summary: A framework for automated error detection and data collection
|
|
5
|
+
Author: AMD
|
|
5
6
|
Project-URL: homepage, https://github.com/amd/node-scraper
|
|
6
7
|
Project-URL: documentation, https://github.com/amd/node-scraper
|
|
7
8
|
Project-URL: repository, https://github.com/amd/node-scraper
|
|
@@ -25,6 +26,7 @@ Requires-Dist: pre-commit; extra == "dev"
|
|
|
25
26
|
Requires-Dist: pytest; extra == "dev"
|
|
26
27
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
27
28
|
Requires-Dist: mypy; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
28
30
|
|
|
29
31
|
# Node Scraper
|
|
30
32
|
Node Scraper is a tool which performs automated data collection and analysis for the purposes of
|
|
@@ -144,7 +146,7 @@ options:
|
|
|
144
146
|
Comma-separated built-in names and/or plugin config
|
|
145
147
|
JSON paths (e.g. --plugin-
|
|
146
148
|
configs=NodeStatus,/path/c.json). Built-ins:
|
|
147
|
-
|
|
149
|
+
AllPlugins, NodeStatus (default: None)
|
|
148
150
|
--system-config STRING
|
|
149
151
|
Path to system config json (default: None)
|
|
150
152
|
--connection-config STRING
|
|
@@ -116,7 +116,7 @@ options:
|
|
|
116
116
|
Comma-separated built-in names and/or plugin config
|
|
117
117
|
JSON paths (e.g. --plugin-
|
|
118
118
|
configs=NodeStatus,/path/c.json). Built-ins:
|
|
119
|
-
|
|
119
|
+
AllPlugins, NodeStatus (default: None)
|
|
120
120
|
--system-config STRING
|
|
121
121
|
Path to system config json (default: None)
|
|
122
122
|
--connection-config STRING
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: amd-node-scraper
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.6
|
|
4
4
|
Summary: A framework for automated error detection and data collection
|
|
5
|
+
Author: AMD
|
|
5
6
|
Project-URL: homepage, https://github.com/amd/node-scraper
|
|
6
7
|
Project-URL: documentation, https://github.com/amd/node-scraper
|
|
7
8
|
Project-URL: repository, https://github.com/amd/node-scraper
|
|
@@ -25,6 +26,7 @@ Requires-Dist: pre-commit; extra == "dev"
|
|
|
25
26
|
Requires-Dist: pytest; extra == "dev"
|
|
26
27
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
27
28
|
Requires-Dist: mypy; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
28
30
|
|
|
29
31
|
# Node Scraper
|
|
30
32
|
Node Scraper is a tool which performs automated data collection and analysis for the purposes of
|
|
@@ -144,7 +146,7 @@ options:
|
|
|
144
146
|
Comma-separated built-in names and/or plugin config
|
|
145
147
|
JSON paths (e.g. --plugin-
|
|
146
148
|
configs=NodeStatus,/path/c.json). Built-ins:
|
|
147
|
-
|
|
149
|
+
AllPlugins, NodeStatus (default: None)
|
|
148
150
|
--system-config STRING
|
|
149
151
|
Path to system config json (default: None)
|
|
150
152
|
--connection-config STRING
|
|
@@ -62,7 +62,6 @@ nodescraper/cli/helper.py
|
|
|
62
62
|
nodescraper/cli/host_cli_embed.py
|
|
63
63
|
nodescraper/cli/inputargtypes.py
|
|
64
64
|
nodescraper/cli/invocation.py
|
|
65
|
-
nodescraper/configs/node_status.json
|
|
66
65
|
nodescraper/connection/__init__.py
|
|
67
66
|
nodescraper/connection/inband/__init__.py
|
|
68
67
|
nodescraper/connection/inband/inband.py
|
|
@@ -108,6 +107,11 @@ nodescraper/models/priority_override.py
|
|
|
108
107
|
nodescraper/models/systeminfo.py
|
|
109
108
|
nodescraper/models/taskresult.py
|
|
110
109
|
nodescraper/models/timerangeargs.py
|
|
110
|
+
nodescraper/pluginrecipe/__init__.py
|
|
111
|
+
nodescraper/pluginrecipe/all_plugins.py
|
|
112
|
+
nodescraper/pluginrecipe/discovery.py
|
|
113
|
+
nodescraper/pluginrecipe/node_status.py
|
|
114
|
+
nodescraper/pluginrecipe/pluginrecipe.py
|
|
111
115
|
nodescraper/plugins/__init__.py
|
|
112
116
|
nodescraper/plugins/inband/__init__.py
|
|
113
117
|
nodescraper/plugins/inband/amdsmi/__init__.py
|
|
@@ -309,6 +313,7 @@ test/functional/test_redfish_endpoint_plugin.py
|
|
|
309
313
|
test/functional/test_reference_config_workflow.py
|
|
310
314
|
test/functional/test_run_plugins.py
|
|
311
315
|
test/functional/test_sys_settings_plugin.py
|
|
316
|
+
test/functional/fixtures/amdsmi_plugin_config.json
|
|
312
317
|
test/functional/fixtures/bios_plugin_config.json
|
|
313
318
|
test/functional/fixtures/cmdline_plugin_config.json
|
|
314
319
|
test/functional/fixtures/dimm_plugin_config.json
|
|
@@ -362,12 +367,14 @@ test/unit/framework/test_cli_helper.py
|
|
|
362
367
|
test/unit/framework/test_compare_runs.py
|
|
363
368
|
test/unit/framework/test_config_builder.py
|
|
364
369
|
test/unit/framework/test_config_registry.py
|
|
370
|
+
test/unit/framework/test_config_registry_entry_points.py
|
|
365
371
|
test/unit/framework/test_connection_manager_entrypoints.py
|
|
366
372
|
test/unit/framework/test_dataanalyzer.py
|
|
367
373
|
test/unit/framework/test_datacollector.py
|
|
368
374
|
test/unit/framework/test_dataplugin.py
|
|
369
375
|
test/unit/framework/test_file_artifact.py
|
|
370
376
|
test/unit/framework/test_plugin_executor.py
|
|
377
|
+
test/unit/framework/test_pluginrecipe.py
|
|
371
378
|
test/unit/framework/test_regexanalyzer.py
|
|
372
379
|
test/unit/framework/test_type_utils.py
|
|
373
380
|
test/unit/framework/common/shared_utils.py
|
|
@@ -382,6 +389,7 @@ test/unit/framework/fixtures/log_dir/collector/biosdatamodel.json
|
|
|
382
389
|
test/unit/framework/fixtures/log_dir/collector/result.json
|
|
383
390
|
test/unit/plugin/test_amdsmi_analyzer.py
|
|
384
391
|
test/unit/plugin/test_amdsmi_collector.py
|
|
392
|
+
test/unit/plugin/test_amdsmi_data.py
|
|
385
393
|
test/unit/plugin/test_analyzer_args_build_from_model.py
|
|
386
394
|
test/unit/plugin/test_bios_analyzer.py
|
|
387
395
|
test/unit/plugin/test_bios_collector.py
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
| Plugin | Collection | Analyzer Args | Collection Args | DataModel | Collector | Analyzer |
|
|
6
6
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
7
|
-
| AmdSmiPlugin | bad-pages<br>firmware --json<br>list --json<br>metric -g all<br>partition --json<br>process --json<br>ras --cper --folder={folder}<br>ras --afid --cper-file {cper_file}<br>static -g all --json<br>static -g {gpu_id} --json<br>topology<br>version --json<br>xgmi -l<br>xgmi -m | **Analyzer Args:**<br>- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).<br>- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.<br>- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).<br>- `expected_driver_version`: Optional[str] — Expected AMD driver version string.<br>- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).<br>- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.<br>- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).<br>- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.<br>- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.<br>- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).<br>- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.<br>- `devid_ep`: Optional[str] — Expected endpoint device ID.<br>- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.<br>- `sku_name`: Optional[str] — Expected SKU name string for GPU.<br>- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).<br>- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.<br>- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**<br>- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions<br>- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiDataModel](#AmdSmiDataModel-Model) | [AmdSmiCollector](#Collector-Class-AmdSmiCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
|
|
7
|
+
| AmdSmiPlugin | bad-pages<br>firmware --json<br>list --json<br>metric -g all<br>partition --json<br>process --json<br>ras --cper --folder={folder}<br>ras --afid --cper-file {cper_file}<br>static -g all --json<br>static -g {gpu_id} --json<br>topology<br>version --json<br>xgmi -l<br>xgmi -m | **Analyzer Args:**<br>- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).<br>- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.<br>- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).<br>- `expected_power_management`: Optional[str] — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-manage...<br>- `expected_driver_version`: Optional[str] — Expected AMD driver version string.<br>- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).<br>- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.<br>- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).<br>- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.<br>- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.<br>- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).<br>- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.<br>- `devid_ep`: Optional[str] — Expected endpoint device ID.<br>- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.<br>- `sku_name`: Optional[str] — Expected SKU name string for GPU.<br>- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).<br>- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.<br>- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**<br>- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions<br>- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiDataModel](#AmdSmiDataModel-Model) | [AmdSmiCollector](#Collector-Class-AmdSmiCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
|
|
8
8
|
| BiosPlugin | sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'<br>wmic bios get SMBIOSBIOSVersion /Value | **Analyzer Args:**<br>- `exp_bios_version`: list[str] — Expected BIOS version(s) to match against collected value (str or list).<br>- `regex_match`: bool — If True, match exp_bios_version as regex; otherwise exact match. | - | [BiosDataModel](#BiosDataModel-Model) | [BiosCollector](#Collector-Class-BiosCollector) | [BiosAnalyzer](#Data-Analyzer-Class-BiosAnalyzer) |
|
|
9
9
|
| CmdlinePlugin | cat /proc/cmdline | **Analyzer Args:**<br>- `required_cmdline`: Union[str, List] — Command-line parameters that must be present (e.g. 'pci=bfsort').<br>- `banned_cmdline`: Union[str, List] — Command-line parameters that must not be present.<br>- `os_overrides`: Dict[str, nodescraper.plugins.inband.cmdline.cmdlineconfig.OverrideConfig] — Per-OS overrides for required_cmdline and banned_cmdline (keyed by OS identifier).<br>- `platform_overrides`: Dict[str, nodescraper.plugins.inband.cmdline.cmdlineconfig.OverrideConfig] — Per-platform overrides for required_cmdline and banned_cmdline (keyed by platform). | - | [CmdlineDataModel](#CmdlineDataModel-Model) | [CmdlineCollector](#Collector-Class-CmdlineCollector) | [CmdlineAnalyzer](#Data-Analyzer-Class-CmdlineAnalyzer) |
|
|
10
10
|
| DeviceEnumerationPlugin | powershell -Command "(Get-WmiObject -Class Win32_Processor | Measure-Object).Count"<br>lspci -d {vendorid_ep}: | grep -iE 'VGA|Display|3D|Processing accelerators|Co-processor|Accelerator' | grep -vi 'Virtual Function' | wc -l<br>powershell -Command "(wmic path win32_VideoController get name | findstr AMD | Measure-Object).Count"<br>lscpu<br>lshw<br>lspci -d {vendorid_ep}: | grep -i 'Virtual Function' | wc -l<br>powershell -Command "(Get-VMHostPartitionableGpu | Measure-Object).Count" | **Analyzer Args:**<br>- `cpu_count`: Optional[list[int]] — Expected CPU count(s); pass as int or list of ints. Analysis passes if actual is in list.<br>- `gpu_count`: Optional[list[int]] — Expected GPU count(s); pass as int or list of ints. Analysis passes if actual is in list.<br>- `vf_count`: Optional[list[int]] — Expected virtual function count(s); pass as int or list of ints. Analysis passes if actual is in list. | - | [DeviceEnumerationDataModel](#DeviceEnumerationDataModel-Model) | [DeviceEnumerationCollector](#Collector-Class-DeviceEnumerationCollector) | [DeviceEnumerationAnalyzer](#Data-Analyzer-Class-DeviceEnumerationAnalyzer) |
|
|
@@ -1755,6 +1755,7 @@ Check sysctl matches expected sysctl details
|
|
|
1755
1755
|
- **check_static_data**: `bool` — If True, run static data checks (e.g. driver version, partition mode).
|
|
1756
1756
|
- **expected_gpu_processes**: `Optional[int]` — Expected number of GPU processes.
|
|
1757
1757
|
- **expected_max_power**: `Optional[int]` — Expected maximum power value (e.g. watts).
|
|
1758
|
+
- **expected_power_management**: `Optional[str]` — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-managed idle).
|
|
1758
1759
|
- **expected_driver_version**: `Optional[str]` — Expected AMD driver version string.
|
|
1759
1760
|
- **expected_memory_partition_mode**: `Optional[str]` — Expected memory partition mode (e.g. sp3, dp).
|
|
1760
1761
|
- **expected_compute_partition_mode**: `Optional[str]` — Expected compute partition mode.
|
|
@@ -64,7 +64,7 @@ from nodescraper.connection.redfish import (
|
|
|
64
64
|
from nodescraper.connection.redfish.redfish_params import RedfishConnectionParams
|
|
65
65
|
from nodescraper.constants import DEFAULT_LOGGER
|
|
66
66
|
from nodescraper.enums import ExecutionStatus, SystemInteractionLevel, SystemLocation
|
|
67
|
-
from nodescraper.models import
|
|
67
|
+
from nodescraper.models import SystemInfo
|
|
68
68
|
from nodescraper.pluginexecutor import PluginExecutor
|
|
69
69
|
from nodescraper.pluginregistry import PluginRegistry
|
|
70
70
|
|
|
@@ -74,17 +74,16 @@ def _parse_plugin_configs_csv(value: str) -> list[str]:
|
|
|
74
74
|
return [p.strip() for p in value.split(",") if p.strip()]
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
def
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
)
|
|
87
|
-
return config_reg
|
|
77
|
+
def _default_config_registry(_plugin_reg: PluginRegistry) -> ConfigRegistry:
|
|
78
|
+
"""Build the config registry from bundled JSON and plugin-config entry points.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
_plugin_reg (PluginRegistry): Unused; retained for call-site compatibility.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
ConfigRegistry: Registry containing bundled and entry-point plugin configs.
|
|
85
|
+
"""
|
|
86
|
+
return ConfigRegistry()
|
|
88
87
|
|
|
89
88
|
|
|
90
89
|
def _add_cli_root_globals(
|
|
@@ -203,7 +202,7 @@ def _add_cli_root_globals(
|
|
|
203
202
|
def build_global_argument_parser(*, add_help: bool = True) -> argparse.ArgumentParser:
|
|
204
203
|
"""Globals only (no subcommands), for host CLIs."""
|
|
205
204
|
plugin_reg = PluginRegistry()
|
|
206
|
-
config_reg =
|
|
205
|
+
config_reg = _default_config_registry(plugin_reg)
|
|
207
206
|
parser = argparse.ArgumentParser(
|
|
208
207
|
description="node scraper CLI (global options only)",
|
|
209
208
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
@@ -406,7 +405,7 @@ def get_cli_top_level_subcommands() -> tuple[str, ...]:
|
|
|
406
405
|
Tuple of ``subcmd`` subparser names; call ``cache_clear()`` if registries change in-process.
|
|
407
406
|
"""
|
|
408
407
|
plugin_reg = PluginRegistry()
|
|
409
|
-
config_reg =
|
|
408
|
+
config_reg = _default_config_registry(plugin_reg)
|
|
410
409
|
parser, _plugin_subparser_map = build_parser(plugin_reg, config_reg)
|
|
411
410
|
return _top_level_subcommand_names(parser)
|
|
412
411
|
|
|
@@ -474,7 +473,7 @@ def main(
|
|
|
474
473
|
arg_input = sys.argv[1:]
|
|
475
474
|
|
|
476
475
|
plugin_reg = PluginRegistry()
|
|
477
|
-
config_reg =
|
|
476
|
+
config_reg = _default_config_registry(plugin_reg)
|
|
478
477
|
parser, plugin_subparser_map = build_parser(plugin_reg, config_reg)
|
|
479
478
|
|
|
480
479
|
try:
|
|
@@ -211,8 +211,8 @@ def parse_describe(
|
|
|
211
211
|
if not parsed_args.name:
|
|
212
212
|
out: list[str] = []
|
|
213
213
|
if parsed_args.type == "config":
|
|
214
|
-
out.append("Available
|
|
215
|
-
for name in config_reg.configs:
|
|
214
|
+
out.append("Available configs:")
|
|
215
|
+
for name in sorted(config_reg.configs):
|
|
216
216
|
out.append(f" {name}")
|
|
217
217
|
elif parsed_args.type == "plugin":
|
|
218
218
|
out.append("Available plugins:")
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import importlib.metadata
|
|
29
|
+
import inspect
|
|
30
|
+
import json
|
|
31
|
+
import os
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Any, Optional
|
|
34
|
+
|
|
35
|
+
from pydantic import ValidationError
|
|
36
|
+
|
|
37
|
+
from nodescraper.models import PluginConfig
|
|
38
|
+
|
|
39
|
+
PLUGIN_CONFIG_ENTRY_POINT_GROUP = "nodescraper.plugin_configs"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PluginConfigEntryPointError(RuntimeError):
|
|
43
|
+
"""Raised when a ``nodescraper.plugin_configs`` entry point cannot be loaded."""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ConfigRegistry:
|
|
47
|
+
"""Class to load json plugin configs into models"""
|
|
48
|
+
|
|
49
|
+
INTERNAL_SEARCH_PATH = os.path.join(os.path.dirname(__file__), "configs")
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
config_path: Optional[str] = None,
|
|
54
|
+
load_entry_point_configs: bool = True,
|
|
55
|
+
) -> None:
|
|
56
|
+
"""Initialize the config registry.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
config_path (Optional[str], optional): Path in which to search for JSON config files.
|
|
60
|
+
Defaults to None.
|
|
61
|
+
load_entry_point_configs (bool, optional): Whether to load ``nodescraper.plugin_configs``
|
|
62
|
+
entry points. Defaults to True.
|
|
63
|
+
"""
|
|
64
|
+
self.configs: dict[str, PluginConfig] = {}
|
|
65
|
+
self.load_configs(config_path)
|
|
66
|
+
if load_entry_point_configs:
|
|
67
|
+
self.configs.update(self.load_plugin_configs_from_entry_points())
|
|
68
|
+
|
|
69
|
+
def load_configs(self, config_path: Optional[str] = None):
|
|
70
|
+
"""Load plugin config JSON files into pydantic models.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
config_path (Optional[str], optional): Path in which to search for config files.
|
|
74
|
+
Defaults to None.
|
|
75
|
+
"""
|
|
76
|
+
if not config_path:
|
|
77
|
+
config_path = self.INTERNAL_SEARCH_PATH
|
|
78
|
+
|
|
79
|
+
config_path = Path(config_path)
|
|
80
|
+
|
|
81
|
+
for config_file in config_path.glob("*.json"):
|
|
82
|
+
with open(config_file, "r", encoding="utf-8") as in_file:
|
|
83
|
+
try:
|
|
84
|
+
file_data = json.load(in_file)
|
|
85
|
+
config_model = PluginConfig(**file_data)
|
|
86
|
+
if config_model.name:
|
|
87
|
+
self.configs[config_model.name] = config_model
|
|
88
|
+
else:
|
|
89
|
+
self.configs[config_file.name] = config_model
|
|
90
|
+
except (ValidationError, json.JSONDecodeError):
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
@staticmethod
|
|
94
|
+
def _entry_points_for_group(group: str):
|
|
95
|
+
"""Return setuptools entry points for the given group name.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
group (str): Entry point group to query.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Iterable: Entry points registered under ``group``.
|
|
102
|
+
"""
|
|
103
|
+
try:
|
|
104
|
+
return importlib.metadata.entry_points(group=group) # type: ignore[call-arg]
|
|
105
|
+
except TypeError:
|
|
106
|
+
all_eps = importlib.metadata.entry_points() # type: ignore[assignment]
|
|
107
|
+
return all_eps.get(group, []) # type: ignore[assignment, attr-defined, arg-type]
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _resolve_entry_point_config(loaded: Any) -> PluginConfig | dict[str, Any] | None:
|
|
111
|
+
"""Resolve a loaded entry point object into a plugin config.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
loaded (Any): Object returned by an entry point ``load()`` call.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Optional[PluginConfig | dict[str, Any]]: Plugin config, or None if ``loaded`` is unsupported.
|
|
118
|
+
"""
|
|
119
|
+
if isinstance(loaded, PluginConfig):
|
|
120
|
+
return loaded
|
|
121
|
+
if isinstance(loaded, dict):
|
|
122
|
+
return loaded
|
|
123
|
+
if inspect.isclass(loaded) and hasattr(loaded, "plugin_config"):
|
|
124
|
+
config_data = loaded.plugin_config()
|
|
125
|
+
elif callable(loaded):
|
|
126
|
+
config_data = loaded()
|
|
127
|
+
else:
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
if isinstance(config_data, (PluginConfig, dict)):
|
|
131
|
+
return config_data
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def load_plugin_configs_from_entry_points(cls) -> dict[str, PluginConfig]:
|
|
136
|
+
"""Load plugin configs registered under ``nodescraper.plugin_configs`` entry points.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
dict[str, PluginConfig]: Map of config name to loaded :class:`~nodescraper.models.PluginConfig`.
|
|
140
|
+
|
|
141
|
+
Raises:
|
|
142
|
+
PluginConfigEntryPointError: If an entry point target is missing, invalid, or unsupported.
|
|
143
|
+
"""
|
|
144
|
+
configs: dict[str, PluginConfig] = {}
|
|
145
|
+
|
|
146
|
+
for entry_point in cls._entry_points_for_group(PLUGIN_CONFIG_ENTRY_POINT_GROUP):
|
|
147
|
+
entry_point_name = getattr(entry_point, "name", None)
|
|
148
|
+
entry_point_label = entry_point_name or "<unknown>"
|
|
149
|
+
try:
|
|
150
|
+
loaded = entry_point.load() # type: ignore[attr-defined]
|
|
151
|
+
config_data = cls._resolve_entry_point_config(loaded)
|
|
152
|
+
if config_data is None:
|
|
153
|
+
raise PluginConfigEntryPointError(
|
|
154
|
+
f"Failed to load plugin config entry point {entry_point_label!r}: "
|
|
155
|
+
f"unsupported target {loaded!r}"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
config_model = (
|
|
159
|
+
config_data
|
|
160
|
+
if isinstance(config_data, PluginConfig)
|
|
161
|
+
else PluginConfig(**config_data)
|
|
162
|
+
)
|
|
163
|
+
config_key = entry_point_name or config_model.name
|
|
164
|
+
if config_key:
|
|
165
|
+
configs[config_key] = config_model
|
|
166
|
+
except ModuleNotFoundError as exc:
|
|
167
|
+
raise PluginConfigEntryPointError(
|
|
168
|
+
f"Failed to load plugin config entry point {entry_point_label!r}: "
|
|
169
|
+
f"module not found ({exc}). Check the entry point target in pyproject.toml."
|
|
170
|
+
) from exc
|
|
171
|
+
except ValidationError as exc:
|
|
172
|
+
raise PluginConfigEntryPointError(
|
|
173
|
+
f"Failed to load plugin config entry point {entry_point_label!r}: "
|
|
174
|
+
"invalid plugin config"
|
|
175
|
+
) from exc
|
|
176
|
+
except PluginConfigEntryPointError:
|
|
177
|
+
raise
|
|
178
|
+
except Exception as exc:
|
|
179
|
+
raise PluginConfigEntryPointError(
|
|
180
|
+
f"Failed to load plugin config entry point {entry_point_label!r}: {exc}"
|
|
181
|
+
) from exc
|
|
182
|
+
|
|
183
|
+
return configs
|
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
# SOFTWARE.
|
|
24
24
|
#
|
|
25
25
|
###############################################################################
|
|
26
|
-
from
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from typing import Any, Optional
|
|
27
29
|
|
|
28
30
|
from pydantic import BaseModel, Field
|
|
29
31
|
|
|
@@ -36,3 +38,31 @@ class PluginConfig(BaseModel):
|
|
|
36
38
|
result_collators: dict[str, dict] = Field(default_factory=dict)
|
|
37
39
|
name: Optional[str] = None
|
|
38
40
|
desc: Optional[str] = None
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def coerce(cls, config: PluginConfig | dict[str, Any]) -> PluginConfig:
|
|
44
|
+
"""Return a ``PluginConfig`` instance from a model or mapping."""
|
|
45
|
+
if isinstance(config, cls):
|
|
46
|
+
return config
|
|
47
|
+
return cls.model_validate(config)
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def merge(cls, *configs: PluginConfig | dict[str, Any]) -> PluginConfig:
|
|
51
|
+
"""Merge recipe plugin configs.
|
|
52
|
+
|
|
53
|
+
Plugin entries from later configs overwrite earlier ones with the same name.
|
|
54
|
+
``name``, ``desc``, ``global_args``, and ``result_collators`` come from the first
|
|
55
|
+
config.
|
|
56
|
+
"""
|
|
57
|
+
normalized = [cls.coerce(config) for config in configs]
|
|
58
|
+
merged_plugins: dict[str, dict[str, Any]] = {}
|
|
59
|
+
for config in normalized:
|
|
60
|
+
merged_plugins.update(config.plugins)
|
|
61
|
+
first = normalized[0] if normalized else cls()
|
|
62
|
+
return cls(
|
|
63
|
+
name=first.name,
|
|
64
|
+
desc=first.desc,
|
|
65
|
+
global_args=first.global_args,
|
|
66
|
+
plugins=merged_plugins,
|
|
67
|
+
result_collators=first.result_collators,
|
|
68
|
+
)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
###############################################################################
|
|
8
|
+
from nodescraper.models import PluginConfig
|
|
9
|
+
|
|
10
|
+
from .all_plugins import AllPlugins
|
|
11
|
+
from .discovery import (
|
|
12
|
+
load_plugin_class,
|
|
13
|
+
plugin_has_analyzer,
|
|
14
|
+
plugin_has_collector,
|
|
15
|
+
plugin_names_matching,
|
|
16
|
+
plugins_with_analyzer,
|
|
17
|
+
plugins_with_collector,
|
|
18
|
+
registered_plugin_names,
|
|
19
|
+
)
|
|
20
|
+
from .node_status import NodeStatus
|
|
21
|
+
from .pluginrecipe import (
|
|
22
|
+
ANALYZE_ONLY,
|
|
23
|
+
COLLECT_AND_ANALYZE,
|
|
24
|
+
COLLECT_ONLY,
|
|
25
|
+
AnalyzerOnlyPluginRecipe,
|
|
26
|
+
CollectorOnlyPluginRecipe,
|
|
27
|
+
PluginRecipe,
|
|
28
|
+
PluginRunFlags,
|
|
29
|
+
merge_plugin_configs,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"ANALYZE_ONLY",
|
|
34
|
+
"COLLECT_AND_ANALYZE",
|
|
35
|
+
"COLLECT_ONLY",
|
|
36
|
+
"AllPlugins",
|
|
37
|
+
"AnalyzerOnlyPluginRecipe",
|
|
38
|
+
"CollectorOnlyPluginRecipe",
|
|
39
|
+
"NodeStatus",
|
|
40
|
+
"PluginConfig",
|
|
41
|
+
"PluginRecipe",
|
|
42
|
+
"PluginRunFlags",
|
|
43
|
+
"load_plugin_class",
|
|
44
|
+
"merge_plugin_configs",
|
|
45
|
+
"plugin_has_analyzer",
|
|
46
|
+
"plugin_has_collector",
|
|
47
|
+
"plugin_names_matching",
|
|
48
|
+
"plugins_with_analyzer",
|
|
49
|
+
"plugins_with_collector",
|
|
50
|
+
"registered_plugin_names",
|
|
51
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
###############################################################################
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .discovery import registered_plugin_names
|
|
11
|
+
from .pluginrecipe import PluginRecipe
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AllPlugins(PluginRecipe):
|
|
15
|
+
"""Run all registered plugins with default arguments."""
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def plugin_names(cls) -> tuple[str, ...]:
|
|
19
|
+
"""Return every plugin registered at runtime.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
tuple[str, ...]: Sorted names of all plugins in the plugin registry.
|
|
23
|
+
"""
|
|
24
|
+
return registered_plugin_names()
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
###############################################################################
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Iterable
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def registered_plugin_names() -> tuple[str, ...]:
|
|
14
|
+
"""Return all plugin names known to :class:`~nodescraper.pluginregistry.PluginRegistry`.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
tuple[str, ...]: Sorted registered plugin names.
|
|
18
|
+
"""
|
|
19
|
+
from nodescraper.pluginregistry import PluginRegistry
|
|
20
|
+
|
|
21
|
+
return tuple(sorted(PluginRegistry().plugins))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def plugin_names_matching(names: Iterable[str]) -> tuple[str, ...]:
|
|
25
|
+
"""Return plugin names from ``names`` that are registered at runtime.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
names (Iterable[str]): Candidate plugin names to filter.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
tuple[str, ...]: Sorted subset of ``names`` present in the plugin registry.
|
|
32
|
+
"""
|
|
33
|
+
available = set(registered_plugin_names())
|
|
34
|
+
return tuple(sorted(name for name in names if name in available))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def load_plugin_class(plugin_name: str) -> type | None:
|
|
38
|
+
"""Return a registered plugin class by name.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
plugin_name (str): Registered plugin name.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
type | None: Plugin class, or ``None`` if the name is not registered.
|
|
45
|
+
"""
|
|
46
|
+
from nodescraper.pluginregistry import PluginRegistry
|
|
47
|
+
|
|
48
|
+
return PluginRegistry().plugins.get(plugin_name)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def plugin_has_collector(plugin_name: str) -> bool:
|
|
52
|
+
"""Return whether the plugin exposes a collector task.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
plugin_name (str): Registered plugin name.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
bool: ``True`` when the plugin class defines ``COLLECTOR``.
|
|
59
|
+
"""
|
|
60
|
+
plugin_class = load_plugin_class(plugin_name)
|
|
61
|
+
return plugin_class is not None and getattr(plugin_class, "COLLECTOR", None) is not None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def plugin_has_analyzer(plugin_name: str) -> bool:
|
|
65
|
+
"""Return whether the plugin exposes an analyzer task.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
plugin_name (str): Registered plugin name.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
bool: ``True`` when the plugin class defines ``ANALYZER``.
|
|
72
|
+
"""
|
|
73
|
+
plugin_class = load_plugin_class(plugin_name)
|
|
74
|
+
return plugin_class is not None and getattr(plugin_class, "ANALYZER", None) is not None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def plugins_with_collector(plugin_names: Iterable[str]) -> tuple[str, ...]:
|
|
78
|
+
"""Filter plugin names to those that define a collector.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
plugin_names (Iterable[str]): Candidate plugin names.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
tuple[str, ...]: Sorted plugin names with a ``COLLECTOR`` implementation.
|
|
85
|
+
"""
|
|
86
|
+
return tuple(sorted(name for name in plugin_names if plugin_has_collector(name)))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def plugins_with_analyzer(plugin_names: Iterable[str]) -> tuple[str, ...]:
|
|
90
|
+
"""Filter plugin names to those that define an analyzer.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
plugin_names (Iterable[str]): Candidate plugin names.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
tuple[str, ...]: Sorted plugin names with an ``ANALYZER`` implementation.
|
|
97
|
+
"""
|
|
98
|
+
return tuple(sorted(name for name in plugin_names if plugin_has_analyzer(name)))
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
###############################################################################
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .discovery import plugin_names_matching
|
|
11
|
+
from .pluginrecipe import PluginRecipe
|
|
12
|
+
|
|
13
|
+
_NODE_STATUS_PLUGINS = (
|
|
14
|
+
"BiosPlugin",
|
|
15
|
+
"CmdlinePlugin",
|
|
16
|
+
"DimmPlugin",
|
|
17
|
+
"DkmsPlugin",
|
|
18
|
+
"DmesgPlugin",
|
|
19
|
+
"KernelPlugin",
|
|
20
|
+
"MemoryPlugin",
|
|
21
|
+
"OsPlugin",
|
|
22
|
+
"RocmPlugin",
|
|
23
|
+
"StoragePlugin",
|
|
24
|
+
"UptimePlugin",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class NodeStatus(PluginRecipe):
|
|
29
|
+
"""Check configuration and status of the node."""
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def plugin_names(cls) -> tuple[str, ...]:
|
|
33
|
+
"""Return the NodeStatus plugin set resolved at runtime.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
tuple[str, ...]: Sorted node-status plugin names registered in the plugin registry.
|
|
37
|
+
"""
|
|
38
|
+
return plugin_names_matching(_NODE_STATUS_PLUGINS)
|