summaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorWataru Ishida <ishida.wataru@lab.ntt.co.jp>2016-11-16 21:45:27 -0500
committerWataru Ishida <ishida.wataru@lab.ntt.co.jp>2016-11-17 23:22:55 -0500
commit93d1dca70aa0ae3b34050d24ad7462b8757213bf (patch)
tree29c369dfb6d2180e62bf51a5819eff8644bbc81a /tools
parent24e397b0f65b1c5294ea711a953501fda944411d (diff)
config: simplify route-disposition configuration
before: ```yaml actions: route-disposition: accept-route: true reject-route: false ``` after ```yaml action: router-disposition: accept-route ``` Signed-off-by: Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'tools')
-rw-r--r--tools/config/example_toml.go5
-rw-r--r--tools/pyang_plugins/bgpyang2golang.py32
2 files changed, 29 insertions, 8 deletions
diff --git a/tools/config/example_toml.go b/tools/config/example_toml.go
index 11ab2939..62e6b8f6 100644
--- a/tools/config/example_toml.go
+++ b/tools/config/example_toml.go
@@ -156,10 +156,7 @@ func policy() config.RoutingPolicy {
},
},
Actions: config.Actions{
- RouteDisposition: config.RouteDisposition{
- AcceptRoute: false,
- RejectRoute: true,
- },
+ RouteDisposition: "reject-route",
BgpActions: config.BgpActions{
SetCommunity: config.SetCommunity{
SetCommunityMethod: config.SetCommunityMethod{
diff --git a/tools/pyang_plugins/bgpyang2golang.py b/tools/pyang_plugins/bgpyang2golang.py
index f6ea1a86..a7a59866 100644
--- a/tools/pyang_plugins/bgpyang2golang.py
+++ b/tools/pyang_plugins/bgpyang2golang.py
@@ -18,6 +18,7 @@ import optparse
import StringIO
import sys
from pyang import plugin
+from collections import namedtuple
_COPYRIGHT_NOTICE = """
// DO NOT EDIT
@@ -207,6 +208,9 @@ def emit_class_def(ctx, yang_statement, struct_name, prefix):
if is_case(child):
continue
+ if is_choice(child) and is_enum_choice(child):
+ emit_type_name = val_name_go
+
# case leaflist
if is_leaflist(child):
type_obj = child.search_one('type')
@@ -239,7 +243,7 @@ def emit_class_def(ctx, yang_statement, struct_name, prefix):
emit_type_name = '[]'+t.golang_name
# case container
- elif is_container(child) or is_choice(child):
+ elif is_container(child) or (is_choice(child) and not is_enum_choice(child)):
key = child_prefix+':'+container_or_list_name
t = ctx.golang_struct_names[key]
val_name_go = t.golang_name
@@ -380,7 +384,7 @@ def visit_children(ctx, module, children):
t = c.search_one('type')
# define container embeded enums
- if is_leaf(c) and c.search_one('type').arg == 'enumeration':
+ def define_enum(c):
prefix = module.i_prefix
c.path = get_path(c)
c.golang_name = convert_to_golang(c.arg)
@@ -389,12 +393,17 @@ def visit_children(ctx, module, children):
else:
ctx.golang_typedef_map[prefix] = {c.arg: c}
- if is_list(c) or is_container(c) or is_choice(c):
+ if is_leaf(c) and c.search_one('type').arg == 'enumeration':
+ define_enum(c)
+ elif is_list(c) or is_container(c) or is_choice(c):
c.golang_name = convert_to_golang(c.uniq_name)
if is_choice(c):
picks = pickup_choice(c)
c.i_children = picks
+ if is_enum_choice(c):
+ define_enum(c)
+ continue
if ctx.golang_struct_names.get(prefix+':'+c.uniq_name):
ext_c = ctx.golang_struct_names.get(prefix+':'+c.uniq_name)
@@ -504,6 +513,12 @@ def emit_enum(prefix, name, stmt, substmts):
const_prefix = convert_const_prefix(type_name_org)
print >> o, 'const ('
m = {}
+
+ if is_choice(stmt) and is_enum_choice(stmt):
+ n = namedtuple('Statement', ['arg'])
+ n.arg = 'none'
+ substmts = [n] + substmts
+
for sub in substmts:
enum_name = '%s_%s' % (const_prefix, convert_const_prefix(sub.arg))
m[sub.arg.lower()] = enum_name
@@ -580,7 +595,9 @@ def emit_typedef(ctx, module):
t = stmt.search_one('type')
o = StringIO.StringIO()
- if t.arg == 'enumeration':
+ if not t and is_choice(stmt):
+ emit_enum(prefix, type_name_org, stmt, stmt.i_children)
+ elif t.arg == 'enumeration':
emit_enum(prefix, type_name_org, stmt, t.substmts)
elif t.arg == 'union':
print >> o, '// typedef for typedef %s:%s'\
@@ -642,6 +659,13 @@ def is_case(s):
def is_choice(s):
return s.keyword in ['choice']
+def is_enum_choice(s):
+ return all(e.search_one('type').arg in _type_enum_case for e in s.i_children)
+
+_type_enum_case = [
+ 'empty',
+]
+
def is_builtin_type(t):
return t.arg in _type_builtin