summaryrefslogtreecommitdiffstats
path: root/src/tools/vppapigen/vppapigen.py
diff options
context:
space:
mode:
authorMarek Gradzki <mgradzki@cisco.com>2018-03-06 10:05:44 +0100
committerMarek Gradzki <mgradzki@cisco.com>2018-03-06 10:09:12 +0100
commit51e59688359ddac32ed58f3add3ea9ac358c9132 (patch)
tree98308da8c6eeb9ed1da7c960f78658541c4c3aff /src/tools/vppapigen/vppapigen.py
parent2de1f15355f9e183e46ee4ea94523a7dd4921ec0 (diff)
API: Add service definitions for events and singleton messages (second attempt)
Based on https://gerrit.fd.io/r/#/c/10920/ Updates service definition in stats.api with correct reply message names. Change-Id: I3282bee5304e667e23bc1fab3f43d967a50d880d Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'src/tools/vppapigen/vppapigen.py')
-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