74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
"""Tests for firmware planning."""
|
|
|
|
from cnmaestro.devices import device_from_api
|
|
from cnmaestro.firmware import (
|
|
FirmwareImage,
|
|
_parse_version,
|
|
chunked,
|
|
latest_per_product,
|
|
plan_upgrades,
|
|
)
|
|
|
|
|
|
def img(product, version, name=None):
|
|
return FirmwareImage(
|
|
product=product, version=version, name=name or version, raw={}
|
|
)
|
|
|
|
|
|
def test_parse_version_orders():
|
|
assert _parse_version("4.7.0") < _parse_version("4.7.1")
|
|
assert _parse_version("4.7.0") < _parse_version("4.8.0")
|
|
assert _parse_version("4.7.0") < _parse_version("5.0.0")
|
|
|
|
|
|
def test_latest_per_product():
|
|
images = [
|
|
img("ePMP", "4.7.0"),
|
|
img("ePMP", "4.7.1"),
|
|
img("ePMP", "4.6.2"),
|
|
img("PMP", "20.3.1"),
|
|
img("PMP", "20.3.2"),
|
|
]
|
|
latest = latest_per_product(images)
|
|
assert latest["ePMP"].version == "4.7.1"
|
|
assert latest["PMP"].version == "20.3.2"
|
|
|
|
|
|
def test_plan_upgrades_skips_up_to_date_and_offline():
|
|
devices = [
|
|
device_from_api({"mac": "A1", "product": "ePMP", "status": "online",
|
|
"software_version": "4.7.0"}),
|
|
device_from_api({"mac": "A2", "product": "ePMP", "status": "online",
|
|
"software_version": "4.7.1"}), # already latest
|
|
device_from_api({"mac": "A3", "product": "ePMP", "status": "offline",
|
|
"software_version": "4.7.0"}), # offline, skip
|
|
device_from_api({"mac": "B1", "product": "PMP", "status": "online",
|
|
"software_version": "20.3.0"}),
|
|
]
|
|
images = [img("ePMP", "4.7.1"), img("PMP", "20.3.2")]
|
|
groups = plan_upgrades(devices, images)
|
|
macs_by_product = {g.product: {d.mac for d in g.devices} for g in groups}
|
|
assert macs_by_product == {"ePMP": {"A1"}, "PMP": {"B1"}}
|
|
|
|
|
|
def test_plan_upgrades_product_filter():
|
|
devices = [
|
|
device_from_api({"mac": "A1", "product": "ePMP", "status": "online",
|
|
"software_version": "4.7.0"}),
|
|
device_from_api({"mac": "B1", "product": "PMP", "status": "online",
|
|
"software_version": "20.3.0"}),
|
|
]
|
|
images = [img("ePMP", "4.7.1"), img("PMP", "20.3.2")]
|
|
groups = plan_upgrades(devices, images, products_filter={"ePMP"})
|
|
assert len(groups) == 1
|
|
assert groups[0].product == "ePMP"
|
|
|
|
|
|
def test_chunked():
|
|
assert chunked([1, 2, 3, 4, 5], 2) == [[1, 2], [3, 4], [5]]
|
|
assert chunked(list(range(250)), 100) == [
|
|
list(range(0, 100)),
|
|
list(range(100, 200)),
|
|
list(range(200, 250)),
|
|
]
|