Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Revert "Python API: Add enum and union support."
[vpp.git]
/
src
/
vpp-api
/
python
/
vpp_papi.py
diff --git
a/src/vpp-api/python/vpp_papi.py
b/src/vpp-api/python/vpp_papi.py
index
c2d12b5
..
ece0e4e
100644
(file)
--- a/
src/vpp-api/python/vpp_papi.py
+++ b/
src/vpp-api/python/vpp_papi.py
@@
-56,6
+56,7
@@
void vac_set_error_handler(vac_error_callback_t);
# Barfs on failure, no need to check success.
vpp_api = ffi.dlopen('libvppapiclient.so')
# Barfs on failure, no need to check success.
vpp_api = ffi.dlopen('libvppapiclient.so')
+
def vpp_atexit(vpp_weakref):
"""Clean up VPP connection on shutdown."""
vpp_instance = vpp_weakref()
def vpp_atexit(vpp_weakref):
"""Clean up VPP connection on shutdown."""
vpp_instance = vpp_weakref()
@@
-63,6
+64,7
@@
def vpp_atexit(vpp_weakref):
vpp_instance.logger.debug('Cleaning up VPP on exit')
vpp_instance.disconnect()
vpp_instance.logger.debug('Cleaning up VPP on exit')
vpp_instance.disconnect()
+
vpp_object = None
vpp_object = None
@@
-114,7
+116,8
@@
class VPP():
these messages in a background thread.
"""
def __init__(self, apifiles=None, testmode=False, async_thread=True,
these messages in a background thread.
"""
def __init__(self, apifiles=None, testmode=False, async_thread=True,
- logger=logging.getLogger('vpp_papi'), loglevel='debug', read_timeout=0):
+ logger=None, loglevel=None,
+ read_timeout=0):
"""Create a VPP API object.
apifiles is a list of files containing API
"""Create a VPP API object.
apifiles is a list of files containing API
@@
-122,11
+125,20
@@
class VPP():
dynamically created reflecting these APIs. If not
provided this will load the API files from VPP's
default install location.
dynamically created reflecting these APIs. If not
provided this will load the API files from VPP's
default install location.
+
+ logger, if supplied, is the logging logger object to log to.
+ loglevel, if supplied, is the log level this logger is set
+ to report at (from the loglevels in the logging module).
"""
global vpp_object
vpp_object = self
"""
global vpp_object
vpp_object = self
+
+ if logger is None:
+ logger = logging.getLogger(__name__)
+ if loglevel is not None:
+ logger.setLevel(loglevel)
+
self.logger = logger
self.logger = logger
- logging.basicConfig(level=getattr(logging, loglevel.upper()))
self.messages = {}
self.id_names = []
self.messages = {}
self.id_names = []
@@
-173,7
+185,8
@@
class VPP():
# Support legacy CFFI
# from_buffer supported from 1.8.0
# Support legacy CFFI
# from_buffer supported from 1.8.0
- (major, minor, patch) = [int(s) for s in cffi.__version__.split('.', 3)]
+ (major, minor, patch) = [int(s) for s in
+ cffi.__version__.split('.', 3)]
if major >= 1 and minor >= 8:
self._write = self._write_new_cffi
else:
if major >= 1 and minor >= 8:
self._write = self._write_new_cffi
else:
@@
-217,14
+230,14
@@
class VPP():
localdir = os.path.dirname(os.path.realpath(main.__file__))
else:
# use cwd if there is no calling script
localdir = os.path.dirname(os.path.realpath(main.__file__))
else:
# use cwd if there is no calling script
- localdir = os.cwd()
+ localdir = os.
get
cwd()
localdir_s = localdir.split(os.path.sep)
def dmatch(dir):
"""Match dir against right-hand components of the script dir"""
d = dir.split('/') # param 'dir' assumes a / separator
localdir_s = localdir.split(os.path.sep)
def dmatch(dir):
"""Match dir against right-hand components of the script dir"""
d = dir.split('/') # param 'dir' assumes a / separator
- l = len(d)
- return len(localdir_s) > l
and localdir_s[-l
:] == d
+ l
ength
= len(d)
+ return len(localdir_s) > l
ength and localdir_s[-length
:] == d
def sdir(srcdir, variant):
"""Build a path from srcdir to the staged API files of
def sdir(srcdir, variant):
"""Build a path from srcdir to the staged API files of
@@
-253,7
+266,6
@@
class VPP():
if srcdir:
# we're in the source tree, try both the debug and release
# variants.
if srcdir:
# we're in the source tree, try both the debug and release
# variants.
- x = 'vpp/share/vpp/api'
dirs.append(sdir(srcdir, '_debug'))
dirs.append(sdir(srcdir, ''))
dirs.append(sdir(srcdir, '_debug'))
dirs.append(sdir(srcdir, ''))
@@
-330,9
+342,8
@@
class VPP():
'i32': 'i',
'u64': 'Q',
'f64': 'd', }
'i32': 'i',
'u64': 'Q',
'f64': 'd', }
- pack = None
+
if t in base_types:
if t in base_types:
- pack = base_types[t]
if not vl:
if e > 0 and t == 'u8':
# Fixed byte array
if not vl:
if e > 0 and t == 'u8':
# Fixed byte array
@@
-393,9
+404,9
@@
class VPP():
for k in kwargs:
if k not in msgdef['args']:
for k in kwargs:
if k not in msgdef['args']:
- raise ValueError(1,
'Non existing argument [' + k + ']' + \
- ' used in call to: ' + \
- self.id_names[kwargs['_vl_msg_id']] + '()'
)
+ raise ValueError(1,
'Non existing argument [' + k + ']' +
+ ' used in call to: ' +
+ self.id_names[kwargs['_vl_msg_id']] + '()')
for k, v in vpp_iterator(msgdef['args']):
off += size
for k, v in vpp_iterator(msgdef['args']):
off += size
@@
-404,21
+415,28
@@
class VPP():
if callable(v[1]):
e = kwargs[v[0]] if v[0] in kwargs else v[0]
if e != len(kwargs[k]):
if callable(v[1]):
e = kwargs[v[0]] if v[0] in kwargs else v[0]
if e != len(kwargs[k]):
- raise (ValueError(1, 'Input list length mismatch: %s (%s != %s)' % (k, e, len(kwargs[k]))))
+ raise (ValueError(1,
+ 'Input list length mismatch: '
+ '%s (%s != %s)' %
+ (k, e, len(kwargs[k]))))
size = 0
for i in range(e):
size += v[1](self, True, buf, off + size,
kwargs[k][i])
else:
if v[0] in kwargs:
size = 0
for i in range(e):
size += v[1](self, True, buf, off + size,
kwargs[k][i])
else:
if v[0] in kwargs:
- l = kwargs[v[0]]
- if l != len(kwargs[k]):
- raise ValueError(1, 'Input list length mismatch: %s (%s != %s)' % (k, l, len(kwargs[k])))
+ kwargslen = kwargs[v[0]]
+ if kwargslen != len(kwargs[k]):
+ raise ValueError(1,
+ 'Input list length mismatch:'
+ ' %s (%s != %s)' %
+ (k, kwargslen,
+ len(kwargs[k])))
else:
else:
-
l
= len(kwargs[k])
+
kwargslen
= len(kwargs[k])
if v[1].size == 1:
if v[1].size == 1:
- buf[off:off +
l
] = bytearray(kwargs[k])
- size =
l
+ buf[off:off +
kwargslen
] = bytearray(kwargs[k])
+ size =
kwargslen
else:
size = 0
for i in kwargs[k]:
else:
size = 0
for i in kwargs[k]:
@@
-429,7
+447,10
@@
class VPP():
size = v(self, True, buf, off, kwargs[k])
else:
if type(kwargs[k]) is str and v.size < len(kwargs[k]):
size = v(self, True, buf, off, kwargs[k])
else:
if type(kwargs[k]) is str and v.size < len(kwargs[k]):
- raise ValueError(1, 'Input list length mismatch: %s (%s < %s)' % (k, v.size, len(kwargs[k])))
+ raise ValueError(1,
+ 'Input list length mismatch: '
+ '%s (%s < %s)' %
+ (k, v.size, len(kwargs[k])))
v.pack_into(buf, off, kwargs[k])
size = v.size
else:
v.pack_into(buf, off, kwargs[k])
size = v.size
else:
@@
-548,7
+569,8
@@
class VPP():
raise ValueError('Variable Length Array must be last: ' + name)
size, s = self.__struct(*f)
args[field_name] = s
raise ValueError('Variable Length Array must be last: ' + name)
size, s = self.__struct(*f)
args[field_name] = s
- if type(s) == list and type(s[0]) == int and type(s[1]) == struct.Struct:
+ if type(s) == list and type(s[0]) == int and \
+ type(s[1]) == struct.Struct:
if s[0] < 0:
sizes[field_name] = size
else:
if s[0] < 0:
sizes[field_name] = size
else:
@@
-578,10
+600,11
@@
class VPP():
def make_function(self, name, i, msgdef, multipart, async):
if (async):
def make_function(self, name, i, msgdef, multipart, async):
if (async):
- f = lambda **kwargs: (self._call_vpp_async(i, msgdef, **kwargs))
+ def f(**kwargs):
+ return self._call_vpp_async(i, msgdef, **kwargs)
else:
else:
- f = lambda **kwargs: (self._call_vpp(i, msgdef, multipart,
-
**kwargs)
)
+ def f(**kwargs):
+
return self._call_vpp(i, msgdef, multipart, **kwargs
)
args = self.messages[name]['args']
argtypes = self.messages[name]['argtypes']
f.__name__ = str(name)
args = self.messages[name]['args']
argtypes = self.messages[name]['argtypes']
f.__name__ = str(name)
@@
-625,7
+648,7
@@
class VPP():
"""Send a binary-packed message to VPP."""
if not self.connected:
raise IOError(1, 'Not connected')
"""Send a binary-packed message to VPP."""
if not self.connected:
raise IOError(1, 'Not connected')
- return vpp_api.vac_write(
str
(buf), len(buf))
+ return vpp_api.vac_write(
bytes
(buf), len(buf))
def _read(self):
if not self.connected:
def _read(self):
if not self.connected: