[OVN] Add baremetal support with Neutron DHCP agent

This patch now creates OVN "external" ports for Neutron ports with
VNIC_BAREMETAL. This ports will be scheduled on the OpenStack Controller
nodes (or OVN Gateway nodes) and are responsible for replying to the
ARP requests coming from the baremetal nodes.

This patch also disables OVN's built-in DHCP server for VNIC_BAREMETAL
ports. This is because OVN DHCP server does not yet fully support
chainloading from PXE to iPXE, this feature is work-in-progress right
now. A following patch to this one will be sent in the future adding
support for OVN's built-in DHCP server being used with baremetal nodes.

This patch implements the "Part 1" from bug #1971431.

Conflicts:
  neutron/common/ovn/constants.py
  neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py

Partial-bug: #1971431
Change-Id: I6b234fbe1b7c54b41a1b8b430fdf0ac76993af96
Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com>
(cherry picked from commit 243c209eb2)
This commit is contained in:
Lucas Alvares Gomes 2021-04-30 09:42:17 +01:00
parent 4c1d9b2102
commit bca80bfbfb
4 changed files with 16 additions and 3 deletions

View File

@ -299,7 +299,9 @@ MCAST_FLOOD_UNREGISTERED = 'mcast_flood_unregistered'
EXTERNAL_PORT_TYPES = (portbindings.VNIC_DIRECT,
portbindings.VNIC_DIRECT_PHYSICAL,
portbindings.VNIC_MACVTAP)
portbindings.VNIC_MACVTAP,
portbindings.VNIC_BAREMETAL,
)
NEUTRON_AVAILABILITY_ZONES = 'neutron-availability-zones'
OVN_CMS_OPTIONS = 'ovn-cms-options'

View File

@ -159,7 +159,12 @@ def get_lsp_dhcp_opts(port, ip_version):
# in OVN.
lsp_dhcp_disabled = False
lsp_dhcp_opts = {}
if is_network_device_port(port):
vnic_type = port.get(portbindings.VNIC_TYPE, portbindings.VNIC_NORMAL)
# NOTE(lucasagomes): Baremetal does not yet work with OVN's built-in
# DHCP server, disable it for now
if (is_network_device_port(port) or
vnic_type == portbindings.VNIC_BAREMETAL):
lsp_dhcp_disabled = True
else:
mapping = constants.SUPPORTED_DHCP_OPTS_MAPPING[ip_version]

View File

@ -161,7 +161,9 @@ class OVNMechanismDriver(api.MechanismDriver):
self.supported_vnic_types = [portbindings.VNIC_NORMAL,
portbindings.VNIC_DIRECT,
portbindings.VNIC_DIRECT_PHYSICAL,
portbindings.VNIC_MACVTAP]
portbindings.VNIC_MACVTAP,
portbindings.VNIC_BAREMETAL,
]
self.vif_details = {
portbindings.VIF_TYPE_OVS: {
portbindings.CAP_PORT_FILTER: self.sg_enabled,

View File

@ -3321,6 +3321,10 @@ class TestOVNMechanismDriverSecurityGroup(
self._test_create_port_with_vnic_type(
portbindings.VNIC_MACVTAP)
def test_create_port_with_vnic_baremetal(self):
self._test_create_port_with_vnic_type(
portbindings.VNIC_BAREMETAL)
def test_update_port_with_sgs(self):
with self.network() as n, self.subnet(n):
sg1 = self._create_empty_sg('sg1')