Neutron/L3ServiceTypeFrameworkIntegration

Introduction
In Havana release, L3 router service was moved out of core plugin and became an independent service plugin. This blueprint is to take this effort one step further to integrate L3 service with Service Type Framework. This function enables the operator to provider routing services from multiple vendors to the customer.

Blueprint
L3 router integration with Service Type Framework

Overview
LBaaS is the first advanced service that supports Service Type Framework. FWaaS and VPNaaS integration is under discussion. To enable multiple vendor support, all advance services employ "one service plugin / multiple driver" model. The tenant user specifies the provider when creating the resource. The service plugin dispatches calls to drivers implemented by vendors based on the provider setting. LBaaS service plugin introduced the concept of plugin-side driver. The plugin-side driver coexist with service plugin at the control node and has direct access to the database.

In this blueprint, the approach we plan to take is along the line that how LBaaS is integrated with the service framework. L3 router plugin will become a plugin-side driver. The reference design, l3-agent, is at the agent side and almost remains untouched.

Design Consideration
Most vendors' L3 services today are developed as part of their own core plugins. In addition to monitoring router configuration change, these implementations perform activities such as managing database, creating/removing ports and communicating with the backend services. All these functions should be allowed in the service framework integration. The service plugin itself should be a very thin layer that just dispatches calls and maintains necessary state for data consistency.

The purpose of this blueprint to support multiple vendors under one service plugin. How to expose vendor specific features is an important consideration. These features are normally supported by extensions today. Because the service plugin hide the vendor implementations behind, it seems to imply that the service plugin will have to implement all extension interfaces when vendors start adding their drivers and functions. This issue is likely to happen in other advanced services as well.

Dependencies
No new dependency and no CLI or database schema change.

Configuration
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin

[service_providers] service_provider=L3_ROUTER_NAT:linux:neutron.services.l3_router.drivers.linux.l3_router_driver.L3RouterDriver:default service_provider=L3_ROUTER_NAT:vendor1:neutron.services.l3_router.drivers.vendor1.vendor1_l3_driver.L3Driver