Configuration Syntax Changes
Ze has not shipped a stable configuration release yet. There is no public deprecation lifecycle for old config versions, and Ze does not promise a numbered generation ladder for config syntax.
Config compatibility is date-based. A config file records the schema stamp that
wrote it, and recovery chooses the newest rollback file that the running binary
can parse. For pre-release files or old examples, ze config migrate converts
known older shapes to the syntax expected by the current tree.
Compatibility rules
| Case | What Ze does |
|---|---|
| Current config | ze config validate <file> checks it directly. |
| Older pre-release Ze syntax | ze config migrate applies named transforms, then emits current syntax. |
| ExaBGP-shaped syntax | The migrator converts supported shapes and reports unsupported extensions. |
| Newer schema stamp after downgrade | Startup tries rollback files newest-first and writes back the first one this binary can parse. |
The transform names are descriptive implementation names, not public config
version numbers. Use ze config migrate --list to see the current list in the
binary you are running.
Older shapes the migrator recognizes
Root-level neighbor
Older examples sometimes used root-level neighbor blocks:
neighbor 192.0.2.1 {
local-as 65000;
peer-as 65001;
}
Current native config puts BGP under bgp {} and separates transport from BGP
session state:
bgp {
session { asn { local 65000; } }
peer upstream1 {
connection {
remote { ip 192.0.2.1; }
}
session {
asn { remote 65001; }
}
}
}
Root-level peer globs
Older configs could use root-level peer globs for shared defaults:
peer * {
hold-time 90;
}
Current config uses named groups and concrete peers:
bgp {
group default {
timer { receive-hold-time 90; }
peer upstream1 {
connection {
remote { ip 192.0.2.1; }
}
session {
asn { remote 65001; }
}
}
}
}
template { neighbor }
Older template neighbors became peer groups:
template {
neighbor ibgp-rs {
peer-as 65000;
}
}
Current config expresses the same default as a BGP group:
bgp {
group ibgp-rs {
session { asn { remote 65000; } }
}
}
Unsupported ExaBGP extensions
ze exabgp migrate translates the capability keywords Ze has a session
setting for, and WARNS about every other keyword the block holds. The warning
goes to stderr, names the peer and names each keyword in one line. The migrated
session negotiates less than the ExaBGP config asked for, so read the warnings
before you deploy the output.
The set is derived, not listed: migrateCapability declares the keywords it
translates (route-refresh, extended-message, link-local-nexthop, asn4,
graceful-restart, software-version, add-path), and anything else in the
block reaches the warning. A keyword ExaBGP adds later is therefore reported
without an edit here.
| Syntax | Result |
|---|---|
capability { multi-session; } |
Warns: peer <name>: the capability block asks for "multi-session", which `ze exabgp migrate` does not translate, so the migrated config does not ask for it |
capability { aigp enable; } |
Same warning, naming aigp. Ze's AIGP codec is always on and has no per-peer switch, so there is no setting to translate the keyword into |
| Several in one peer | One warning names them all, in the order the block declares them |
operational { ... } under an ExaBGP neighbor |
ze exabgp migrate stops at the parser: line N: unknown field in neighbor: operational |
capability { multi-session; } in Ze syntax |
ze config migrate stops at the parser: line N: unknown field in capability: multi-session |
operational { ... } under a peer, in Ze syntax |
ze config migrate stops at the parser: line N: unknown field in peer: operational |
The capability block is the only place a warning replaces a refusal. An
operational { ... } block, in either syntax, is a parse error: the grammar has
no such field, so there is nothing to leave out.
Two of the keywords are worth knowing by name, because each comes from an IETF draft that expired without becoming an RFC.
| Extension | Draft | Expired | Codepoint |
|---|---|---|---|
multi-session |
draft-ietf-idr-bgp-multisession-07 | 2013-03-16 | Section 4 assigns capability code 68 |
operational |
draft-ietf-idr-operational-message-00 | 2012-09-01 | Section 9 requests a capability code and a BGP message type from IANA. Neither was allocated |
operational therefore has no assigned value to put on the wire. ExaBGP fills
both with private values of its own, capability 0xB9 and message type 0x06.
Ze does not copy a private codepoint.
Commands
# Check whether a file already matches the current binary
ze config validate config.conf
# Preview conversion without writing a new file
ze config migrate --dry-run config.conf
# Convert to stdout
ze config migrate config.conf
# Convert to a new file
ze config migrate -o config-current.conf config.conf
# List transforms in this binary
ze config migrate --list
See Configuration Migration for command details.