chore: adopt the NAPALM driver standard
driver / standard (pull_request) Successful in 13s
driver / lint (pull_request) Successful in 12s
driver / types (pull_request) Successful in 43s
driver / test (3.10) (pull_request) Successful in 46s
driver / test (3.11) (pull_request) Successful in 48s
driver / test (3.12) (pull_request) Successful in 43s
driver / test (3.13) (pull_request) Successful in 39s
driver / lowest (pull_request) Successful in 23s
driver / security (pull_request) Successful in 46s
driver / build (pull_request) Successful in 22s
CI / driver (pull_request) Successful in 5m37s
driver / publish (pull_request) Skipped

- CI arrives in .gitea/workflows/ci.yml and calls the shared driver
  workflow of NAPALM/driver-standard; the repo had none before.
- setuptools>=77 and the SPDX license string PEP 639 wants, without the
  License classifier; napalm-device-types>=4.21.1 from PyPI; Issues and
  Changelog links on git.netork.io. LICENSE, NOTICE and py.typed were
  already there and stay.
- The test extra becomes the dev extra of the standard, plus responses,
  which the tests mock AMT with.
- mypy strict with the untyped imports (napalm, requests, defusedxml)
  named instead of ignored globally; napalm_amt.driver is exempt for now
  (5 errors: getters return dicts where the role declares TypedDicts),
  recorded in tests/quality_baseline.json with get_event_log's
  complexity of 11.
- Coverage floor 95 % (measured 95.87 %).
- CHANGELOG.md in Keep a Changelog form; the README's development steps
  install from PyPI.
This commit is contained in:
christianmanivong committed 2026-10-23 08:37:32 +02:00
1 parent 76f85051cc
commit c9a7ee4378
6 files changed
+83 -21

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/ dist/
.venv/ .venv/
.pytest_cache/ .pytest_cache/
.coverage
.mypy_cache/
.ruff_cache/
+21 -2
View File
@@ -1,12 +1,31 @@
# Changelog # 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 - `SNMP_CAPABLE = False`: AMT runs no SNMP agent, so netOrk does not poll it over SNMP
as it does other management controllers. 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 - `amt` driver (`napalm_amt.AmtDriver`), a `ManagementControllerDriver` for Intel AMT over
WS-Management: facts, AMT's network port, hardware inventory with the SMBIOS system 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 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 `optional_args`: `port` (16992; 16993 means TLS), `tls` (overrides what the port
implies), `verify_ssl` (`True`, a CA file path, or `False`), `retries` (1). 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 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) defusedxml to parse the answers). Neither `pywsman` (a C binding) nor `python-amt` (unmaintained, power only)
is used. is used.
## What AMT knows, and what it does not ## 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 ## Development
The rules are in [STANDARDS.md](https://git.netork.io/NAPALM/driver-standard/src/branch/main/STANDARDS.md).
```bash ```bash
python -m venv .venv python -m venv .venv
.venv/bin/pip install -e ../napalm-device-types # not on PyPI .venv/bin/pip install -e '.[dev]'
.venv/bin/pip install -e '.[test]' ruff mypy types-requests .venv/bin/pytest --cov
.venv/bin/python -m pytest .venv/bin/ruff format --check . && .venv/bin/ruff check . && .venv/bin/mypy napalm_amt
.venv/bin/ruff check . && .venv/bin/mypy napalm_amt
``` ```
## Conventions ## Conventions
+25 -13
View File
@@ -1,5 +1,5 @@
[build-system] [build-system]
requires = ["setuptools>=64"] requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
@@ -7,17 +7,15 @@ name = "napalm-amt"
version = "0.1.1" version = "0.1.1"
description = "NAPALM driver for Intel Active Management Technology (AMT) over WS-Management" description = "NAPALM driver for Intel Active Management Technology (AMT) over WS-Management"
readme = "README.md" readme = "README.md"
license = { file = "LICENSE" } license = "Apache-2.0"
requires-python = ">=3.10" requires-python = ">=3.10"
dependencies = [ dependencies = [
"napalm>=5.0", "napalm>=5.0",
# Not on PyPI: install from git before this package (see README). "napalm-device-types>=4.21.1",
"napalm-device-types>=4.16",
"requests>=2.31", "requests>=2.31",
"defusedxml>=0.7", "defusedxml>=0.7",
] ]
classifiers = [ classifiers = [
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Topic :: System :: Hardware", "Topic :: System :: Hardware",
"Topic :: System :: Networking", "Topic :: System :: Networking",
@@ -25,12 +23,12 @@ classifiers = [
[project.urls] [project.urls]
Repository = "https://git.netork.io/NAPALM/napalm-amt" 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] [project.optional-dependencies]
test = [ # responses mocks AMT's HTTP answers in the tests.
"pytest>=7", dev = ["pytest>=8", "pytest-cov>=5", "mypy>=1.11", "ruff>=0.6", "responses>=0.23"]
"responses>=0.23",
]
[project.entry-points."napalm.drivers"] [project.entry-points."napalm.drivers"]
amt = "napalm_amt:AmtDriver" amt = "napalm_amt:AmtDriver"
@@ -41,9 +39,6 @@ include = ["napalm_amt*"]
[tool.setuptools.package-data] [tool.setuptools.package-data]
napalm_amt = ["py.typed"] napalm_amt = ["py.typed"]
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.ruff] [tool.ruff]
line-length = 100 line-length = 100
target-version = "py310" target-version = "py310"
@@ -58,6 +53,23 @@ select = ["E", "F", "I", "UP", "B"]
[tool.mypy] [tool.mypy]
python_version = "3.10" python_version = "3.10"
strict = true strict = true
ignore_missing_imports = true
# napalm itself is untyped, so every driver subclasses Any. # napalm itself is untyped, so every driver subclasses Any.
disallow_subclassing_any = false 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": []
}