What Netcanon knows about: backup-side device definitions ({{ definitions | length }} family-base + {{ overlays | length }} overlay), migration target profiles ({{ target_profile_count }} hardware models across {{ profiles_by_vendor | length }} vendor{{ 's' if profiles_by_vendor | length != 1 else '' }}), and {{ vendor_rows | length }} vendor codec{{ 's' if vendor_rows | length != 1 else '' }} with capability matrices.
{# ═════════════════ 1. Backup-side device definitions ═════════════════ #}| Type Key | Vendor | OS | Collection | File Ext | Priority | Notes |
|---|---|---|---|---|---|---|
| {{ def.type_key }} | {{ def.vendor }} | {{ def.os }} |
{% if def.collector.strategy == 'netmiko' %}
SSH (Netmiko)
{% if def.collector.netmiko_device_type %}
{{ def.collector.netmiko_device_type }} {% endif %} {% elif def.collector.strategy == 'paramiko_shell' %} SSH (Shell) {% else %} {{ def.collector.strategy }}
{% endif %}
|
.{{ def.file_extension }} |
{{ def.priority }} | {{ def.notes | truncate(120) }} |
No definitions loaded. Add YAML files to the
definitions/ directory and click
Reload from disk.
Overlays are YAML variants that pin a specific OS version or
model (e.g. ``Cisco 17.12``). They're stored in the loader's
variant registry and resolved by
{# Link is informational; the actual resolve() call lives in
netcanon/definitions/loader.py. Don't link-rot. #}
DefinitionLoader.resolve() during backup — longest
match wins. The main definitions table above shows only the
family bases; this list explains the "loaded N but showed N-M"
split on the startup log.
| Type Key | OS Version | Model | Priority | File |
|---|---|---|---|---|
| {{ ov.type_key }} |
{% if ov.os_version %}{{ ov.os_version }}
{% else %}—{% endif %}
|
{% if ov.model %}{{ ov.model }}
{% else %}—{% endif %}
|
{{ ov.priority }} | {{ ov.source_file | default('', true) }} |
Hardware-aware profiles from
definitions/target_profiles/: per-model port
inventories, module variants, stacking capabilities, VLAN +
user limits. The Tier-3 rename modal uses these to validate
port assignments; they're shown here for discovery + browsing.
{{ p.model }}
· {{ p.device_class.value if p.device_class.value is defined else p.device_class }}
{% if p.has_modules %}
· {{ p.modules | length }} module variant{{ 's' if p.modules | length != 1 else '' }}
{% endif %}
· {{ p.port_count }} base port{{ 's' if p.port_count != 1 else '' }}
{{ p.vendor }}{{ p.model }}{{ p.lags.prefix }}{% endif %}
No target profiles loaded. The Tier-3 rename modal will fall back to free-form port names.
{% endif %}Each vendor ships with one or more codecs that parse / render its configuration format. Direction: parse-only vs bidirectional. Certainty tier: certified (≥3 real captures from ≥2 OS versions, all round-trip stable) · best_effort (≥1 real capture round-trips clean) · experimental (synthetic fixtures only).
{% for row in vendor_rows %}{{ row.info.id }}
{% if row.info.device_classes %}
·
{% for dc in row.info.device_classes %}
{{ dc.value if dc.value is defined else dc }}{% if not loop.last %},{% endif %}
{% endfor %}
{% endif %}
· {{ row.codecs | length }} codec{{ 's' if row.codecs | length != 1 else '' }}
{{ row.info.notes }}
{% endif %} {% if row.codecs %}| Codec | Direction | Certainty | Input format | Paths |
|---|---|---|---|---|
{{ c.name }} |
{{ c.direction }} | {{ c.certainty }} | {{ c.input_format }} |
{# Each chip is a button: clickable when count > 0, disabled (greyed) when 0. Click toggles a detail row inserted below this codec's row showing the bucket's actual xpaths + reasons. See the ``codec-caps-chip-*`` testids for the click handlers. #} · · |
No codecs registered for this vendor.
{% endif %}