← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1615128] [NEW] Custom binding:profile values not coming through

 

Public bug reported:

1) Create a port with custom binding:profile values, e.g.:

$ neutron port-create --vnic-type direct  ab85306c-0861-4ef0-b127-1bedc8fc94f3 -- --binding:profile type=dict vnic_required_vfs=3,capacity=0.06
Created a new port:
+-----------------------+------------------------------------------------------------------------------------+
| Field                 | Value                                                                              |
+-----------------------+------------------------------------------------------------------------------------+
| admin_state_up        | True                                                                               |
| allowed_address_pairs |                                                                                    |
| binding:host_id       |                                                                                    |
| binding:profile       | {"vnic_required_vfs": "3", "capacity": "0.06"}                                     |
| binding:vif_details   | {}                                                                                 |
| binding:vif_type      | unbound                                                                            |
| binding:vnic_type     | direct                                                                             |
| created_at            | 2016-08-19T17:04:01                                                                |
| description           |                                                                                    |
| device_id             |                                                                                    |
| device_owner          |                                                                                    |
| extra_dhcp_opts       |                                                                                    |
| fixed_ips             | {"subnet_id": "47171599-7a0d-480a-82c7-adf8f58ecf52", "ip_address": "172.24.4.12"} |
|                       | {"subnet_id": "ddc562b9-65c3-48fe-8b3e-20ac98630375", "ip_address": "2001:db8::d"} |
| id                    | ff17dcab-bbf7-44f4-8f65-0e7dc32b611b                                               |
| mac_address           | fa:16:3e:4f:4b:d0                                                                  |
| name                  |                                                                                    |
| network_id            | ab85306c-0861-4ef0-b127-1bedc8fc94f3                                               |
| port_security_enabled | True                                                                               |
| revision              | 5                                                                                  |
| security_groups       | 98413527-6c85-4c16-8fe9-da0f3fdcaa97                                               |
| status                | DOWN                                                                               |
| tenant_id             | aac7c974992c44b7aaf4ecf6049c2165                                                   |
| updated_at            | 2016-08-19T17:06:17                                                                |
+-----------------------+------------------------------------------------------------------------------------+

2) Boot an instance with that port, e.g.

$ nova boot --flavor 1 --image  58bc4e42-0189-4f4b-bdff-dfe7fcabf414
efried1 --nic port-id=ff17dcab-bbf7-44f4-8f65-0e7dc32b611b

3) The mechanism driver, accessing the binding:profile via:

profile = context.current.get(portbindings.PROFILE, {})

...cannot see the custom values.

==============================

I believe the reason lies here:
https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L310-L319

310        if attrs and portbindings.PROFILE in attrs:
311            profile = attrs.get(portbindings.PROFILE) or {}
312
313        if profile not in (None, const.ATTR_NOT_SPECIFIED,
314                           self._get_profile(binding)):
315            binding.profile = jsonutils.dumps(profile)
316            if len(binding.profile) > models.BINDING_PROFILE_LEN:
317                msg = _("binding:profile value too large")
318                raise exc.InvalidInput(error_message=msg)
319            changes = True

Stepping through the mech driver, binding.profile contains the custom
values:

(Pdb) pp binding.profile
u'{"vnic_required_vfs": "3", "capacity": "0.06"}'

But attrs does not:

(Pdb) pp attrs['binding:profile']
{u'pci_slot': u'*:*:*.*',
 u'pci_vendor_info': u'*:*',
 u'physical_network': u'default'}

At this point, the condition on lines 313-4 succeds, and binding.profile
is overwritten with the contents of attrs['binding:profile']

=============================

Proposal is to *combine* the two dicts in this scenario, so the
resulting binding.profile will in fact contain:

{u'pci_slot': u'*:*:*.*',
 u'pci_vendor_info': u'*:*',
 u'physical_network': u'default',
 u'vnic_required_vfs': u'3', 'capacity': u'0.06'}

** Affects: neutron
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/1615128

Title:
  Custom binding:profile values not coming through

Status in neutron:
  New

Bug description:
  1) Create a port with custom binding:profile values, e.g.:

  $ neutron port-create --vnic-type direct  ab85306c-0861-4ef0-b127-1bedc8fc94f3 -- --binding:profile type=dict vnic_required_vfs=3,capacity=0.06
  Created a new port:
  +-----------------------+------------------------------------------------------------------------------------+
  | Field                 | Value                                                                              |
  +-----------------------+------------------------------------------------------------------------------------+
  | admin_state_up        | True                                                                               |
  | allowed_address_pairs |                                                                                    |
  | binding:host_id       |                                                                                    |
  | binding:profile       | {"vnic_required_vfs": "3", "capacity": "0.06"}                                     |
  | binding:vif_details   | {}                                                                                 |
  | binding:vif_type      | unbound                                                                            |
  | binding:vnic_type     | direct                                                                             |
  | created_at            | 2016-08-19T17:04:01                                                                |
  | description           |                                                                                    |
  | device_id             |                                                                                    |
  | device_owner          |                                                                                    |
  | extra_dhcp_opts       |                                                                                    |
  | fixed_ips             | {"subnet_id": "47171599-7a0d-480a-82c7-adf8f58ecf52", "ip_address": "172.24.4.12"} |
  |                       | {"subnet_id": "ddc562b9-65c3-48fe-8b3e-20ac98630375", "ip_address": "2001:db8::d"} |
  | id                    | ff17dcab-bbf7-44f4-8f65-0e7dc32b611b                                               |
  | mac_address           | fa:16:3e:4f:4b:d0                                                                  |
  | name                  |                                                                                    |
  | network_id            | ab85306c-0861-4ef0-b127-1bedc8fc94f3                                               |
  | port_security_enabled | True                                                                               |
  | revision              | 5                                                                                  |
  | security_groups       | 98413527-6c85-4c16-8fe9-da0f3fdcaa97                                               |
  | status                | DOWN                                                                               |
  | tenant_id             | aac7c974992c44b7aaf4ecf6049c2165                                                   |
  | updated_at            | 2016-08-19T17:06:17                                                                |
  +-----------------------+------------------------------------------------------------------------------------+

  2) Boot an instance with that port, e.g.

  $ nova boot --flavor 1 --image  58bc4e42-0189-4f4b-bdff-dfe7fcabf414
  efried1 --nic port-id=ff17dcab-bbf7-44f4-8f65-0e7dc32b611b

  3) The mechanism driver, accessing the binding:profile via:

  profile = context.current.get(portbindings.PROFILE, {})

  ...cannot see the custom values.

  ==============================

  I believe the reason lies here:
  https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L310-L319

  310        if attrs and portbindings.PROFILE in attrs:
  311            profile = attrs.get(portbindings.PROFILE) or {}
  312
  313        if profile not in (None, const.ATTR_NOT_SPECIFIED,
  314                           self._get_profile(binding)):
  315            binding.profile = jsonutils.dumps(profile)
  316            if len(binding.profile) > models.BINDING_PROFILE_LEN:
  317                msg = _("binding:profile value too large")
  318                raise exc.InvalidInput(error_message=msg)
  319            changes = True

  Stepping through the mech driver, binding.profile contains the custom
  values:

  (Pdb) pp binding.profile
  u'{"vnic_required_vfs": "3", "capacity": "0.06"}'

  But attrs does not:

  (Pdb) pp attrs['binding:profile']
  {u'pci_slot': u'*:*:*.*',
   u'pci_vendor_info': u'*:*',
   u'physical_network': u'default'}

  At this point, the condition on lines 313-4 succeds, and
  binding.profile is overwritten with the contents of
  attrs['binding:profile']

  =============================

  Proposal is to *combine* the two dicts in this scenario, so the
  resulting binding.profile will in fact contain:

  {u'pci_slot': u'*:*:*.*',
   u'pci_vendor_info': u'*:*',
   u'physical_network': u'default',
   u'vnic_required_vfs': u'3', 'capacity': u'0.06'}

To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/1615128/+subscriptions


Follow ups