CORD-1389: xproto extension to support policies
Change-Id: I5d6c11107d5bc9cd82e41c4a8e6a378d22d7fb61
diff --git a/lib/xos-genx/xosgenx/generator.py b/lib/xos-genx/xosgenx/generator.py
index 668d351..8a4e1a8 100755
--- a/lib/xos-genx/xosgenx/generator.py
+++ b/lib/xos-genx/xosgenx/generator.py
@@ -191,11 +191,13 @@
models = {}
models[model] = v.models[model]
messages = [XOSGenerator._find_message_by_model_name(v.messages, model)]
+
rendered[model] = template.render(
{"proto":
{
'message_table': models,
'messages': messages,
+ 'policies': v.policies,
'message_names': [m['name'] for m in messages]
},
"context": context,
@@ -209,6 +211,7 @@
{
'message_table': v.models,
'messages': v.messages,
+ 'policies': v.policies,
'message_names': [m['name'] for m in v.messages]
},
"context": context,
diff --git a/lib/xos-genx/xosgenx/proto2xproto.py b/lib/xos-genx/xosgenx/proto2xproto.py
index f05c2bc..3723e7c 100644
--- a/lib/xos-genx/xosgenx/proto2xproto.py
+++ b/lib/xos-genx/xosgenx/proto2xproto.py
@@ -1,4 +1,5 @@
import plyxproto.model as m
+from plyxproto.helpers import Visitor
import pdb
import argparse
import plyxproto.parser as plyxproto
@@ -47,7 +48,7 @@
except:
return obj
-class Proto2XProto(m.Visitor):
+class Proto2XProto(Visitor):
def __init__(self):
super(Proto2XProto, self).__init__()
diff --git a/lib/xos-genx/xosgenx/xos2jinja.py b/lib/xos-genx/xosgenx/xos2jinja.py
index 929526d..c58260e 100644
--- a/lib/xos-genx/xosgenx/xos2jinja.py
+++ b/lib/xos-genx/xosgenx/xos2jinja.py
@@ -1,5 +1,5 @@
import plyxproto.model as m
-import pdb
+from plyxproto.helpers import Visitor
import argparse
import plyxproto.parser as plyxproto
import traceback
@@ -64,7 +64,6 @@
try:
rev_links[l['peer']['fqn']].append(rlink)
except TypeError:
- pdb.set_trace()
pass
except KeyError:
rev_links[l['peer']['fqn']] = [rlink]
@@ -97,12 +96,7 @@
''' XOS2Jinja overrides the underlying visitor pattern to transform the tree
in addition to traversing it '''
-
-class XOS2Jinja(m.Visitor):
-
- def get_stack(self):
- return self.stack
-
+class XOS2Jinja(Visitor):
def __init__(self):
super(XOS2Jinja, self).__init__()
@@ -112,6 +106,7 @@
self.package = None
self.message_options = {}
self.count_stack = Stack()
+ self.policies = {}
self.content = ""
self.offset = 0
self.current_message_name = None
@@ -119,6 +114,16 @@
self.first_field = True
self.first_method = True
+ def visit_PolicyDefinition(self, obj):
+ if self.package:
+ pname = '.'.join([self.package, obj.name.value.pval])
+ else:
+ pname = obj.name.value.pval
+
+ self.policies[pname] = obj.body
+
+ return True
+
def visit_PackageStatement(self, obj):
dotlist = obj.name.value
dotlist2 = [f.pval for f in dotlist]
@@ -177,6 +182,10 @@
s['src_port'] = obj.src_port.value.pval
s['name'] = obj.src_port.value.pval
+ try:
+ s['policy'] = obj.policy.pval
+ except AttributeError:
+ s['policy'] = None
try:
s['dst_port'] = obj.dst_port.value.pval
@@ -218,6 +227,12 @@
s['type'] = obj.ftype.name.pval
s['name'] = obj.name.value.pval
+
+ try:
+ s['policy'] = obj.policy.pval
+ except AttributeError:
+ s['policy'] = None
+
s['modifier'] = obj.field_modifier.pval
s['id'] = obj.fieldId.pval
@@ -293,6 +308,11 @@
model_name = obj.name.value.pval
model_def = {'name':obj.name.value.pval,'fields':fields,'links':links, 'bases':obj.bases, 'options':self.message_options, 'package':self.package, 'fqn': model_name, 'rlinks': []}
+ try:
+ model_def['policy'] = obj.policy.pval
+ except AttributeError:
+ model_def['policy'] = None
+
self.stack.push(model_def)
self.models[model_name] = model_def
@@ -352,4 +372,4 @@
def visit_LinkSpec(self, obj):
count = self.count_stack.pop()
self.count_stack.push(count + 1)
- return True
\ No newline at end of file
+ return True