Add update binding:profile with physical_network

Add temporary solution in order to support multiple physical networks
by mlnx ML2 MechanismDriver.
Due to non merged patches in nova that should support propagating
physical_network retrieved from port binding:profile attribute
to VIF/Network object.
The code will be removed once relevant nova patches are merged.
The code is disabled by default and should be enabled via
ml2_conf_mlnx.ini config file.

Change-Id: I815f9e28774efd47bccd1c57481e6ba89075792b
Closes-bug: #1291209
This commit is contained in:
Irena Berezovsky 2014-03-18 16:35:35 +02:00
parent 3d6d2f5e99
commit 4a3a1bd2a2
4 changed files with 43 additions and 0 deletions

View File

@ -2,3 +2,5 @@
# (StrOpt) Type of Network Interface to allocate for VM: # (StrOpt) Type of Network Interface to allocate for VM:
# mlnx_direct or hostdev according to libvirt terminology # mlnx_direct or hostdev according to libvirt terminology
# vnic_type = mlnx_direct # vnic_type = mlnx_direct
# (BoolOpt) Enable server compatibility with old nova
# apply_profile_patch = False

View File

@ -23,6 +23,9 @@ eswitch_opts = [
default=portbindings.VIF_TYPE_MLNX_DIRECT, default=portbindings.VIF_TYPE_MLNX_DIRECT,
help=_("Type of VM network interface: mlnx_direct or " help=_("Type of VM network interface: mlnx_direct or "
"hostdev")), "hostdev")),
cfg.BoolOpt('apply_profile_patch',
default=False,
help=_("Enable server compatibility with old nova ")),
] ]

View File

@ -18,6 +18,7 @@ from oslo.config import cfg
from neutron.common import constants from neutron.common import constants
from neutron.extensions import portbindings from neutron.extensions import portbindings
from neutron.openstack.common import jsonutils
from neutron.openstack.common import log from neutron.openstack.common import log
from neutron.plugins.ml2 import driver_api as api from neutron.plugins.ml2 import driver_api as api
from neutron.plugins.ml2.drivers import mech_agent from neutron.plugins.ml2.drivers import mech_agent
@ -48,6 +49,7 @@ class MlnxMechanismDriver(mech_agent.SimpleAgentMechanismDriverBase):
cfg.CONF.ESWITCH.vnic_type, cfg.CONF.ESWITCH.vnic_type,
{portbindings.CAP_PORT_FILTER: False}, {portbindings.CAP_PORT_FILTER: False},
portbindings.VNIC_TYPES) portbindings.VNIC_TYPES)
self.update_profile = cfg.CONF.ESWITCH.apply_profile_patch
def check_segment_for_agent(self, segment, agent): def check_segment_for_agent(self, segment, agent):
mappings = agent['configurations'].get('interface_mappings', {}) mappings = agent['configurations'].get('interface_mappings', {})
@ -70,6 +72,13 @@ class MlnxMechanismDriver(mech_agent.SimpleAgentMechanismDriverBase):
context.set_binding(segment[api.ID], context.set_binding(segment[api.ID],
vif_type, vif_type,
self.vif_details) self.vif_details)
# REVISIT(irenab): Temporary solution till nova support
# will be merged for physical_network propagation
# via VIF object to VIFDriver (required by mlnx vif plugging).
if self.update_profile:
profile = {'physical_network':
segment['physical_network']}
context._binding.profile = jsonutils.dumps(profile)
def _get_vif_type(self, requested_vnic_type): def _get_vif_type(self, requested_vnic_type):
if requested_vnic_type == portbindings.VNIC_MACVTAP: if requested_vnic_type == portbindings.VNIC_MACVTAP:

View File

@ -13,8 +13,13 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import mock
from oslo.config import cfg
from neutron.common import constants from neutron.common import constants
from neutron.extensions import portbindings from neutron.extensions import portbindings
from neutron.plugins.ml2 import driver_api as api
from neutron.plugins.ml2.drivers.mlnx import mech_mlnx from neutron.plugins.ml2.drivers.mlnx import mech_mlnx
from neutron.tests.unit.ml2 import _test_mech_agent as base from neutron.tests.unit.ml2 import _test_mech_agent as base
@ -87,3 +92,27 @@ class MlnxMechanismVnicTypeTestCase(MlnxMechanismBaseTestCase,
def test_vnic_type_normal(self): def test_vnic_type_normal(self):
self._check_vif_type_for_vnic_type(portbindings.VNIC_NORMAL, self._check_vif_type_for_vnic_type(portbindings.VNIC_NORMAL,
self.VIF_TYPE) self.VIF_TYPE)
class MlnxMechanismProfileTestCase(MlnxMechanismBaseTestCase):
def setUp(self):
cfg.CONF.set_override('apply_profile_patch', True, 'ESWITCH')
super(MlnxMechanismProfileTestCase, self).setUp()
def test_profile_contains_physical_net(self):
VLAN_SEGMENTS = [{api.ID: 'vlan_segment_id',
api.NETWORK_TYPE: 'vlan',
api.PHYSICAL_NETWORK: 'fake_physical_network',
api.SEGMENTATION_ID: 1234}]
context = base.FakePortContext(self.AGENT_TYPE,
self.AGENTS,
VLAN_SEGMENTS,
portbindings.VNIC_DIRECT)
context._binding = mock.Mock()
context._binding.profile = {}
segment = VLAN_SEGMENTS[0]
agent = self.AGENTS[0]
self.driver.try_to_bind_segment_for_agent(context, segment, agent)
self.assertEqual('{"physical_network": "fake_physical_network"}',
context._binding.profile)