aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools/vppapigen
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-03-01 14:53:12 +0100
committerNeale Ranns <nranns@cisco.com>2018-03-05 16:44:28 +0000
commitf7b7fa53b7eaec81d8c00c1023fb7d01f1f9761f (patch)
tree4367f86fbb2c335c0e6d893a3eb6981ea7a63927 /src/tools/vppapigen
parentf313b747ad4313a5cadfdb6aa7eb66ce8bf7958f (diff)
API: Add service definitions for events and singleton messages.
Change-Id: I7de987c30b263d43521e6280c5273f30b5f6e11c Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/tools/vppapigen')
-rwxr-xr-xsrc/tools/vppapigen/vppapigen.py47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/tools/vppapigen/vppapigen.py b/src/tools/vppapigen/vppapigen.py
index a230e2290e3..620b2ef7b71 100755
--- a/src/tools/vppapigen/vppapigen.py
+++ b/src/tools/vppapigen/vppapigen.py
@@ -41,6 +41,7 @@ class VPPAPILexer(object):
'service': 'SERVICE',
'rpc': 'RPC',
'returns': 'RETURNS',
+ 'null': 'NULL',
'stream': 'STREAM',
'events': 'EVENTS',
'define': 'DEFINE',
@@ -115,12 +116,6 @@ class VPPAPILexer(object):
# A string containing ignored characters (spaces and tabs)
t_ignore = ' \t'
-
-class Iterator(type):
- def __iter__(self):
- return self.iter()
-
-
class Service():
def __init__(self, caller, reply, events=[], stream=False):
self.caller = caller
@@ -346,7 +341,8 @@ class VPPAPIParser(object):
p[0] = p[1] + [p[2]]
def p_service_statement(self, p):
- '''service_statement : RPC ID RETURNS ID ';'
+ '''service_statement : RPC ID RETURNS NULL ';'
+ | RPC ID RETURNS ID ';'
| RPC ID RETURNS STREAM ID ';'
| RPC ID RETURNS ID EVENTS event_list ';' '''
if len(p) == 8:
@@ -571,15 +567,16 @@ class VPPAPI(object):
if isinstance(o2, Service):
s['services'].append(o2)
- # Create services implicitly
+
msgs = {d.name: d for d in s['defines']}
svcs = {s.caller: s for s in s['services']}
+ seen_services = {}
for service in svcs:
if service not in msgs:
raise ValueError('Service definition refers to unknown message'
' definition: {}'.format(service))
- if svcs[service].reply not in msgs:
+ if svcs[service].reply != 'null' and svcs[service].reply not in msgs:
raise ValueError('Service definition refers to unknown message'
' definition in reply: {}'
.format(svcs[service].reply))
@@ -588,12 +585,18 @@ class VPPAPI(object):
raise ValueError('Service definition refers to unknown '
'event: {} in message: {}'
.format(event, service))
+ seen_services[event] = True
+ # Create services implicitly
for d in msgs:
- if msgs[d].singular is True:
+ if d in seen_services:
continue
- if d.endswith('_counters'):
+ if msgs[d].singular is True:
continue
+ #if d.endswith('_counters'):
+ # continue
+ #if d.endswith('_event'):
+ # continue
if d.endswith('_reply'):
if d[:-6] in svcs:
continue
@@ -629,10 +632,16 @@ class VPPAPI(object):
return s
- def process_imports(self, objs):
+ def process_imports(self, objs, in_import):
+ imported_objs = []
for o in objs:
if isinstance(o, Import):
- return objs + self.process_imports(o.result)
+ return objs + self.process_imports(o.result, True)
+ if in_import:
+ if isinstance(o, Define) and o.typeonly:
+ imported_objs.append(o)
+ if in_import:
+ return imported_objs
return objs
@@ -664,9 +673,6 @@ def dirlist_get():
# Main
#
def main():
- logging.basicConfig()
- log = logging.getLogger('vppapigen')
-
cliparser = argparse.ArgumentParser(description='VPP API generator')
cliparser.add_argument('--pluginpath', default=""),
cliparser.add_argument('--includedir', action='append'),
@@ -692,11 +698,18 @@ def main():
else:
filename = ''
+ if args.debug:
+ logging.basicConfig(stream=sys.stdout, level=logging.WARNING)
+ else:
+ logging.basicConfig()
+ log = logging.getLogger('vppapigen')
+
+
parser = VPPAPI(debug=args.debug, filename=filename, logger=log)
result = parser.parse_file(args.input, log)
# Build a list of objects. Hash of lists.
- result = parser.process_imports(result)
+ result = parser.process_imports(result, False)
s = parser.process(result)
# Add msg_id field