Files
ovn-octavia-provider/ovn_octavia_provider/event.py
Fernando Royo 30db5c88ce Capture port deleted event associated to HM ServiceMonitor
When the port associated to a VM is deleted, if a ServiceMonitor
row is associated to that port an OVN SB event is triggered
in order to communicate that the ServiceMonitor entry is been
deleted. That event would allow us to update the status of
member/pool/LB according to the event.

This patch suscribes the driver agent to the DELETE events
for table ServiceMonitor on the OVN SB DB in order to
update the operating_status when the VM port is deleted.

Closes-Bug: #1989460
Change-Id: I9f8c5668c260a896f5c5848734854551c842db1e
2022-09-14 09:01:10 +00:00

89 lines
3.2 KiB
Python

# Copyright 2020 Red Hat, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_log import log as logging
from ovsdbapp.backend.ovs_idl import event as row_event
# TODO(mjozefcz): Start consuming const and utils
# from neutron-lib once released.
from ovn_octavia_provider.common import constants as ovn_const
LOG = logging.getLogger(__name__)
class LogicalRouterPortEvent(row_event.RowEvent):
def __init__(self, driver):
table = 'Logical_Router_Port'
events = (self.ROW_CREATE, self.ROW_DELETE)
super().__init__(events, table, None)
self.event_name = 'LogicalRouterPortEvent'
self.driver = driver
def run(self, event, row, old):
LOG.debug('LogicalRouterPortEvent logged, '
'%(event)s, %(row)s',
{'event': event,
'row': row})
if row.gateway_chassis:
return
if event == self.ROW_CREATE:
self.driver.lb_create_lrp_assoc_handler(row)
elif event == self.ROW_DELETE:
self.driver.lb_delete_lrp_assoc_handler(row)
class LogicalSwitchPortUpdateEvent(row_event.RowEvent):
def __init__(self, driver):
table = 'Logical_Switch_Port'
events = (self.ROW_UPDATE,)
super().__init__(events, table, None)
self.event_name = 'LogicalSwitchPortUpdateEvent'
self.driver = driver
def run(self, event, row, old):
LOG.debug('LogicalSwitchPortUpdateEvent logged, '
'%(event)s, %(row)s',
{'event': event,
'row': row})
# Get the neutron:port_name from external_ids and check if
# it's a vip port or not.
port_name = row.external_ids.get(
ovn_const.OVN_PORT_NAME_EXT_ID_KEY, '')
if port_name.startswith(ovn_const.LB_VIP_PORT_PREFIX):
# Handle port update only for vip ports created by
# this driver.
self.driver.vip_port_update_handler(row)
class ServiceMonitorUpdateEvent(row_event.RowEvent):
def __init__(self, driver):
table = 'Service_Monitor'
events = (self.ROW_UPDATE, self.ROW_DELETE)
super().__init__(events, table, None)
self.event_name = 'ServiceMonitorUpdateEvent'
self.driver = driver
def run(self, event, row, old):
LOG.debug('ServiceMonitorUpdateEvent logged, '
'%(event)s, %(row)s',
{'event': event,
'row': row})
if event == self.ROW_DELETE:
self.driver.hm_update_event_handler(row, sm_delete_event=True)
elif event == self.ROW_UPDATE:
self.driver.hm_update_event_handler(row)