XR Toolbox, Part 3 : App Development Topology

6 minutes read

Check out Part 2 of the XR toolbox series: Bootstrap XR configuration with Vagrant.


Without diving too deep into the IOS-XR architecture, it might be useful to state that applications on IOS-XR may be deployed in two different ways:

  • natively (inside the XR process space) OR
  • as a container (LXC)

In this quick start guide we introduce a typical vagrant topology that we intend to use in other quick start guides in the XR Toolbox series.
This topology will be used to build and deploy container (LXC) as well as native XR applications and test them on Vagrant IOS-XR.


cd ~/
git clone https://github.com/ios-xr/vagrant-xrdocs.git
cd vagrant-xrdocs/

You will notice a few directories. We will utilize the lxc-app-topo-bootstrap directory in this tutorial.

AKSHSHAR-M-K0DS:vagrant-xrdocs akshshar$ pwd
AKSHSHAR-M-K0DS:vagrant-xrdocs akshshar$ ls lxc-app-topo-bootstrap/
Vagrantfile	configs		scripts
AKSHSHAR-M-K0DS:vagrant-xrdocs akshshar$ 

Understand the topology

For this tutorial, we’ll use a two-node topology: An XR vagrant instance connected to Linux instance (devbox). For illustrative purposes, we use Ubuntu as our devbox OS:

app dev topo

The Vagrantfile to bring up this topology is already in your cloned directory:


Vagrant.configure(2) do |config|

 config.vm.define "rtr" do |node|
   node.vm.box =  "IOS-XRv"

   # gig0/0/0 connected to "link1"
   # auto_config is not supported for XR, set to false

   node.vm.network :private_network, virtualbox__intnet: "link1", auto_config: false

   #Source a config file and apply it to XR

   node.vm.provision "file", source: "configs/rtr_config", destination: "/home/vagrant/rtr_config"

   node.vm.provision "shell" do |s|
     s.path =  "scripts/apply_config.sh"
     s.args = ["/home/vagrant/rtr_config"]


 config.vm.define "devbox" do |node|
   node.vm.box =  "ubuntu/trusty64"

   # eth1 connected to link1
   # auto_config is supported for an ubuntu instance

   node.vm.network :private_network, virtualbox__intnet: "link1", ip: ""



Notice the #Source a config file and apply it to XR section of the Vagrantfile? This is derived from the Bootstrap XR configuration with Vagrant tutorial. Check it out if you want to know more about how shell provisioning with XR works

The configuration we wish to apply to XR on boot is pretty simple. You can find it in the lxc-app-topo-bootstrap/configs directory.
We want to configure the XR interface: GigabitEthernet0/0/0/0 with the ip-address:

AKSHSHAR-M-K0DS:vagrant-xrdocs akshshar$ cat lxc-app-topo-bootstrap/configs/rtr_config 
!! XR configuration
interface GigabitEthernet0/0/0/0
  ip address
  no shutdown
AKSHSHAR-M-K0DS:vagrant-xrdocs akshshar$ 

Take a look at the Vagrantfile above, again. We use the Vagrant auto_config capabilities to make sure “eth1” interface of the Ubuntu VM (called devbox) is configured in the same subnet ( as XR gig0/0/0/0.

Bring up the topology

Download and Add the XR Vagrant box

IOS-XR Vagrant is currently in Private Beta

To download the box, you will need an API-KEY and a CCO-ID

To get the API-KEY and a CCO-ID, browse to the following link and follow the steps:

Steps to Generate API-KEY

$ BOXURL="http://devhub.cisco.com/artifactory/appdevci-release/XRv64/latest/iosxrv-fullk9-x64.box"

$ curl -u your-cco-id:API-KEY  $BOXURL --output ~/iosxrv-fullk9-x64.box

$ vagrant box add --name IOS-XRv ~/iosxrv-fullk9-x64.box

Of course, you should replace your-cco-id with your actual Cisco.com ID and API-KEY with the key you generated and copied using the above link.

The vagrant box add command will take around 10-15 mins as it downloads the box for you.

Once it completes, you should be able to see the box added as “IOS-XRv” in your local vagrant box list:

AKSHSHAR-M-K0DS:~ akshshar$ vagrant box list
IOS-XRv (virtualbox, 0)
AKSHSHAR-M-K0DS:~ akshshar$ 

Launch the nodes

Make sure you’re in the lxc-app-topo-bootstrap/ directory and issue a vagrant up

AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$pwd
AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$ vagrant up 
Bringing machine 'rtr' up with 'virtualbox' provider...
Bringing machine 'devbox' up with 'virtualbox' provider...
==> rtr: Importing base box 'IOS-XRv'...
==> rtr: Matching MAC address for NAT networking...
==> rtr: Setting the name of the VM: lxc-app-topo-bootstrap_rtr_1465208784531_75603
==> rtr: Clearing any previously set network interfaces...
==> rtr: Preparing network interfaces based on configuration...
    rtr: Adapter 1: nat
    rtr: Adapter 2: intnet
==> rtr: Forwarding ports...
    rtr: 57722 (guest) => 2222 (host) (adapter 1)
    rtr: 22 (guest) => 2223 (host) (adapter 1)
==> rtr: Running 'pre-boot' VM customizations...
==> rtr: Booting VM...
==> rtr: Waiting for machine to boot. This may take a few minutes...
    rtr: SSH address:
    rtr: SSH username: vagrant
    rtr: SSH auth method: private key
    rtr: Warning: Remote connection disconnect. Retrying...
    rtr: Warning: Remote connection disconnect. Retrying...

Once it completes, you should be able to see both the VMs running by using the vagrant status command inside the lxc-app-topo-bootstrap/ directory:

Vagrant Status output

Check Reachability

To get into the Ubuntu “devbox”, issue a vagrant ssh devbox:

AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$ vagrant ssh devbox
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-87-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Mon Jun  6 11:20:37 UTC 2016

  System load:  0.0               Processes:           74
  Usage of /:   3.5% of 39.34GB   Users logged in:     0
  Memory usage: 25%               IP address for eth0:
  Swap usage:   0%                IP address for eth1:

  Graph this data and manage this system at:

  Get cloud support with Ubuntu Advantage Cloud Guest:

0 packages can be updated.
0 updates are security updates.


From “devbox”, you should be able to ping the XR Gig0/0/0/0 interface:

vagrant@vagrant-ubuntu-trusty-64:~$ ping -c 2
PING ( 56(84) bytes of data.
64 bytes from icmp_seq=1 ttl=255 time=1.56 ms
64 bytes from icmp_seq=2 ttl=255 time=1.44 ms

--- ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 1.447/1.504/1.562/0.069 ms

To get into XR linux shell, issue vagrant ssh rtr

AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$ vagrant ssh rtr
Last login: Mon Jun  6 11:20:58 2016 from
xr-vm_node0_RP0_CPU0:~$ifconfig Gi0_0_0_0
Gi0_0_0_0 Link encap:Ethernet  HWaddr 08:00:27:46:1f:b2  
          inet addr:  Mask:
          inet6 addr: fe80::a00:27ff:fe46:1fb2/64 Scope:Link
          UP RUNNING NOARP MULTICAST  MTU:1514  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:3 overruns:0 carrier:1
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:42 (42.0 B)


To get into XR CLI, remember that XR SSH runs on port 22 of the guest IOS-XR instance.
First, determine the port to which the XR SSH port (port 22) is forwarded by vagrant by using the vagrant port command:

AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$ vagrant port rtr 
The forwarded ports for the machine are listed below. Please note that
these values may differ from values configured in the Vagrantfile if the
provider supports automatic port collision detection and resolution.

    22 (guest) => 2223 (host)
 57722 (guest) => 2222 (host)

As shown above, port 22 of XR is fowarded to port 2223:

Use port 2223 to now ssh into XR CLI

The password is “vagrant”

AKSHSHAR-M-K0DS:lxc-app-topo-bootstrap akshshar$ ssh -p 2223 vagrant@localhost
The authenticity of host '[localhost]:2223 ([]:2223)' can't be established.
RSA key fingerprint is 7f:1a:56:e1:3c:7f:cf:a4:ee:ac:20:3a:e6:cf:ad:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2223' (RSA) to the list of known hosts.
vagrant@localhost's password: 

RP/0/RP0/CPU0:ios#show ipv4 interface gigabitEthernet 0/0/0/0 brief 
Tue Jun  7 03:23:31.324 UTC

Interface                      IP-Address      Status                Protocol
GigabitEthernet0/0/0/0       Up                    Up      

You’re all set! You can now use this topology to build applications (native-WRL7 or LXC containers) on the “devbox” and test them out on the IOS-XR vagrant node. We will explore these scenarios in the next set of tutorials in the XR Toolbox series.

Head over to Part 4 of the XR Toolbox series where we create and bring up a container (LXC) app on IOS-XR —> Bring your own Container (LXC) App.

Leave a Comment