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
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:
1 parent
76f85051cc
commit
c9a7ee4378
6 files changed
+83
-21
No files matched your search
@@ -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 }}
|
||||||
@@ -5,3 +5,6 @@ build/
|
|||||||
dist/
|
dist/
|
||||||
.venv/
|
.venv/
|
||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
|
.coverage
|
||||||
|
.mypy_cache/
|
||||||
|
.ruff_cache/
|
||||||
+21
-2
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
@@ -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": []
|
||||||
|
}
|
||||||
Reference in new issue
Block a user