aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2009-06-09 21:12:38 +0000
committerRob Austein <sra@hactrn.net>2009-06-09 21:12:38 +0000
commitd46e715c216bf4cc6b11d023b41d8073dd958b1b (patch)
tree678ef2dec60d62a1708df6919119e161470704f5
parent4855e6b65bdbf072be6500966d67e91ed8141adb (diff)
Handle withdrawal of abandoned ROAs
svn path=/rpkid/rpki/left_right.py; revision=2513
-rw-r--r--rpkid/rpki/left_right.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/rpkid/rpki/left_right.py b/rpkid/rpki/left_right.py
index 6ee14fb6..95073151 100644
--- a/rpkid/rpki/left_right.py
+++ b/rpkid/rpki/left_right.py
@@ -408,16 +408,16 @@ class self_elt(data_elt):
roas = dict(((r.asn, str(r.ipv4), str(r.ipv6)), r) for r in self.roas())
- def loop(iterator, roa_request):
+ def roa_requests_loop(iterator, roa_request):
def lose(e):
rpki.log.error(traceback.format_exc())
rpki.log.warn("Could not update ROA %r, skipping: %s" % (roa, e))
iterator()
- roa = roas.get((roa_request.asn, str(roa_request.ipv4), str(roa_request.ipv6)))
+ key = (roa_request.asn, str(roa_request.ipv4), str(roa_request.ipv6))
- if roa is None:
+ if key not in roas:
# This really should be using a constructor
roa = rpki.rpki_engine.roa_obj()
roa.gctx = self.gctx
@@ -427,7 +427,8 @@ class self_elt(data_elt):
roa.ipv6 = roa_request.ipv6
return roa.generate_roa(iterator, lose)
- assert roa.roa is not None
+ roa = roas[key]
+ del roas[key]
ca_detail = roa.ca_detail()
@@ -453,14 +454,24 @@ class self_elt(data_elt):
iterator()
- def done():
+ def roa_requests_done():
- # Need to do something here to handle existing ROAs for
- # which we no longer have a ROA request.
+ # Any roa_obj entries still in the dict at this point are
+ # orphans that no longer correspond to a roa_request, so clean
+ # them up.
- cb()
+ def roa_withdraw_loop(iterator, roa):
- rpki.async.iterator(roa_requests, loop, done)
+ def lose(e):
+ rpki.log.error(traceback.format_exc())
+ rpki.log.warn("Could not withdraw ROA %r: %s" % (roa, e))
+ iterator()
+
+ roa.withdraw(iterator, lose)
+
+ rpki.async.iterator(roas.values(), roa_withdraw_loop, cb)
+
+ rpki.async.iterator(roa_requests, roa_requests_loop, roa_requests_done)
def roa_requests_failed(e):
rpki.log.error(traceback.format_exc())