Ensure sync task exposes all NATed IPs on the cr-lrp ports

This is needed to ensure ovn load balancer FIPs and VIPs on provider
are exposed on sync task, since they gets exposed through the
cr-lrp port

Change-Id: I8febc16f8f3c2d40fadddd53995cd7100e6503cb
This commit is contained in:
Luis Tomas Bolivar 2022-02-11 10:58:54 +01:00
parent 14f336a58e
commit 49039dcd93
2 changed files with 42 additions and 0 deletions

View File

@ -172,6 +172,11 @@ class OVNBGPDriver(driver_api.AgentDriverBase):
for port in ports:
self._ensure_port_exposed(port, exposed_ips, ovn_ip_rules)
cr_lrp_ports = self.sb_idl.get_cr_lrp_ports_on_chassis(self.chassis)
for cr_lrp_port in cr_lrp_ports:
self._ensure_cr_lrp_associated_ports_exposed(
cr_lrp_port, exposed_ips, ovn_ip_rules)
# add missing route/ips for tenant network VMs
if self._expose_tenant_networks:
for cr_lrp_info in self.ovn_local_cr_lrps.values():
@ -195,6 +200,23 @@ class OVNBGPDriver(driver_api.AgentDriverBase):
self.ovn_routing_tables_routes,
extra_routes)
def _ensure_cr_lrp_associated_ports_exposed(self, cr_lrp_port,
exposed_ips, ovn_ip_rules):
ips, patch_port_row = self.sb_idl.get_cr_lrp_nat_addresses_info(
cr_lrp_port)
if not ips:
return
self._expose_ip(ips, patch_port_row, associated_port=cr_lrp_port)
for ip in ips:
ip_version = linux_net.get_ip_version(ip)
if ip_version == constants.IP_VERSION_6:
ip_dst = "{}/128".format(ip)
else:
ip_dst = "{}/32".format(ip)
if ip in exposed_ips:
exposed_ips.remove(ip)
ovn_ip_rules.pop(ip_dst, None)
def _ensure_port_exposed(self, port, exposed_ips, ovn_ip_rules):
if port.type not in constants.OVN_VIF_PORT_TYPES:
return

View File

@ -160,6 +160,26 @@ class OvsdbSbOvnIdl(sb_impl_idl.OvnSbApiIdlImpl, Backend):
rows = self.db_list_rows('Port_Binding').execute(check_error=True)
return [r for r in rows if r.chassis and r.chassis[0].name == chassis]
def get_cr_lrp_ports_on_chassis(self, chassis):
rows = self.db_find_rows(
'Port_Binding',
('type', '=', constants.OVN_CHASSISREDIRECT_VIF_PORT_TYPE)
).execute(check_error=True)
return [r.logical_port for r in rows
if r.chassis and r.chassis[0].name == chassis]
def get_cr_lrp_nat_addresses_info(self, cr_lrp_port_name):
# NOTE: Assuming logical_port format is "cr-lrp-XXXX"
patch_port_name = cr_lrp_port_name.split("cr-lrp-")[1]
patch_port_row = self._get_port_by_name(patch_port_name)
if not patch_port_row:
return [], None
ips = []
for row in patch_port_row.nat_addresses:
nat_ips = row.split(" ")[1:-1]
ips.extend(nat_ips)
return ips, patch_port_row
def get_network_name_and_tag(self, datapath, bridge_mappings):
for row in self.get_ports_on_datapath(
datapath, constants.OVN_LOCALNET_VIF_PORT_TYPE):