Dynamic Routing Service

The MidoNet Neutron plugin, through Neutron’s advanced service framework, provides the dynamic routing feature on the provider router.

MidoNet currently only supports BGP but it will also support OSPF in the future. The API design attempts to abstract away the underlying routing protocol.

Problem Description

With the dynamic routing service, an OpenStack cloud would run a routing protocol (for example, BGP) against at least one router in each uplink network provider. By announcing external network hosting floating IP prefixes to those peers, the Neutron network would be reachable by the rest of the internet via both paths. If the link to an uplink provider broke, the failure information would propagate to routers further up the stream, keeping the cloud reachable through the remaining healthy link. Likewise, in such a case, Neutron would eliminate the routes learned through the faulty link from its forwarding table, redirecting all cloud-originated traffic through the healthy link.

Without dynamic routing, the scenario described above would not be possible.

Proposed Change

Three new models are introduced.

RoutingInstance is the top level object that abstracts a dynamic routing service (such as BGP, OSFP). When configured, the dynamic routing service is enabled on the router that it is associated with.

RoutingPeer is the peering configuration applied on the router port that you want to start the peering session from. Since RoutingPeers are associated with ports, there would be multiple RoutingPeers for a given RoutingInstance.

AdvertiseRoute is the route advertised with dynamic routing. In Neutron, Floating IP could be advertised to the outside of OpenStack cloud by creating an AdvertiseRoute object for that CIDR.

In MidoNet, routes learned from the peer are inserted into the routing table of the router, and this proposal does not affect this mechanism.

REST API

RoutingInstance

Attribute Name Type POST/ PUT Required Description
id string (UUID) POST generated ID of the routing instance
router_id string (UUID) POST Yes Router that the routing service is attached to
local_as int POST Yes Local AS number used in BGP
protocol string   No Routing protocol to use. Only BGP supported, so cannot be updated.

Deleting the routing instance deletes all the advertise routes and routing peers. ‘loopback address’ feature is not included in this spec, but will be added in the future. Also, while the models proposed are meant to abstract away all the dynamic routing protocols, because MidoNet only handles BGP right now, they only include BGP-specific fields.

A router that has a routing instance associated cannot be deleted, and you must delete the routing instance first.

A router could have only one routing instance associated.

RoutingPeer

Attribute Name Type POST/ PUT Required Description
id string (UUID) POST generated ID of the routing peer
routing_instance_id string (UUID) POST Yes Routing instance it is associated with
port_id string (UUID) POST Yes Port used to connect to the peer
peer_as int POST Yes Peer AS number used in BGP
peer_address string POST Yes Peer IP address

Only IPv4 is supported for ‘peer_address’. In this proposal, the support for establishing connections with peers that do not have an IP address is not included.

Deleting a routing instance deletes the associated routing peers.

AdvertiseRoute

Attribute Name Type POST/ PUT Required Desciption
id string (UUID) POST generated Unique Identifier for route configuration
routing_instance_id string (UUID) POST Yes ID of the routing instance the route is associated with
destination string POST No Value to compare with the destination IP address of the flow being forwarded Default: 0.0.0.0/32

Only IPv4 is supported for destination.

Deleting a routing instance deletes the associated advertise routes.

DB Model

midonet_routing_instances

Name Type Description
id String ID of the routing instance
router_id String ID of the router the routing instance is attached to
local_as Int Local AS number
protocol String Routing protocol

The only supported value for ‘protocol’ is ‘BGP’, but ‘OSPF’ will be added in the future.

midonet_routing_peers

Name Type Description
id String ID of the routing peer
routing_instance_id String ID of the routing instance associated
port_id String ID of the port for the peer connection
peer_as Int Peer AS number used for BGP
peer_address String Peer IP address

midonet_advertise_route

Name Type Description
id String ID of the route
routing_instance_id String ID of the routing instance associated
destination String destination CIDR to match on

midonet_tasks

New task data types are introduced:

  • ROUTING_INSTANCE
  • ROUTING_PEER
  • ADVERTISE_ROUTE

Security

For this proposal, dynamic routing configuration is limited to admins only.

Client

The following command creates a routing instance:

::
neutron routing-instance-create [–router-id ROUTER_ID]
[–local-as LOCAL_AS]
–router-id ROUTER_ID::
ID of the router to associate with
–local-as LOCAL_AS::
The local AS number

The following command gets a routing instance:

::
neutron routing-instance-show ROUTING_INSTANCE_ID
ROUTING_INSTANCE_ID::
ID of the routing instance to look up

The following command lists all the routing instances of a tenant:

::
neutron routing-instance-list

The following command associates a routing instance to a router:

::
neutron routing-instance-associate [–router-id ROUTER_ID]
ROUTING_INSTANCE_ID
ROUTING_INSTANCE_ID::
ID of the routing instance to look up
–router-id ROUTER_ID::
ID of the router to associate with

The following command disassociates a routing instance from a router:

::
neutron routing-instance-disassociate ROUTING_INSTANCE_ID
ROUTING_INSTANCE_ID::
ID of the routing instance to look up

The following command deletes a routing instance:

::
neutron routing-instance-delete ROUTING_INSTANCE_ID
ROUTING_INSTANCE_ID::
ID of the routing instance to look up

The following command creates a routing peer:

::
neutron routing-peer-create [–routing-instance-id ROUTING_INSTANCE_ID]
[–port-id PORT_ID] [–peer-as PEER_AS] [–peer-address PEER_ADDRESS]
–routing_instance_id ROUTING_INSTANCE_ID::
ID of the routing instance to create the routing peer for
–port-id PORT_ID::
ID of the port to connect to peer from
–peer-as PEER_AS::
Peer AS number for BGP
–peer-address PEER_ADDRESS::
Peer IP address

The following command deletes a routing peer:

::
neutron routing-peer-delete ROUTING_PEER_ID
ROUTING_PEER_ID::
ID of the routing peer to delete

The following command gets a routing peer:

::
neutron routing-peer-get ROUTING_PEER_ID
ROUTING_PEER_ID::
ID of the routing peer to look up

The following command lists all the routing peers of a tenant:

::
neutron routing-peer-list

The following command creates an advertise route:

::
neutron advertise-route-create [–routing-instance-id ROUTING_INSTANCE_ID]
[–destination DESTINATION]
–routing_instance_id ROUTING_INSTANCE_ID::
ID of the routing instance to create the advertse route for
–destination DESTINATION::
destination CIDR of the route

The following command delets an advertise route:

::
neutron advertise-route-delete ADVERTISE_ROUTE_ID
ADVERTISE_ROUTE_ID::
ID of the advertise route to delete

The following command gets an advertise route:

::
neutron advertise-route-get ADVERTISE_ROUTE_ID
ADVERTISE_ROUTE_ID::
ID of the advertise route to look up

The following command lists all the advertise routes of a tenant:

::
neutron advertise-route-list