Don't validate local_link_connection when port has client-id

Infiniband ports do not require the local_link_connection field to be
populated as the network topology is discoverable by the Infiniband
Subnet Manager.

This change removes the requirement for local_link_connection for
Infiniband ports. Infiniband ports have a client-id in their extra
field.

Closes-Bug: #1753222
Change-Id: I2bfac4ccaf825bd9aa8ea0d2b447fcd7767acbc5
This commit is contained in:
Moshe Levi 2018-02-27 21:09:14 +02:00 committed by Mark Goddard
parent 46ee76aa46
commit dcebb77d9d
3 changed files with 40 additions and 0 deletions

View File

@ -453,6 +453,12 @@ def validate_port_info(node, port):
:param port: Ironic port object. :param port: Ironic port object.
:returns: True if port info is valid, False otherwise. :returns: True if port info is valid, False otherwise.
""" """
# Note(moshele): client-id in the port extra field indicates an InfiniBand
# port. In this case we don't require local_link_connection to be
# populated because the network topology is discoverable by the Infiniband
# Subnet Manager.
if port.extra.get('client-id'):
return True
if (node.network_interface == 'neutron' and if (node.network_interface == 'neutron' and
not port.local_link_connection): not port.local_link_connection):
LOG.warning("The local_link_connection is required for " LOG.warning("The local_link_connection is required for "

View File

@ -528,6 +528,33 @@ class TestNeutronNetworkActions(db_base.DbTestCase):
self.assertTrue(res) self.assertTrue(res)
self.assertFalse(log_mock.warning.called) self.assertFalse(log_mock.warning.called)
@mock.patch.object(neutron, 'LOG', autospec=True)
def test_validate_port_info_flat_interface_with_client_id(self, log_mock):
self.node.network_interface = 'flat'
self.node.save()
llc = {}
port = object_utils.create_test_port(
self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(),
address='52:54:00:cf:2d:33', local_link_connection=llc,
extra={'client-id': self._CLIENT_ID})
res = neutron.validate_port_info(self.node, port)
self.assertTrue(res)
self.assertFalse(log_mock.warning.called)
@mock.patch.object(neutron, 'LOG', autospec=True)
def test_validate_port_info_neutron_interface_with_client_id(
self, log_mock):
self.node.network_interface = 'neutron'
self.node.save()
llc = {}
port = object_utils.create_test_port(
self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(),
address='52:54:00:cf:2d:33', local_link_connection=llc,
extra={'client-id': self._CLIENT_ID})
res = neutron.validate_port_info(self.node, port)
self.assertTrue(res)
self.assertFalse(log_mock.warning.called)
@mock.patch.object(neutron, 'get_client', autospec=True) @mock.patch.object(neutron, 'get_client', autospec=True)
class TestValidateNetwork(base.TestCase): class TestValidateNetwork(base.TestCase):

View File

@ -0,0 +1,7 @@
---
fixes:
- |
Fixes an issue with validation of Infiniband ports. Infiniband ports do not
require the ``local_link_connection`` field to be populated as the network
topology is discoverable by the Infiniband Subnet Manager. See `bug 1753222
<https://launchpad.net/bugs/1753222>`_ for details.