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
# (StrOpt) Type of Network Interface to allocate for VM:
# mlnx_direct or hostdev according to libvirt terminology
# vnic_type = mlnx_direct
+# (BoolOpt) Enable server compatibility with old nova
+# apply_profile_patch = False
default=portbindings.VIF_TYPE_MLNX_DIRECT,
help=_("Type of VM network interface: mlnx_direct or "
"hostdev")),
+ cfg.BoolOpt('apply_profile_patch',
+ default=False,
+ help=_("Enable server compatibility with old nova ")),
]
from neutron.common import constants
from neutron.extensions import portbindings
+from neutron.openstack.common import jsonutils
from neutron.openstack.common import log
from neutron.plugins.ml2 import driver_api as api
from neutron.plugins.ml2.drivers import mech_agent
cfg.CONF.ESWITCH.vnic_type,
{portbindings.CAP_PORT_FILTER: False},
portbindings.VNIC_TYPES)
+ self.update_profile = cfg.CONF.ESWITCH.apply_profile_patch
def check_segment_for_agent(self, segment, agent):
mappings = agent['configurations'].get('interface_mappings', {})
context.set_binding(segment[api.ID],
vif_type,
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):
if requested_vnic_type == portbindings.VNIC_MACVTAP:
# License for the specific language governing permissions and limitations
# under the License.
+
+import mock
+from oslo.config import cfg
+
from neutron.common import constants
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.tests.unit.ml2 import _test_mech_agent as base
def test_vnic_type_normal(self):
self._check_vif_type_for_vnic_type(portbindings.VNIC_NORMAL,
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)