Hi Mathieu, Thanks a lot for your reply.
Even in the neutron/neutron/db/db_base_plugin_v2.py: create_network() passes network object: 911 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#911> *def* create_network <http://www.xrefs.info/neutron-icehouse-3/s?refs=create_network>(self <http://www.xrefs.info/neutron-icehouse-3/s?defs=self>, context <http://www.xrefs.info/neutron-icehouse-3/s?defs=context>, network <http://www.xrefs.info/neutron-icehouse-3/s?defs=network>):912 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#912> """Handle creation of a single network."""913 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#913> # single request processing914 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#914> n = network <http://www.xrefs.info/neutron-icehouse-3/s?defs=network>['network'] *<<<<<<<<==== 'n' has all the network info (including extensions)*915 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#915> # NOTE(jkoelker) Get the tenant_id outside of the session to avoid916 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#916> # unneeded db action if the operation raises917 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#917> tenant_id <http://www.xrefs.info/neutron-icehouse-3/s?defs=tenant_id> = self <http://www.xrefs.info/neutron-icehouse-3/s?defs=self>._get_tenant_id_for_create <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#_get_tenant_id_for_create>(context <http://www.xrefs.info/neutron-icehouse-3/s?defs=context>, n)918 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#918> *with* context <http://www.xrefs.info/neutron-icehouse-3/s?defs=context>.session <http://www.xrefs.info/neutron-icehouse-3/s?defs=session>.begin <http://www.xrefs.info/neutron-icehouse-3/s?defs=begin>(subtransactions <http://www.xrefs.info/neutron-icehouse-3/s?defs=subtransactions>=True <http://www.xrefs.info/neutron-icehouse-3/s?defs=True>):919 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#919> args <http://www.xrefs.info/neutron-icehouse-3/s?defs=args> = {'tenant_id': tenant_id <http://www.xrefs.info/neutron-icehouse-3/s?defs=tenant_id>,920 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#920> 'id': n.get <http://www.xrefs.info/neutron-icehouse-3/s?defs=get>('id') *or* uuidutils <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#uuidutils>.generate_uuid <http://www.xrefs.info/neutron-icehouse-3/s?defs=generate_uuid>(),921 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#921> 'name': n['name'],922 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#922> 'admin_state_up': n['admin_state_up'],923 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#923> 'shared': n['shared'],924 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#924> 'status': n.get <http://www.xrefs.info/neutron-icehouse-3/s?defs=get>('status', constants <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#constants>.NET_STATUS_ACTIVE <http://www.xrefs.info/neutron-icehouse-3/s?defs=NET_STATUS_ACTIVE>)}925 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#925> network <http://www.xrefs.info/neutron-icehouse-3/s?defs=network> = models_v2 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#models_v2>.Network <http://www.xrefs.info/neutron-icehouse-3/s?defs=Network>(**args <http://www.xrefs.info/neutron-icehouse-3/s?defs=args>) <<*= 'network' does not include extensions.*926 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#926> context <http://www.xrefs.info/neutron-icehouse-3/s?defs=context>.session <http://www.xrefs.info/neutron-icehouse-3/s?defs=session>.add <http://www.xrefs.info/neutron-icehouse-3/s?defs=add>(network <http://www.xrefs.info/neutron-icehouse-3/s?defs=network>)927 <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#927> *return* self <http://www.xrefs.info/neutron-icehouse-3/s?defs=self>._make_network_dict <http://www.xrefs.info/neutron-icehouse-3/xref/neutron/db/db_base_plugin_v2.py#_make_network_dict>(network <http://www.xrefs.info/neutron-icehouse-3/s?defs=network>, process_extensions <http://www.xrefs.info/neutron-icehouse-3/s?defs=process_extensions>=False <http://www.xrefs.info/neutron-icehouse-3/s?defs=False>) even if process_extensions set to True, we still have issue. If using original_network, causes confusion can we add a new parameter and use it in mechanism driver? Also haven't received any reply from salvotore. * Another issue with the Ml2Plugin regarding the extensions is that neutron api can fail as it cannot find any handler in the plugin for request such as get/update/create/delete. For instance I added 'config_profile' as an extensions to network resource and get this error. 2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource File "/opt/stack/neutron/neutron/api/v2/base.py", line 273, in index 2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource ret urn self._items(request, True, parent_id) 2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource File *"/opt/stack/neutron/neutron/api/v2/base.py", line 226, in _items* *2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource obj_getter = getattr(self._plugin, self._plugin_handlers[self.LIST])* *2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource AttributeError: 'Ml2Plugin' object has no attribute 'get_config_profiles'* *2014-03-28 12:27:02.495 TRACE resource.py: neutron.api.v2.resource* We need to add either (1) Make Ml2Plugin code aware of such an attribute (e.g. adding another base class, which may not be a good solution) or (2) make the changes in neutron/neutron/api/v2/base.py to understand if Ml2Plugin is supported then get the attributes from mechanism driver. (3) any other idea? I already implemented (2) in my private repo, to fix this error. Also, I have already opened a BP to for supporting extensions in MD, and if it is okay I can include the fix as part of that BP. Thanks, Nader. On Fri, Mar 28, 2014 at 8:22 AM, Mathieu Rohon <mathieu.ro...@gmail.com>wrote: > hi nader, > > I don't think this parameter could be used in this case. As andre said > , tha original-network is usefull for update and delete commands. It > would led to misunderstandings if we use this param in other cases, > and particulary in create commands. > I'm still thinking that the result of super(Ml2Plugin, > self).create_network(context, network), should have network extension > informations[1]. did you talk with salvotore about reverting his > change and using another workaround? > > [1]https://answers.launchpad.net/neutron/+question/245773 > > Mathieu > > On Thu, Mar 27, 2014 at 5:24 PM, Nader Lahouti <nader.laho...@gmail.com> > wrote: > > Hi Andre, > > > > Thans for your reply. > > > > There is no existing network. The scenario is for the first time that we > > create a network with an extension. Consider, a mechanism driver adds an > > attribute (through extensions) to the network resource. When user > creates a > > network, the attribute is set and it is present in the 'network' > parameter, > > when calling create_network() in Ml2Plugin. > > But when create_network_pre/post_commit is called, the attribute won't be > > available to the mechanism driver. Because the attribute is not included > in > > network object passed to MD - as I mentioned in previous email, the > 'result' > > does not have the new attribute. > > > > > > Thanks, > > Nader. > > > > > > > > > > > > > > > > > > On Wed, Mar 26, 2014 at 3:52 PM, Andre Pech <ap...@aristanetworks.com> > > wrote: > >> > >> Hi Nader, > >> > >> When I wrote this, the intention was that original_network only really > >> makes sense during an update_network call (ie when there's an existing > >> network that you are modifying). In a create_network call, the > assumption is > >> that no network exists yet, so there is no "original network" to set. > >> > >> Can you provide a bit more detail on the case where there's an existing > >> network when create_network is called? Sorry, I didn't totally follow > when > >> this would happen. > >> > >> Thanks > >> Andre > >> > >> > >> On Tue, Mar 25, 2014 at 8:45 AM, Nader Lahouti <nader.laho...@gmail.com > > > >> wrote: > >>> > >>> Hi All, > >>> > >>> In the current Ml2Plugin code when 'create_network' is called, as shown > >>> below: > >>> > >>> > >>> > >>> def create_network(self, context, network) > >>> > >>> net_data = network['network'] > >>> > >>> ... > >>> > >>> session = context.session > >>> > >>> with session.begin(subtransactions=True): > >>> > >>> self._ensure_default_security_group(context, tenant_id) > >>> > >>> result = super(Ml2Plugin, self).create_network(context, > >>> network) > >>> > >>> ... > >>> > >>> mech_context = driver_context.NetworkContext(self, context, > >>> result) > >>> > >>> > self.mechanism_manager.create_network_precommit(mech_context) > >>> > >>> ... > >>> > >>> > >>> > >>> the original_network parameter is not set (the default is None) when > >>> instantiating NetworkContext, and as a result the mech_context has > only the > >>> value of network object returned from super(Ml2Plugin, > >>> self).create_network(). > >>> > >>> This causes issue when a mechanism driver needs to use the original > >>> network parameters (given to the create_network), specially when > extension > >>> is used for the network resources. > >>> > >>> (The 'result' only has the network attributes without extension which > is > >>> used to set the '_network' in the NetwrokContext object). > >>> > >>> Even using extension function registration using > >>> > >>> db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(...) > won't > >>> help as the network object that is passed to the registered function > does > >>> not include the extension parameters. > >>> > >>> > >>> Is there any reason that the original_network is not set when > >>> initializing the NetworkContext? Would that cause any issue to set it > to > >>> 'net_data' so that any mechanism driver can use original network > parameters > >>> as they are available when create_network is called? > >>> > >>> > >>> Appreciate your comments. > >>> > >>> > >>> Thanks, > >>> > >>> Nader. > >>> > >>> > >>> > >>> > >>> > >>> _______________________________________________ > >>> OpenStack-dev mailing list > >>> OpenStack-dev@lists.openstack.org > >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > >>> > >> > >> > >> _______________________________________________ > >> OpenStack-dev mailing list > >> OpenStack-dev@lists.openstack.org > >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > >> > > > > > > _______________________________________________ > > OpenStack-dev mailing list > > OpenStack-dev@lists.openstack.org > > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > > > > _______________________________________________ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >
_______________________________________________ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev