Mark Bergsma has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/393066 )
Change subject: Support multiple BGP peerings
......................................................................
Support multiple BGP peerings
Allow Pybal to setup BGP peerings with multiple peers.
Global configuration option bgp-peer-address can now be a list and
contain multiple addresses.
Bug: T180069
Change-Id: Ie008f62c3667c20e947ee8d193632a46513188e9
---
M pybal/bgpfailover.py
1 file changed, 29 insertions(+), 16 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/operations/debs/pybal
refs/changes/66/393066/1
diff --git a/pybal/bgpfailover.py b/pybal/bgpfailover.py
index b967837..8055957 100755
--- a/pybal/bgpfailover.py
+++ b/pybal/bgpfailover.py
@@ -18,23 +18,26 @@
class BGPFailover:
- """Class for maintaining a BGP session to a router for IP address
failover"""
+ """Class for maintaining BGP sessions to routers for IP address failover"""
prefixes = {}
- peerings = []
+ peerings = {}
def __init__(self, globalConfig):
- self.globalConfig = globalConfig
+ if not globalConfig.getboolean('bgp', False):
+ return
- if self.globalConfig.getboolean('bgp', False):
- self.setup()
+ self.globalConfig = globalConfig
+ self.setup()
def setup(self):
try:
- self.bgpPeering =
bgp.NaiveBGPPeering(myASN=self.globalConfig.getint('bgp-local-asn'),
-
peerAddr=self.globalConfig.get('bgp-peer-address'))
-
- asPath = [int(asn) for asn in self.globalConfig.get('bgp-as-path',
str(self.bgpPeering.myASN)).split()]
+ myASN = self.globalConfig.getint('bgp-local-asn')
+ asPath = [int(asn)
+ for asn
+ in self.globalConfig.get('bgp-as-path',
+ str(myASN)
+ ).split()]
med = self.globalConfig.getint('bgp-med', 0)
baseAttrs = [bgp.OriginAttribute(), bgp.ASPathAttribute(asPath)]
if med: baseAttrs.append(bgp.MEDAttribute(med))
@@ -59,15 +62,25 @@
for af in attributes.keys()
for prefix in BGPFailover.prefixes.get(af,
set())])
- self.bgpPeering.setEnabledAddressFamilies(set(attributes.keys()))
- self.bgpPeering.setAdvertisements(advertisements)
- self.bgpPeering.automaticStart()
+ bgpPeerAddress = self.globalConfig.get('bgp-peer-address',
'').strip()
+ if bgpPeerAddress[0] != '[': bgpPeerAddress = "[ \"{}\"
]".format(bgpPeerAddress)
+ peerAddresses = eval(bgpPeerAddress)
+ assert isinstance(peerAddresses, list)
+
+ for peerAddr in peerAddresses:
+ peering = bgp.NaiveBGPPeering(myASN, peerAddr)
+ peering.setEnabledAddressFamilies(set(attributes.keys()))
+ peering.setAdvertisements(advertisements)
+
+ log.info("Starting BGP session with peer {}".format(peerAddr))
+ peering.automaticStart()
+ self.peerings[peerAddr] = peering
+ reactor.addSystemEventTrigger('before', 'shutdown',
self.closeSession, peering)
+
except Exception:
- log.critical("Could not set up BGP peering instance.")
+ log.critical("Could not set up BGP peering instances.")
raise
else:
- BGPFailover.peerings.append(self.bgpPeering)
- reactor.addSystemEventTrigger('before', 'shutdown',
self.closeSession, self.bgpPeering)
# Bind on the IPs listed in 'bgp_local_ips'. Default to
# localhost v4 and v6 if no IPs have been specified in the
@@ -79,7 +92,7 @@
try:
reactor.listenTCP(
bgp_local_port,
- bgp.BGPServerFactory({self.bgpPeering.peerAddr:
self.bgpPeering}),
+ bgp.BGPServerFactory(self.peerings),
interface=ip)
except CannotListenError as e:
log.critical(
--
To view, visit https://gerrit.wikimedia.org/r/393066
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie008f62c3667c20e947ee8d193632a46513188e9
Gerrit-PatchSet: 1
Gerrit-Project: operations/debs/pybal
Gerrit-Branch: master
Gerrit-Owner: Mark Bergsma <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits