chore: adopt the NAPALM driver standard #2

Merged
christianmanivong merged 4 commits from chore/driver-standard into main 2026-10-23 09:28:20 +00:00
6 changed files with 83 additions and 21 deletions
Showing only changes of commit c9a7ee4378 - Show all commits

No files matched your search

+15
View File
@@ -0,0 +1,15 @@
name: CI
on:
push:
branches: [main]
tags: ["v*"]
pull_request:
jobs:
driver:
uses: NAPALM/driver-standard/.gitea/workflows/driver.yml@main
with:
standard-ref: main
secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
+3
View File
@@ -5,3 +5,6 @@ build/
dist/
.venv/
.pytest_cache/
.coverage
.mypy_cache/
.ruff_cache/
+21 -2
View File
@@ -1,12 +1,31 @@
# Changelog
## 0.1.1
All notable changes to this driver. The format follows
[Keep a Changelog](https://keepachangelog.com/), versions follow
[Semantic Versioning](https://semver.org/).
## [Unreleased]
### Changed
- The driver follows the NAPALM driver standard
(https://git.netork.io/NAPALM/driver-standard): CI on Gitea runs ruff, mypy, the
tests on Python 3.10–3.13 and at the lowest declared versions, bandit, pip-audit and
a build check, and a release tag publishes to PyPI. Python 3.10 stays the floor; the
license is declared as the SPDX string `Apache-2.0`, next to the LICENSE file and
`py.typed` the package already shipped. napalm-device-types now comes from PyPI
(4.21.1 or later).
- AMT's answers are parsed with defusedxml (a new dependency). An answer that carries a
DTD is refused in any encoding; before, one in UTF-16 got through.
## [0.1.1] - 2026-10-18
### Fixed
- `SNMP_CAPABLE = False`: AMT runs no SNMP agent, so netOrk does not poll it over SNMP
as it does other management controllers.
## 0.1.0
## [0.1.0] - 2026-10-18
### Added
- `amt` driver (`napalm_amt.AmtDriver`), a `ManagementControllerDriver` for Intel AMT over
WS-Management: facts, AMT's network port, hardware inventory with the SMBIOS system
UUID, firmware (AMT with build, BIOS), power state and power control, the hardware event
+7 -6
View File
@@ -29,8 +29,8 @@ nothing with napalm-redfish beyond the role, so it lives here.
`optional_args`: `port` (16992; 16993 means TLS), `tls` (overrides what the port
implies), `verify_ssl` (`True`, a CA file path, or `False`), `retries` (1).
The WS-Management client in `napalm_amt/wsman.py` is self-contained (requests and
ElementTree). Neither `pywsman` (a C binding) nor `python-amt` (unmaintained, power only)
The WS-Management client in `napalm_amt/wsman.py` is self-contained (requests, and
defusedxml to parse the answers). Neither `pywsman` (a C binding) nor `python-amt` (unmaintained, power only)
is used.
## What AMT knows, and what it does not
@@ -54,12 +54,13 @@ of its own in the MEBx ([docs/lenovo-m910x.md](docs/lenovo-m910x.md)).
## Development
The rules are in [STANDARDS.md](https://git.netork.io/NAPALM/driver-standard/src/branch/main/STANDARDS.md).
```bash
python -m venv .venv
.venv/bin/pip install -e ../napalm-device-types # not on PyPI
.venv/bin/pip install -e '.[test]' ruff mypy types-requests
.venv/bin/python -m pytest
.venv/bin/ruff check . && .venv/bin/mypy napalm_amt
.venv/bin/pip install -e '.[dev]'
.venv/bin/pytest --cov
.venv/bin/ruff format --check . && .venv/bin/ruff check . && .venv/bin/mypy napalm_amt
```
## Conventions
+25 -13
View File
@@ -1,5 +1,5 @@
[build-system]
requires = ["setuptools>=64"]
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"
[project]
@@ -7,17 +7,15 @@ name = "napalm-amt"
version = "0.1.1"
description = "NAPALM driver for Intel Active Management Technology (AMT) over WS-Management"
readme = "README.md"
license = { file = "LICENSE" }
license = "Apache-2.0"
requires-python = ">=3.10"
dependencies = [
"napalm>=5.0",
# Not on PyPI: install from git before this package (see README).
"napalm-device-types>=4.16",
"napalm-device-types>=4.21.1",
"requests>=2.31",
"defusedxml>=0.7",
]
classifiers = [
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3",
"Topic :: System :: Hardware",
"Topic :: System :: Networking",
@@ -25,12 +23,12 @@ classifiers = [
[project.urls]
Repository = "https://git.netork.io/NAPALM/napalm-amt"
Issues = "https://git.netork.io/NAPALM/napalm-amt/issues"
Changelog = "https://git.netork.io/NAPALM/napalm-amt/src/branch/main/CHANGELOG.md"
[project.optional-dependencies]
test = [
"pytest>=7",
"responses>=0.23",
]
# responses mocks AMT's HTTP answers in the tests.
dev = ["pytest>=8", "pytest-cov>=5", "mypy>=1.11", "ruff>=0.6", "responses>=0.23"]
[project.entry-points."napalm.drivers"]
amt = "napalm_amt:AmtDriver"
@@ -41,9 +39,6 @@ include = ["napalm_amt*"]
[tool.setuptools.package-data]
napalm_amt = ["py.typed"]
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.ruff]
line-length = 100
target-version = "py310"
@@ -58,6 +53,23 @@ select = ["E", "F", "I", "UP", "B"]
[tool.mypy]
python_version = "3.10"
strict = true
ignore_missing_imports = true
# napalm itself is untyped, so every driver subclasses Any.
disallow_subclassing_any = false
[[tool.mypy.overrides]]
module = ["napalm.*", "requests.*", "defusedxml.*"]
ignore_missing_imports = true
[[tool.mypy.overrides]]
# Not yet under strict mypy (quality baseline); may only shrink.
module = ["napalm_amt.driver"]
ignore_errors = true
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.coverage.run]
source = ["napalm_amt"]
[tool.coverage.report]
fail_under = 95
+12
View File
@@ -0,0 +1,12 @@
{
"coverage_floor": 95.0,
"function_complexity": {
"napalm_amt/driver.py::AmtDriver.get_event_log": 11
},
"function_lines": {},
"mypy_relaxed": [
"napalm_amt.driver"
],
"python_file_lines": {},
"untyped_public": []
}