Section 01
Layered Architecture
A thin GUI sits over a reusable, testable engine. Each layer talks only to the one beneath it, so the core can be driven by the desktop app, a CLI, or tests without change.
app.py
App shell, sidebar nav, after() bus-drain loop
inventory_view
Connect, load AP DB, sortable/multi-select table, filter
convert_view
Review curated convert list, grouped counts
runner_view
Strategy/method, start/cancel, live per-AP states + progress
logs_view / settings_view
Streaming log console; connection & image-map config
WorkerBus / run_in_thread
Thread-safe queue; daemon threads post log/event/error/finished messages back to the UI tick
AppContext
Single shared state: settings, profiles, inventory, convert list, live connection
theme.py
Win11 appearance, Treeview styling, state colors
connection.py
Netmiko SSH + Simulated backend (interchangeable)
ap_inventory.py
Parse 'show ap database' → AccessPoint records
models.py
Model → family → AOS-10 image catalog + capability gate
convert.py
'ap convert' command builder + precheck gates
upgrade.py
Engine: 2 strategies + per-AP state machine
central_api.py
Central REST: firmware + AOS-10 presence verify
settings.py
Path resolution, image-map load, CSV export
data/
image_map.json · sim_ap_database.txt
AOS-8 Mobility Master / Controller
Source of truth (show ap database long); receives ap convert add-ap commands over SSH
Aruba Central (AOS-10)
Delivers AOS-10 image to allow-listed APs; REST API confirms post-convert AOS-10 presence