[backend] longer timeout for node communication and retrying with other if add/update fails with 409/404
This commit is contained in:
parent
b3337a5b3d
commit
d34136b42f
2 changed files with 27 additions and 18 deletions
|
@ -227,8 +227,7 @@ class PeeringManager:
|
||||||
else:
|
else:
|
||||||
return False, ret_code
|
return False, ret_code
|
||||||
|
|
||||||
def update_peering(self, ASN, wg_key, MNT=NotSpecified, node=NotSpecified, endpoint=NotSpecified, ipv6ll=NotSpecified, ipv4=NotSpecified, ipv6=NotSpecified, bgp_mp=NotSpecified, bgp_enh=NotSpecified):
|
def update_peering(self, asn, wg_key, MNT=NotSpecified, node=NotSpecified, endpoint=NotSpecified, ipv6ll=NotSpecified, ipv4=NotSpecified, ipv6=NotSpecified, bgp_mp=NotSpecified, bgp_enh=NotSpecified):
|
||||||
asn = ASN
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not asn in self.peerings:
|
if not asn in self.peerings:
|
||||||
|
|
|
@ -17,11 +17,11 @@ class NodeCommunicator:
|
||||||
def update(self, action: str, peering: dict):
|
def update(self, action: str, peering: dict):
|
||||||
try:
|
try:
|
||||||
if action == "add":
|
if action == "add":
|
||||||
req = requests.post(f"{self.__api_addr}peerings", json=peering, timeout=6)
|
req = requests.post(f"{self.__api_addr}peerings", json=peering, timeout=10)
|
||||||
elif action == "update":
|
elif action == "update":
|
||||||
req = requests.put(f"{self.__api_addr}peerings", json=peering, timeout=6)
|
req = requests.put(f"{self.__api_addr}peerings", json=peering, timeout=10)
|
||||||
elif action == "delete":
|
elif action == "delete":
|
||||||
req = requests.delete(f"{self.__api_addr}peerings", json=peering, timeout=6)
|
req = requests.delete(f"{self.__api_addr}peerings", json=peering, timeout=10)
|
||||||
else:
|
else:
|
||||||
return 400
|
return 400
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ class PeeringManager:
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def add_peering(self, asn, node, mnt, wg_key, endpoint=None, ipv6ll=None, ipv4=None, ipv6=None, bgp_mp=True, bgp_enh=True):
|
def add_peering(self, asn, node, mnt, wg_key, endpoint=None, ipv6ll=None, ipv4=None, ipv6=None, bgp_mp=True, bgp_enh=True)-> tuple[bool,int]:
|
||||||
# check if this MNT already has a/this asn
|
# check if this MNT already has a/this asn
|
||||||
try:
|
try:
|
||||||
if asn not in self.peerings["mntner"][mnt]:
|
if asn not in self.peerings["mntner"][mnt]:
|
||||||
|
@ -181,10 +181,14 @@ class PeeringManager:
|
||||||
peering = {"MNT": mnt, "ASN": asn, "node": node, "wg_key": wg_key, "endpoint": endpoint,
|
peering = {"MNT": mnt, "ASN": asn, "node": node, "wg_key": wg_key, "endpoint": endpoint,
|
||||||
"ipv6ll": ipv6ll, "ipv4": ipv4, "ipv6": ipv6, "bgp_mp": bgp_mp, "bgp_enh": bgp_enh}
|
"ipv6ll": ipv6ll, "ipv4": ipv4, "ipv6": ipv6, "bgp_mp": bgp_mp, "bgp_enh": bgp_enh}
|
||||||
success, code = self._update_nodes("add", peering=peering)
|
success, code = self._update_nodes("add", peering=peering)
|
||||||
if not success:
|
if not success and code != 409:
|
||||||
# if ssomething failed notify user and don't add it to the list
|
# if something failed notify user and don't add it to the list
|
||||||
return False, code
|
return False, code
|
||||||
#
|
elif code == 409:
|
||||||
|
# apparently this peering already exists in a similar way, so we'll try updating it
|
||||||
|
success, code = self._update_nodes("update", peering=peering)
|
||||||
|
if not success:
|
||||||
|
return False, code
|
||||||
self.peerings["asn"][asn].append(peering)
|
self.peerings["asn"][asn].append(peering)
|
||||||
self._save_peerings()
|
self._save_peerings()
|
||||||
return True, code
|
return True, code
|
||||||
|
@ -206,27 +210,33 @@ class PeeringManager:
|
||||||
# this should only happen if "asn" not in self.peerings
|
# this should only happen if "asn" not in self.peerings
|
||||||
return False, 404
|
return False, 404
|
||||||
|
|
||||||
success = False
|
found = False
|
||||||
for pNr in range(len(self.peerings["asn"][asn])):
|
for pNr in range(len(self.peerings["asn"][asn])):
|
||||||
if self.peerings["asn"][asn][pNr]["node"] == node:
|
if self.peerings["asn"][asn][pNr]["node"] == node:
|
||||||
old_peering = self.peerings["asn"][asn][pNr]
|
old_peering = self.peerings["asn"][asn][pNr]
|
||||||
new_peering = self.peerings["asn"][asn][pNr] = {"MNT": mnt, "ASN": asn, "node": node, "wg_key": wg_key,
|
new_peering = self.peerings["asn"][asn][pNr] = {"MNT": mnt, "ASN": asn, "node": node, "wg_key": wg_key,
|
||||||
"endpoint": endpoint, "ipv6ll": ipv6ll, "ipv4": ipv4, "ipv6": ipv6, "bgp_mp": bgp_mp, "bgp_enh": bgp_enh}
|
"endpoint": endpoint, "ipv6ll": ipv6ll, "ipv4": ipv4, "ipv6": ipv6, "bgp_mp": bgp_mp, "bgp_enh": bgp_enh}
|
||||||
success = True
|
found = True
|
||||||
peering_number = pNr
|
peering_number = pNr
|
||||||
if not success:
|
if not found:
|
||||||
return False
|
return False, 404
|
||||||
# notify the node
|
# notify the node
|
||||||
|
|
||||||
success, code = self._update_nodes("update", old_peering, new_peering=new_peering)
|
success, code = self._update_nodes("update", old_peering, new_peering=new_peering)
|
||||||
if not success:
|
if not success and code != 404:
|
||||||
# revert updating peering
|
# revert updating peering
|
||||||
self.peerings["asn"][asn][peering_number] = old_peering
|
self.peerings["asn"][asn][peering_number] = old_peering
|
||||||
return False, code
|
return False, code
|
||||||
else:
|
elif code == 404:
|
||||||
|
# for some reason the node doesn't yet know about this peering, we'l try adding it
|
||||||
self._save_peerings()
|
success, code = self._update_nodes("add", old_peering, new_peering=new_peering)
|
||||||
return True, code
|
if not success:
|
||||||
|
# revert updating peering
|
||||||
|
self.peerings["asn"][asn][peering_number] = old_peering
|
||||||
|
return False, code
|
||||||
|
|
||||||
|
self._save_peerings()
|
||||||
|
return True, code
|
||||||
|
|
||||||
def delete_peering(self, asn, node, mnt, wg_key=None):
|
def delete_peering(self, asn, node, mnt, wg_key=None):
|
||||||
if not self.exists(asn, node, mnt=mnt, wg_key=wg_key):
|
if not self.exists(asn, node, mnt=mnt, wg_key=wg_key):
|
||||||
|
|
Loading…
Add table
Reference in a new issue