diff options
-rw-r--r-- | rpkid/rpki/resource_set.py | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/rpkid/rpki/resource_set.py b/rpkid/rpki/resource_set.py index 4ce6cced..b51d3105 100644 --- a/rpkid/rpki/resource_set.py +++ b/rpkid/rpki/resource_set.py @@ -584,7 +584,7 @@ class roa_prefix_set(list): def __init__(self, ini = None): """Initialize a ROA prefix set.""" - if isinstance(ini, str) and len(str): + if isinstance(ini, str) and len(ini): self.extend(self.parse_str(s) for s in ini.split(",")) elif isinstance(ini, (list, tuple)): self.extend(ini) @@ -603,18 +603,38 @@ class roa_prefix_set(list): """Parse ROA prefix from text (eg, an XML attribute).""" r = re.match("^([0-9:.a-fA-F]+)/([0-9]+)-([0-9]+)$", x) if r: - return self.range_type.roa_prefix(self.range_type.datum_type(r.group(1)), int(r.group(2)), int(r.group(3))) + return self.prefix_type(self.prefix_type.range_type.datum_type(r.group(1)), int(r.group(2)), int(r.group(3))) r = re.match("^([0-9:.a-fA-F]+)/([0-9]+)$", x) if r: - return self.range_type.roa_prefix(self.range_type.datum_type(r.group(1)), int(r.group(2))) + return self.prefix_type(self.prefix_type.range_type.datum_type(r.group(1)), int(r.group(2))) raise RuntimeError, 'Bad ROA prefix "%s"' % (x) + def to_resource_set(self): + """Convert a ROA prefix set to a resource set. This is an + irreversable transformation. + """ + return self.resource_set_type([p.to_resource_range() for p in self]) + +class roa_prefix_set_ipv4(roa_prefix_set): + """Set of IPv4 ROA prefixes.""" + + prefix_type = roa_prefix_ipv4 + resource_set_type = resource_set_ipv4 + +class roa_prefix_set_ipv6(roa_prefix_set): + """Set of IPv6 ROA prefixes.""" + + prefix_type = roa_prefix_ipv6 + resource_set_type = resource_set_ipv6 + # Test suite for set operations. if __name__ == "__main__": def test1(t, s1, s2): - print + if isinstance(s1, str) and isinstance(s2, str): + print "x: ", s1 + print "y: ", s2 r1 = t(s1) r2 = t(s2) print "x: ", r1 @@ -644,10 +664,34 @@ if __name__ == "__main__": assert v1 == v2 print "x&y:", v1 + def test2(t, s1, s2): + print "x: ", s1 + print "y: ", s2 + r1 = t(s1) + r2 = t(s2) + print "x: ", r1 + print "y: ", r2 + print "x == y:", (r1 == r2) + print "x > y: ", (r1 > r2) + print "x < y: ", (r1 < r2) + test1(t.resource_set_type, r1.to_resource_set(), r2.to_resource_set()) + print print "Testing set operations on resource sets" + print test1(resource_set_as, "1,2,3,4,5,6,11,12,13,14,15", "1,2,3,4,5,6,111,121,131,141,151") + print test1(resource_set_ipv4, "10.0.0.44/32,10.6.0.2/32", "10.3.0.0/24,10.0.0.77/32") + print test1(resource_set_ipv4, "10.0.0.44/32,10.6.0.2/32", "10.0.0.0/24") + print test1(resource_set_ipv4, "10.0.0.0/24", "10.3.0.0/24,10.0.0.77/32") print + print "Testing set operations on ROA prefixes" + print + test2(roa_prefix_set_ipv4, "10.0.0.44/32,10.6.0.2/32", "10.3.0.0/24,10.0.0.77/32") + print + test2(roa_prefix_set_ipv4, "10.0.0.0/24-32,10.6.0.0/24-32", "10.3.0.0/24,10.0.0.0/16-32") + print + test2(roa_prefix_set_ipv4, "10.3.0.0/24-24,10.0.0.0/16-32", "10.3.0.0/24,10.0.0.0/16-32") + print |