Add wait event for ovn agents (bgp/evpn) sb_idl
Fix issue with 'OVNXXXAgent' object has no attribute 'sb_idl' Change-Id: Id224a905a4d5fa63771bff325896c71df4bace54
This commit is contained in:
parent
11fc255365
commit
5b08453191
|
@ -15,6 +15,7 @@
|
||||||
import collections
|
import collections
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import pyroute2
|
import pyroute2
|
||||||
|
import threading
|
||||||
|
|
||||||
from oslo_concurrency import lockutils
|
from oslo_concurrency import lockutils
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
@ -49,6 +50,25 @@ class OVNBGPDriver(driver_api.AgentDriverBase):
|
||||||
# {'br-ex': [route1, route2]}
|
# {'br-ex': [route1, route2]}
|
||||||
self.ovn_routing_tables_routes = collections.defaultdict()
|
self.ovn_routing_tables_routes = collections.defaultdict()
|
||||||
|
|
||||||
|
self._sb_idl = None
|
||||||
|
self._post_fork_event = threading.Event()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sb_idl(self):
|
||||||
|
if not self._sb_idl:
|
||||||
|
self._post_fork_event.wait()
|
||||||
|
return self._sb_idl
|
||||||
|
|
||||||
|
@sb_idl.setter
|
||||||
|
def sb_idl(self, val):
|
||||||
|
self._sb_idl = val
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
# Ensure FRR is configure to leak the routes
|
||||||
|
# NOTE: If we want to recheck this every X time, we should move it
|
||||||
|
# inside the sync function instead
|
||||||
|
frr.vrf_leak(constants.OVN_BGP_VRF, CONF.bgp_AS, CONF.bgp_router_id)
|
||||||
|
|
||||||
self.ovs_idl = ovs.OvsIdl()
|
self.ovs_idl = ovs.OvsIdl()
|
||||||
self.ovs_idl.start(constants.OVS_CONNECTION_STRING)
|
self.ovs_idl.start(constants.OVS_CONNECTION_STRING)
|
||||||
self.chassis = self.ovs_idl.get_own_chassis_name()
|
self.chassis = self.ovs_idl.get_own_chassis_name()
|
||||||
|
@ -60,31 +80,25 @@ class OVNBGPDriver(driver_api.AgentDriverBase):
|
||||||
event_class = getattr(watcher, event)
|
event_class = getattr(watcher, event)
|
||||||
events += (event_class(self),)
|
events += (event_class(self),)
|
||||||
|
|
||||||
|
self._post_fork_event.clear()
|
||||||
# TODO(lucasagomes): The OVN package in the ubuntu LTS is old
|
# TODO(lucasagomes): The OVN package in the ubuntu LTS is old
|
||||||
# and does not support Chassis_Private. Once the package is updated
|
# and does not support Chassis_Private. Once the package is updated
|
||||||
# we can remove this fallback mode.
|
# we can remove this fallback mode.
|
||||||
try:
|
try:
|
||||||
self._sb_idl = ovn.OvnSbIdl(
|
self.sb_idl = ovn.OvnSbIdl(
|
||||||
self.ovn_remote,
|
self.ovn_remote,
|
||||||
chassis=self.chassis,
|
chassis=self.chassis,
|
||||||
tables=OVN_TABLES + ["Chassis_Private"],
|
tables=OVN_TABLES + ["Chassis_Private"],
|
||||||
events=events)
|
events=events).start()
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
self._sb_idl = ovn.OvnSbIdl(
|
self.sb_idl = ovn.OvnSbIdl(
|
||||||
self.ovn_remote,
|
self.ovn_remote,
|
||||||
chassis=self.chassis,
|
chassis=self.chassis,
|
||||||
tables=OVN_TABLES,
|
tables=OVN_TABLES,
|
||||||
events=events)
|
events=events).start()
|
||||||
|
|
||||||
def start(self):
|
# Now IDL connections can be safely used
|
||||||
# Ensure FRR is configure to leak the routes
|
self._post_fork_event.set()
|
||||||
# NOTE: If we want to recheck this every X time, we should move it
|
|
||||||
# inside the sync function instead
|
|
||||||
frr.vrf_leak(constants.OVN_BGP_VRF, CONF.bgp_AS, CONF.bgp_router_id)
|
|
||||||
|
|
||||||
# start the subscriptions to the OSP events. This ensures the watcher
|
|
||||||
# calls the relevant driver methods upon registered events
|
|
||||||
self.sb_idl = self._sb_idl.start()
|
|
||||||
|
|
||||||
def _get_events(self):
|
def _get_events(self):
|
||||||
events = set(["PortBindingChassisCreatedEvent",
|
events = set(["PortBindingChassisCreatedEvent",
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
import ipaddress
|
import ipaddress
|
||||||
|
import threading
|
||||||
|
|
||||||
from oslo_concurrency import lockutils
|
from oslo_concurrency import lockutils
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
@ -50,6 +51,20 @@ class OVNEVPNDriver(driver_api.AgentDriverBase):
|
||||||
self._ovn_routing_tables_routes = collections.defaultdict()
|
self._ovn_routing_tables_routes = collections.defaultdict()
|
||||||
self._ovn_exposed_evpn_ips = collections.defaultdict()
|
self._ovn_exposed_evpn_ips = collections.defaultdict()
|
||||||
|
|
||||||
|
self._sb_idl = None
|
||||||
|
self._post_fork_event = threading.Event()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sb_idl(self):
|
||||||
|
if not self._sb_idl:
|
||||||
|
self._post_fork_event.wait()
|
||||||
|
return self._sb_idl
|
||||||
|
|
||||||
|
@sb_idl.setter
|
||||||
|
def sb_idl(self, val):
|
||||||
|
self._sb_idl = val
|
||||||
|
|
||||||
|
def start(self):
|
||||||
self.ovs_idl = ovs.OvsIdl()
|
self.ovs_idl = ovs.OvsIdl()
|
||||||
self.ovs_idl.start(constants.OVS_CONNECTION_STRING)
|
self.ovs_idl.start(constants.OVS_CONNECTION_STRING)
|
||||||
self.chassis = self.ovs_idl.get_own_chassis_name()
|
self.chassis = self.ovs_idl.get_own_chassis_name()
|
||||||
|
@ -61,26 +76,25 @@ class OVNEVPNDriver(driver_api.AgentDriverBase):
|
||||||
event_class = getattr(watcher, event)
|
event_class = getattr(watcher, event)
|
||||||
events += (event_class(self),)
|
events += (event_class(self),)
|
||||||
|
|
||||||
|
self._post_fork_event.clear()
|
||||||
# TODO(lucasagomes): The OVN package in the ubuntu LTS is old
|
# TODO(lucasagomes): The OVN package in the ubuntu LTS is old
|
||||||
# and does not support Chassis_Private. Once the package is updated
|
# and does not support Chassis_Private. Once the package is updated
|
||||||
# we can remove this fallback mode.
|
# we can remove this fallback mode.
|
||||||
try:
|
try:
|
||||||
self._sb_idl = ovn.OvnSbIdl(
|
self.sb_idl = ovn.OvnSbIdl(
|
||||||
self.ovn_remote,
|
self.ovn_remote,
|
||||||
chassis=self.chassis,
|
chassis=self.chassis,
|
||||||
tables=OVN_TABLES + ["Chassis_Private"],
|
tables=OVN_TABLES + ["Chassis_Private"],
|
||||||
events=events)
|
events=events).start()
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
self._sb_idl = ovn.OvnSbIdl(
|
self.sb_idl = ovn.OvnSbIdl(
|
||||||
self.ovn_remote,
|
self.ovn_remote,
|
||||||
chassis=self.chassis,
|
chassis=self.chassis,
|
||||||
tables=OVN_TABLES,
|
tables=OVN_TABLES,
|
||||||
events=events)
|
events=events).start()
|
||||||
|
|
||||||
def start(self):
|
# Now IDL connections can be safely used
|
||||||
# start the subscriptions to the OSP events. This ensures the watcher
|
self._post_fork_event.set()
|
||||||
# calls the relevant driver methods upon registered events
|
|
||||||
self.sb_idl = self._sb_idl.start()
|
|
||||||
|
|
||||||
def _get_events(self):
|
def _get_events(self):
|
||||||
events = set(["PortBindingChassisCreatedEvent",
|
events = set(["PortBindingChassisCreatedEvent",
|
||||||
|
|
Loading…
Reference in New Issue