summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/python/vpp_papi
diff options
context:
space:
mode:
authorPaul Vinciguerra <pvinci@vinciconsulting.com>2020-04-28 00:27:38 -0400
committerPaul Vinciguerra <pvinci@vinciconsulting.com>2020-04-28 15:43:28 +0000
commite64e5fff4ddea88f386657c5d95ae8dc78138d20 (patch)
treea4b91682810f8d64dfe2ae0934c21d1f67b94f9d /src/vpp-api/python/vpp_papi
parent58db6e16cf4f3bb1740ca2f62d7d887baad58d63 (diff)
tests: implement ipaddress convenience methods
Add vpp specific properties to ip addresses for use in the api. .vapi_af -- returns [ADDRESS_IP4, ADDRESS_IP6] .vapi_af_name -- returns the string ['ip4', 'ip6'] Update tests to demonstrate usage. Type: feature Change-Id: I43447a1522769d99f89debdc714c51700068d771 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
Diffstat (limited to 'src/vpp-api/python/vpp_papi')
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_format.py5
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_papi.py30
2 files changed, 34 insertions, 1 deletions
diff --git a/src/vpp-api/python/vpp_papi/vpp_format.py b/src/vpp-api/python/vpp_papi/vpp_format.py
index 3e836c9da6b..4c26463bbb5 100644
--- a/src/vpp-api/python/vpp_papi/vpp_format.py
+++ b/src/vpp-api/python/vpp_papi/vpp_format.py
@@ -27,6 +27,11 @@ except NameError:
ADDRESS_IP4 = 0
ADDRESS_IP6 = 1
+
+def verify_enum_hint(e):
+ return (e.ADDRESS_IP4.value == ADDRESS_IP4) and\
+ (e.ADDRESS_IP6.value == ADDRESS_IP6)
+
#
# Type conversion for input arguments and return values
#
diff --git a/src/vpp-api/python/vpp_papi/vpp_papi.py b/src/vpp-api/python/vpp_papi/vpp_papi.py
index 7f6efbbae07..6c17fa88c95 100644
--- a/src/vpp-api/python/vpp_papi/vpp_papi.py
+++ b/src/vpp-api/python/vpp_papi/vpp_papi.py
@@ -17,6 +17,7 @@
from __future__ import print_function
from __future__ import absolute_import
import ctypes
+import ipaddress
import sys
import multiprocessing as mp
import os
@@ -28,6 +29,7 @@ import fnmatch
import weakref
import atexit
import time
+from . vpp_format import verify_enum_hint
from . vpp_serializer import VPPType, VPPEnumType, VPPUnionType
from . vpp_serializer import VPPMessage, vpp_get_type, VPPTypeAlias
@@ -77,6 +79,26 @@ else:
return d.items()
+def add_convenience_methods():
+ # provide convenience methods to IP[46]Address.vapi_af
+ def _vapi_af(self):
+ if 6 == self._version:
+ return VppEnum.vl_api_address_family_t.ADDRESS_IP6.value
+ if 4 == self._version:
+ return VppEnum.vl_api_address_family_t.ADDRESS_IP4.value
+ raise ValueError("Invalid _version.")
+
+ def _vapi_af_name(self):
+ if 6 == self._version:
+ return 'ip6'
+ if 4 == self._version:
+ return 'ip4'
+ raise ValueError("Invalid _version.")
+
+ ipaddress._IPAddressBase.vapi_af = property(_vapi_af)
+ ipaddress._IPAddressBase.vapi_af_name = property(_vapi_af_name)
+
+
class VppApiDynamicMethodHolder(object):
pass
@@ -113,6 +135,7 @@ class VPPRuntimeError(RuntimeError):
class VPPValueError(ValueError):
pass
+
class VPPApiJSONFiles(object):
@classmethod
def find_api_dir(cls, dirs):
@@ -295,6 +318,7 @@ class VPPApiJSONFiles(object):
self.logger.error('Not implemented error for {}'.format(m[0]))
return messages, services
+
class VPPApiClient(object):
"""VPP interface.
@@ -383,16 +407,20 @@ class VPPApiClient(object):
# Basic sanity check
if len(self.messages) == 0 and not testmode:
raise VPPValueError(1, 'Missing JSON message definitions')
+ if not(verify_enum_hint(VppEnum.vl_api_address_family_t)):
+ raise VPPRuntimeError("Invalid address family hints. "
+ "Cannot continue.")
self.transport = VppTransport(self, read_timeout=read_timeout,
server_address=server_address)
# Make sure we allow VPP to clean up the message rings.
atexit.register(vpp_atexit, weakref.ref(self))
+ add_convenience_methods()
+
def get_function(self, name):
return getattr(self._api, name)
-
class ContextId(object):
"""Multiprocessing-safe provider of unique context IDs."""
def __init__(self):