Current VPNaaS Service Plugin inherits from VpnPluginRpcDbMixin, which is not required for some vendor solutions, since L3 is implemented without leveraging L3 Agents to manage router namespaces (ODL, MidoNet, etc). I guess if Mixin usage will be changed to conditional RPC support based on drivers requirements, follow what Salvatore suggested makes perfect sense.
On Wed, Aug 19, 2015 at 11:06 AM, Salvatore Orlando <salv.orla...@gmail.com> wrote: > my 0.02€ on the matter inline. > > Regards, > Salvatore > > On 18 August 2015 at 23:45, Mathieu Rohon <mathieu.ro...@gmail.com> wrote: > >> hi brandon, >> >> thanks for your answer. >> >> my answers inline, >> >> >> >> On Tue, Aug 18, 2015 at 8:53 PM, Brandon Logan < >> brandon.lo...@rackspace.com> wrote: >> >>> So let me make sure I understand this. You want to do a separate >>> service plugin for what would normally be separate drivers under one >>> service plugin. The reasons for this are: >>> >>> >>> 1. You dont want users the ability to choose the type, you want it >>> always to be the same one >>> >> While in theory it is be possible to have multiple BGPVPN providers in > the same deployment, there are control and data plane aspects that the > service type framework at the moment cannot deal with it. Mathieu brought > some examples in the bug report. The bottom line appears to be that the > choice of the l3 service plugin (or whatever serves l3 in your deployment) > also dictates the choiche of the BGPVPN service provider to employ. > >> 2. Some types do want to be the source of truth of the data stored, >>> instead of it being the service plugin database. >>> >> This point has little to do with service types. It's about the fact that > plugins are not required to implemented the various db mixins in neutron.db > and therefore not required to use the neutron DB. > >> >>> First, let me address the possibility of a solution using one service >>> plugin and multiple drivers per type: >>> >>> >>> I think that you can overcome #1 in the instantiation of the service >>> plugin to check if there are more than 1 provider active, if so you can >>> just throw an exception saying you can only have 1. I'd have to look at it >>> more to see if there are any caveats to this, but I think that would work. >>> >>> >>> For #2, assuming #1 works, then the drivers that are defined can have >>> some boolean that they set that will tell the plugin whether they are the >>> source of truth or not, and depending on that you can store the data in the >>> service plugin's db or just pass the data along, also pass GET requests to >>> the drivers as well. >>> >>> >> I agree that those workarounds will surely works but I wonder what is the >> meaning of a service plugin/type that can only support one service >> provider? can't the service plugin be the service provider directly? >> > > I believe there is some value, but I am not able to quantify it at the > moment. > - A single service plugin also implies (more or less) a common user-facing > APIs. I really don't want to end up in a conditons where the user API looks > different (or the workflow is different) according to what's backing the > neutron BGPVPN implementation > - A single service plugin provides a commonplace for all the boilerplate > management logic. This works for most drivers, but not for those who don't > rely on neutron DB as a data source (unless you manage to build a > sqlalchemy dialect for things such as opencontrail APIs, but I seriously > doubt that it would be feasible) > - Distinct service plugins might lead to different workflows. This is not > necessarily a bad thing, because integration for some backends might need > it. However this means that during review phase particular attention should > be paid to ensure the behaviour of each service plugin respects the API > specification. > > >> >> The reasons why I'm considering this change are : >> >> 1. I'm not sure we would have some use cases where we would be able to >> choose one bgpvpn backend independently from the provider of the core >> plugin (or a mech driver in the ML2 case) and/or the router plugin. >> If one use ODL to manage its core resources, he won't be able to use >> nuage or contrail to manage its bgpvpn connection. >> The bgpvpn project is more about having a common API than having the >> capacity to mix backends. At least for the moment. >> > > I agree with this; but this problem exists regardless of whether you have > a single service plugin with drivers or multiple service plugins. You are > unlikely to be able to use the contrail BGPVPN service plugin is core and > l3 are managed by ODL, I think. > > >> >> 2. I'm also considering that each plugin, which would be backend >> dependent, could declare what features it supports through the use of >> extensions. >> > > Unfortunately extensions are the only way to declare supported > capabilities at the moment. But please - don't end up allowing each service > plugin exposing a different API. > > >> Each plugin would be a "bgpvpn" service type, and would implement the >> bgpvpn extension, but some of them could extend the bgpvpn_connection >> resource with other extensions also hosted in the bgpvpn project. Since >> some backends only support attachment of networks to a bgpvpn_connection, >> others support attachment of routers, and others both attachments, I'm >> considering having an extension for each type of attachment. Then the >> bgpvpn plugin declares what extensions it supports and the end user can act >> accordingly depending on the scan of neutron extensions. >> > > This is not good. It appears that you are forced to leak backend details > to API consumers. Is it possible for you to share more context on why this > is necessary and there's nothing that can be done to avoid it? > > > >> By moving to one plugin per backend, the load of extensions would be done >> by the neutron framework, natively. We won't have to scan each service >> providers to see what extensions it supports, as it is done by the ML2 >> extension manager. >> But I agree that with your workaround, of allowing only one service >> provider, we can easily scan this driver for its extensions. >> > > Indeed. But still, backends like contrail will have to provide their own > service plugin I think. Which might be ok. All the backends which leverage > the neutron DB might use the "driverized" plugin, and the others can supply > their own service plugin. > >> >> >>> As for making a service plugin for each type, I don't see why that >>> wouldn't work. It seems a bit overkill to me though because you'd probably >>> end up having 2 base classes for every service plugin type, one for using >>> the service plugin database and another for the data source of truth being >>> external. Probably a better way to do this, I'm sure I'm oversimplifying. >>> >> You're right, and you're not oversimplifying. With this change, the >> bgpvpn framework will only manage API extensions and the DB layer if >> needed. And we don't want this framework to be complicated, in a first >> step, we just want to have a consistent API for every backends. >> > I don't see much technical reasons why you couldn't do this, though. It's >>> just inconsistent and might cause some confusion. I'd need to spend some >>> time on it to really have an educated opinion. >>> >> The fact that this change will lead to inconsistency between usage of >> each service plugins is a valid point and might be enough to not do it and >> instead limiting the bgpvpn service plugin to be able to only load one >> service driver for the moment. Which is also inconsistent with some other >> service plugins, but probably less. >> >> thanks brandon. >> >> Mathieu >> >> Thanks, >>> Brandon >>> ------------------------------ >>> *From:* Mathieu Rohon <mathieu.ro...@gmail.com> >>> *Sent:* Tuesday, August 18, 2015 7:13 AM >>> *To:* OpenStack Development Mailing List >>> *Subject:* [openstack-dev] [Neutron][bgpvpn] Service Plugin vs Service >>> driver >>> >>> Adding the related subject :) >>> >>> On Tue, Aug 18, 2015 at 10:35 AM, Mathieu Rohon <mathieu.ro...@gmail.com >>> > wrote: >>> >>>> Hi all, >>>> >>>> The current bgpvpn implementation is using the service type framework, >>>> with a service plugin and one or more service providers. >>>> >>>> After registering the bug [1], I wonder if we would rather use a >>>> service plugin per implementation type (bagpipe, ODL, OpenContrail, >>>> Nuage...) which handles API calls, instead of having one service plugin >>>> which forwards API calls to a service driver depending on the provider >>>> chosen by the end user. >>>> >>>> I would like to better understand what would be the main drawbacks of >>>> such a move apart from the fact that a deployment would be tightly coupled >>>> to a bgpvpn plugin, and multiple implementations of the plugin couldn't >>>> coexist. >>>> >>>> Thanks, >>>> >>>> Mathieu >>>> >>>> [1]https://bugs.launchpad.net/bgpvpn/+bug/1485515 >>>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >> >> __________________________________________________________________________ >> OpenStack Development Mailing List (not for usage questions) >> Unsubscribe: >> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> > > __________________________________________________________________________ > OpenStack Development Mailing List (not for usage questions) > Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > >
__________________________________________________________________________ OpenStack Development Mailing List (not for usage questions) Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev