VTL: Fix issue with ipaddress library use under python2. 48/17148/3
authorPaul Vinciguerra <pvinci@vinciconsulting.com>
Tue, 29 Jan 2019 19:51:44 +0000 (11:51 -0800)
committerOle Trøan <otroan@employees.org>
Fri, 1 Feb 2019 08:51:59 +0000 (08:51 +0000)
If you pass in a non-unicode 4-byte ipv6 address to ip_address,
ipaddress interprets this as an IPv4Address.

Under python2, ip_address  interprets 'a7::' as a packed ipv4:
 97.55.58.58

You can test with:
---
import ipaddress
try:
    text_type = unicode
except NameError:
    text_type = str

addr = ipaddress.ip_address('a7::')
print(addr)
---

Change-Id: I06c561e0ab7315869cc89d0bb08c05e743a90982
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
test/hook.py
test/vpp_ip.py

index a8f37c7..64fc076 100644 (file)
@@ -6,6 +6,10 @@ from log import RED, single_line_delim, double_line_delim
 import ipaddress
 from subprocess import check_output, CalledProcessError
 from util import check_core_path, get_core_path
+try:
+    text_type = unicode
+except NameError:
+    text_type = str
 
 
 class Hook(object):
@@ -32,6 +36,7 @@ class Hook(object):
                 return '{!s} ({!s})'.format(val, ':'.join(['{:02x}'.format(
                     ord(x)) for x in val]))
             try:
+                # we don't call test_type(val) because it is a packed value.
                 return '{!s} ({!s})'.format(val, str(
                     ipaddress.ip_address(val)))
             except ipaddress.AddressValueError:
index fe985fb..8b7ea22 100644 (file)
@@ -7,6 +7,10 @@ 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__)
 
@@ -26,7 +30,7 @@ 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 == 6:
@@ -191,8 +195,8 @@ class VppIpMPrefix():
         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.ip_saddr = ip_address(text_type(self.saddr))
+        self.ip_gaddr = ip_address(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.')