From 3db1097c07322809e3159ff0d6db1617392953e9 Mon Sep 17 00:00:00 2001 From: yuyangbj Date: Thu, 30 Jun 2016 17:01:30 +0800 Subject: [PATCH] Document about how to test dynamic routing Partially-Implements: blueprint bgp-spinout Partial-Bug: #156000 Change-Id: I49f3ba285a4b66766e1f04103fd08798e3c0628b --- doc/source/others/testing.rst | 514 +++++++++++++++++++++++++++++++++- 1 file changed, 513 insertions(+), 1 deletion(-) diff --git a/doc/source/others/testing.rst b/doc/source/others/testing.rst index ed3afc74..2b335fe3 100644 --- a/doc/source/others/testing.rst +++ b/doc/source/others/testing.rst @@ -25,4 +25,516 @@ Testing ======= -TODO: Coming Soon +Dynamic routing enables advertisement of self-service network prefixes to physical network +devices that support dynamic routing protocol such as routers. Neutron dynamic routing project that +consists of a service plugin-in and agent can advertise neutron private network to outside of +OpenStack. This document will describe how to test the Dynamic Routing functionalities, introduce +what the environment architecture is for dynamic routing test and show how to setup dynamic routing +environment using Devstack. + +Environment Architecture +------------------------- + +Using the following example architecture as a test environment to deploy neutron-dynamic-routing in +your environment. The example architecture will deploy an all-in-one OpenStack and pick up an Ubuntu +VM running Quagga as a router outside of OpenStack . See following:: + + + + +--------------+ + 10.156.18.20 | | + +----------------------------------| Quagga | + | BGP Peering Session | Router | + | | 172.24.4.3 | + | +--------------+ + | | + |10.156.18.21 | External Network(172.24.4.0/24) + -------------------------------------------------------------------------------------------------- |ETH0 |br-ex + +---------------------------------------+ + | | | | + | | | | + | | +-------+ | + | | |172.24.4.1 | + | +------------+ +-------+ | + | | | |Router | | + | | Dr-Agent | | | | + | | | +-------+ | + | +------------+ | | + | ---------------- | + | Tenant Network | + | (10.0.0.0/24) | + | | + +---------------------------------------+ + All-In-One OpenStack Installation + + +Devstack Setup +-------------- + +1. Download devstack:: + + git clone http://git.openstack.org/openstack-dev/devstack.git + +2. Enable neutron-dynamic-routing:: + + [[local|localrc]] + enable_plugin neutron-dynamic-routing http://git.openstack.org/openstack/neutron-dynamic-routing + +3. Run devstack:: + + ./stack.sh + +Quagga Configure +---------------- + +Quagga is a network routing software available in most GNU/Linux, Solaris, FreeBSD, and NetBSD. It provides +the implementation of OSPF, RIP, BGP and IS-IS. This section shows you how to install Quagga and then configure +it on Ubuntu Linux. + +1. Install Quagga using apt-get:: + + $ sudo apt-get install quagga quagga-doc + +2. Create an empty file (/etc/quagga/zebra.conf) and set permissions. + + The Quagga files and configurations will be stored in /etc/quagga:: + + $ sudo touch /etc/quagga/zebra.conf + $ sudo chown quagga.quagga /etc/quagga/zebra.conf + $ sudo chmod 640 /etc/quagga/zebra.conf + +3. Update quagga deamon file. + + You can enable/disable the daemons routing in the /etc/quagga/daemons file. Update /etc/quagga/deamons to enable zebra and bgp:: + + zebra=yes + bgpd=yes + ospfd=no + ospf6d=no + ripd=no + ripngd=no + isisd=no + +4. Update /etc/quagga/zebra.conf:: + + # Zebra configuration + # name of the router + hostname quagga_1 + password zebra + + # log + log file /var/log/quagga/zebra.log + +5. Update /etc/quagga/bgpd.conf:: + + # set router-id to the network address we announce + bgp router-id 10.156.18.20 + + # declare a router with local-as 1000 + router bgp 1000 + + # expose neighbor network which dynamic routing agent is using + neighbor 10.156.18.21 remote-as 12345 + + # treat neutron dynamic routing agent as a passive peer in case + # quagga keeps making futile connection attempts + neighbor 10.156.18.21 passive + + # log + log file /var/log/quagga/bgpd.log + + debug bgp events + debug bgp filters + debug bgp fsm + debug bgp keepalives + debug bgp updates + +6. Restart the Quagga:: + + $ sudo /etc/init.d/quagga restart + +Service Test +------------- + +1. As the dynamic routing is only supported by admin, source the devstack admin credentials:: + + $ source devstack/openrc admin admin + +2. Verify the neutron dynamic routing agent is running. + +.. code-block:: console + + $ neutron agent-list --agent-type 'BGP dynamic routing agent' + +--------------------+--------------------+--------------------+-------------------+-------+----------------+---------------------+ + | id | agent_type | host | availability_zone | alive | admin_state_up | binary | + +--------------------+--------------------+--------------------+-------------------+-------+----------------+---------------------+ + | 69ad386f-e055-4284 | BGP dynamic | yang-devstack- | | :-) | True | neutron-bgp-dragent | + | -8c8e-ef9bd540705c | routing agent | ubuntu-1604 | | | | | + +--------------------+--------------------+--------------------+-------------------+-------+----------------+---------------------+ + + +3. Create an address scope. + + The provider(external) and tenant networks must belong to the same address scope + for the agent to advertise those tenant network prefixes. + + .. code-block:: console + + $ neutron address-scope-create --shared public 4 + Created a new address_scope: + +------------+--------------------------------------+ + | Field | Value | + +------------+--------------------------------------+ + | id | c02c358a-9d35-43ea-8313-986b3e4a91c0 | + | ip_version | 4 | + | name | public | + | shared | True | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +------------+--------------------------------------+ + +4. Create subnet pools. The provider and tenant networks use different pools. + + * Create the provider network pool. + + .. code-block:: console + + $ neutron subnetpool-create --pool-prefix 172.24.4.0/24 \ + --address-scope public provider + Created a new subnetpool: + +-------------------+--------------------------------------+ + | Field | Value | + +-------------------+--------------------------------------+ + | address_scope_id | 238aaf8f-f91a-4538-b6b2-c0140111cf69 | + | created_at | 2016-06-30T07:03:52 | + | default_prefixlen | 8 | + | default_quota | | + | description | | + | id | 8439bfee-e09c-40a9-a3ea-8cf7212b7ba9 | + | ip_version | 4 | + | is_default | False | + | max_prefixlen | 32 | + | min_prefixlen | 8 | + | name | provider | + | prefixes | 172.24.4.0/24 | + | shared | False | + | tenant_id | 21734c4383284cf9906b7fe8246bffb1 | + | updated_at | 2016-06-30T07:03:52 | + +-------------------+--------------------------------------+ + + * Create tenant network pool. + + .. code-block:: console + + $ neutron subnetpool-create --pool-prefix 10.0.0.0/16 \ + --address-scope public --shared selfservice + Created a new subnetpool: + +-------------------+--------------------------------------+ + | Field | Value | + +-------------------+--------------------------------------+ + | address_scope_id | c02c358a-9d35-43ea-8313-986b3e4a91c0 | + | created_at | 2016-06-30T07:08:30 | + | default_prefixlen | 8 | + | default_quota | | + | description | | + | id | c7e9737a-cfd3-45b5-a861-d1cee1135a92 | + | ip_version | 4 | + | is_default | False | + | max_prefixlen | 32 | + | min_prefixlen | 8 | + | name | selfservice | + | prefixes | 10.0.0.0/16 | + | shared | True | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + | updated_at | 2016-06-30T07:08:30 | + +-------------------+--------------------------------------+ + +5. Create the provider and tenant networks. + + * Create the provider network. + + .. code-block:: console + + $ neutron net-create --router:external True --provider:physical_network provider \ + --provider:network_type flat provider + Created a new network: + +---------------------------+--------------------------------------+ + | Field | Value | + +---------------------------+--------------------------------------+ + | admin_state_up | True | + | id | 68ec148c-181f-4656-8334-8f4eb148689d | + | name | provider | + | provider:network_type | flat | + | provider:physical_network | provider | + | provider:segmentation_id | | + | router:external | True | + | shared | False | + | status | ACTIVE | + | subnets | | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +---------------------------+--------------------------------------+ + + * Create a subnet on the provider network using an IP address allocation from the provider subnet pool. + + .. code-block:: console + + $ neutron subnet-create --name provider --subnetpool provider \ + --prefixlen 24 provider + Created a new subnet: + +-------------------+------------------------------------------------+ + | Field | Value | + +-------------------+------------------------------------------------+ + | allocation_pools | {"start": "172.24.4.2", "end": "172.24.4.254"} | + | cidr | 172.24.4.0/24 | + | created_at | 2016-03-17T23:17:16 | + | description | | + | dns_nameservers | | + | enable_dhcp | True | + | gateway_ip | 172.24.4.1 | + | host_routes | | + | id | 8ed65d41-2b2a-4f3a-9f92-45adb266e01a | + | ip_version | 4 | + | ipv6_address_mode | | + | ipv6_ra_mode | | + | name | provider | + | network_id | 68ec148c-181f-4656-8334-8f4eb148689d | + | subnetpool_id | 3771c0e7-7096-46d3-a3bd-699c58e70259 | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + | updated_at | 2016-03-17T23:17:16 | + +-------------------+------------------------------------------------+ + + * Create the tenant network. + + .. code-block:: console + + $ neutron net-create private + Created a new network: + +---------------------------+--------------------------------------+ + | Field | Value | + +---------------------------+--------------------------------------+ + | admin_state_up | True | + | id | 01da3e19-129f-4d26-b065-255ade0e5e2c | + | name | private | + | shared | False | + | status | ACTIVE | + | subnets | | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +---------------------------+--------------------------------------+ + + * Create a subnet on the tenant network using an IP address allocation from the private subnet pool. + + .. code-block:: console + + $ neutron subnet-create --name selfservice --subnetpool private \ + --prefixlen 24 private + Created a new subnet: + +-------------------+--------------------------------------------+ + | Field | Value | + +-------------------+--------------------------------------------+ + | allocation_pools | {"start": "10.0.0.2", "end": "10.0.0.254"} | + | cidr | 10.0.0.0/24 | + | created_at | 2016-03-17T23:20:20 | + | description | | + | dns_nameservers | | + | enable_dhcp | True | + | gateway_ip | 10.0.0.1 | + | host_routes | | + | id | 8edd3dc2-df40-4d71-816e-a4586d61c809 | + | ip_version | 4 | + | ipv6_address_mode | | + | ipv6_ra_mode | | + | name | private | + | network_id | 01da3e19-129f-4d26-b065-255ade0e5e2c | + | subnetpool_id | c7e9737a-cfd3-45b5-a861-d1cee1135a92 | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + | updated_at | 2016-03-17T23:20:20 | + +-------------------+--------------------------------------------+ + +6. Create and configure router + + * Create a router. + + .. code-block:: console + + $ neutron router-create router + +-----------------------+--------------------------------------+ + | Field | Value | + +-----------------------+--------------------------------------+ + | admin_state_up | True | + | external_gateway_info | | + | id | 49439b14-f6ee-420d-8c48-d3767fadcb3a | + | name | router | + | status | ACTIVE | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +-----------------------+--------------------------------------+ + + * Add the private subnet as an interface on the router. + + .. code-block:: console + + $ neutron router-interface-add router selfservice + Added interface 969a1d4b-7fa1-4346-9963-de06becab87a to router router. + + * Add the provide network as a gateway on the router + + .. code-block:: console + + $ neutron router-gateway-set router provider + Set gateway for router router + + * Verify router ports. Note: from this result, you can see what the advertised routes are. + + .. code-block:: console + + $ neutron router-port-list router + +--------------------------------------+------+-------------------+----------------------------------------------------+ + | id | name | mac_address | fixed_ips | + +--------------------------------------+------+-------------------+----------------------------------------------------+ + | dc675aab-5a8b-462c-872e-2f791b6c1730 | | fa:16:3e:e5:a2:d2 | {"subnet_id": "1c6b725e- | + | | | | 890e-4454-8842-7ff22ffa704b", "ip_address": | + | | | | "10.0.0.1"} | + | e15c701d-868f-4171-a282-e6a4567a8d83 | | fa:16:3e:28:86:4c | {"subnet_id": | + | | | | "b442c453-7e4a-4568-9d70-1dde91a65fbb", | + | | | | "ip_address": "172.24.4.2"} | + +--------------------------------------+------+-------------------+----------------------------------------------------+ + +7. Create and configure the BGP speaker + + The BGP speaker advertised the next-hop IP address for the tenant network prefix. + + * Create the BGP speaker. + + Replace LOCAL_AS with an appropriate local autonomous system number. The example configuration uses AS 12345. + + .. code-block:: console + + $ neutron bgp-speaker-create --ip-version 4 \ + --local-as LOCAL_AS bgp-speaker + Created a new bgp_speaker: + +-----------------------------------+--------------------------------------+ + | Field | Value | + +-----------------------------------+--------------------------------------+ + | advertise_floating_ip_host_routes | True | + | advertise_tenant_networks | True | + | id | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | + | ip_version | 4 | + | local_as | 12345 | + | name | bgp-speaker | + | networks | | + | peers | | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +-----------------------------------+--------------------------------------+ + + * Associate the BGP speaker with the provider network. + + A BGP speaker requires association with a provider network to determine eligible + prefixes. After the association, the BGP speaker can advertise the tenant network + prefixes with the corresponding router as the next-hop IP address. + + .. code-block:: console + + $ neutron bgp-speaker-network-add bgp-speaker provider + Added network provider to BGP speaker bgpspeaker. + + * Verify the association of the provider network with the BGP speaker. + + Checking the ``networks`` attribute. + + .. code-block:: console + + $ neutron bgp-speaker-show bgpspeaker + +-----------------------------------+--------------------------------------+ + | Field | Value | + +-----------------------------------+--------------------------------------+ + | advertise_floating_ip_host_routes | True | + | advertise_tenant_networks | True | + | id | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | + | ip_version | 4 | + | local_as | 12345 | + | name | bgp-speaker | + | networks | 68ec148c-181f-4656-8334-8f4eb148689d | + | peers | | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +-----------------------------------+--------------------------------------+ + + * Verify the prefixes and next-hop ip addresses that the BGP speaker advertises. + + .. code-block:: console + + $ neutron bgp-speaker-advertiseroute-list bgpspeaker + +-------------+------------+ + | destination | next_hop | + +-------------+------------+ + | 10.0.0.0/24 | 172.24.4.3 | + +-------------+------------+ + + * Create a BGP peer. + + Here the BGP peer is pointed to the quagga VM. Replace REMOTE_AS with an appropriate + remote autonomous system number. The example configuration uses AS 12345 which triggers + iBGP peering. + + .. code-block:: console + + $ neutron bgp-peer-create --peer-ip 10.156.18.20 \ + --remote-as REMOTE_AS bgp-peer + Created a new bgp_peer: + +-----------+--------------------------------------+ + | Field | Value | + +-----------+--------------------------------------+ + | auth_type | none | + | id | 35c89ca0-ac5a-4298-a815-0b073c2362e9 | + | name | bgp-peer | + | peer_ip | 10.156.18.20 | + | remote_as | 12345 | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +-----------+--------------------------------------+ + + * Add a BGP peer to the BGP speaker. + + .. code-block:: console + + $ neutron bgp-speaker-peer-add bgp-speaker bgp-peer + Added BGP peer bgppeer to BGP speaker bgpspeaker. + + * Verify the association of the BGP peer with the BGP speaker. + + Checking the ``peers`` attribute. + + .. code-block:: console + + $ neutron bgp-speaker-show bgp-speaker + +-----------------------------------+--------------------------------------+ + | Field | Value | + +-----------------------------------+--------------------------------------+ + | advertise_floating_ip_host_routes | True | + | advertise_tenant_networks | True | + | id | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | + | ip_version | 4 | + | local_as | 12345 | + | name | bgp-speaker | + | networks | 68ec148c-181f-4656-8334-8f4eb148689d | + | peers | 35c89ca0-ac5a-4298-a815-0b073c2362e9 | + | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d | + +-----------------------------------+--------------------------------------+ + +8. Schedule the BGP speaker to an agent. + + * Schedule the BGP speaker to ``BGP dynamic routing agent`` + + BGP speakers require manual scheduling to an agent. BGP speakers only form peering sessions. + + .. code-block:: console + + $ neutron bgp-speaker-network-add bgp-speaker provider + Added network provider to BGP speaker bgpspeaker. + + * Verify scheduling of the BGP speaker to the agent. + + .. code-block:: console + + neutron bgp-dragent-list-hosting-speaker bgp-speaker + +--------------------------------------+---------------------------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+---------------------------+----------------+-------+ + | 69ad386f-e055-4284-8c8e-ef9bd540705c | yang-devstack-ubuntu-1604 | True | :-) | + +--------------------------------------+---------------------------+----------------+-------+