[openstack-dev] [Neutron][ML2][Ml2Plugin] Setting _original_network in NetworkContext:

Mohammad Banikazemi mb at us.ibm.com
Fri Apr 4 02:49:36 UTC 2014


Nader,

During the last ML2 IRC weekly meeting [1] having per-MD extensions was
mentioned. This is an important topic in my opinion. You may want to add a
proposal for a design session on this topic at [2] and/or add this topic to
the agenda for the next ML2 weekly meeting [3] for further discussion.

Mohammad

[1]
http://eavesdrop.openstack.org/meetings/networking_ml2/2014/networking_ml2.2014-04-02-16.00.log.html

[2] http://summit.openstack.org
[3] https://wiki.openstack.org/wiki/Meetings/ML2



From:	Nader Lahouti <nader.lahouti at gmail.com>
To:	"OpenStack Development Mailing List (not for usage questions)"
            <openstack-dev at lists.openstack.org>, Andre Pech
            <apech at aristanetworks.com>,
Date:	04/03/2014 01:16 PM
Subject:	Re: [openstack-dev] [Neutron][ML2][Ml2Plugin] Setting
            _original_network in NetworkContext:



Thanks a lot Andre for the reply.
My comments inline:

On Wed, Apr 2, 2014 at 12:37 PM, Andre Pech <apech at aristanetworks.com>
wrote:



  On Fri, Mar 28, 2014 at 6:44 PM, Nader Lahouti <nader.lahouti at gmail.com>
  wrote:
   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    def create_network(self, context, network):
   912        """Handle creation of a single network."""
   913        # single request processing
   914        n = network['network']       <<<<<<<<==== 'n' has all the
   network info (including extensions)
   915        # NOTE(jkoelker) Get the tenant_id outside of the session to
   avoid
   916        #                unneeded db action if the operation raises
   917        tenant_id = self._get_tenant_id_for_create(context, n)
   918        with context.session.begin(subtransactions=True):
   919            args = {'tenant_id': tenant_id,
   920                    'id': n.get('id') or uuidutils.generate_uuid(),
   921                    'name': n['name'],
   922                    'admin_state_up': n['admin_state_up'],
   923                    'shared': n['shared'],
   924                    'status': n.get('status', constants.
   NET_STATUS_ACTIVE)}
   925            network = models_v2.Network(**args)  <<= 'network' does
   not include extensions.
   926            context.session.add(network)
   927        return self._make_network_dict(network, process_extensions=
   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.

  Yes, not re-using original_network would be my preference.


Will add new parameter to avoid re-using original_network.


   * 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.

  Yes, we don't really have great support for extensions today, so fixing
  this in the context of making extensions work in general with ML2 and
  MechanismDrivers, this sounds great.

  Thanks for taking this on,

Sure. Will add it as part of
https://blueprints.launchpad.net/neutron/+spec/neutron-ml2-mechanismdriver-extensions

Thanks,
Nader.



  Andre



   Thanks,
   Nader.



   On Fri, Mar 28, 2014 at 8:22 AM, Mathieu Rohon <mathieu.rohon at 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.lahouti at 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 <
     apech at 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.lahouti at 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 at lists.openstack.org
     >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
     >>>
     >>
     >>
     >> _______________________________________________
     >> OpenStack-dev mailing list
     >> OpenStack-dev at lists.openstack.org
     >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
     >>
     >
     >
     > _______________________________________________
     > OpenStack-dev mailing list
     > OpenStack-dev at lists.openstack.org
     > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
     >

     _______________________________________________
     OpenStack-dev mailing list
     OpenStack-dev at lists.openstack.org
     http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev


   _______________________________________________
   OpenStack-dev mailing list
   OpenStack-dev at lists.openstack.org
   http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev



  _______________________________________________
  OpenStack-dev mailing list
  OpenStack-dev at lists.openstack.org
  http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

_______________________________________________
OpenStack-dev mailing list
OpenStack-dev at lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20140403/34fca145/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20140403/34fca145/attachment.gif>


More information about the OpenStack-dev mailing list