Arista and Juniper

Arista EOS and Juniper Junos, side by side with Cisco

I design networks that mix vendors, so I need to know how each one thinks. This page explains how Arista EOS (Extensible Operating System) and Juniper Junos work inside and how changes land on each. It covers MLAG (multi chassis link aggregation), buffers, Virtual Chassis and routing policy, and where they differ from Cisco IOS and NX-OS. It ends with a CLI (command line interface) translator and the faults I expect where vendors meet.

  • EOS and Sysdb
  • Config sessions
  • Deep buffers
  • MLAG
  • Junos RE and PFE
  • commit confirmed
  • Routing policy
  • CLI translator
One design applied to three network operating systems A single design sends the same change to an Arista switch running EOS, a Juniper router running Junos and a Cisco switch running IOS XE. EOS takes it in a configuration session, Junos in a candidate configuration with commit confirmed, and IOS XE line by line with an archive to roll back to. All three then report the same checks: BGP up, neighbours seen and MTU matching. One designsource of truth Arista EOSconfig session Juniper Junoscommit confirmed Cisco IOS XEarchive, rollback ChecksBGP and MTU same result One intent, three ways to apply it safely
Live view · one design, three operating systems
Overview

Why I design for more than one vendor

Most of my production work has been on Cisco, with Palo Alto, Check Point, FortiGate, F5 and Aruba alongside. Arista and Juniper turn up in the same kinds of estates: Arista in data centres and trading networks, Juniper at the provider edge and in campuses run from the cloud. This page sets out how EOS and Junos work, how they differ from Cisco, and what I check when they meet.

Where Arista and Juniper usually sit in an estate An enterprise network in three zones. The campus has a core, access switches and access points. The data centre has two spines, three leaves and servers. The WAN and internet edge has two firewalls and two routers. Traffic runs from a campus access switch through the core and the data centre to the edge. Each state highlights one zone and names the Arista, Juniper and Cisco families usually found there. The last state highlights all three. Campus Data centre WAN and internet edge Core Access Access APs APs Spine Spine Leaf Leaf Leaf Servers and storage Firewall Firewall Router Router carriers and peering Juniper EX with Mist, Arista 720XP and 750, Cisco Catalyst Arista 7050X and 7280R, Juniper QFX with Apstra, Cisco Nexus Juniper MX and SRX, Arista 7280R, Cisco ASR and Catalyst 8000 One design and one source of truth, with three CLIs underneath

Swipe sideways to see the whole diagram.

In the campus, Juniper EX switches are usually run with Juniper Mist, a cloud service that uses AI (artificial intelligence) to find faults across wired and wireless clients. Arista sells campus switches too, such as the 720XP and 750, managed through CloudVision. Most campus estates I see are still Cisco Catalyst, so the second vendor tends to arrive with a new site or a refresh.

Arista built its business in data centre leaf and spine fabrics: 7050X switches with shallow shared buffers as leaves, and 7280R or 7800R switches with deep buffers where incast or speed changes need them. Juniper QFX switches run EVPN (Ethernet VPN) and VXLAN (Virtual Extensible LAN) fabrics, often designed and checked through Apstra, which also manages Cisco NX-OS, Arista EOS and SONiC (Software for Open Networking in the Cloud).

At the WAN (wide area network) and internet edge, Juniper MX routers are common for peering, transit and provider edge work, with SRX firewalls behind them. Arista 7280R switches also take full internet tables for peering. Cisco ASR and Catalyst 8000 routers hold the same roles in many estates.

Most estates end up mixed, through a merger, a refresh or a deliberate choice of a second supplier. I keep it manageable with one design, one source of truth and one set of tests. Between vendors I only use standard protocols: BGP (Border Gateway Protocol), OSPF (Open Shortest Path First), EVPN, LACP (Link Aggregation Control Protocol) and LLDP (Link Layer Discovery Protocol).

Animation

The families, side by side

VendorOperating systemMain families and roles
AristaEOS (Extensible Operating System)7050X and 7060X leaf and spine; 7280R and 7800R deep buffer leaf, spine and peering; 7130 ultra low latency; 720XP and 750 campus. CloudVision manages them.
Juniper, part of HPE (Hewlett Packard Enterprise)Junos OS and Junos OS EvolvedMX routers for the edge and provider edge; PTX for core and peering; ACX for metro and access; QFX data centre switches; EX campus switches; SRX firewalls. Mist and Apstra manage them.
Cisco, for comparisonIOS XE, NX-OS and IOS XRCatalyst campus and Catalyst 8000 routers; Nexus data centre switches; ASR (Aggregation Services Router) and NCS (Network Convergence System) provider routers.

HPE closed its purchase of Juniper on 2 July 2025, and Juniper now sits inside HPE Networking. In July 2025 Arista bought the VeloCloud SD-WAN business from Broadcom.

Why a second vendor

Price tension at renewal, less supply chain risk, and features one vendor does better: deep buffers, full table peering on a switch, low latency, or AI driven operations in the campus. Mergers bring a second vendor in whether anyone planned it or not.

What it costs

Two sets of skills, tools, support contracts, software trains and security advisories to track. Every protocol that crosses the boundary needs interoperability testing, and the support desk needs runbooks for both.

How I keep it manageable

One design and one source of truth, rendered into each vendor's syntax. Standard protocols only between vendors. The same automated tests after every change, whatever the platform. Clear ownership of each domain.

EOS inside

Arista EOS: every agent shares one state database

EOS (Extensible Operating System) looks like IOS at the prompt, but the design underneath is different. Each feature runs as a separate agent on Linux. Agents never talk to each other directly. They read and write a central, in memory database called Sysdb, and that one decision explains most of how EOS behaves when things fail.

How EOS agents share state through Sysdb Six EOS agents around a central state database called Sysdb, all running on an unmodified Linux kernel. The CLI writes a configuration change into Sysdb. The BGP agent reads it, then publishes the routes it learns back into Sysdb. The forwarding agent subscribes to those routes and programs the switch chip, TerminAttr streams the state to CloudVision, eAPI reads and writes through the same database, and the spanning tree agent subscribes to what it needs. No agent talks to another directly. Agents Agents write config read and write publish routes stream state program subscribe CLIyou type here eAPIJSON-RPC Bgp agentrouting Sysdball system state TerminAttrto CloudVision Forwardingprograms the chip Stp agentspanning tree Linux kernel, unmodified

Swipe sideways to see the whole diagram.

Animation
  • Configuration
  • Routes
  • Streamed state
  • eAPI calls

Agents never call each other. Each one writes what it knows into Sysdb and subscribes to what it needs, so one agent can fail and restart without the others noticing.

  1. One image. The same EOS binary runs on every Arista switch and as a virtual machine, so I can test a release in a lab of virtual switches before it reaches hardware.
  2. Linux underneath. EOS runs on an unmodified Linux kernel. I can open a bash shell, run tcpdump on control plane traffic and use standard Linux tools, with the right privileges.
  3. Sysdb in the middle. Every process stores its state in Sysdb and learns about changes by subscribing to it, not by calling other processes.
  4. Restartable agents. Because state lives outside each agent, a failed agent restarts and picks up where it left off, and some features can be patched without a reload.
  5. Streaming by design. The TerminAttr agent streams changes in Sysdb to CloudVision as they happen, rather than waiting for a poll.
What happens when an EOS agent restarts A BGP peer, the EOS BGP agent, Sysdb, the forwarding agent and the switch chip, with user traffic crossing the chip. In the steps the BGP agent crashes while traffic keeps flowing, EOS restarts the agent, it reads its state back from Sysdb, and its BGP sessions come back up. BGP peernext router Bgp agentrouting Sysdbstate kept Forwardingprograms the chip Switch chipforwarding table user traffic keeps flowing crashed restarting Routes in Sysdb, programmed into the chip The BGP agent fails: forwarding carries on EOS starts the agent again It reads its state back from Sysdb Sessions come back up Indicative behaviour. How much each agent keeps across a restart depends on the feature and the release.

Swipe sideways to see the whole diagram.

Step 1
  1. The BGP agent learns routes from its peer and writes them into Sysdb. The forwarding agent subscribes to them and programs the switch chip, which forwards user traffic in hardware.

  2. If the BGP agent crashes, the routes it wrote are still in Sysdb and still in the chip. User traffic keeps flowing, because forwarding never depended on the agent being alive.

  3. EOS notices the failed process and starts it again on its own. No reload, and no other agent is touched. The event is logged, so I can raise it with the vendor.

  4. The new BGP agent reads its configuration and state back from Sysdb, rather than rebuilding everything from scratch. This is why Arista describes EOS processes as restartable.

  5. The BGP sessions come back up. With graceful restart configured on both sides, the peer keeps forwarding to me while that happens. Then the routes refresh and the table converges.

The same idea in three operating systems

Classic IOSArista EOSJunos OS Evolved
KernelIOS was its own operating system; IOS XE now runs IOSd as a process on LinuxUnmodified Linux kernelNative Linux
Where state livesInside each processSysdb, a central state databaseA distributed data store (DDS)
If a process failsOften a reload in classic IOSThe agent restarts and reads its state backThe application restarts and reloads its state from the DDS
Shell accessGuest shell on IOS XEFull bash shellLinux shell

Junos OS Evolved moved Juniper to the same idea: applications publish and subscribe through a state store, and restart on their own. Classic Junos runs on FreeBSD.

Running EOS

Changing EOS safely, by hand and as code

At the prompt EOS feels like IOS: the same modes, many of the same show commands and the same habits. The differences are in how changes land and how much can be driven by software. I use configuration sessions for anything risky, eAPI or CloudVision for anything repeated, and automated tests after every change.

Three ways a change reaches the network An operator, a middle box where edits are made, the running configuration and live traffic, with a store of earlier versions below. In IOS each line goes straight to the running configuration. In an EOS session, edits go to a copy first and one commit applies them. In Junos, edits build a candidate that is checked and committed. In EOS and Junos a timed commit can roll back from the store if it is not confirmed. OperatorSSH or API Each linelive at Enter Session copyconfigure session Candidateedit, then commit Runningwhat forwards Traffic Archiveif configured Checkpointssaved sessions rollback 0 to 49last 50 commits no check commit commit check configure replace commit timer commit confirmed Every line changes the live network as you type it Edits wait in a copy until one commit applies them Edits wait in the candidate until a checked commit A timed commit rolls back on its own unless I confirm it, so a change that cuts my access undoes itself.

Swipe sideways to see the whole diagram.

In classic IOS and IOS XE, each command takes effect when I press Enter. A half typed change is live, and a mistake in line three can cut my session before line four arrives. IOS XE can still protect me: configure terminal revert timer 10, with the archive set up, rolls back unless I enter configure confirm.

EOS can work like IOS, but I prefer configuration sessions. configure session takes a copy of the running configuration, my edits go into the copy, and show session-config diffs shows exactly what will change. One commit applies it all, and commit timer rolls it back unless I confirm.

Junos never changes the live network as I type. Edits build a candidate configuration. show | compare shows the difference, commit check validates it, and commit applies it in one step. Junos keeps the last 50 commits, so rollback 1 gets me back to where I was.

Animation

A change in an EOS session

switch# configure session vlan30
switch(config-s-vlan30)# vlan 30
switch(config-s-vlan30-vlan-30)# name APP-30
switch(config-s-vlan30-vlan-30)# exit
switch(config-s-vlan30)# show session-config diffs
+vlan 30
+   name APP-30
switch(config-s-vlan30)# commit timer 00:05:00

# Still connected and working? Make it permanent:
switch# show configuration sessions detail
switch# configure session vlan30 commit

If I lose access, the change rolls back after five minutes on its own. Committing a session replaces the running configuration, so any change someone made outside my session since I started it is lost. I keep sessions short for that reason.

eAPI: the CLI as a programming interface

management api http-commands
   protocol https
   no shutdown

# A JSON-RPC call to https://switch/command-api
{"jsonrpc": "2.0", "method": "runCmds", "id": "1",
 "params": {"version": 1, "format": "json",
            "cmds": ["show version", "show ip bgp summary"]}}

eAPI accepts the same commands I type, so anything I can do by hand I can script. With "format": "json" the answer comes back as structured data rather than text.

The tools around EOS

ToolWhat it isHow I use it
CloudVisionArista's management platform, on premises or as a cloud serviceInventory, configuration with change control, compliance against a template, and streamed telemetry with history
TerminAttrThe streaming agent on each switchSends state changes to CloudVision as they happen
eAPIJSON-RPC (JavaScript Object Notation remote procedure calls) over HTTPS (Hypertext Transfer Protocol Secure), on the switchRun any CLI command from code and get structured JSON back, with no screen scraping
AVD (Arista Validated Designs)An open source Ansible collectionBuilds every device configuration and its documentation from one set of YAML (YAML Ain't Markup Language) files for a leaf and spine design
ANTA (Arista Network Test Automation)An open source Python test frameworkChecks BGP, MLAG, interfaces and more after every change, with pass or fail results
cEOS and vEOSEOS as a container or a virtual machineLab copies of a design, for testing a change or a release before it reaches hardware

Software lifecycle

ItemWhat I plan around
Release namesEach EOS release ends in F or M, for example 4.36.2F. F releases add features. M releases are in their maintenance phase and only get fixes.
Support lengthArista supports each major EOS release for up to 36 months from when it was first posted, moving from the feature phase to maintenance and then support only.
My standardI pick an M release where one has the features I need, test it in a cEOS or vEOS lab, then pilot it before the estate moves.
Arista platforms

Shallow or deep: choosing buffers on purpose

Arista's range splits into switches with shallow shared buffers, built for low cost and low latency, and switches with deep buffers, built to absorb bursts. Choosing between them is the main platform decision in an Arista fabric. Incast is the clearest reason: many senders answer one request at once, and the switch port facing the receiver has to queue what it cannot send.

The same incast burst into a shallow and a deep buffer Two lanes compare the same burst arriving at two leaf switches. In each lane a group of senders bursts at the same moment towards one receiver on a single 100G port. The top leaf has a 32 MB shared buffer, and its queue bar overflows, so packets are dropped. The bottom leaf has an indicative 8 GB buffer, and its queue bar barely fills. Choose the number of senders and the burst size to see how much queue the burst needs. Shallow buffer leaf, 7050X3 class Deep buffer leaf, 7280R3 class Sendersburst at once Shallow buffer32 MB, shared Receiverone 100G port Sendersburst at once Deep buffer8 GB, indicative Receiverone 100G port 127 MB needed: 95 MB dropped 127 MB needed: about 1.6% used drops Indicative model: when every sender bursts at once, the queue needs about one burst from every sender but one.

Swipe sideways to see the whole diagram.

Animation

Senders bursting at once

Burst from each sender

128 senders, 1 MB each: the queue needs about 127 MB. The shallow buffer leaf drops about 95 MB even if one port could use all 32 MB. The deep buffer leaf absorbs the burst with about 1.6% of its buffer.

Shallow buffers are right for most leaves, because most traffic never queues for long. Deep buffers earn their cost where many senders converge on one port, such as storage and analytics clusters, or where speeds change, such as 100G into a slower WAN.

The Arista families I meet

SeriesRoleWhat sets it apart
7050X3LeafA fully shared 32 MB packet buffer and port to port latency from 800 ns, per the datasheet. The default choice for most leaves.
7060XLeaf and spineHigh port counts for large fabrics, with shallow buffers like the 7050X.
7280R3Leaf, spine and peeringDeep buffers with VOQ (virtual output queues): 2 GB to 24 GB per system, depending on the model. Takes full internet tables with FlexRoute for peering.
7800RModular spine and coreThe deep buffer architecture in a chassis, for the largest spines and data centre interconnects.
7130Ultra low latencyLayer 1 switching in about 5 ns, with FPGA (field programmable gate array) applications. It came from Metamako, which Arista bought in 2018. See the low latency trading page.
720XP and 750CampusAccess switches with PoE (Power over Ethernet), and a modular campus chassis, run from CloudVision.
VeloCloudSD-WANBought from Broadcom in July 2025, adding SD-WAN for branches.

Figures are from Arista datasheets and announcements. Model by model limits change, so I check the current datasheet before I size a design.

VOQ in one paragraph

In a VOQ switch each ingress port keeps a separate queue for every egress port. A packet only crosses the fabric when the egress port can take it, so one congested port never blocks traffic heading somewhere else. That is head of line blocking, and VOQ removes it.

Buffers are not free

Deep buffer switches cost more and use more power per port. A deep buffer can also hide congestion by adding delay instead of loss, which hurts latency sensitive traffic. I put deep buffers where the traffic pattern needs them, not everywhere.

What I measure first

Output discards on leaf ports, the queue length at busy times, and which hosts send in bursts. Arista's LANZ (Latency Analyzer) reports queue lengths from the hardware, which shows microbursts that five minute averages hide.

MLAG

MLAG: two switches acting as one

MLAG (multi chassis link aggregation) is Arista's version of Cisco vPC. Two switches keep separate control planes but present one LACP partner to a server or another switch, so both links forward and spanning tree blocks nothing. The design work is in the failures: what happens when an uplink, the peer link or a whole switch goes.

MLAG in normal running and three failures Two leaf switches, leaf 1 and leaf 2, joined by a peer link and a heartbeat, with uplinks to the spines. A server bonds one link to each leaf, and an orphan host has a single link to leaf 2. Normally both leaves forward. If leaf 1 loses its uplinks, traffic from the server to leaf 1 crosses the peer link. If the peer link fails, the heartbeat is what tells the leaves apart. If leaf 1 reloads, leaf 2 carries all traffic until leaf 1 has finished its reload delay. Spinesor the core Leaf 1MLAG primary Leaf 2MLAG secondary Serverone LACP bond Orphan hostone link only peer link heartbeat Both leaves forward; the server sees one switch Traffic hashed to leaf 1 crosses the peer link Is my peer dead, or just out of reach? Leaf 2 carries everything until leaf 1 is ready

Swipe sideways to see the whole diagram.

Two leaves act as one switch towards the server, which bonds its two links with LACP (Link Aggregation Control Protocol). Each leaf forwards locally, the peer link keeps the MAC (media access control) tables in step, and a host on only one leaf is an orphan whose traffic may cross the peer link.

If leaf 1 loses every uplink, its MLAG ports stay up, so anything the server hashes to leaf 1 crosses the peer link to leaf 2. I size the peer link for that, or track the uplinks so leaf 1 takes its MLAG ports down when it has nowhere to send traffic.

The peer link carries the MLAG control messages. If it fails while both leaves are alive, each may decide it is alone, which is a split brain. I build the peer link from at least two links on different chips, and add a heartbeat over the management network so each leaf can tell a dead peer from a broken link.

While leaf 1 is down, leaf 2 carries everything. When leaf 1 returns, a reload delay keeps its MLAG ports down until it has learned the tables from its peer: 300 seconds by default on fixed configuration switches, longer on modular and deep buffer platforms.

Animation

An MLAG pair on EOS

vlan 4094
   trunk group MLAG-PEER
no spanning-tree vlan-id 4094
!
interface Port-Channel10
   description peer link
   switchport mode trunk
   switchport trunk group MLAG-PEER
!
interface Vlan4094
   ip address 10.255.255.0/31
   no autostate
!
mlag configuration
   domain-id POD1
   local-interface Vlan4094
   peer-address 10.255.255.1
   peer-link Port-Channel10
   peer-address heartbeat 192.168.0.12 vrf MGMT
   dual-primary detection delay 10 action errdisable all-interfaces
!
interface Port-Channel20
   description server bond
   switchport access vlan 30
   mlag 20

What I check on every pair

  • The domain ID, VLANs and port channel settings match on both peers. show mlag config-sanity lists any difference.
  • Every MLAG port channel uses LACP, so a miscabled link fails safe instead of looping.
  • The MLAG ID matches the port channel number, which keeps both peers readable.
  • The peer link is at least two links, on different chips or line cards.
  • The heartbeat to the peer runs over the management network, not over the peer link.
  • The reload delay is long enough for the platform to learn its tables before taking traffic.
  • show mlag reports the state as active, with the peer link and local interface up.

Two switches, one logical link: the options

ApproachControl planesStandard?What I watch for
Cisco vPC (NX-OS)TwoCisco onlyPeer link, keepalive and consistency checks. Detail on the data centre page.
Arista MLAGTwoArista onlyPeer link sizing, the heartbeat, reload delay and show mlag config-sanity.
Juniper MC-LAGTwo, joined by ICCP (Inter Chassis Control Protocol)Juniper onlyOlder designs. Juniper now steers new fabrics to EVPN multihoming.
EVPN multihoming (ESI)Two or moreYes, RFC 7432Works between vendors in principle; I still test it, because support for each route type varies.
Virtual Chassis, StackWise VirtualOneVendor specificOne control plane is simpler to run, but one software fault or upgrade touches every member.
Junos inside

Junos: a routing brain and a forwarding engine

Juniper built Junos around a strict split. The RE (Routing Engine) runs the operating system, the routing protocols and the CLI. The PFE (Packet Forwarding Engine) forwards packets in hardware. One Junos runs across Juniper's routers, switches and firewalls, so the commands and the commit model are the same on an MX router, a QFX switch or an SRX firewall.

The Routing Engine and the Packet Forwarding Engine A Juniper router drawn as two parts: the Routing Engine at the top and the Packet Forwarding Engine below, joined by an internal link. Transit traffic from a neighbour crosses the Packet Forwarding Engine straight to the next hop. Routing protocol packets climb to the Routing Engine, which sends routes back down as a forwarding table. Unwanted traffic aimed at the router itself is stopped by a firewall filter on the loopback interface, lo0. Routing Enginerpd, mgd, CLI, routing tables Packet Forwarding Engineforwarding table, filters Neighbourtraffic, routing Next hoponward lo0 filter blocked up routes down Transit traffic stays in the PFE. Only traffic for the router itself goes up to the RE, through the lo0 filter.

Swipe sideways to see the whole diagram.

Animation
  • Transit traffic
  • Routing protocol packets
  • Routes to the forwarding table
  • Unwanted traffic to the router

A routing update climbs to the RE, the routing protocol daemon picks the best path, and the RE pushes the result down to the PFE as a forwarding table. Traffic passing through never needs the RE at all.

The two halves of every Juniper box

PartWhat runs thereWhat I need to know
Routing Engine (RE)The Junos kernel, rpd (routing protocol daemon), mgd (management daemon), chassisd, the CLI and every routing table: inet.0 for IPv4, inet6.0 for IPv6, mpls.0 and moreIt makes decisions but forwards almost nothing. Routers with two REs use GRES (graceful Routing Engine switchover) and NSR (nonstop active routing), and commit synchronize keeps both configurations the same.
Packet Forwarding Engine (PFE)The forwarding table, firewall filters, policers and class of service, in hardwareIt forwards at line rate on its own, and it keeps forwarding with its last table if the RE is busy or switching over.
The internal linkRoutes and configuration down to the PFE, and host bound packets up to the REEverything aimed at the router itself crosses it, so I filter and police that traffic on lo0.

Protecting the RE with a lo0 filter

firewall {
    family inet {
        filter PROTECT-RE {
            term BGP {
                from { source-prefix-list BGP-PEERS; protocol tcp; port bgp; }
                then accept;
            }
            term SSH {
                from { source-prefix-list MGMT-NETS; protocol tcp; destination-port ssh; }
                then accept;
            }
            term ICMP {
                from { protocol icmp; }
                then { policer ICMP-1M; accept; }
            }
            term LAST { then { count DROPPED; discard; } }
        }
    }
}

# Applied to the loopback, in set form:
set interfaces lo0 unit 0 family inet filter input PROTECT-RE

A filter on lo0 applies to every packet the router delivers to itself, whichever interface it arrived on. The last term discards everything I did not name, so I build the list carefully and apply it with commit confirmed.

Two flavours of Junos

Junos OSJunos OS Evolved
BaseFreeBSDNative Linux
StateInside each daemonA distributed data store that applications publish to and subscribe from
If an application failsThe daemon restartsThe application restarts on its own and reloads its state
Where I meet itMost MX, SRX and EX modelsNewer routing and switching platforms; I check which one a model runs before I plan an upgrade
CLI and commit modelThe sameThe same

Releases and lifecycle

  • Release names start with the year and the release: 24.2 came out in July 2024 and 24.4 in December 2024. R1 is the first build of a release, and service releases add -S and a number.
  • Juniper's published dates list recent main releases, such as 23.4, 24.2 and 24.4, with five years of engineering support from first release and six months more support after that.
  • Each platform has a recommended release on Juniper's support site. I start from that, test in a lab, and upgrade by role.
Commit model

Nothing changes until I commit

The Junos commit model is the biggest habit change for anyone coming from IOS. Edits build a candidate configuration, and the network only changes when I commit. Every commit is kept, so I can see who changed what and step back to any of the last 50 versions. commit confirmed adds a safety net for remote changes.

commit confirmed, step by step An operator edits a candidate configuration. After a check, commit confirmed makes it active and moves the previous version into a store of earlier commits, rollback 1 to 49, with a 10 minute timer. In one ending the operator loses their session, the timer runs out and the previous version is restored. In the other the operator confirms in time and the change stays. OperatorSSH session Candidateedits wait here Activerollback 0 Earlier commitsrollback 1rollback 2rollback 3...rollback 49 my SSH session timer: 10 minutes set commands change only the candidate show | compare, then commit check commit confirmed: live, with a timer No confirmation in time: Junos rolls back commit again in time: the change stays commit confirmed waits 10 minutes by default. Junos keeps the last 50 commits as rollback 0 to 49.

Swipe sideways to see the whole diagram.

Step 1
  1. Every set or delete changes a private candidate copy. Nothing on the network changes, however many lines I type. Other users can see that the configuration is being edited, and configure private gives me my own copy.

  2. show | compare prints exactly what will change against the active configuration. commit check validates the whole candidate, including references between sections, without applying anything.

  3. commit confirmed 10 makes the candidate active and moves the old active configuration to rollback 1. The change is live, but Junos will undo it unless I confirm within 10 minutes.

  4. If the change cuts my session, I cannot confirm it. When the timer runs out, Junos rolls back to the previous configuration on its own and tells every logged in user. Nobody needs to drive to the site.

  5. If everything still works, I enter commit or commit check within the window. The timer stops and the change stays. I add commit comment with the change number, so show system commit tells the story later.

Try it: a Junos commit sandbox

Make a change, compare it, check it and commit it, the way I would on a real router. The changes add a VLAN (virtual LAN), move a BGP peer to a new AS (autonomous system) number, or swap the filter that protects the router. Time runs ten times faster here, so a two minute timer lasts twelve seconds. The last one locks out SSH (Secure Shell) on purpose: commit it both ways and see the difference.

1. Edit the candidate

2. Run a command

No timer running

[edit]
punit@mx1# set vlans v30 vlan-id 30

[edit]
punit@mx1# show | compare
[edit vlans]
+   v30 {
+       vlan-id 30;
+   }

[edit]
punit@mx1# commit check
configuration check succeeds

[edit]
punit@mx1# commit confirmed 2
commit confirmed will be automatically rolled back in 2 minutes unless confirmed
commit complete

[edit]
punit@mx1# commit
commit complete

Worked example: add a VLAN, compare, check, commit with a two minute timer, then confirm with a second commit.

Commit history, newest first

  1. commit confirmed then commit: VLAN 30 added
  2. Starting configuration

One configuration, as a hierarchy

interfaces {
    ge-0/0/0 {
        mtu 9192;
        unit 0 {
            family inet {
                address 10.0.0.1/31;
            }
        }
    }
}
protocols {
    ospf {
        area 0.0.0.0 {
            interface ge-0/0/0.0 interface-type p2p;
        }
    }
}

The same, as set commands

set interfaces ge-0/0/0 mtu 9192
set interfaces ge-0/0/0 unit 0 family inet address 10.0.0.1/31
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 interface-type p2p

# The same configuration, two views:
#   show configuration
#   show configuration | display set

I read configurations as a hierarchy and write changes as set lines, because set lines paste cleanly, diff cleanly and suit templates.

The commands I use most

CommandWhat it does
show | compareShows the candidate against the active configuration. show | compare rollback 3 compares with an older version.
commit checkValidates the candidate without applying it.
commit confirmed 5Applies it, and rolls back after five minutes unless I commit again.
commit comment "CHG1234"Records why, for show system commit.
rollback 1 then commitLoads the previous version into the candidate, then makes it active.
load merge terminalMerges pasted configuration into the candidate; the pasted lines win any conflict.
load overrideReplaces the whole candidate with a file.
load replaceReplaces only the sections marked replace: in the file.
load set terminalRuns pasted set lines one by one.
load patchApplies a difference, such as the output of show | compare from another router.
commit synchronizeOn routers with two Routing Engines, commits on both.
Routing policy

Routing policy: first match wins, then the default

Junos does all redistribution and filtering with one tool, the policy statement. Policies are applied as import or export chains on a protocol, a group or a neighbour. The rule that catches people out is what happens when no policy decides: the protocol's default policy does, and the BGP default is generous.

How Junos evaluates an export policy chain A route enters an export policy chain of three boxes: policy BOGONS, policy AGGREGATE and the default BGP export policy. In turn, a private range is rejected by BOGONS, and my aggregate is accepted by AGGREGATE. A route learned from another peer falls through to the default and is advertised, which is a leak. A direct loopback route falls through to the default and is not advertised. The last step adds an explicit final reject. Route 10.20.0.0/16BGP, customer 198.51.100.0/24my aggregate 203.0.113.0/24BGP, other peer 192.0.2.1/32direct, lo0 each in turn Policy 1: BOGONSroute-filter10.0.0.0/8 orlongerthen reject Policy 2: AGGREGATEprotocol aggregate198.51.100.0/24 exactthen accept Default BGP exportactive BGP routesthen acceptanything elsethen reject term LAST: then reject export [ BOGONS AGGREGATE ], then the default Matches term 1 of BOGONS: rejected, evaluation stops No match in BOGONS, accepted by AGGREGATE No match anywhere: the default advertises it No match anywhere: the default drops it I end every eBGP export chain with an explicit reject A peer's route sent to my transit provider: a route leak Connected and static routes need an explicit export term Policies run left to right, terms top to bottom. The first accept or reject ends the evaluation.

Swipe sideways to see the whole diagram.

Step 1
  1. This eBGP group exports with two policies: export [ BOGONS AGGREGATE ]. Junos evaluates them left to right, and each policy's terms top to bottom. If nothing accepts or rejects a route, the protocol's default policy decides.

  2. A customer leaks 10.20.0.0/16 to me. Term 1 of BOGONS matches private space with orlonger and rejects it. A reject is a terminating action, so nothing after it is evaluated.

  3. My aggregate 198.51.100.0/24 does not match BOGONS, so evaluation moves on. AGGREGATE matches it exactly and accepts it, so it is advertised.

  4. A route learned from another peer matches neither policy. The default BGP export policy then advertises every active BGP route, so my transit provider receives a peer's route. That is a route leak.

  5. My loopback is a direct route. It matches neither policy, and the default BGP policy only advertises BGP routes, so it is never sent. This is why Junos needs an explicit export policy for connected and static routes.

  6. I end every eBGP export chain with a term that rejects everything else, so only what I meant to send leaves the router. IOS and EOS also send every best BGP route to every peer unless an outbound filter stops it.

The chain with the fix, in Junos

policy-options {
    prefix-list MY-AGGREGATES {
        198.51.100.0/24;
    }
    policy-statement BOGONS {
        term PRIVATE {
            from {
                route-filter 10.0.0.0/8 orlonger;
                route-filter 172.16.0.0/12 orlonger;
                route-filter 192.168.0.0/16 orlonger;
            }
            then reject;
        }
    }
    policy-statement AGGREGATE {
        term MINE {
            from {
                protocol aggregate;
                prefix-list MY-AGGREGATES;
            }
            then accept;
        }
        term LAST {
            then reject;
        }
    }
}
routing-options {
    aggregate {
        route 198.51.100.0/24;
    }
}
protocols {
    bgp {
        group TRANSIT {
            type external;
            peer-as 64500;
            neighbor 192.0.2.254;
            export [ BOGONS AGGREGATE ];
        }
    }
}

Default policies

ProtocolDefault importDefault export
BGPAccept every BGP route from configured neighboursAdvertise every active BGP route to every BGP speaker, within the usual iBGP rules
OSPFAccept all OSPF routes. This cannot be changedReject everything: nothing outside OSPF is redistributed
IS-ISAccept all IS-IS routesReject everything
Direct and staticAccept into the routing tableThey are not protocols, so they reach BGP or OSPF only through an export policy

From Juniper's documentation on default routing policies.

Route filter match types

Match typeWhat it matches, for 10.0.0.0/8
exactOnly 10.0.0.0/8 itself
orlonger10.0.0.0/8 and anything longer inside it
longerOnly longer prefixes, not the /8 itself
upto /2410.0.0.0/8 and longer prefixes down to /24
prefix-length-range /16-/24Prefixes inside 10/8 with a length from /16 to /24
Juniper platforms

Juniper today: one Junos, many families

Juniper's range is wide, but one Junos and one commit model run across it. The design choices I meet most are at the campus edge, where Virtual Chassis has been the way to stack EX switches, and in the data centre, where EVPN multihoming has taken over from stacking and MC-LAG.

Virtual Chassis, its failures, and EVPN multihoming Four switches joined in a ring by Virtual Chassis port links, acting as one switch with a primary Routing Engine, a backup and two linecards. If the primary fails the backup takes over and a new backup is chosen. If the ring is cut twice, split detection keeps one part active. The last state shows the alternative: two independent switches sharing an EVPN Ethernet segment towards a server. VCP links form a ring uplink on member 0 uplink on member 2 Member 0primary REfailedprimary RE Member 1backup REnow primarybackup RE Member 2linecardnow backuplinecard Member 3linecardlinecardlinecard Coretwo uplinks EVPN fabricspines Switch Aown control plane Switch Bown control plane Serverone LACP bond same ESI on both links Up to ten EX4400s, managed as one switch The backup takes over; a new backup is chosen Ring cut twice: split detection keeps one part active Two switches, two control planes, one bond, standard EVPN

Swipe sideways to see the whole diagram.

A Virtual Chassis joins switches through VCP (Virtual Chassis port) links into one logical switch, with one management address and one configuration. One member is the primary Routing Engine, one is the backup, and the rest are linecards. An EX4400 Virtual Chassis can have up to ten members.

If the primary fails, the backup takes over as primary, and another member is chosen as the new backup. With graceful Routing Engine switchover and nonstop bridging configured, forwarding carries on through the change. Ports on the failed member go down with it, so I spread uplinks and important hosts across members, as the second uplink shows.

If the ring is cut in two places, the members split into two groups. Split detection decides which group stays active, so the two halves never both claim the same identity. I run VCP links in a ring, never a chain, and keep each one on a separate path.

For new fabrics Juniper points to EVPN multihoming instead: two switches with their own control planes share an ESI (Ethernet segment identifier) towards the server. An upgrade or a software fault touches one switch, not the whole stack, and the method is a standard, so it can work between vendors.

Animation

Juniper families by role

FamilyRoleWhat I note
MXEdge, provider edge, broadband and peering routersThe workhorse of many service provider and enterprise edges. Rich routing, MPLS and subscriber features.
PTXCore and peeringHigh capacity routers for large backbones and peering points.
ACXMetro and accessSmaller routers for metro rings and cell sites.
QFXData centre leaf and spineEVPN VXLAN fabrics, usually designed and run from Apstra.
EXCampus access, distribution and coreVirtual Chassis for stacking, run from Juniper Mist with wired assurance.
SRXFirewallsBranch to data centre security. How an SRX handles a packet is on the firewall platforms page.

Juniper Mist

A cloud management and assurance service for Wi-Fi, wired and WAN. Marvis, its AI assistant, answers questions about client problems and points to likely causes across access points, switches and the WAN.

Apstra

Intent based design and assurance for data centre fabrics. I describe the design once, and Apstra builds and checks the configuration. Apstra 6.1 qualifies Junos, Junos OS Evolved, Cisco NX-OS, Arista EOS and SONiC.

HPE Networking

HPE closed its purchase of Juniper on 2 July 2025, and Rami Rahim, formerly Juniper's chief executive, now leads the combined HPE Networking business. Aruba and Juniper both make campus switches and Wi-Fi, so I watch the roadmap before committing an estate for ten years.

Commands

The same task in four CLIs

Most of my troubleshooting starts with the same dozen questions, whatever the vendor: what are my neighbours, what is in the routing table, what am I sending and receiving, and what changed. This table answers them in IOS XE, NX-OS, EOS and Junos. Type in the box to filter it.

CLI translator

Showing all 26 tasks.

TaskCisco IOS XECisco NX-OSArista EOSJuniper Junos
Routing tableshow ip routeshow ip routeshow ip routeshow route
One routeshow ip route 10.1.1.0show ip route 10.1.1.0show ip route 10.1.1.0show route 10.1.1.0
Whole configurationshow running-configshow running-configshow running-configshow configuration
One part of the configurationshow running-config | section router bgpshow running-config bgpshow running-config section bgpshow configuration protocols bgp
Configuration as set linesNo direct equivalentNo direct equivalentNo direct equivalentshow configuration | display set
Interfaces at a glanceshow ip interface briefshow ip interface briefshow ip interface briefshow interfaces terse
Interface errorsshow interfaces counters errorsshow interface counters errorsshow interfaces counters errorsshow interfaces extensive ge-0/0/0
Neighbours by LLDPshow lldp neighborsshow lldp neighborsshow lldp neighborsshow lldp neighbors
MAC address tableshow mac address-tableshow mac address-tableshow mac address-tableshow ethernet-switching table
ARP (Address Resolution Protocol) tableshow ip arpshow ip arpshow ip arpshow arp no-resolve
BGP peersshow ip bgp summaryshow bgp ipv4 unicast summaryshow ip bgp summaryshow bgp summary
Routes I send a BGP peershow ip bgp neighbors 192.0.2.1 advertised-routesshow bgp ipv4 unicast neighbors 192.0.2.1 advertised-routesshow ip bgp neighbors 192.0.2.1 advertised-routesshow route advertising-protocol bgp 192.0.2.1
Routes a BGP peer sends meshow ip bgp neighbors 192.0.2.1 routesshow bgp ipv4 unicast neighbors 192.0.2.1 routesshow ip bgp neighbors 192.0.2.1 routesshow route receive-protocol bgp 192.0.2.1
OSPF neighboursshow ip ospf neighborshow ip ospf neighborsshow ip ospf neighborshow ospf neighbor
Port channelsshow etherchannel summaryshow port-channel summaryshow port-channelshow lacp interfaces
A pair of switches as oneshow stackwise-virtualshow vpcshow mlagshow virtual-chassis
Logsshow loggingshow logging logfileshow loggingshow log messages
Save the configurationcopy running-config startup-configcopy running-config startup-configcopy running-config startup-configcommit (saves as it applies)
Compare running with savedshow archive config differencesshow running-config diffshow running-config diffsshow | compare
Undo a changeconfigure replace flash:backup.cfgrollback running-config checkpoint CP1configure replace flash:backup.cfgrollback 1, then commit
Capture traffic to the CPU (central processing unit)monitor capture (EPC)ethanalyzer local interface inbandtcpdump interface Ethernet1monitor traffic interface ge-0/0/0
Ping from a sourceping 10.0.0.2 source Loopback0ping 10.0.0.2 source-interface loopback0ping 10.0.0.2 source Loopback0ping 10.0.0.2 source 192.0.2.1
Filter the output| include BGP| include BGP| include BGP| match BGP
A show command while configuringdo show ip routeshow ip routeshow ip routerun show route
Linux shellguestshell run bashrun bashbashstart shell
Hardware and softwareshow versionshow versionshow versionshow chassis hardware

Interface names, addresses and the checkpoint name are examples. On NX-OS, run bash needs feature bash-shell first. Junos pipes use match rather than include, and Junos has | display set, which no other CLI here offers.

Habits that carry over

From IOS to NX-OS and EOS almost everything does: modes, show commands, interface ranges and the way a running configuration reads. EOS was built to feel familiar, and it shows.

Habits that need unlearning

On Junos, configuration mode changes nothing until I commit, show becomes run show while configuring, and filters, policies and redistribution are all policy statements rather than route maps.

Habits worth adding everywhere

Compare before applying, apply with a timer, record a comment, and check with the same tests on every platform afterwards. Junos makes these the default; on the others I make them a standard.

More on each Cisco platform: IOS and IOS XE and NX-OS.

Interoperability

When vendors meet, defaults collide

Standard protocols interoperate, but each vendor fills the gaps in the standards with its own defaults. Most of the faults I see at a vendor boundary are two correct configurations that mean different things. I list them in the design, so they are settled once rather than found one at a time.

Same MTU number, different meaning: OSPF stuck in ExStart A Junos router and an IOS XE router on one link, both configured with mtu 9192, above a drawing of an Ethernet frame. Junos counts the 14 byte header in its MTU, so its IP MTU is 9178, while IOS XE counts only the IP packet. OSPF hellos agree, but the database description packet from IOS XE announces 9192, which Junos rejects, so the adjacency sticks in ExStart and Exchange. Matching the IP MTU fixes it. header 14 IP packet FCS 4 Junos mtu 9192 counts header and packet IOS XE mtu 9192 counts the packet only Junos routerIP MTU 9178 IOS XE routerIP MTU 9192 DownDown 2-Way2-Way ExStartExchange ExStartExchange FullFull Both sides say mtu 9192 Hellos carry no MTU, so they agree DBD says 9192, more than Junos takes: rejected Retries for ever, never Full Same IP MTU both sides: Full

Swipe sideways to see the whole diagram.

Step 1
  1. Both interfaces are set to mtu 9192. On Junos the interface MTU (maximum transmission unit) includes the 14 byte Ethernet header, so the IP (Internet Protocol) MTU is 9178. On an IOS XE router the interface MTU is the IP packet size, so the IP MTU is 9192.

  2. OSPF hello packets do not carry the MTU, so the two routers see each other and reach 2-Way. Nothing looks wrong yet.

  3. The database description (DBD) packets carry the interface MTU. RFC 2328 says a router rejects a DBD that announces a larger IP MTU than it can accept. Junos receives 9192 against its own 9178 and ignores the packet.

  4. The exchange never completes. One side typically sits in ExStart and the other in Exchange, retrying until someone looks. Small pings work, so the link looks healthy.

  5. I agree the IP MTU in the design and set each platform to match it: on Junos, mtu 9206 on the interface or family inet mtu 9192 on the unit. Ignoring the MTU check would hide the fault, and large packets would still be lost.

Where mixed estates trip up

AreaWhat differsWhat I do
OSPF costIOS and Junos default to a reference bandwidth of 100 Mb/s, so every link of 100 Mb/s or faster costs 1. NX-OS defaults to 40 Gb/s. A mixed area can pick paths nobody intended.Set one reference bandwidth on every router in the design, or set costs explicitly on every link.
MTUJunos counts the Ethernet header in the interface MTU. IOS XE routers count only the IP packet.Agree the IP MTU in the design and translate it per platform. Test with large pings that are not allowed to fragment.
BGP exportJunos advertises only active BGP routes by default, so connected and static routes need a policy. It also passes every peer's routes on, as IOS and EOS do.An explicit export policy with a final reject on every eBGP session, on every vendor.
BGP timersJunos defaults to a 90 second hold time; IOS defaults to 180. The lower offer wins, so detection time depends on who the peer is.Set timers explicitly, and use BFD (Bidirectional Forwarding Detection) where fast failover matters.
Link aggregationJunos creates no ae interfaces until chassis aggregated-devices ethernet device-count is set.Put the device count in the base template of every Junos box.
ARP and MAC timersJunos ages ARP entries after 20 minutes and IOS after four hours, while MAC entries usually age after five. If ARP outlives the MAC entry, the switch floods unicast traffic until the host speaks again.Keep ARP timeouts shorter than MAC aging on gateways, and watch for unknown unicast flooding.
Change modelJunos changes nothing until commit. An EOS session commit replaces the running configuration, including changes made by others since the session began.Write the change procedure per platform, and never mix live edits with session based changes on the same box.
EVPNRFC 9136 allows more than one model for IP prefix routes, so both ends must use the same one. Multihoming and route type support also vary by release.Prove every EVPN feature between the exact releases in a lab before it reaches production.

Each of these has a test in my post change checks: OSPF costs per link, MTU with large pings, routes advertised per peer, timers per session, LACP state and flooding counters.

Troubleshooting

Faults I expect in a mixed estate

Faults on EOS and Junos look like faults anywhere: an interface that will not come up, a neighbour that will not form, routes that do not arrive. The causes are often specific to the platform or to the boundary between vendors. Choose a symptom to see where it sits, what I see and what I run.

A fault finder for EOS, Junos and mixed estates Five places a fault can sit when Arista or Juniper meets another vendor, in order: configuration, links, routing adjacencies, routing policy and forwarding. For each symptom, test traffic flows as far as the place that fails. A panel shows what I see and the command I run. Configcommit, session LinkLACP, MLAG, VCP AdjacencyOSPF, BGP Policyexport, cost ForwardingMAC and ARP What I see What I run Symptom: ae0 never appears on Junos error: device ae0 not foundshow interfaces terse | match ae Symptom: My change vanished ten minutes later A rollback in the commit history I did not typeshow system commit Symptom: A colleague's change disappeared My session commit replaced a newer running configshow configuration sessions detail Symptom: MLAG ports down after a reload MLAG active, but the reloaded peer's ports waitshow mlag Symptom: A Virtual Chassis member is missing One member absent from show virtual-chassisshow virtual-chassis vc-port Symptom: OSPF stuck in ExStart with a Cisco router Neighbour in ExStart while small pings workshow ospf neighbor Symptom: BGP up, nothing advertised from Junos Established, but 0 routes advertised to the peershow route advertising-protocol bgp 192.0.2.1 Symptom: Traffic takes the long way after a Nexus joins Cost 1 on IOS links, higher costs on Nexus linksshow ip ospf interface brief Symptom: Unicast flooding every few minutes MAC entry aged out while the ARP entry is still validshow ethernet-switching table

Swipe sideways to see the whole diagram.

ae0 never appears on Junos. Junos creates no aggregated Ethernet interfaces until a device count is set, so the configuration commits but the interface does not exist. I add set chassis aggregated-devices ethernet device-count 8 to the base template, commit, and check LACP with show lacp interfaces.

My change vanished ten minutes later. It went in with commit confirmed and nobody confirmed it, so Junos rolled it back as designed. If the change was good, I apply it again and confirm with commit inside the window. If my session had dropped, the rollback just saved a site visit.

A colleague's change disappeared on EOS. Committing a configuration session replaces the running configuration with the session copy, so anything changed outside the session after it started is lost. I keep sessions short, agree one change at a time per switch, and restore the lost lines from the change record.

MLAG ports stay down after a reload. The reload delay is holding them down while the switch learns its tables from its peer: 300 seconds by default on fixed switches, longer on others. If they stay down after that, show mlag config-sanity lists settings that differ between the peers.

A Virtual Chassis member is missing. The usual causes are a VCP cable or optic fault, a port not set as a VCP, or a member on a different Junos release. I check the VCP port states, the member's software version and the ring, and I keep spare VCP cables on site.

OSPF stuck in ExStart with a Cisco router. Both sides show the same MTU number, but Junos counts the Ethernet header and IOS XE does not, so the database description packets are rejected. I match the IP MTU, as the interoperability section shows, and prove it with large pings that may not fragment.

BGP is up, but Junos advertises nothing. The routes I expected are connected or static, and the default BGP export policy only sends active BGP routes. I write an export policy that names the prefixes, end it with a reject, and check again with the same command.

Traffic takes the long way after a Nexus joins. NX-OS defaults to a 40 Gb/s reference bandwidth while IOS and Junos default to 100 Mb/s, so the same link has different costs depending on who calculates it. I set one reference bandwidth across the area, or set costs explicitly.

Unicast flooding every few minutes. A gateway still has the host in its ARP table, but the switch has aged out its MAC entry, so frames to that host flood every port in the VLAN. I bring the ARP timeout below the MAC aging time on the gateway, or raise MAC aging where it is safe.

Animation

Evidence I collect before a vendor case

What I needArista EOSJuniper Junos
Everything the vendor will ask forshow tech-supportrequest support information | save /var/tmp/rsi.txt
What changed, and whenshow configuration sessions detailshow system commit, then show | compare rollback 1
Process crashesRestarted agents in show loggingshow system core-dumps
Hardware alarmsshow logging and CloudVision eventsshow chassis alarms
Traffic to the control planetcpdump interface Ethernet1monitor traffic interface ge-0/0/0

I change one thing at a time, re run the same checks after each change, and record the cause for problem management. My general method, with worked faults, is on the troubleshooting page.

Engagement

How I bring a second vendor in, from first reason to steady state

A second vendor usually arrives through a refresh, a merger or a data centre build. The technology is rarely the hard part. The work is in agreeing why, deciding which domains each vendor owns, settling the boundaries between them and making sure the support teams can run both. I follow the same path every time.

How an engagement runs, from first conversation to lifecycle Seven stages from left to right: engage (stakeholders), requirements (FR and NFR), discovery (measure first), design (HLD and LLD), build and test (lab and pilot), support (handover), lifecycle (keep current). For each stage the panel shows who I work with and what comes out of it. After the lifecycle stage the loop returns to the start. Engagestakeholders RequirementsFR and NFR Discoverymeasure first DesignHLD and LLD Buildlab and pilot Supporthandover Lifecyclekeep current Step 1 · EngageAgree why a second vendor, and whereWho I work withWhat comes outArchitecture and procurementNetwork operationsSecurity and riskReasons and scope, in writingDomains for each vendorDecision log and RACIExit and support criteria Step 2 · RequirementsInterop, support and skills, with numbersWho I work withWhat comes outNetwork operationsApplication ownersSecurity and riskInterop rules at each boundaryConvergence and upgrade targetsSupport and spares modelSkills and training plan Step 3 · DiscoveryEstate, configs and boundaries as they areWho I work withWhat comes outNetwork operations centreIncumbent vendorNew vendor engineersInventory and software versionsProtocols at every boundaryConfig analysis with BatfishCurrent defaults and timers Step 4 · DesignOne design, rendered for each platformWho I work withWhat comes outDesign authorityVendor architectsAutomation teamBoundary standards and defaultsTemplates per platformTest plan and pass marksMigration waves and rollback Step 5 · Build and testProve interop in a lab, then at one siteWho I work withWhat comes outEngineersVendor TACChange advisory boardLab results per boundaryPilot with real trafficAutomated post change testsUpdated runbooks Step 6 · SupportTwo vendors, one service deskWho I work withWhat comes outService desk and NOCArista TAC and JTACResellers and partnersRunbooks for each platformEscalation paths per vendorSpares and RMA processHypercare exit criteria Step 7 · LifecycleTwo release trains and two roadmapsWho I work withWhat comes outDesign authorityVendor account teamsSecurity operationsRelease plan for EOS and JunosAdvisory and bug trackingInterop retest after upgradesHardware end of life plan

Swipe sideways to see the whole diagram.

Step 1
  1. I start by writing down why a second vendor is coming in: cost, supply risk, a feature or an inherited estate. Then I agree which domains each vendor will own, who decides, and what would make us stop. A RACI (responsible, accountable, consulted, informed) chart records who signs off each decision.

  2. Requirements cover what each boundary must carry and how well: convergence times, upgrade windows, monitoring and access control. They also cover the people side. Operations must be able to run both platforms at three in the morning, so training and runbooks are requirements, not extras.

  3. I map the estate as it is: inventory and releases, every protocol that will cross a vendor boundary, and the defaults each side uses today. A vendor neutral tool such as Batfish reads the configurations of both vendors and answers reachability and policy questions before anything changes.

  4. The high level design sets the domains, the boundary protocols and every default that must match: MTU, OSPF reference bandwidth, timers and export policy. The low level design renders one source of truth into templates for EOS, Junos and IOS, with a test plan agreed before the build.

  5. I build the boundaries in a lab with the exact releases, using virtual EOS and Junos where hardware is short, and break them on purpose: links, peers and upgrades. Then one pilot site carries real traffic before rollout in waves through change control, each with a tested rollback.

  6. Before handover, both platforms report into the same monitoring, and the service desk has runbooks that start with the same questions on either vendor. Escalation paths, contract numbers and spares are agreed for each, and hypercare ends only when the agreed criteria have held for a set period.

  7. Two vendors means two release trains, two sets of advisories and two hardware roadmaps. I plan upgrades by role, retest every boundary after each one, and review the roadmaps each year, including how Juniper settles inside HPE alongside Aruba.

Functional requirements

What it must do.

  • Run each domain on its chosen vendor, with standard protocols only at the boundaries: BGP, OSPF, EVPN, LACP and LLDP.
  • Render every device configuration from one source of truth, whatever the vendor.
  • Apply changes with a timed rollback on every platform that supports one.
  • Advertise only intended routes at every eBGP boundary, with an explicit final reject.
  • Report health, logs and flows from both vendors into the same monitoring.
  • Give the service desk one set of runbooks and escalation paths covering both vendors.

Non functional requirements

How well it must do it, with a number wherever one can be agreed.

Convergence
Traffic recovers from a single link or device failure within a few seconds, at every vendor boundary (typical).
Change safety
Every change compared before it is applied, and rolled back automatically if access is lost.
Consistency
MTU, OSPF reference bandwidth, timers and export policy identical by design across vendors.
Upgrades
Each platform upgraded at least once a year within its vendor's supported releases (typical).
Supportability
Runbooks, trained staff and a support contract for both vendors before go live.
Observability
Streamed or polled health for every device, with alerts tuned during hypercare.
Security
Management plane filtered on every platform, AAA (authentication, authorisation and accounting) through the same servers, and advisories reviewed monthly.

Numbers are typical starting points. Each organisation agrees its own.

Projects

Related work behind this page

My production work has been on Cisco, Palo Alto, Check Point, FortiGate, F5, Meraki and Aruba, rather than Arista or Juniper. These are the projects closest to this page: estates with several vendors, provider routing at the internet edge, and data centre fabrics. The skills carry straight across: protocols, design, change control and testing do not depend on the badge on the box.

XIDA · 2021 to 2024

Multi vendor SD-WAN and campus designs Related

Produced multi vendor SD-WAN and SD-Access designs for enterprise clients, as lead architect on network, cloud and data centre programmes from discovery to operational handover.

iSystems Integration · three engagements, 2015 to 2019

Architecture across several vendors Related

Cloud, SDN (software defined networking), disaster recovery and security architecture on Nexus, Viptela, Palo Alto, F5 and Aruba, for the firm's enterprise clients.

Civica (Luton Borough Council) · 2017

A public sector network on four platforms Related

Public sector network modernisation on Meraki, Nexus, FortiGate and Check Point, leading 7 engineers and third party suppliers.

Manx Telecom · 2016

Provider routing and address space Related

A tier 3 data centre and managed infrastructure for over 300 customer sites on Cisco ACI (Application Centric Infrastructure) and Nexus. Managed provider IP space and AS numbers with RIPE NCC (Réseaux IP Européens Network Coordination Centre), including RPKI (Resource Public Key Infrastructure) ROAs (route origin authorisations).

Vodafone · 2024

Routing security at the peering edge Related

Defined routing security policy for the peering and transit edge: RPKI and ROA origin validation and RIPE NCC resource governance. The export policy rules on this page come from the same thinking.

NVIDIA Academy · training

Two more network operating systems Related

Completed the Cumulus Linux Essentials and SONiC Essentials courses: two more network operating systems built on Linux, managed the way EOS invites, through files, APIs and automation.

Backed by CCNP (Cisco Certified Network Professional) Enterprise, a pass in the CCIE (Cisco Certified Internetwork Expert) Routing and Switching written exam, and NVIDIA courses in Cumulus Linux and SONiC. See all credentials