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:
parent
14f336a58e
commit
49039dcd93
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue