Skip to content

Example Topology

Renato Westphal edited this page Apr 12, 2023 · 1 revision

Overview

This wiki page provides a practical demonstration of Holo's functionality. The primary objective is to demonstrate how Holo is configured, how to fetch state information, and how to perform basic validations to ensure proper operation.

Network Topology

The network topology for this demonstration consists of six routers distributed across two OSPFv3 areas: the backbone area (routers rt1, rt2, rt3, rt4, and rt5) and area 0.0.0.1 (routers rt4, rt5, and rt6). Routers rt4 and rt5 act as ABRs.

Although simple in design, this topology offers sufficient complexity to test a range of functionalities such as:

  • OSPFv3 with the IPv4 address family
  • Point-to-Point and Broadcast links
  • Equal-cost multi-path routing (ECMP)
  • OSPF multi-area and ABR functionality
  • Segment-Routing (Adj-SIDs and Prefix-SIDs)
                         +---------+
                         |         |     
                         |   RT1   |     
                         | 1.1.1.1 |
                         |         |
                         +---------+     
                              |eth-sw1   
                              |  
                              |   
         +---------+          |          +---------+
         |         |          |          |         |
         |   RT2   |eth-sw1   |   eth-sw1|   RT3   |
         | 2.2.2.2 +----------+----------+ 3.3.3.3 |
         |         |     10.0.1.0/24     |         |
         +---------+                     +---------+
    eth-rt4-1|  |eth-rt4-2          eth-rt5-1|  |eth-rt5-2
             |  |                            |  |
  10.0.2.0/24|  |10.0.3.0/24      10.0.4.0/24|  |10.0.5.0/24
             |  |                            |  |
    eth-rt2-1|  |eth-rt2-2          eth-rt3-1|  |eth-rt3-2
         +---------+                     +---------+
         |         |                     |         |
         |   RT4   |     10.0.6.0/24     |   RT5   |
         | 4.4.4.4 +---------------------+ 5.5.5.5 |
         |         |eth-rt5       eth-rt4|         |
         +---------+                     +---------+
       eth-rt6|                                |eth-rt6
              |                                |
   10.0.7.0/24|                                |10.0.8.0/24
              |          +---------+           |
              |          |         |           |
              |          |   RT6   |           |
              +----------+ 6.6.6.6 +-----------+
                  eth-rt4|         |eth-rt5
                         +---------+

Configuration

Below is the Holo CLI configuration for all routers in the network topology:

Please note that the CLI uses auto-generated commands from the IETF YANG models. These commands can at times be excessively verbose and more intricate than required. In the future, efforts will be made to provide simpler commands.

rt1
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-sw1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 1.1.1.1/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 10
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 1.1.1.1
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.0
  interfaces interface lo
  interfaces interface eth-sw1
   priority 1
   hello-interval 3
   dead-interval 12
  !
 !
!
rt2
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-sw1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt4-1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt4-2
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 2.2.2.2/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 20
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 2.2.2.2
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.0
  interfaces interface lo
  interfaces interface eth-sw1
   priority 2
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt4-1
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt4-2
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
!
rt3
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-sw1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt5-1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt5-2
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 3.3.3.3/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 30
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 3.3.3.3
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.0
  interfaces interface lo
  interfaces interface eth-sw1
   priority 3
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt5-1
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt5-2
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
!
rt4
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt2-1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt2-2
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt5
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt6
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 4.4.4.4/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 40
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 4.4.4.4
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.0
  interfaces interface lo
  interfaces interface eth-rt2-1
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt2-2
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
 ospf areas area 0.0.0.1
  interfaces interface lo
  interfaces interface eth-rt5
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt6
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
!
rt5
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt3-1
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt3-2
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt4
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt6
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 5.5.5.5/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 50
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 5.5.5.5
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.0
  interfaces interface eth-rt3-1
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt3-2
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
 ospf areas area 0.0.0.1
  interfaces interface lo
  interfaces interface eth-rt4
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt6
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
!
rt6
interfaces interface lo
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt4
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
interfaces interface eth-rt5
 type iana-if-type:ethernetCsmacd
 ipv4
 ipv6
!
routing segment-routing sr-mpls srgb srgb 16000 23999
!
routing segment-routing sr-mpls bindings connected-prefix-sid-map connected-prefix-sid 6.6.6.6/32 ietf-segment-routing-common:prefix-sid-algorithm-shortest-path
 start-sid 60
 last-hop-behavior no-php
!
routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
 ospf explicit-router-id 6.6.6.6
 ospf address-family ipv4
 ospf extended-lsa-support true
 ospf segment-routing enabled true
 !
 ospf areas area 0.0.0.1
  interfaces interface lo
  interfaces interface eth-rt4
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
  interfaces interface eth-rt5
   interface-type point-to-point
   hello-interval 3
   dead-interval 12
  !
 !
!

Verification - Initial Network Convergence

In order to verify the OSPF network convergence, we will inspect the rt4 router.

Firstly, it is important to ensure that all interfaces are operational:

rt4# show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/areas/area/interfaces/interface/*

{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "areas": {
              "area": [
                {
                  "area-id": "0.0.0.0",
                  "interfaces": {
                    "interface": [
                      {
                        "name": "eth-rt2-1",
                        "state": "point-to-point",
                        "hello-timer": 1,
                        "wait-timer": "not-set",
                        "interface-id": 4
                      },
                      {
                        "name": "eth-rt2-2",
                        "state": "point-to-point",
                        "hello-timer": 1,
                        "wait-timer": "not-set",
                        "interface-id": 6
                      }
                    ]
                  }
                },
                {
                  "area-id": "0.0.0.1",
                  "interfaces": {
                    "interface": [
                      {
                        "name": "eth-rt5",
                        "state": "point-to-point",
                        "hello-timer": 1,
                        "wait-timer": "not-set",
                        "interface-id": 3
                      },
                      {
                        "name": "eth-rt6",
                        "state": "point-to-point",
                        "hello-timer": 1,
                        "wait-timer": "not-set",
                        "interface-id": 7
                      },
                      {
                        "name": "lo",
                        "state": "loopback",
                        "hello-timer": "not-set",
                        "wait-timer": "not-set",
                        "interface-id": 1
                      }
                    ]
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

Check if a full adjacency has been established with all connected neighbors:

rt4# show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/areas/area/interfaces/interface/neighbors//*

{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "areas": {
              "area": [
                {
                  "area-id": "0.0.0.0",
                  "interfaces": {
                    "interface": [
                      {
                        "name": "eth-rt2-1",
                        "neighbors": {
                          "neighbor": [
                            {
                              "neighbor-router-id": "2.2.2.2",
                              "address": "fe80::5c39:d6ff:fe4b:e2cb",
                              "state": "full",
                              "dead-timer": 10,
                              "statistics": {
                                "discontinuity-time": "2023-04-02T10:45:53.858099739-03:00",
                                "nbr-event-count": 4,
                                "nbr-retrans-qlen": 0
                              }
                            }
                          ]
                        }
                      },
                      {
                        "name": "eth-rt2-2",
                        "neighbors": {
                          "neighbor": [
                            {
                              "neighbor-router-id": "2.2.2.2",
                              "address": "fe80::28de:6cff:fe2d:f511",
                              "state": "full",
                              "dead-timer": 10,
                              "statistics": {
                                "discontinuity-time": "2023-04-02T10:45:53.865773865-03:00",
                                "nbr-event-count": 5,
                                "nbr-retrans-qlen": 0
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "area-id": "0.0.0.1",
                  "interfaces": {
                    "interface": [
                      {
                        "name": "eth-rt5",
                        "neighbors": {
                          "neighbor": [
                            {
                              "neighbor-router-id": "5.5.5.5",
                              "address": "fe80::68ec:fcff:feb7:cf49",
                              "state": "full",
                              "dead-timer": 9,
                              "statistics": {
                                "discontinuity-time": "2023-04-02T10:45:53.895945337-03:00",
                                "nbr-event-count": 5,
                                "nbr-retrans-qlen": 0
                              }
                            }
                          ]
                        }
                      },
                      {
                        "name": "eth-rt6",
                        "neighbors": {
                          "neighbor": [
                            {
                              "neighbor-router-id": "6.6.6.6",
                              "address": "fe80::1c4a:2bff:fede:494c",
                              "state": "full",
                              "dead-timer": 9,
                              "statistics": {
                                "discontinuity-time": "2023-04-02T10:45:53.875728142-03:00",
                                "nbr-event-count": 5,
                                "nbr-retrans-qlen": 0
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

Inspect the OSPF routing table to verify that all destinations are reachable via the shortest available paths:

rt4# show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/local-rib//*

{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "local-rib": {
              "route": [
                {
                  "prefix": "1.1.1.1/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 20,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "2.2.2.2/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "3.3.3.3/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 20,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "4.4.4.4/32",
                  "metric": 0,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "5.5.5.5/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.6.5",
                        "outgoing-interface": "eth-rt5"
                      }
                    ]
                  },
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "6.6.6.6/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.7.6",
                        "outgoing-interface": "eth-rt6"
                      }
                    ]
                  },
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.1.0/24",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 20,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.2.0/24",
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.3.0/24",
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.4.0/24",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 30,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.5.0/24",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.2.2",
                        "outgoing-interface": "eth-rt2-1"
                      },
                      {
                        "next-hop": "10.0.3.2",
                        "outgoing-interface": "eth-rt2-2"
                      }
                    ]
                  },
                  "metric": 30,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.6.0/24",
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.7.0/24",
                  "metric": 10,
                  "route-type": "intra-area"
                },
                {
                  "prefix": "10.0.8.0/24",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.6.5",
                        "outgoing-interface": "eth-rt5"
                      },
                      {
                        "next-hop": "10.0.7.6",
                        "outgoing-interface": "eth-rt6"
                      }
                    ]
                  },
                  "metric": 20,
                  "route-type": "intra-area"
                }
              ]
            }
          }
        }
      ]
    }
  }
}

Check the Forwarding Information Base (FIB) to confirm that it is synchronized with the Routing Information Base (RIB):

rt4# ip route
1.1.1.1 nhid 53 proto ospf metric 20 
        nexthop  encap mpls  16010 via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop  encap mpls  16010 via 10.0.3.2 dev eth-rt2-2 weight 1 
2.2.2.2 nhid 30 proto ospf metric 20 
        nexthop  encap mpls  16020 via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop  encap mpls  16020 via 10.0.3.2 dev eth-rt2-2 weight 1 
3.3.3.3 nhid 47 proto ospf metric 20 
        nexthop  encap mpls  16030 via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop  encap mpls  16030 via 10.0.3.2 dev eth-rt2-2 weight 1 
5.5.5.5 nhid 33  encap mpls  16050 via 10.0.6.5 dev eth-rt5 proto ospf metric 20 
6.6.6.6 nhid 34  encap mpls  16060 via 10.0.7.6 dev eth-rt6 proto ospf metric 20 
10.0.1.0/24 nhid 35 proto ospf metric 20 
        nexthop via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop via 10.0.3.2 dev eth-rt2-2 weight 1 
10.0.2.0/24 dev eth-rt2-1 proto kernel scope link src 10.0.2.4 
10.0.3.0/24 dev eth-rt2-2 proto kernel scope link src 10.0.3.4 
10.0.4.0/24 nhid 35 proto ospf metric 20 
        nexthop via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop via 10.0.3.2 dev eth-rt2-2 weight 1 
10.0.5.0/24 nhid 35 proto ospf metric 20 
        nexthop via 10.0.2.2 dev eth-rt2-1 weight 1 
        nexthop via 10.0.3.2 dev eth-rt2-2 weight 1 
10.0.6.0/24 dev eth-rt5 proto kernel scope link src 10.0.6.4 
10.0.7.0/24 dev eth-rt6 proto kernel scope link src 10.0.7.4 
10.0.8.0/24 nhid 38 proto ospf metric 20 
        nexthop via 10.0.6.5 dev eth-rt5 weight 1 
        nexthop via 10.0.7.6 dev eth-rt6 weight 1

Verify the Label Forwarding Information Base (LFIB) to ensure that all Segment Routing Adj-SIDs and Prefix-SIDs have been correctly installed:

rt4# ip -M route
16 via inet6 fe80::5c39:d6ff:fe4b:e2cb dev eth-rt2-1 proto ospf 
17 via inet6 fe80::28de:6cff:fe2d:f511 dev eth-rt2-2 proto ospf 
18 via inet6 fe80::1c4a:2bff:fede:494c dev eth-rt6 proto ospf 
19 via inet6 fe80::68ec:fcff:feb7:cf49 dev eth-rt5 proto ospf 
16010 proto ospf 
        nexthop as to 16010 via inet 10.0.2.2 dev eth-rt2-1 
        nexthop as to 16010 via inet 10.0.3.2 dev eth-rt2-2 
16020 proto ospf 
        nexthop as to 16020 via inet 10.0.2.2 dev eth-rt2-1 
        nexthop as to 16020 via inet 10.0.3.2 dev eth-rt2-2 
16030 proto ospf 
        nexthop as to 16030 via inet 10.0.2.2 dev eth-rt2-1 
        nexthop as to 16030 via inet 10.0.3.2 dev eth-rt2-2 
16050 as to 16050 via inet 10.0.6.5 dev eth-rt5 proto ospf 
16060 as to 16060 via inet 10.0.7.6 dev eth-rt6 proto ospf

Verification - Configuration Change

Let's modify the cost of rt4's interface towards rt5 to a very high value:

rt4# holo-cli
rt4# configure 
rt4(config)# routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main
rt4(config/control-plane-protocol[ietf-ospf:ospfv3 main])# ospf areas area 0.0.0.1
rt4(config/control-plane-protocol[ietf-ospf:ospfv3 main]/area[0.0.0.0])# interfaces interface eth-rt5
rt4(config/control-plane-protocol[ietf-ospf:ospfv3 main]/area[0.0.0.0]/interface[eth-sw1])# cost 1000
rt4(config/control-plane-protocol[ietf-ospf:ospfv3 main]/area[0.0.0.0]/interface[eth-sw1])# commit
% configuration committed successfully

This change will trigger a full SPF run:

rt4# show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/spf-log//*

{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "spf-log": {
              "event": [
                {
                  "id": 28,
                  "spf-type": "full",
                  "schedule-timestamp": 4345,
                  "start-timestamp": 3842,
                  "end-timestamp": 3842,
                  "trigger-lsa": [
                    {
                      "area-id": "0.0.0.1",
                      "type": 40993,
                      "lsa-id": "0.0.0.0",
                      "adv-router": "4.4.4.4",
                      "seq-num": 2147483657
                    },
                    {
                      "area-id": "0.0.0.1",
                      "type": 41001,
                      "lsa-id": "0.0.0.0",
                      "adv-router": "4.4.4.4",
                      "seq-num": 2147483657
                    }
                  ]
                },

We can observe that 5.5.5.5/32 is now reachable via rt6, as the accumulated cost between rt4-rt6-rt5 is smaller than the cost of the direct link between rt4 and rt5:

rt4# holo-cli -c "show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/local-rib/route[prefix='5.5.5.5/32']//*"
{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "local-rib": {
              "route": [
                {
                  "prefix": "5.5.5.5/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.7.6",
                        "outgoing-interface": "eth-rt6"
                      }
                    ]
                  },
                  "metric": 20,
                  "route-type": "intra-area"
                }
              ]
            }
          }
        }
      ]
    }
  }
}

rt4# ip route show 5.5.5.5/32
5.5.5.5 nhid 58  encap mpls  16050 via 10.0.7.6 dev eth-rt6 proto ospf metric 20

Verification - Link Failure

To simulate a link failure, we will shut down rt4's interface towards rt6:

rt4# ip link set dev eth-rt6 down

After the link failure, we expect rt4 to reach rt5 through rt2, as the direct link to rt5 has a very high cost. However, rt4 still prefers to use the direct link because intra-area routes are always preferred over inter-area routes, regardless of the route costs. We can confirm this by inspecting rt4's RIB and FIB:

rt4# holo-cli -c "show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/local-rib/route[prefix='5.5.5.5/32']//*"
{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "local-rib": {
              "route": [
                {
                  "prefix": "5.5.5.5/32",
                  "next-hops": {
                    "next-hop": [
                      {
                        "next-hop": "10.0.6.5",
                        "outgoing-interface": "eth-rt5"
                      }
                    ]
                  },
                  "metric": 1000,
                  "route-type": "intra-area"
                }
              ]
            }
          }
        }
      ]
    }
  }
}

rt4# ip route show 5.5.5.5/32
5.5.5.5 nhid 100  encap mpls  16050 via 10.0.6.5 dev eth-rt5 proto ospf metric 20 

As a further exercise, we will disconnect rt1 from the topology:

rt1# ip link set dev eth-sw1 down

After disconnecting rt1, we can inspect the RIB and FIB on rt6 and confirm that the route to 1.1.1.1/32 is gone:

rt6# holo-cli -c "show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/local-rib/route[prefix='1.1.1.1/32']//*"
{}

rt6# ip route show 1.1.1.1/32

It is interesting to note that a partial SPF run was sufficient to update the routing table, as rt1 resides in another OSPF area. We can confirm this by using the following command:

rt6# show state xpath /ietf-routing:routing/control-plane-protocols/control-plane-protocol/ospf/spf-log//*

{
  "ietf-routing:routing": {
    "control-plane-protocols": {
      "control-plane-protocol": [
        {
          "type": "ietf-ospf:ospfv3",
          "name": "main",
          "ietf-ospf:ospf": {
            "spf-log": {
              "event": [
                {
                  "id": 53,
                  "spf-type": "inter",
                  "schedule-timestamp": 5572,
                  "start-timestamp": 5552,
                  "end-timestamp": 5551,
                  "trigger-lsa": [
                    {
                      "area-id": "0.0.0.1",
                      "type": 40995,
                      "lsa-id": "0.0.0.23",
                      "adv-router": "4.4.4.4",
                      "seq-num": 2147483649
                    },