Adding agent-less driver support for neutron-dynamic-routing project

[RFE] neutron_dynamic_routing project is bound to rpc driver closely
https://bugs.launchpad.net/neutron/+bug/1611632

Problem Description

The current module BgpPlugin.py is bound to RPC driver so closely, so it is not working well with the agent-less driver. Another problem is the neutron-dynamic-routing project does not follow the service provider registration mechanism. Currently, for all advanced service features, all projects are using service provider to load the driver, so from this view, the neutron-dynamic-routing project needs to be refactored.

Proposed Change

Refactor the current neutron-dynamic-routing code to make sure all agent/agent-less drivers work well.

1. Make BgpPlugin.py as an overall interface to load different BGP drivers. The service name will be DYNAMIC_ROUTING.

2. Add a new configuration file neutron_dynamic_routing.conf to specify the service_providers, currently, the default service provider is RPC agent driver.

3. The existing bgp_dragent.ini will be used by the RPC driver such as RYU driver and quagga driver.

4. Create a new directory to locate the BgpRpcPluginDriver. The BgpRpcPluginDriver will do what the current BgpPlugin did, for example, setup rpc and register callback.

Configuration file impact

Add a new neutron_dynamic_routing.conf to specify the service_providers.

service_provider = DYNAMIC_ROUTING:PRCDriver:neutron_dynamic_routing.services.bgp.service_drivers.rpc_bgp.BgpRpcPluginDriver:default

Behaviour Changes

Currently, for devstack, the dynamic routing agent (DR agent) is started by default. After the code refactor, the DR agent is only started when the RPC service provider is enabled. But there will not be any behavioural changes because the RPC back-end which is the current behaviour will remain as it is.