Hi Rajaram,
I'm working on Cisco's API extensions by using the extension framework and have some questions. Hope to get your help. 1. If our plug-in requires multiple extensions, we just need to list all of those aliases in supports_extension() function in the plug-in, right? 2. Through "/v0.1/extensions", I can see the list of available extensions. But, when I tried to access new resources, it fails with either "/v0.1/extensions/tenants/tenantuser/portprofiles" or "/v0.1/extensions/portprofiles". As we set up parent_resources "tenants" in portprofile extension, I assume the first URI should be the one we used to access portprofile resources. Did I miss something here? Best, Ying From: Rajaram Mallya [mailto:rajarammal...@gmail.com] Sent: Wednesday, July 20, 2011 10:56 AM To: Ying Liu (yinliu2) Cc: Dan Wendlandt; Somik Behera; Troy; Salvatore Orlando; Brad Hall; Ram Durairaj (radurair); jorge.willi...@rackspace.com; rax_network_service; netstack@lists.launchpad.net Subject: Re: Extensions and Plugins Hi Ying, We looked at your branch at https://code.launchpad.net/~cisco-openstack/quantum/plugin-framework <https://code.launchpad.net/~cisco-openstack/quantum/plugin-framework> . The extension code in this branch can be easily incorporated in the extension framework we are proposing. Just for demo purposes, we put your portprofile extensions into our extension framework :-). You can see this working at lp:~raxnetworking/quantum/cisco_api_extension. The main "extensions" folder in this branch has your portprofiles extension code. Here the cisco plugin advertises that it supports the cisco portprofiles extension by implementing a method called "supports_extension". This has the advantage, as Dan mentions below, of ensuring that the plugin-specific cisco portprofile extension is loaded only if the cisco plugin is enabled. We still need some work around the framework before we raise a merge prop, but this should hopefully remove the confusion around how you can use the extension framework for plugin specific extensions. Thanks, Rajaram On Wed, Jul 20, 2011 at 4:34 AM, Dan Wendlandt <d...@nicira.com> wrote: Adding main netstack list (now that we have it) to kick-off this discussion again. Ying, the ability for a plugin at registration time to inform the API layer of a plugin-specific API extension is definitely something I see as critical. This API extension should be implemented by the plugin, giving plugins a way to expose user control over a capability that only that plugin implements. At a hight-level, I think of it as: 1) framework starts up, reads config, and loads plugin 2) framework asks plugin what extensions that plugin will the implement. 3) plugin provides info about each extension it supports, as well as the method to call (if needed) to handle calls to that API extension (e.g., if a new API method is introduced). This list of extension info could refer to "standard" extensions (i.e. those implemented by multiple extensions) or "plugin-specific" extensions (i.e., those only implemented by the plugin itself). The only difference, I suspect, would be where the python class(es) that define the extension are placed in the directory structure. It would be helpful for me to understand if this is the same capability you are looking for, or if not, what additional capabilities you think we need. Dan On Wed, Jul 13, 2011 at 1:50 PM, Ying Liu (yinliu2) <yinl...@cisco.com> wrote: Hi Rajaram and all, Thanks for the great work on extension framework. Per my understanding, the standard extension mechanism is dealing with pure API extensions. (Please correct me if I missed something.) By "pure" API extension, I mean 1. All the extensions just function within web service layer. 2. Application P adds extended APIs. Those extended APIs are only used within P's scope. I agree current extension mechanism is needed for above scenarios. However, as discussed earlier, our use case is little different. We need tightly coupled plug-in and API (service) extension. That is, when a new plug-in is developed, we define some functionalities and resources which are not part of quantum core. We need to expose those new resources and actions to users through extended REST services. Plus, those extended web services become part of quantum services. Any user application can use them with proper URL. Therefore, we need a different approach for such tightly coupled extensions. With current single plug-in quantum framework, the approach we took is directly adding new controllers for plug-in's extended resources and actions. When we plug new plug-in into quantum, we anyway need to restart quantum service. At that time, we deploy new controllers. Currently, we use this approach to add extended REST services for our plug-ins. We will check in code these two days into our branch and will send a separate email for community's review. If you have any questions, please let us know. Thanks, Ying From: Rajaram Mallya [mailto:rajarammal...@gmail.com] Sent: Wednesday, July 13, 2011 9:52 AM To: Somik Behera Cc: Dan Wendlandt; Troy; Ying Liu (yinliu2); Salvatore Orlando; Brad Hall; Ram Durairaj (radurair); jorge.willi...@rackspace.com; rax_network_service Subject: Re:Extensions and Plugins Hi Somik, Thanks for the comments. Agreed that the Use Case 2 mechanism also takes care of Use Case 1. The only reason we had the Use Case 1 mechanism was to make it more convenient for plugin developers/deployers to have the plugin code and related extensions all in one place. But I guess the usefulness of this may not be that great when compared to the complexity of having to understand two different ways to implement extensions. We can go ahead with only the standard extensions mechanism for now. If the Use Case 1 mechanism is deemed necessary, we can still implement it without causing compatibility problems for private extensions that might already be present at that time. Thanks, Rajaram On Tue, Jul 12, 2011 at 9:52 PM, Somik Behera <so...@nicira.com> wrote: Hi Rajaram et. al., Thanks for the work so our and the continuing work on extensions with a "plugin" mechanism. I agree with your use cases elucidated below that cover the requirements I would ask for our extensibility story to address. The one thing that I am not sure is required or I am just not clear on is if we require 2 separate implementation mechanisms. If we just have the mechanism of standard extensions as described in Use Case 2, I believe that would enable anybody to write private extensions as long as the extension plugin packager deploys the extension plugin into the correct "well known" location. With that said, I think if we have 2 separate mechanisms, I am fine with that too. Something in the implementation step that is implicit but I would like to restate explicitly is: - "Extensions" as mentioned in both use cases refer to API extensions only. - A single plugin can implement many "extension" functionality and we will have multiple ways for the plugin to advertise which "extensions" it is implementing. Otherwise, I think this proposal is good. We should customize the sample extension that extends everything that is "extensible" and illustrates that using an implementation of both use cases. That would be a very big step forward in enabling the eco-system to start adding functionality into Quantum. Thanks, Somik On Thu, Jul 7, 2011 at 10:09 AM, Rajaram Mallya <rajarammal...@gmail.com> wrote: Hi all, As of right now, the extension code we ported from nova has a few limitations when it comes to plugins. These limitations should probably be addressed before we merge the extension framework into quantum. Based on the mails exchanged so far on this we see two distinct use cases for Plugin-Extensions interaction. (This is excluding the feature of dynamically adding extensions, which could be a separate discussion in itself.) 1.Use Case: A plugin could have special extensions that it doesnt share with other plugins. Implementation: Plugin will contain the extensions within its plugin directory in a well know subfolder. The extension framework can find out which plugin is currently loaded and load the plugins extension subfolder. 2. Use Case : There are well known standard extensions that a plugin might want to support. Here the APIs of the extension are standardized, but a plugin need not support some/any of the extensions. Implementation: Standard extensions exist in a configurable path. Each standard extension defines an interface (an abstract python class like QuantumPluginBase). The plugin will advertise which extensions it supports. The extension framework will make a compatibility check to see if the plugin has implemented the interface methods required for the std. extension. Please let us know other possible use cases that you see or alternative ideas around implementing them. When we implement this, we can have unit test cases that double up as usage examples to make extension usage clear to plugin implementors. Most of the features for extensions from Jorge's presentation are possible with the current extension framework. Some of them like such as extension headers, response extensions etc are less obvious in the framework. We are currently reshaping the unit tests around these to clearly demonstrate how these extensions can be implemented. We see only mime type extensions and Vendor id registries missing from the current extensions framework. Not sure how important these two things are right now from quantum's point of view. Based on Somik's inputs, with a README, the unit tests and some sample extensions that implement the features that the extension framework supports, I suppose we can make it fairly easy for people to implement extensions. Thanks, Rajaram -- Somik Behera | Nicira Networks, Inc. | so...@nicira.com <mailto:sbeh...@nicira.com> | office: 650-390-6790 | cell: 512-577-6645 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dan Wendlandt Nicira Networks, Inc. www.nicira.com | www.openvswitch.org Sr. Product Manager cell: 650-906-2650 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Mailing list: https://launchpad.net/~netstack Post to : netstack@lists.launchpad.net Unsubscribe : https://launchpad.net/~netstack More help : https://help.launchpad.net/ListHelp