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:
parent
3d6d2f5e99
commit
4a3a1bd2a2
@ -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
|
||||||
|
@ -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 ")),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user