X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fvpp_ip.py;h=5396e8457e20ebfdbfe454aac2ce8b424a90a222;hb=097fa66b9;hp=6d22c16ff609dc51f57d4edb76d12f75abd2af2f;hpb=93cc3ee3b3a9c9224a1446625882205f3282a949;p=vpp.git diff --git a/test/vpp_ip.py b/test/vpp_ip.py index 6d22c16ff60..5396e8457e2 100644 --- a/test/vpp_ip.py +++ b/test/vpp_ip.py @@ -2,10 +2,17 @@ IP Types """ +import logging from ipaddress import ip_address from socket import AF_INET, AF_INET6 from vpp_papi import VppEnum +try: + text_type = unicode +except NameError: + text_type = str + +_log = logging.getLogger(__name__) class DpoProto: @@ -23,21 +30,13 @@ INVALID_INDEX = 0xffffffff class VppIpAddressUnion(): def __init__(self, addr): self.addr = addr - self.ip_addr = ip_address(unicode(self.addr)) + self.ip_addr = ip_address(text_type(self.addr)) def encode(self): - if self.version is 6: - return { - 'ip6': { - 'address': self.ip_addr.packed - }, - } + if self.version == 6: + return {'ip6': self.ip_addr} else: - return { - 'ip4': { - 'address': self.ip_addr.packed - }, - } + return {'ip4': self.ip_addr} @property def version(self): @@ -49,10 +48,7 @@ class VppIpAddressUnion(): @property def length(self): - if self.version is 6: - return 128 - else: - return 32 + return self.ip_addr.max_prefixlen @property def bytes(self): @@ -63,16 +59,18 @@ class VppIpAddressUnion(): return self.ip_addr == other.ip_addr elif hasattr(other, "ip4") and hasattr(other, "ip6"): # vl_api_address_union_t - if 4 is self.version: - return self.ip_addr.packed == other.ip4.address + if 4 == self.version: + return self.ip_addr.packed == other.ip4 else: - return self.ip_addr.packed == other.ip6.address + return self.ip_addr.packed == other.ip6 else: - raise Exception("Comparing VppIpAddresUnions:%s" - " with unknown type: %s" % - (self, other)) + _log.error("Comparing VppIpAddressUnions:%s" + " with incomparable type: %s", + self, other) + return NotImplemented - return False + def __str__(self): + return str(self.ip_addr) class VppIpAddress(): @@ -80,7 +78,7 @@ class VppIpAddress(): self.addr = VppIpAddressUnion(addr) def encode(self): - if self.addr.version is 6: + if self.addr.version == 6: return { 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6, 'un': self.addr.encode() @@ -96,7 +94,7 @@ class VppIpAddress(): return self.addr == other.addr elif hasattr(other, "af") and hasattr(other, "un"): # a vp_api_address_t - if 4 is self.version: + if 4 == self.version: return other.af == \ VppEnum.vl_api_address_family_t.ADDRESS_IP4 and \ other.un == self.addr @@ -105,9 +103,12 @@ class VppIpAddress(): VppEnum.vl_api_address_family_t.ADDRESS_IP6 and \ other.un == self.addr else: - raise Exception("Comparing VppIpAddress:%s with unknown type: %s" % - (self, other)) - return False + _log.error( + "Comparing VppIpAddress:<%s> %s with incomparable " + "type: <%s> %s", + self.__class__.__name__, self, + other.__class__.__name__, other) + return NotImplemented def __ne__(self, other): return not (self == other) @@ -119,10 +120,6 @@ class VppIpAddress(): def bytes(self): return self.addr.bytes - @property - def bytes(self): - return self.addr.bytes - @property def address(self): return self.addr.address @@ -148,7 +145,7 @@ class VppIpAddress(): @property def dpo_proto(self): - if self.version is 6: + if self.version == 6: return DpoProto.DPO_PROTO_IP6 else: return DpoProto.DPO_PROTO_IP4 @@ -160,7 +157,7 @@ class VppIpPrefix(): self.len = len def __eq__(self, other): - if self.addr == other.addr and self.len == other.len: + if self.address == other.address and self.len == other.len: return True return False @@ -168,6 +165,10 @@ class VppIpPrefix(): return {'address': self.addr.encode(), 'address_length': self.len} + @property + def version(self): + return self.addr.version + @property def address(self): return self.addr.address @@ -193,51 +194,81 @@ class VppIpPrefix(): elif hasattr(other, "address") and hasattr(other, "address_length"): # vl_api_prefix_t return self.len == other.address_length and \ - self.addr == other.address + self.addr == other.address else: - raise Exception("Comparing VppIpPrefix:%s with unknown type: %s" % - (self, other)) - return False + _log.error( + "Comparing VppIpPrefix:%s with incomparable type: %s" % + (self, other)) + return NotImplemented class VppIpMPrefix(): - def __init__(self, saddr, gaddr, len): + def __init__(self, saddr, gaddr, glen): self.saddr = saddr self.gaddr = gaddr - self.len = len - self.ip_saddr = ip_address(unicode(self.saddr)) - self.ip_gaddr = ip_address(unicode(self.gaddr)) + self.glen = glen + self.ip_saddr = VppIpAddressUnion(text_type(self.saddr)) + self.ip_gaddr = VppIpAddressUnion(text_type(self.gaddr)) + if self.ip_saddr.version != self.ip_gaddr.version: + raise ValueError('Source and group addresses must be of the ' + 'same address family.') def encode(self): - - if 6 is self.ip_saddr.version: + if 6 == self.ip_saddr.version: prefix = { 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6, 'grp_address': { - 'ip6': { - 'address': self.ip_gaddr.packed - }, + 'ip6': self.gaddr }, 'src_address': { - 'ip6': { - 'address': self.ip_saddr.packed - }, + 'ip6': self.saddr }, - 'grp_address_length': self.len, + 'grp_address_length': self.glen, } else: prefix = { 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP4, 'grp_address': { - 'ip4': { - 'address': self.ip_gaddr.packed - }, + 'ip4': self.gaddr }, 'src_address': { - 'ip4': { - 'address': self.ip_saddr.packed - }, + 'ip4': self.saddr }, - 'grp_address_length': self.len, + 'grp_address_length': self.glen, } return prefix + + @property + def length(self): + return self.glen + + @property + def version(self): + return self.ip_gaddr.version + + def __str__(self): + return "(%s,%s)/%d" % (self.saddr, self.gaddr, self.glen) + + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self.glen == other.glen and + self.ip_saddr == other.ip_gaddr and + self.ip_saddr == other.ip_saddr) + elif (hasattr(other, "grp_address_length") and + hasattr(other, "grp_address") and + hasattr(other, "src_address")): + # vl_api_mprefix_t + if 4 == self.ip_saddr.version: + if self.glen == other.grp_address_length and \ + self.gaddr == str(other.grp_address.ip4) and \ + self.saddr == str(other.src_address.ip4): + return True + return False + else: + return (self.glen == other.grp_address_length and + self.gaddr == other.grp_address.ip6 and + self.saddr == other.src_address.ip6) + else: + raise Exception("Comparing VppIpPrefix:%s with unknown type: %s" % + (self, other)) + return False