summaryrefslogtreecommitdiffstats
path: root/src/vpp-api
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-10-16 14:42:50 +0200
committerNeale Ranns <nranns@cisco.com>2018-10-18 10:16:49 +0000
commit0685da4a6db8195d1a86f3466fcd3395b0ccb83e (patch)
treec77bf5b08aade685beadc01972f601e795685ba8 /src/vpp-api
parent5fcca2a124ac828b01633a3ad237a6435e8ff603 (diff)
PAPI: Expose API enums to tests / applications
e.g: from vpp_papi import VppEnum VppEnum.vl_api_address_family_t.ADDRESS_IP4 Change-Id: I10c22d57234a1a06e98a889cf80b19085b468ed3 Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp-api')
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_papi.py49
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_serializer.py10
2 files changed, 43 insertions, 16 deletions
diff --git a/src/vpp-api/python/vpp_papi/vpp_papi.py b/src/vpp-api/python/vpp_papi/vpp_papi.py
index e1a7059f317..5e98f92cecd 100644
--- a/src/vpp-api/python/vpp_papi/vpp_papi.py
+++ b/src/vpp-api/python/vpp_papi/vpp_papi.py
@@ -27,7 +27,7 @@ import fnmatch
import weakref
import atexit
from . vpp_serializer import VPPType, VPPEnumType, VPPUnionType, BaseTypes
-from . vpp_serializer import VPPMessage
+from . vpp_serializer import VPPMessage, vpp_get_type
if sys.version[0] == '2':
import Queue as queue
@@ -35,6 +35,19 @@ else:
import queue as queue
+class VppEnumType(type):
+ def __getattr__(cls, name):
+ t = vpp_get_type(name)
+ return t.enum
+
+
+# Python3
+# class VppEnum(metaclass=VppEnumType):
+# pass
+class VppEnum:
+ __metaclass__ = VppEnumType
+
+
def vpp_atexit(vpp_weakref):
"""Clean up VPP connection on shutdown."""
vpp_instance = vpp_weakref()
@@ -94,21 +107,22 @@ class VPP():
unresolved = {}
for k, v in types.items():
t = v['data']
- if v['type'] == 'enum':
- try:
- VPPEnumType(t[0], t[1:])
- except ValueError:
- unresolved[k] = v
- elif v['type'] == 'union':
- try:
- VPPUnionType(t[0], t[1:])
- except ValueError:
- unresolved[k] = v
- elif v['type'] == 'type':
- try:
- VPPType(t[0], t[1:])
- except ValueError:
- unresolved[k] = v
+ if not vpp_get_type(t[0]):
+ if v['type'] == 'enum':
+ try:
+ VPPEnumType(t[0], t[1:])
+ except ValueError:
+ unresolved[k] = v
+ elif v['type'] == 'union':
+ try:
+ VPPUnionType(t[0], t[1:])
+ except ValueError:
+ unresolved[k] = v
+ elif v['type'] == 'type':
+ try:
+ VPPType(t[0], t[1:])
+ except ValueError:
+ unresolved[k] = v
if len(unresolved) == 0:
break
if i > 3:
@@ -200,6 +214,9 @@ class VPP():
return self.context
get_context = ContextId()
+ def get_type(self, name):
+ return vpp_get_type(name)
+
@classmethod
def find_api_dir(cls):
"""Attempt to find the best directory in which API definition
diff --git a/src/vpp-api/python/vpp_papi/vpp_serializer.py b/src/vpp-api/python/vpp_papi/vpp_serializer.py
index cac6dd61791..240912d96ba 100644
--- a/src/vpp-api/python/vpp_papi/vpp_serializer.py
+++ b/src/vpp-api/python/vpp_papi/vpp_serializer.py
@@ -62,6 +62,13 @@ types['f64'] = BaseTypes('f64')
types['bool'] = BaseTypes('bool')
+def vpp_get_type(name):
+ try:
+ return types[name]
+ except KeyError:
+ return None
+
+
class FixedList_u8():
def __init__(self, name, field_type, num):
self.name = name
@@ -202,6 +209,9 @@ class VPPEnumType():
def __getattr__(self, name):
return self.enum[name]
+ def __nonzero__(self):
+ return True
+
def pack(self, data, kwargs=None):
return types['u32'].pack(data, kwargs)