From 8b590420ea6febbf405dc7fec7445b1351d7f07a Mon Sep 17 00:00:00 2001 From: "yogalakshmi.pa" Date: Fri, 1 Jan 2016 02:17:47 +0530 Subject: [PATCH] Modified Flowlist,FLowlistentry Keytypes in VTN Coordinator to invoke VTN Manager RPC Change-Id: Ib35d0929c231cb9aa70417c965aa4d6db7716e26 Signed-off-by: yogalakshmi.pa --- coordinator/modules/odcdriver/code_gen.py | 346 +++++++--- coordinator/modules/odcdriver/flowlist.rest | 433 ++++++++++++ .../modules/odcdriver/flowlistentry.rest | 398 +++++++++++ .../modules/odcdriver/include/odc_flowlist.hh | 325 +-------- coordinator/modules/odcdriver/nodes.rest | 1 + coordinator/modules/odcdriver/odc_flowlist.cc | 616 ++++++++++-------- coordinator/modules/odcdriver/port.rest | 1 + coordinator/modules/odcdriver/topo.rest | 1 + coordinator/modules/odcdriver/vbrif.rest | 4 +- coordinator/modules/odcdriver/vbrif_port.rest | 4 +- coordinator/modules/odcdriver/vtermif.rest | 3 +- .../modules/odcdriver/vtermif_portmap.rest | 4 +- coordinator/modules/odcdriver/vterminal.rest | 3 +- coordinator/modules/odcdriver/vtn.rest | 3 +- .../restjsonutil/include/json_build_parse.hh | 3 +- .../modules/restjsonutil/json_build_parse.cc | 7 +- .../test/modules/odcdriver/ut/Makefile | 1 - .../stub/restjsonutil/json_build_parse.hh | 9 +- 18 files changed, 1495 insertions(+), 667 deletions(-) create mode 100644 coordinator/modules/odcdriver/flowlist.rest create mode 100644 coordinator/modules/odcdriver/flowlistentry.rest diff --git a/coordinator/modules/odcdriver/code_gen.py b/coordinator/modules/odcdriver/code_gen.py index 1942427a..1065d188 100755 --- a/coordinator/modules/odcdriver/code_gen.py +++ b/coordinator/modules/odcdriver/code_gen.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -38,6 +38,8 @@ def begin_namespace(item, file_desc, output_file_name, d): # This method will generate multiple objects if parse class has nested objects def read_nested_object(item, file_desc, members, output_file_name, d): + print 'objects' + print 'members', members url_name = parser.ReadValues(item, 'ROOT')['url_class'] class_parsename = parser.ReadValues(item, 'ROOT').has_key('parse_class') method = parser.ReadValues(item, 'ROOT')['methods'] @@ -47,6 +49,7 @@ def read_nested_object(item, file_desc, members, output_file_name, d): if str(check_key) == 'True': interface_members = parser.ReadValues(item, url_name)['interface'] for members in interface_members.split(','): + print 'members-----1---', members objects = objects + 'std::string ' + 'get_%s'%(members.lower()) + '()' objects = objects + '{' +'\n\t' objects = objects + 'return %s_;'%(members) + '\n' @@ -132,6 +135,7 @@ def fill_config(item, req_mem, file_desc, output_file_name, d): check_bool = parser.ReadValues(item, req_mem)['check_bool_set'] child = parser.ReadValues(item, req_mem)['members'] req_key = parser.ReadValues(item, req_mem)['key'] + check_mem = parser.ReadValues(item,req_mem)['is_child'] fill_method = 'UncRespCode set_%s('%(struct_name) +'json_object* json_parser) {' + '\n' fill_method = fill_method + 'int ret_val = restjson::REST_OP_FAILURE;' + '\n' fill_method = fill_method +'json_object* obj_%s'%(req_mem) + '= NULL;' + '\n' @@ -139,17 +143,17 @@ def fill_config(item, req_mem, file_desc, output_file_name, d): fill_method = fill_method +'ret_val = restjson::JsonBuildParse::parse(json_parser,%s,0,'%(req_key) +'obj_%s);'%(req_mem) + '\n' elif check_bool == 'yes': fill_method = fill_method +'ret_val = restjson::JsonBuildParse::parse(json_parser,%s,-1,'%(req_key) +'obj_%s);'%(req_mem) + '\n' - if req_mem_type == 'struct': - fill_method = fill_method + 'if (restjson::REST_OP_SUCCESS != ret_val) { ' + '\n' - fill_method = fill_method + '\t' + 'json_object_put(json_parser);' + '\n' - fill_method = fill_method + '\t' + 'pfc_log_error(" Error while parsing %s");'%(req_mem) + '\n' - fill_method = fill_method + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' +'\n' - fill_method = fill_method +'}' + '\n' - fill_method = fill_method + 'if (json_object_is_type(obj_%s, json_type_null)) {'%(req_mem) + '\n' - fill_method = fill_method + '\t' + 'json_object_put(json_parser);' + '\n' - fill_method = fill_method + '\t' + 'pfc_log_error("No %s present");'%(req_mem) + '\n' - fill_method = fill_method + '\t' + 'return UNC_RC_SUCCESS;' +'\n' - fill_method = fill_method +'}' + '\n' + if (req_mem_type == 'struct') and (check_mem == "yes"): + fill_method = fill_method + 'if (restjson::REST_OP_SUCCESS != ret_val) { ' + '\n' + fill_method = fill_method + '\t' + 'json_object_put(json_parser);' + '\n' + fill_method = fill_method + '\t' + 'pfc_log_error(" Error while parsing %s");'%(req_mem) + '\n' + fill_method = fill_method + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' +'\n' + fill_method = fill_method +'}' + '\n' + fill_method = fill_method + 'if (json_object_is_type(obj_%s, json_type_null)) {'%(req_mem) + '\n' + fill_method = fill_method + '\t' + 'json_object_put(json_parser);' + '\n' + fill_method = fill_method + '\t' + 'pfc_log_error("No %s present");'%(req_mem) + '\n' + fill_method = fill_method + '\t' + 'return UNC_RC_SUCCESS;' +'\n' + fill_method = fill_method +'}' + '\n' else: fill_method = fill_method + 'if ((restjson::REST_OP_SUCCESS != ret_val) || (json_object_is_type(obj_%s, json_type_null))) {'%(req_mem) + '\n' fill_method = fill_method + '\t' + 'json_object_put(json_parser);' + '\n' @@ -160,29 +164,35 @@ def fill_config(item, req_mem, file_desc, output_file_name, d): file = open(output_file_name, "a") file.write(d['fill']) file.close() - if req_mem_type == 'struct': - fill_struct = '' - fill_struct = fill_struct + '%s st_%s ;' %(req_mem, req_mem)+ '\n' - for child_st in child.split(','): - child_key = parser.ReadValues(item,child_st)['key'] - fill_struct = fill_struct + 'ret_val = unc::restjson::JsonBuildParse::parse(obj_%s,%s,-1,st_%s.%s);'%(req_mem,child_key,req_mem,child_st) + '\n' - fill_struct = fill_struct + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' - fill_struct = fill_struct + '\t' + 'json_object_put(json_parser);' + '\n' - fill_struct = fill_struct + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' +'\n' - fill_struct = fill_struct + '}' + '\n' - fill_struct = fill_struct + '%s_.push_back(st_%s);' %(req_mem,req_mem) + '\n' - d['fill'] = fill_struct - file = open(output_file_name, "a") - file.write(d['fill']) - file.close() + if (req_mem_type == 'struct') and (check_mem == "no"): + fill_struct = '' + fill_struct = fill_struct + '%s st_%s ;' %(req_mem, req_mem)+ '\n' + for child_st in child.split(','): + print 'Printing child-name---', child_st + child_key = parser.ReadValues(item,child_st)['key'] + fill_struct = fill_struct + 'ret_val = unc::restjson::JsonBuildParse::parse(obj_%s,%s,-1,st_%s.%s);'%(req_mem,child_key,req_mem,child_st) + '\n' + fill_struct = fill_struct + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' + fill_struct = fill_struct + '\t' + 'json_object_put(json_parser);' + '\n' + fill_struct = fill_struct + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' +'\n' + fill_struct = fill_struct + '}' + '\n' + fill_struct = fill_struct + '%s_.push_back(st_%s);' %(req_mem,req_mem) + '\n' + d['fill'] = fill_struct + file = open(output_file_name, "a") + file.write(d['fill']) + file.close() for child in child.split(','): - print 'child-name', child + print 'child-name---', child child_type = parser.ReadValues(item, child)['type'] - print 'child_type', child_type - if child_type == 'array': + print 'child_type=====', child_type obj_in = 'obj_' + req_mem + if child_type == 'array': + print "obj_in-------->1", obj_in ar_obj = parse_array_object(item, child, obj_in, output_file_name, d) print "json object to parse member:", ar_obj + elif child_type != 'array' and (check_mem == 'yes'): + child_struct = parser.ReadValues(item,child)['struct_name'] + array_index = "arr_idx" + parse_member(item, child_struct, obj_in, child, array_index, output_file_name, d) func_end = 'if (restjson::REST_OP_SUCCESS != ret_val)' + '\n' func_end = func_end + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' + '\n' func_end = func_end + 'return UNC_RC_SUCCESS;' + '\n' @@ -216,10 +226,11 @@ def build_config(item, req_mem, file_desc, output_file_name, d): child_type = parser.ReadValues(item, child)['type'] key_name = parser.ReadValues(item, child)['key'] key_s = key_name.replace('"', '') + print key_s if child_type != 'struct': write_build(item, key_name, struct_name, child, key_s, child_type, output_file_name, d) - elif child_type == 'struct': - print "struct---", key_name + elif child_type == 'struct' : + print " struct---", key_name st_name = struct_name +'_st.'+ child +'_' parent_obj = 'jobj' print "st_name from build struct--->", st_name @@ -267,10 +278,13 @@ def del_build_config(item, req_mem, file_desc, output_file_name, d): child_type = parser.ReadValues(item, child_input)['type'] key_name = parser.ReadValues(item, child_input)['key'] key_s = key_name.replace('"', '') - if child_input.endswith('name') : + if ((child_input.endswith('name')) or (child_type == 'array')) : + print "child_mem", child_input + print "struct---", key_name st_name = struct_name +'_st.'+ child +'_' write_st_name = struct_name +'_st.'+ child parent_obj = 'jobj' + print "st_name from build struct--->", st_name if i == 0: build_st_begin = 'if (%s.valid == true) {' %(st_name)+ '\n' build_st_begin = build_st_begin + '\t' + 'json_object *%s_obj = unc::restjson::JsonBuildParse::create_json_obj();'%(child) + '\n' @@ -280,7 +294,19 @@ def del_build_config(item, req_mem, file_desc, output_file_name, d): file.close() i = i+1 if child_type != 'struct': - del_write_build(item, key_name, write_st_name, child_input, key_s, child_type, child, output_file_name, d) + print " DEL struct", child_input,child_type + if child_type == 'array': + child_arr = parser.ReadValues(item,child_input)['members'] + for child_arr_mem in child_arr.split(','): + del_check = parser.ReadValues(item,child_arr_mem).has_key('del_key') + print "array del check", del_check,child_arr_mem + if str(del_check) == 'True': + key_del = parser.ReadValues(item,child_arr_mem)['del_key'] + key_delete = key_del.replace('"', '') + print "Checking the delete key", key_del,child_arr_mem + del_write_build(item, key_name, write_st_name, child_input, key_delete, child_type, child, output_file_name, d) + else : + del_write_build(item, key_name, write_st_name, child_input, key_s, child_type, child, output_file_name, d) if j == 0 : if child_type == 'string': build_st_end = build_st_end + 'if((!%s.%s.empty())'%(st_name, child_input) @@ -290,8 +316,10 @@ def del_build_config(item, req_mem, file_desc, output_file_name, d): build_st_end = build_st_end + 'if(%s.%s != -1 '%(st_name, child_input) j = j+1 else : + print "inside else",i if child_type == 'string': build_st_end = build_st_end + ' && (!%s.%s.empty())'%(st_name, child_input) + print "PRintingG 2", st_name, child_input elif child_type == 'bool': build_st_end = build_st_end + ' && (%s.%s != PFC_FALSE '%(st_name, child_input) elif child_type == 'int': @@ -334,20 +362,23 @@ def del_build_config(item, req_mem, file_desc, output_file_name, d): # This method will generate the request body for build members def write_build(item, key_name, struct_name, child, key_s, child_type, output_file_name, d): + iter = "iter_" + child build_member = '' if child_type == 'string' or child_type == 'int' or child_type == 'bool': if child_type == 'string': build_member = build_member + 'if(!%s_st.%s.empty()){'%(struct_name, child) + '\n' elif child_type == 'int': build_member = build_member + 'if (%s_st.%s != -1){'%(struct_name, child) + '\n' - elif child_type == 'bool': - build_member = build_member + 'if (%s_st.%s != false){'%(struct_name, child) + '\n' + #elif child_type == 'bool': + #build_member = build_member + 'if (%s_st.%s != false){'%(struct_name, child) + '\n' build_member = build_member + '\t' + 'ret_val = unc::restjson::JsonBuildParse::build(%s,%s_st.%s,jobj);'%(key_name, struct_name, child) + '\n' build_member = build_member + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' build_member = build_member + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) + '\n' build_member = build_member + '\t' + 'json_object_put(jobj);' + '\n' build_member = build_member + '\t' + 'return NULL;' + '\n' - build_member = build_member + '\t' + '}' + '\n' + '}' + '\n' + build_member = build_member + '\t' + '}' + '\n' + if child_type != 'bool': + build_member = build_member + '}' + '\n' d['build_member'] = build_member file = open(output_file_name, "a") file.write(d['build_member']) @@ -356,8 +387,8 @@ def write_build(item, key_name, struct_name, child, key_s, child_type, output_fi print "array object build method" members = parser.ReadValues(item, child)['members'] build_member = build_member + 'json_object* %s_obj = unc::restjson::JsonBuildParse::create_json_array_obj();' %(child) + '\n' - build_member = build_member + 'std::list <%s>::iterator iter=%s_st.%s_.begin();' %(child,struct_name,child) + '\n' - build_member = build_member + 'while ( iter != %s_st.%s_.end() ) {' %(struct_name,child) + '\n' + build_member = build_member + 'std::list <%s>::iterator %s=%s_st.%s_.begin();' %(child,iter,struct_name,child) + '\n' + build_member = build_member + 'while ( %s != %s_st.%s_.end() ) {' %(iter,struct_name,child) + '\n' build_member = build_member + 'json_object *jobj_%s = unc::restjson::JsonBuildParse::create_json_obj();' %(child) + '\n' d['build_member'] = build_member file = open(output_file_name, "a") @@ -367,9 +398,9 @@ def write_build(item, key_name, struct_name, child, key_s, child_type, output_fi build_support = parser.ReadValues(item, arr_mem)['build_support'] if build_support == 'yes': mem_obj = 'jobj_'+child - build_array_object(item,arr_mem,mem_obj,output_file_name,d) + build_array_object(item,arr_mem,mem_obj,iter,output_file_name,d) build_member_end = 'unc::restjson::JsonBuildParse::add_to_array(%s_obj,jobj_%s);' %(child,child)+ '\n' - build_member_end = build_member_end + 'iter++;' + '\n' + build_member_end = build_member_end + '%s++;' %iter + '\n' build_member_end = build_member_end + '}' + '\n' build_member_end = build_member_end + 'ret_val = unc::restjson::JsonBuildParse::build("%s",%s_obj,jobj);' %(key_s,child) +'\n' build_member_end = build_member_end + 'if (restjson::REST_OP_SUCCESS != ret_val) {' +'\n' @@ -384,7 +415,7 @@ def write_build(item, key_name, struct_name, child, key_s, child_type, output_fi print "unsupported type" # This method will generate delete request body for build members -def del_write_build(item, key_name, struct_name, child, key_s, child_type, child_input, output_file_name, d): +def del_write_build(item, key_name, struct_name, child, key, child_type, child_input, output_file_name, d): build_member = '' if child_type == 'string' or child_type == 'int' or child_type == 'bool': if child_type == 'string': @@ -395,7 +426,7 @@ def del_write_build(item, key_name, struct_name, child, key_s, child_type, child build_member = build_member + 'if (%s_st.%s != false){'%(struct_name, child) + '\n' build_member = build_member + '\t' + 'ret_val = unc::restjson::JsonBuildParse::build(%s,%s_.%s,%s_obj);'%(key_name, struct_name, child,child_input) + '\n' build_member = build_member + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' - build_member = build_member + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) + '\n' + build_member = build_member + '\t' + 'pfc_log_error("Error in building request body %s");'%(key) + '\n' build_member = build_member + '\t' + 'json_object_put(jobj);' + '\n' build_member = build_member + '\t' + 'return NULL;' + '\n' build_member = build_member + '\t' + '}' + '\n' + '}' + '\n' @@ -407,24 +438,23 @@ def del_write_build(item, key_name, struct_name, child, key_s, child_type, child print "array object build method" members = parser.ReadValues(item, child)['members'] build_member = build_member + 'json_object* %s_obj = unc::restjson::JsonBuildParse::create_json_array_obj();' %(child) + '\n' - build_member = build_member + 'std::list <%s>::iterator iter=%s_st.%s_.begin();' %(child,struct_name,child) + '\n' - build_member = build_member + 'while ( iter != %s_st.%s_.end() ) {' %(struct_name,child) + '\n' - build_member = build_member + 'json_object *jobj_%s = unc::restjson::JsonBuildParse::create_json_obj();' %(child) + '\n' + build_member = build_member + 'std::list <%s>::iterator iter=%s_.%s_.begin();' %(child,struct_name,child) + '\n' + build_member = build_member + 'while ( iter != %s_.%s_.end() ) {' %(struct_name,child) + '\n' d['build_member'] = build_member file = open(output_file_name, "a") file.write(d['build_member']) file.close() + build_member_end = '' for arr_mem in members.split(','): - build_support = parser.ReadValues(item, arr_mem)['build_support'] - if build_support == 'yes': - mem_obj = 'jobj_'+child - build_array_object(item,arr_mem,mem_obj,output_file_name,d) - build_member_end = 'unc::restjson::JsonBuildParse::add_to_array(%s_obj,jobj_%s);' %(child,child)+ '\n' + del_check = parser.ReadValues(item,arr_mem).has_key('del_key') + if str(del_check) == 'True': + build_member_end = 'json_object *jobj_%s = unc::restjson::JsonBuildParse::create_json_int_obj(iter->%s);' %(child,arr_mem) + '\n' + build_member_end = build_member_end + 'unc::restjson::JsonBuildParse::add_to_array(%s_obj,jobj_%s);' %(child,child)+ '\n' build_member_end = build_member_end + 'iter++;' + '\n' build_member_end = build_member_end + '}' + '\n' - build_member_end = build_member_end + 'ret_val = unc::restjson::JsonBuildParse::build("%s",%s_obj,jobj);' %(key_s,child) +'\n' + build_member_end = build_member_end + 'ret_val = unc::restjson::JsonBuildParse::build("%s",%s_obj,%s_obj);' %(key,child,child_input) +'\n' build_member_end = build_member_end + 'if (restjson::REST_OP_SUCCESS != ret_val) {' +'\n' - build_member_end = build_member_end + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) +'\n' + build_member_end = build_member_end + '\t' + 'pfc_log_error("Error in building request body %s");'%(key) +'\n' build_member_end = build_member_end + '\t' + 'return NULL;' + '\n' build_member_end = build_member_end + '}' +'\n' d['build_member_end'] = build_member_end @@ -434,8 +464,51 @@ def del_write_build(item, key_name, struct_name, child, key_s, child_type, child else: print "unsupported type" +def build_array_object(item, arr_mem, mem_obj, iter,output_file_name, d): + mem_type = parser.ReadValues(item, arr_mem)['type'] + key_name = parser.ReadValues(item, arr_mem)['key'] + key_s = key_name.replace('"', '') + if mem_type == 'struct': + st_name = iter + '->' + arr_mem + '_' + build_struct(item, st_name, arr_mem, mem_obj, output_file_name, d) + if mem_type == 'array': + st_name = iter + '->' + write_st_build(item,key_name, st_name ,arr_mem, key_s, mem_type, mem_obj, output_file_name, d) + elif mem_type == 'string' or mem_type == 'int' or mem_type == 'bool': + mem_name = iter + '->' + write_array_st_build(key_name, mem_name, arr_mem, key_s, mem_type,mem_obj, output_file_name, d) + +def write_array_st_build(key_name, st_name, child, key_s, child_type, parent, output_file_name, d): + #for build structmembers + build_st_member = '' + print "inside write_array_st_build", child_type + if child_type == 'string' or child_type == 'int' or child_type == 'bool': + if child_type == 'string': + build_st_member = build_st_member + 'if(!%s%s.empty()){'%(st_name, child) + '\n' + elif child_type == 'int': + build_st_member = build_st_member + 'if (%s%s != -1){'%(st_name, child) + '\n' + #elif child_type == 'bool': + #build_method = build_st_member + 'if (%s->%s != false){'%(st_name, child) + '\n' + build_st_member = build_st_member +'\t' + 'ret_val = unc::restjson::JsonBuildParse::build(%s,%s%s,%s);'%(key_name, st_name, child, parent) + '\n' + build_st_member = build_st_member + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' + build_st_member = build_st_member + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) + '\n' + build_st_member = build_st_member + '\t' + 'json_object_put(jobj);' + '\n' + build_st_member = build_st_member + '\t' + 'return NULL;' + '\n' + build_st_member = build_st_member + '}' + '\n' + if child_type != 'bool': + build_st_member = build_st_member + '}' + '\n' + d['build_st_member'] = build_st_member + file = open(output_file_name, "a") + file.write(d['build_st_member']) + file.close() + else: + print "unsupported type" + + # This method will generate build methods for nested-structure members -def write_st_build(key_name, st_name, child, key_s, child_type, parent, output_file_name, d): +def write_st_build(item,key_name, st_name, child, key_s, child_type, parent, output_file_name, d): + #for build structmembers + iter = "iter_" + child build_st_member = '' print "inside write_st_build",child_type if child_type == 'string' or child_type == 'int' or child_type == 'bool': @@ -443,31 +516,68 @@ def write_st_build(key_name, st_name, child, key_s, child_type, parent, output_f build_st_member = build_st_member + 'if(!%s.%s.empty()){'%(st_name, child) + '\n' elif child_type == 'int': build_st_member = build_st_member + 'if (%s.%s != -1){'%(st_name, child) + '\n' - elif child_type == 'bool': - build_st_member = build_st_member + 'if (%s.%s != false){'%(st_name, child) + '\n' + #elif child_type == 'bool': + #build_st_member = build_st_member + 'if (%s.%s != false){'%(st_name, child) + '\n' build_st_member = build_st_member +'\t' + 'ret_val = unc::restjson::JsonBuildParse::build(%s,%s.%s,%s);'%(key_name, st_name, child, parent) + '\n' build_st_member = build_st_member + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' build_st_member = build_st_member + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) + '\n' build_st_member = build_st_member + '\t' + 'json_object_put(jobj);' + '\n' build_st_member = build_st_member + '\t' + 'return NULL;' + '\n' build_st_member = build_st_member + '}' + '\n' - build_st_member = build_st_member + '}' + '\n' + if child_type != 'bool': + build_st_member = build_st_member + '}' + '\n' d['build_st_member'] = build_st_member file = open(output_file_name, "a") file.write(d['build_st_member']) file.close() + elif child_type == 'array': + print "array object build method" + members = parser.ReadValues(item, child)['members'] + build_arr_member = 'json_object* %s_obj = unc::restjson::JsonBuildParse::create_json_array_obj();' %(child) + '\n' + if st_name.endswith('->'): + print "PRINTING ITER in write_st_build", st_name, child + build_arr_member = build_arr_member + 'std::list <%s>::iterator %s = %s%s_.begin();' %(child,iter,st_name,child) + '\n' + build_arr_member = build_arr_member + 'while ( %s != %s%s_.end() ) {' %(iter,st_name,child) + '\n' + else: + print "PRINTING ITER in ELSE write_st_build", st_name,child + build_arr_member = build_arr_member + 'std::list <%s>::iterator %s = %s.%s_.begin();' %(child,iter,st_name,child) + '\n' + build_arr_member = build_arr_member + 'while ( %s != %s.%s_.end() ) {' %(iter,st_name,child) + '\n' + build_arr_member = build_arr_member + 'json_object *jobj_%s = unc::restjson::JsonBuildParse::create_json_obj();' %(child) + '\n' + d['build_arr_member'] = build_arr_member + file = open(output_file_name, "a") + file.write(d['build_arr_member']) + file.close() + for arr_mem in members.split(','): + build_support = parser.ReadValues(item, arr_mem)['build_support'] + if build_support == 'yes': + mem_obj = 'jobj_'+child + build_array_object(item,arr_mem,mem_obj,iter,output_file_name,d) + build_arr_member_end = 'unc::restjson::JsonBuildParse::add_to_array(%s_obj,jobj_%s);' %(child,child)+ '\n' + build_arr_member_end = build_arr_member_end + '%s++;' %iter + '\n' + build_arr_member_end = build_arr_member_end + '}' + '\n' + build_arr_member_end = build_arr_member_end + 'ret_val = unc::restjson::JsonBuildParse::build("%s",%s_obj,%s);' %(key_s,child,parent) +'\n' + build_arr_member_end = build_arr_member_end + 'if (restjson::REST_OP_SUCCESS != ret_val) {' +'\n' + build_arr_member_end = build_arr_member_end + '\t' + 'pfc_log_error("Error in building request body %s");'%(key_s) +'\n' + build_arr_member_end = build_arr_member_end + '\t' + 'return NULL;' + '\n' + build_arr_member_end = build_arr_member_end + '}' +'\n' + d['build_arr_member_end'] = build_arr_member_end + file = open(output_file_name, "a") + file.write(d['build_arr_member_end']) + file.close() + else: print "unsupported type" # This method will only generate build methods if they are mandatory using the mandatory parameter in .rest files def build_struct(item, st_name, member, parent_obj, output_file_name, d): + print "child object received in build_struct", member build_st_begin = 'if (%s.valid == true) {' %(st_name)+ '\n' build_st_begin = build_st_begin + '\t' + 'json_object *%s_obj = unc::restjson::JsonBuildParse::create_json_obj();'%(member) + '\n' d['build_st_begin'] = build_st_begin file = open(output_file_name, "a") file.write(d['build_st_begin']) file.close() - print "st_name inside build_struct",st_name + print "st_name inside build_struct -->",st_name,member st_child_mem = parser.ReadValues(item, member)['members'] st_key = parser.ReadValues(item, member)['key'] for child in st_child_mem.split(','): @@ -480,33 +590,41 @@ def build_struct(item, st_name, member, parent_obj, output_file_name, d): key_s = key_name.replace('"', '') print key_s if child_type != 'struct': - write_st_build(key_name, st_name, child, key_s, child_type, parent, output_file_name, d) + write_st_build(item,key_name, st_name, child, key_s, child_type, parent, output_file_name, d) elif child_type == 'struct': key_name = parser.ReadValues(item, child)['key'] key_s = key_name.replace('"', '') + print "struct---", key_name struct_name = st_name + '.'+ child +'_' - print "st_name to build struct", st_name + print "st_name to build struct--->", st_name build_struct(item, struct_name, child, parent, output_file_name, d) struct_name = st_name i = 0 + first_bool = 0 build_st_end = '' for child in st_child_mem.split(','): + print "SWE readind child",child mandatory_parm = parser.ReadValues(item, child)['mandatory'] + print "MANDAROTY PARAM", mandatory_parm, child type_mem = parser.ReadValues(item, child)['type'] - if mandatory_parm != 'no' and type_mem != 'struct': - if i == 0: + #child_mem = parser.ReadValues(item,child)['members'] + #for child_arr in child_mem.split(','): + #child_arr_type = parser.ReadValues(item,child_arr)['type'] + if mandatory_parm != 'no' and type_mem != 'struct' : + if i == 0: + print "inside if ",i if type_mem == 'string': build_st_end = 'if((!%s.%s.empty())'%(st_name, child) - elif type_mem == 'bool': - build_st_end = 'if((%s.%s != PFC_FALSE) '%(st_name, child) + #if child_arr_type == 'string': + # build_st_end = 'if((!%s.%s.empty())'%(st_name, child_arr) + i = i+1 elif type_mem == 'int': build_st_end = 'if((%s.%s != -1) '%(st_name, child) - i = i+1 - else: + i = i+1 + else: + print "inside else",i if type_mem == 'string': build_st_end = build_st_end + ' && (!%s.%s.empty())'%(st_name, child) - elif type_mem == 'bool': - build_st_end = build_st_end + ' && (%s.%s != PFC_FALSE) '%(st_name, child) elif type_mem == 'int': build_st_end = build_st_end + ' && (%s.%s != -1) '%(st_name, child) print "i value after loop end",i @@ -519,9 +637,9 @@ def build_struct(item, st_name, member, parent_obj, output_file_name, d): build_st_end = build_st_end + '\t json_object_put(%s);'%(parent_obj) + '\n' build_st_end = build_st_end + '\t json_object_put(%s_obj);'%(member) + '\n' build_st_end = build_st_end + '\t return NULL;' + '\n' - build_st_end = build_st_end + '}' + '\n' + '}' + '\n' + build_st_end = build_st_end + '}' + '\n' + '}' + '\n'; else: - build_st_end = build_st_end + '\t' + 'ret_val = unc::restjson::JsonBuildParse::build ' + '\n' + build_st_end = build_st_end + '\t' + '\n' + 'ret_val = unc::restjson::JsonBuildParse::build ' + '\n' build_st_end = build_st_end + '\t \t \t \t (%s, %s_obj, %s);'%(st_key, member, parent_obj) + '\n' build_st_end = build_st_end + 'if (restjson::REST_OP_SUCCESS != ret_val) {'+ '\n' build_st_end = build_st_end + '\t pfc_log_debug("Failed in framing json request body for %s");'%(member) + '\n' @@ -537,27 +655,30 @@ def build_struct(item, st_name, member, parent_obj, output_file_name, d): file.close() # This method will parse members based on structure member data types -def parse_member(item, struct_name, obj_in, member, output_file_name, d): +def parse_member(item, struct_name, obj_in, member, array_index,output_file_name, d): class_name = parser.ReadValues(item, 'ROOT')['parse_class'] class_parse_mem = parser.ReadValues(item, class_name)['parse_request_members'] class_struct = parser.ReadValues(item, class_parse_mem)['struct_name'] req_key = parser.ReadValues(item, member)['key'] type_name = parser.ReadValues(item, member)['type'] - mem_struct = parser.ReadValues(item,member)['struct_name'] - print "Checking the struct types",class_struct, mem_struct + struc_name = parser.ReadValues(item,member)['struct_name'] + parent_strct_type = parser.ReadValues(item, struc_name)['type'] + print "Checking the struct types",class_struct, parent_strct_type key_s = req_key.replace('"', '') print "type_key", type_name parse = parser.ReadValues(item, member)['parse_support'] if type_name == 'struct': - parse_struct_object(item, struct_name, member, obj_in, output_file_name, d) + parse_struct_object(item, struct_name, member, obj_in, array_index, output_file_name, d) elif type_name != 'struct': + object = '' if parse == 'yes': - if class_struct == mem_struct : - object = '\n' + 'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',arr_idx,st_%s.%s);'%(struct_name, member) + '\n' - elif class_struct != mem_struct: + if parent_strct_type == 'array' : + object = '\n' + 'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',%s,st_%s.%s);'%(array_index,struct_name, member) + '\n' + elif parent_strct_type != 'array': object = '\n' + 'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',-1,st_%s.%s);'%(struct_name, member) + '\n' + #object = object + 'st_%s.valid = true;' %(struct_name)+ '\n' if type_name == 'string': - object = object + 'if ((restjson::REST_OP_SUCCESS != ret_val) || (st_%s.%s.empty())) {'%(struct_name, member) + '\n' + object = object + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' elif type_name == 'int': object = object + 'if (restjson::REST_OP_SUCCESS != ret_val) {'+ '\n' elif type_name == 'bool': @@ -573,11 +694,17 @@ def parse_member(item, struct_name, obj_in, member, output_file_name, d): print"member doesnot support parse" # This method will parse the structure objects -def parse_struct_object(item, struct_name, st_member, obj_in, output_file_name, d): +def parse_struct_object(item, struct_name, st_member, obj_in, array_index, output_file_name, d): req_key = parser.ReadValues(item, st_member)['key'] sub_members = parser.ReadValues(item, st_member)['members'] - parse_st = 'json_object *jobj_'+st_member + '= NULL;' +'\n' - parse_st = parse_st + 'ret_val = unc::restjson::JsonBuildParse::parse(%s,%s,arr_idx,jobj_%s);'%(obj_in, req_key, st_member) + '\n' + check_key = parser.ReadValues(item,st_member)['is_child'] + print 'sub_members', sub_members + parse_st = 'json_object *jobj_'+st_member + '= NULL;' +'\n' + if check_key == 'no': + parse_st = parse_st + 'ret_val = unc::restjson::JsonBuildParse::parse(%s,%s,-1,jobj_%s);'%(obj_in, req_key, st_member) + '\n' + elif check_key == 'yes': + parse_st = parse_st + 'ret_val = unc::restjson::JsonBuildParse::parse(%s,%s,%s,jobj_%s);'%(obj_in, req_key, array_index,st_member) + '\n' + parse_st = parse_st + 'st_%s.%s_.valid = true;' %(struct_name,st_member)+ '\n' parse_st = parse_st + 'if (restjson::REST_OP_SUCCESS != ret_val) {' + '\n' parse_st = parse_st + '\t' + 'pfc_log_debug("%s is null");' %(st_member) + '\n' parse_st = parse_st + '\t' + 'json_object_put(%s);' %(obj_in) + '\n' @@ -596,9 +723,9 @@ def parse_struct_object(item, struct_name, st_member, obj_in, output_file_name, if sub_mem_type != 'array': st_name = struct_name +'.'+st_member+'_' parent_obj = 'jobj_' + st_member - parse_member(item, st_name, parent_obj, member, output_file_name, d) + parse_member(item, st_name, parent_obj, member, array_index, output_file_name, d) elif sub_mem_type == 'array': - print "array type inside struct" + parse_array_object(item, member, obj_in, output_file_name, d) # This method will generate parse methods for array-type structure members def parse_array_object(item, member, obj_in, output_file_name, d): @@ -657,12 +784,17 @@ def parse_array_object(item, member, obj_in, output_file_name, d): s_name = parser.ReadValues(item, members)['struct_name'] if sub_mem_type != 'array': print "member send to parse_member", obj - parse_member(item, s_name, obj, members, output_file_name, d) + array_index = "arr_idx" + parse_member(item, s_name, obj, members, array_index,output_file_name, d) elif sub_mem_type == 'array': prefix = 'st_' + st_name parse_nested_array_object(item, members, obj, output_file_name, d, prefix) + #cal nested parse_array obj with prefix + print "PRINTING THE PUSH BACK" , st_name loop_end = st_name +'_.push_back(st_%s);'%(st_name) + '\n' loop_end = loop_end +'}' + '\n' + + #find length parse child members if type array call again parse array with prefix d['loop_end'] = loop_end file = open(output_file_name, "a") file.write(d['loop_end']) @@ -671,26 +803,35 @@ def parse_array_object(item, member, obj_in, output_file_name, d): # This method will generate nested array for structure members def parse_nested_array_object(item, member, obj_in, output_file_name, d, prefix): + print "calling array nested obj" req_key = parser.ReadValues(item, member)['key'] st_name = parser.ReadValues(item, member)['struct_name'] + parent_st_type = parser.ReadValues(item,st_name)['type'] check_bool = parser.ReadValues(item, member)['check_bool_set'] - object = 'uint32_t array_length = 0' + '\n' + array_index = "arr_idx1" + object = 'uint32_t array_length1 = 0;' + '\n' object = object + 'json_object *obj_%s = NULL;'%(member) +'\n' - object = object +'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',-1,obj_%s);'%(member) + '\n' + if check_bool == 'yes': + if parent_st_type == 'array': + object = object +'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',arr_idx,obj_%s);'%(member) + '\n' + elif parent_st_type != 'array': + object = object +'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',0,obj_%s);'%(member) + '\n' + elif check_bool == 'no': + object = object +'ret_val = restjson::JsonBuildParse::parse(%s,%s'%(obj_in, req_key) +',-1,obj_%s);'%(member) + '\n' object = object + 'if ((restjson::REST_OP_SUCCESS != ret_val) || (json_object_is_type(obj_%s, json_type_null))) {'%(member) + '\n' object = object + '\t' + 'json_object_put(json_parser);' + '\n' object = object + '\t' + 'pfc_log_error(" Error while parsing %s");'%(member) + '\n' object = object + '\t' + 'return UNC_DRV_RC_ERR_GENERIC;' + '\n' object = object + '}' + '\n' object = object + 'if (json_object_is_type(obj_%s, json_type_array)) {'%(member) + '\n' - object = object + '\t' + 'array_length = restjson::JsonBuildParse::get_array_length(%s,%s);'%(obj_in, req_key) + '\n' + object = object + '\t' + 'array_length1 = restjson::JsonBuildParse::get_array_length(%s,%s);'%(obj_in, req_key) + '\n' object = object + '}' + '\n' - object = object + 'if (0 == array_length) {' + '\n' + object = object + 'if (0 == array_length1) {' + '\n' object = object + '\t' +'pfc_log_debug("No %s present");'%(member) +'\n' object = object + '\t' +'json_object_put(jobj);' + '\n' object = object + '\t' + 'return UNC_RC_SUCCESS;' + '\n' object = object + '}' + '\n' - object = object + 'for (uint32_t arr_idx = 0; arr_idx < array_length; arr_idx++) {' +'\n' + object = object + 'for (uint32_t %s = 0; %s< array_length1; %s++) {' %(array_index,array_index, array_index)+'\n' object = object + st_name + ' st_%s;'%(st_name) +'\n' d['object'] = object file = open(output_file_name, "a") @@ -705,13 +846,15 @@ def parse_nested_array_object(item, member, obj_in, output_file_name, d, prefix) s_name = parser.ReadValues(item, members)['struct_name'] obj = 'obj_' + member print "member send to parse_member", obj - parse_member(item, s_name, obj, members, output_file_name, d) + parse_member(item, s_name, obj, members, array_index, output_file_name, d) elif sub_mem_type == 'array': - prefix = '.' + st_name + prefix = '.' + st_name print "prefix value", prefix parse_nested_array_object(item, members, obj_in, output_file_name, d, prefix) - loop = prefix +'.push_back(st_%s);'%(st_name) + '\n' + print "PRINTING THE PUSH BACK IN NESTED", prefix,st_name + loop = prefix + '.%s_' %(st_name) + '.push_back(st_%s);'%(st_name) + '\n' loop = loop +'}' + '\n' + #find length parse child members if type array call again parse array with prefix d['loop'] = loop file = open(output_file_name, "a") file.write(d['loop']) @@ -750,6 +893,7 @@ def write_boolean(item, file_desc, member, output_file_name, d): # This method will generate nested objects based on element_type def nested_objects(item, file_desc, member, output_name, d): + print 'entering in to objects nested object method' print 'members', member print 'object' members = parser.ReadValues(item, member)['members'] @@ -758,6 +902,7 @@ def nested_objects(item, file_desc, member, output_name, d): print 'obj_members:', obj_members element_type = parser.ReadValues(item, obj_members)['type'] print 'element_type:', element_type + print 'member:', obj_members if element_type == 'array': print 'calling', write_list write_list(item, file_desc, obj_members, output_file_name, d) @@ -794,6 +939,7 @@ def write_array(item, file_desc, member, output_file_name, d): f.write(d['data_type']) obj_sub_member = parser.ReadValues(item, member)['members'] for obj_member in obj_sub_member.split(','): + print 'arrr', obj_member element_type = parser.ReadValues(item, obj_member)['type'] print element_type write_options[element_type](item, file_desc, obj_member, output_file_name, d) @@ -818,6 +964,7 @@ def write_string(item, file_desc, obj_member, output_file_name, d): def typedef_structure(item, file_desc, method, output_file_name, d): struct_members = parser.ReadValues(item, 'ROOT')['data'] struct_type = parser.ReadValues(item, 'ROOT')['struct_type'] + print 'members-->', struct_members for member in struct_members.split(','): print member members = 'struct %s {'%(member) + '\n' @@ -840,13 +987,11 @@ def typedef_structure(item, file_desc, method, output_file_name, d): print 'count', m_count members = '%s()'%(member) + '\n' if m_count == 1: - if name_type == 'array': - print 'name_type', name_type - members = '%s()'%(member) + '\n' - elif name_type != 'array': - print 'name_type', name_type - members = '%s():'%(member) + '\n' - print 'count', m_count + if name_type == 'array' or name_type == 'struct': + members = '%s()'%(member) + '\n' + else : + members = '%s():'%(member) + '\n' + print 'count', m_count elif m_count > 1: print 'count', m_count members = '%s():'%(member) + '\n' @@ -1026,7 +1171,9 @@ def create_DEL_method(item, operation, HTTP_METHOD_OPERATION, HTTP_CODE_RESP): # It will create GET URL method def get_url_creation(item, file_desc, methods, output_file_name, d): url_name = parser.ReadValues(item, 'READ')['url'] + print 'url_name', url_name url_format = parser.ReadValues(item, url_name)['url_format'] + print 'url_format', url_format print len(url_format) print url_format a = url_format.split(',') @@ -1124,6 +1271,7 @@ def Validate_method(item, file_desc, method, output_file_name, d): print 'VALIDATE' def method(item, file_desc, output_file_name, d): + print 'method implementation' methods = parser.ReadValues(item, 'ROOT')['methods'] print 'methods', methods for method in methods.split(','): diff --git a/coordinator/modules/odcdriver/flowlist.rest b/coordinator/modules/odcdriver/flowlist.rest new file mode 100644 index 00000000..2153de31 --- /dev/null +++ b/coordinator/modules/odcdriver/flowlist.rest @@ -0,0 +1,433 @@ +# Copyright (c) 2015-2016 NEC Corporation +# All rights reserved. +# +# This program and the accompanying materials are made available under the +# terms of the Eclipse Public License v1.0 which accompanies this +# distribution, and is available at http://www.eclipse.org/legal/epl-v10.html + +[flowlist_class] +type=READ,CU,DEL +request_type=object +request_members=flowlists +response_members="flowlists" +http_success=201 + +[flowlist_parser] +type=READ,CU,DEL +request_type=object +parse_request_members=flowlists +build_request_members= ip_flowlists +response_members="flowlists" +http_success=200 + +[READ] +url=FLOWLIST_GETSUPPORT_URL + +[CU] +url=FLOWLIST_COMANSUPPORT_URL + +[DEL] +url=FLOWLIST_DELSUPPORT_URL + +[FLOWLIST_DELSUPPORT_URL] +type=url_string +url_format=BASEURL,SLASH,DEL_FLOWCONDITION + +[FLOWLIST_GETSUPPORT_URL] +type=url_string +url_format=GET_BASEURL,SLASH,GET_FLOWCONDITIONS + + +[FLOWLIST_COMANSUPPORT_URL] +type=url_string +url_format=BASEURL,SLASH,FLOWCONDITIONS + +[GET_BASEURL] +type=url_string +value="/restconf/operational" + +[BASEURL] +type=url_string +value="/restconf/operations" + +[SLASH] +type=url_string +value="/" + +[DEL_FLOWCONDITION] +type=url_string +value="vtn-flow-condition:remove-flow-condition" + +[FLOWCONDITIONS] +type=url_string +value="vtn-flow-condition:set-flow-condition" + +[GET_FLOWCONDITIONS] +type=url_string +value="vtn-flow-condition:vtn-flow-conditions" + +[udp_dst_port_to] +type=string +key="port_to" +is_child=yes +struct_name=pa_udp_destination_range +mandatory=no +build_support=no +parse_support=no + +[udp_dst_port_from] +type=string +key="port_from" +is_child=yes +struct_name=pa_udp_destination_range +mandatory=no +build_support=no +parse_support=no + +[pa_udp_destination_range] +type=struct +key="udp-destination-range" +is_child=yes +struct_name=vtn_flow_match +members=udp_dst_port_from,udp_dst_port_to,valid +mandatory=no +build_support=no +parse_support=no + +[udp_src_port_to] +type=string +key="port_to" +is_child=yes +struct_name=pa_udp_source_range +mandatory=no +build_support=no +parse_support=no + +[udp_src_port_from] +type=string +key="port_from" +is_child=yes +struct_name=pa_udp_source_range +mandatory=no +build_support=no +parse_support=no + +[pa_udp_source_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=vtn_flow_match +members=udp_src_port_from,udp_src_port_to,valid +mandatory=no +build_support=no +parse_support=no + +[dst_port_to] +type=int +key="port_to" +is_child=yes +struct_name=tcp_destination_range +mandatory=no +build_support=no +parse_support=yes + +[dst_port_from] +type=int +key="port_from" +is_child=yes +struct_name=tcp_destination_range +mandatory=no +build_support=no +parse_support=yes + +[tcp_source_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=vtn_flow_match +members=src_port_from,src_port_to,valid +mandatory=no +build_support=no +parse_support=yes + + +[tcp_destination_range] +type=struct +key="tcp-destination-range" +is_child=yes +struct_name=vtn_flow_match +members=dst_port_from,dst_port_to,valid +mandatory=no +build_support=no +parse_support=yes + +[src_port_to] +type=int +key="port-to" +is_child=yes +struct_name=tcp_source_range +mandatory=no +build_support=no +parse_support=yes + + +[src_port_from] +type=int +key="port-from" +is_child=yes +struct_name=tcp_source_range +mandatory=no +build_support=no +parse_support=yes + +[tcp_source_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=vtn_flow_match +members=src_port_from,src_port_to,valid +mandatory=no +build_support=no +parse_support=yes + +[icmp_code] +type=int +key="icmp-code" +is_child=yes +struct_name=vtn_flow_match +mandatory=no +build_support=no +parse_support=yes + + +[icmp_type] +type=int +key="icmp-type" +is_child=yes +struct_name=vtn_flow_match +mandatory=no +build_support=no +parse_support=yes + +[dscp] +type=int +key="dscp" +is_child=yes +struct_name=vtn_inet_match +mandatory=no +build_support=no +parse_support=yes + +[protocol] +type=int +key="protocol" +is_child=yes +struct_name=vtn_inet_match +mandatory=no +build_support=no +parse_support=yes + +[destination_network] +type=string +key="destination-network" +is_child=yes +struct_name=vtn_inet_match +mandatory=yes +build_support=no +parse_support=yes + + +[source_network] +type=string +key="source-network" +is_child=yes +struct_name=vtn_inet_match +mandatory=no +build_support=no +parse_support=yes + +[ether_type] +type=int +key="ether-type" +is_child=yes +struct_name=vtn_ether_match +mandatory=no +build_support=no +parse_support=yes + +[vlanpri] +type=int +key="vlan-pcp" +is_child=yes +struct_name=vtn_ether_match +mandatory=no +build_support=no +parse_support=yes + +[destination_address] +type=string +key="destination-address" +is_child=yes +struct_name=vtn_ether_match +mandatory=no +build_support=no +parse_support=yes + +[source_address] +type=string +key="source-address" +is_child=yes +struct_name=vtn_ether_match +mandatory=no +build_support=no +parse_support=yes + +[vtn_inet_match] +type=struct +key="vtn-inet-match" +is_child=yes +struct_name=vtn_flow_match +mandatory=no +members=source_network,destination_network,protocol,dscp,valid +build_support=no +parse_support=yes + +[vtn_ether_match] +type=struct +key="vtn-ether-match" +is_child=yes +struct_name=vtn_flow_match +members=source_address,destination_address,vlanpri,ether_type,valid +build_support=no +mandatory=no +parse_support=yes + +[flow_index] +type=int +key="index" +struct_name=vtn_flow_match +mandatory=yes +build_support=no +parse_support=yes + +[vtn_flow_match] +type=array +key="vtn-flow-match" +is_child=yes +check_bool_set=yes +struct_name=vtn_flow_match +members=flow_index,vtn_ether_match,vtn_inet_match,icmp_type,icmp_code,tcp_source_range,tcp_destination_range,pa_udp_source_range,pa_udp_destination_range,valid +build_support=no +parse_support=yes + +[name] +type=string +key="name" +is_child=yes +check_bool_set=no +struct_name=flowlist +build_support=no +mandatory=yes +parse_support=yes + +[valid] +type=bool +key="" +struct_name=vtn_flow_match +mandatory=no +build_support=no +parse_support=no + +[flowlist] +type=array +key="vtn-flow-condition" +is_child=yes +check_bool_set=no +struct_name = flowlist +members= name,vtn_flow_match +build_support=no +parse_support=yes + +[valid] +type=bool +key="" +struct_name=input_flowlist +mandatory=no +build_support=no +parse_support=no + +[present] +type=bool +key="present" +is_child=yes +check_bool_set=no +struct_name=input_flowlist +build_support=yes +mandatory=yes +parse_support=no + +[operation] +type=string +key="operation" +is_child=yes +check_bool_set=no +struct_name=input_flowlist +build_support=yes +mandatory=yes +parse_support=no + +[ip_name] +type=string +key="name" +is_child=yes +check_bool_set=no +struct_name=input_flowlist +build_support=yes +mandatory=yes +parse_support=no + +[input_flowlist] +type=struct +key="input" +is_child=yes +check_bool_set=yes +struct_name = ip_flowlist +members= ip_name,operation,present,valid +build_support = yes +parse_support = no + +[ip_flowlist] +type=struct +key="ip_flowlist" +is_child=yes +check_bool_set=yes +struct_name = ip_flowlist +members= input_flowlist,valid +build_support = yes +parse_support = no + +[ip_flowlists] +type=object +key="ip_flowlists" +is_child=yes +check_bool_set=yes +struct_name = ip_flowlist +members= ip_flowlist +build_support = yes +parse_support = no + +[flowlists] +type=object +key="vtn-flow-conditions" +is_child=yes +check_bool_set=yes +struct_name = flowlist +members=flowlist + +[ROOT] +url_class = flowlist_class +parse_class= flowlist_parser +namespace=odcdriver +struct_type = vtn_flow_match,flowlist,ip_flowlist +data=pa_udp_source_range,pa_udp_destination_range,tcp_source_range,tcp_destination_range,vtn_ether_match,vtn_inet_match,vtn_flow_match,flowlist,input_flowlist,ip_flowlist +methods= flowlist_class diff --git a/coordinator/modules/odcdriver/flowlistentry.rest b/coordinator/modules/odcdriver/flowlistentry.rest new file mode 100644 index 00000000..b6b026c5 --- /dev/null +++ b/coordinator/modules/odcdriver/flowlistentry.rest @@ -0,0 +1,398 @@ +# Copyright (c)2015- 2016 NEC Corporation +# All rights reserved. +# +# This program and the accompanying materials are made available under the +# terms of the Eclipse Public License v1.0 which accompanies this +# distribution, and is available at http://www.eclipse.org/legal/epl-v10.html + +[flowlistentry_class] +type=CU,DEL,READ +interface=cond_name +request_type=object +request_members=flowlistentrys +response_members="flowlistentrys" + + +[flowlistentry_parser] +type=CU,DEL,READ +request_type=object +build_request_members=ip_flowlistentrys +parse_request_members=flowlistentrys +response_members="flowlistentrys" + +[CU] +url=FLOWLISTENTRY_COMANSUPPORT_URL + +[READ] +url=FLOWLISTENTRY_GETSUPPORT_URL + +[DEL] +url=FLOWLISTENTRY_DELSUPPORT_URL + +[FLOWLISTENTRY_GETSUPPORT_URL] +type=url_string +url_format=BASEURL,SLASH,FLOWCONDITIONS,COLON,GET_FLOWCONDITION + + +[FLOWLISTENTRY_COMANSUPPORT_URL] +type=url_string +url_format=BASEURL,SLASH,FLOWCONDITIONS,COLON,CU_FLOWCONDITION + +[FLOWLISTENTRY_DELSUPPORT_URL] +type=url_string +url_format=BASEURL,SLASH,FLOWCONDITIONS,COLON,DEL_FLOWCONDITION + +[BASEURL] +type=url_string +value="/restconf/operations" + +[SLASH] +type=url_string +value="/" + +[COLON] +type=url_string +value=":" + +[FLOWCONDITIONS] +type=url_string +value="vtn-flow-condition" + +[GET_FLOWCONDITION] +type=url_string +value="vtn-flow-conditions" + +[CU_FLOWCONDITION] +type=url_string +value="set-flow-condition-match" + +[DEL_FLOWCONDITION] +type=url_string +value="remove-flow-condition" + +[cond_name] +type=url_string +get_abstract=yes + +[udp_dst_port_to] +type=string +key="port_to" +is_child=yes +struct_name=udp_destination_range +mandatory=no +build_support=yes +parse_support=no + +[udp_dst_port_from] +type=string +key="port_from" +is_child=yes +struct_name=udp_destination_range +mandatory=no +build_support=yes +parse_support=no + +[udp_destination_range] +type=struct +key="udp-destination-range" +is_child=yes +struct_name=match +members=udp_dst_port_from,udp_dst_port_to,valid +mandatory=no +build_support=yes +parse_support=no + +[udp_src_port_to] +type=string +key="port_to" +is_child=yes +struct_name=udp_source_range +mandatory=no +build_support=yes +parse_support=no + +[udp_src_port_from] +type=string +key="port_from" +is_child=yes +struct_name=udp_source_range +mandatory=no +build_support=yes +parse_support=no + +[udp_source_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=match +members=udp_src_port_from,udp_src_port_to,valid +mandatory=no +build_support=yes +parse_support=no + +[dst_port_to] +type=string +key="port_to" +is_child=yes +struct_name=tcp_dest_range +mandatory=no +build_support=yes +parse_support=no + +[dst_port_from] +type=string +key="port_from" +is_child=yes +struct_name=tcp_dest_range +mandatory=no +build_support=yes +parse_support=no + +[tcp_src_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=match +members=src_port_from,src_port_to,valid +mandatory=no +build_support=yes +parse_support=no + + +[tcp_dest_range] +type=struct +key="tcp-destination-range" +is_child=yes +struct_name=match +members=dst_port_from,dst_port_to,valid +mandatory=no +build_support=yes +parse_support=no + +[src_port_to] +type=string +key="port-to" +is_child=yes +struct_name=tcp_src_range +mandatory=no +build_support=yes +parse_support=no + + +[src_port_from] +type=string +key="port-from" +is_child=yes +struct_name=tcp_src_range +mandatory=no +build_support=yes +parse_support=no + +[tcp_src_range] +type=struct +key="tcp-source-range" +is_child=yes +struct_name=match +members=src_port_from,src_port_to,valid +mandatory=no +build_support=yes +parse_support=no + +[icmp_code] +type=int +key="icmp-code" +is_child=yes +struct_name=match +mandatory=yes +build_support=yes +parse_support=no + + +[icmp_type] +type=int +key="icmp-type" +is_child=yes +struct_name=match +mandatory=no +build_support=yes +parse_support=no + +[dscp] +type=int +key="dscp" +is_child=yes +struct_name=inet_match +mandatory=no +build_support=yes +parse_support=no + +[protocol] +type=int +key="protocol" +is_child=yes +struct_name=inet_match +mandatory=no +build_support=yes +parse_support=no + +[dest_network] +type=string +key="destination-network" +is_child=yes +struct_name=inet_match +mandatory=yes +build_support=yes +parse_support=no + + +[src_network] +type=string +key="source-network" +is_child=yes +struct_name=inet_match +mandatory=no +build_support=yes +parse_support=no + +[ether_type] +type=int +key="ether-type" +is_child=yes +struct_name=ether_match +mandatory=yes +build_support=yes +parse_support=no + +[vlanpri] +type=int +key="vlan-pcp" +is_child=yes +struct_name=ether_match +mandatory=no +build_support=yes +parse_support=no + +[dest_addr] +type=string +key="destination-address" +is_child=yes +struct_name=ether_match +mandatory=no +build_support=yes +parse_support=no + +[src_addr] +type=string +key="source-address" +is_child=yes +struct_name=ether_match +mandatory=no +build_support=yes +parse_support=no + +[inet_match] +type=struct +key="vtn-inet-match" +is_child=yes +struct_name=inet_match +mandatory=no +members=src_network,dest_network,protocol,dscp,valid +build_support=yes +parse_support=no + +[ether_match] +type=struct +key="vtn-ether-match" +is_child=yes +struct_name=match +members=src_addr,dest_addr,vlanpri,ether_type,valid +build_support=yes +mandatory=no +parse_support=no + +[index] +type=int +key="index" +del_key="match-index" +struct_name=match +mandatory=yes +build_support=yes +parse_support=no + +[match] +type=array +key="flow-match-list" +is_child=yes +check_bool_set=no +struct_name=match +members=index,ether_match,inet_match,tcp_src_range,tcp_dest_range,icmp_type,icmp_code,udp_source_range,udp_destination_range,valid +build_support=yes +mandatory=yes +parse_support=no + +[name] +type=string +key="name" +is_child=yes +check_bool_set=no +struct_name=in_flowcond +build_support=yes +mandatory=yes +parse_support=no + +[valid] +type=bool +key="" +struct_name=match +mandatory=no +build_support=no +parse_support=no + +[in_flowcond] +type=struct +key="input" +is_child=yes +check_bool_set=no +struct_name = ip_flowlistentry +members= name,match,valid +build_support=yes +parse_support=no + +[ip_flowlistentry] +type=struct +key="ip_flowlistentry" +is_child=yes +check_bool_set=yes +struct_name = ip_flowlistentry +members = in_flowcond,valid +build_support=yes +parse_support=no + +[ip_flowlistentrys] +type=object +key="ip_flowlistentrys" +is_child=yes +check_bool_set=yes +struct_name = ip_flowlistentry +members = ip_flowlistentry +build_support=yes +parse_support=no + +[flowlistentrys] +type=object +key="flowlistentrys" +is_child=no +check_bool_set=no +struct_name = ip_flowlistentry +members = flowlistentrys +build_support=no +parse_support=no + + +[ROOT] +url_class = flowlistentry_class +parse_class= flowlistentry_parser +namespace=odcdriver +struct_type = match,ip_flowlistentry +data=udp_source_range,udp_destination_range,tcp_src_range,tcp_dest_range,ether_match,inet_match,match,in_flowcond,ip_flowlistentry +methods= flowlistentry_class diff --git a/coordinator/modules/odcdriver/include/odc_flowlist.hh b/coordinator/modules/odcdriver/include/odc_flowlist.hh index 24e49d5d..795b8e7d 100644 --- a/coordinator/modules/odcdriver/include/odc_flowlist.hh +++ b/coordinator/modules/odcdriver/include/odc_flowlist.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 NEC Corporation + * Copyright (c) 2014-2016 NEC Corporation * All rights reserved. * * This program and the accompanying materials are made available under the @@ -14,11 +14,12 @@ #include #include #include -#include +#include #include #include #include #include +#include #include #include #include @@ -26,238 +27,9 @@ namespace unc { namespace odcdriver { - - -class odl_flowlist_http_request: public odl_http_rest_intf { - -public: - odl_flowlist_http_request(flowcondition *value, std::string url, - flowConditions *read_value, pfc_bool_t entry): - url_(url), - flow_condition_(value), - flow_conditions_(read_value), - is_entry_(entry) {} - - // Is multiple requests need to be sent to handle the request? - pfc_bool_t is_multiple_requests(unc::odcdriver::OdcDriverOps Op) { - return PFC_FALSE; - } - -// Provide a list of request indicators for multiple request scenario. - UncRespCode get_multi_request_indicator( - unc::odcdriver::OdcDriverOps Op, - std::set *arg_list) { - ODC_FUNC_TRACE; - return UNC_RC_SUCCESS; - } - -// Construct the URL for the operation -// The request indicator will ne SINGLE as default - UncRespCode construct_url(unc::odcdriver::OdcDriverOps Op, - std::string &request_indicator, - std::string &url) { - ODC_FUNC_TRACE; - url=url_; - return UNC_RC_SUCCESS; - } - -// Construct Request body for the operation - UncRespCode construct_request_body(unc::odcdriver::OdcDriverOps Op, - std::string &request_indicator, - json_object *object) { - ODC_FUNC_TRACE; - UncRespCode ret = UNC_RC_SUCCESS; - if ( Op != unc::odcdriver::CONFIG_READ && - Op != unc::odcdriver::CONFIG_DELETE ) { - unc::odcdriver::flowConditionsUtil util_; - if ( is_entry_ == PFC_FALSE ) { - ret=util_.SetValue(object,flow_condition_); - } else { - std::list ::iterator iter_; - iter_ = flow_condition_->match_.begin(); - if ( iter_ != flow_condition_->match_.end() && (*iter_ == NULL) ) { - pfc_log_error("No Contents in match"); - } else { - UncRespCode ret(util_.SetValue(object,*iter_)); - if ( ret != UNC_RC_SUCCESS ) { - pfc_log_error("Failed to Copy from flowcondtion to json!!"); - return ret; - } - } - } - } else { - pfc_log_info("READ or delete"); - } - return ret; - } -// Return the HTTP operation intended - restjson::HttpMethod get_http_method( - unc::odcdriver::OdcDriverOps Op, - std::string &request_indicator) { - - ODC_FUNC_TRACE; - if ( Op == unc::odcdriver::CONFIG_READ ) - return unc::restjson::HTTP_METHOD_GET; - if ( Op == unc::odcdriver::CONFIG_CREATE ) - return unc::restjson::HTTP_METHOD_POST; - if ( Op == unc::odcdriver::CONFIG_DELETE) - return unc::restjson::HTTP_METHOD_DELETE; - if ( Op == unc::odcdriver::CONFIG_UPDATE) - return unc::restjson::HTTP_METHOD_PUT; - return unc::restjson::HTTP_METHOD_GET; - } - -// Validate the response code handed - UncRespCode validate_response_code(unc::odcdriver::OdcDriverOps Op, - std::string &request_indicator, - int resp_code) { - ODC_FUNC_TRACE; - - pfc_log_info("the Response code is %d",resp_code); - if (HTTP_200_RESP_OK != resp_code && - HTTP_201_RESP_CREATED != resp_code && - HTTP_204_NO_CONTENT != resp_code) { - return UNC_DRV_RC_ERR_GENERIC; - } - return UNC_RC_SUCCESS; - } - -// Read the response of the http request from data - UncRespCode handle_response(unc::odcdriver::OdcDriverOps Op, - std::string &request_indicator, - char* data) { - ODC_FUNC_TRACE; - if ( Op == unc::odcdriver::CONFIG_READ ) { - unc::odcdriver::flowConditionsUtil util_; - json_object *parse(unc::restjson::JsonBuildParse::get_json_object(data)); - if ( parse != NULL ) { - unc::restjson::json_obj_destroy_util delete_obj(parse); - UncRespCode ret(util_.GetValue( parse, flow_conditions_)); - if ( ret != UNC_RC_SUCCESS ) - return ret; - } else { - return UNC_DRV_RC_ERR_GENERIC; - } - } - return UNC_RC_SUCCESS; - } - -private: - std::string url_; - flowcondition* flow_condition_; - flowConditions* flow_conditions_; - pfc_bool_t is_entry_; -}; - -template -class OdcFlowConditionCmd { - -private: - unc::restjson::ConfFileValues_t conf_values_; - pfc_bool_t is_entry_; - -public: - OdcFlowConditionCmd(unc::restjson::ConfFileValues_t conf_values, - pfc_bool_t is_entry): - conf_values_(conf_values), - is_entry_(is_entry) {} - - ~OdcFlowConditionCmd() {} - - virtual std::string get_url_tail(key &key_in,value &val_in)=0; - - // Copy from Key Value Structure to FlowConditions Structure - virtual void copy(flowcondition *out, key &key_in, value &value_val_in) = 0; - virtual void copy(flowcondition* out, key &key_in, - value &value_old_in, value &value_new_in)=0; - - // Copy from FlowConditions List and send to platform - virtual UncRespCode r_copy(flowConditions *in, - std::vector &cfgnode_vector) =0; - - UncRespCode run_command(key& key_in, - value& val_in, - unc::driver::controller *ctr, - unc::odcdriver::OdcDriverOps Op) { - ODC_FUNC_TRACE; - flowcondition command_; - //Copy Contents from key and val - copy(&command_,key_in,val_in); - - std::string url = ""; - url.append(BASE_URL); - url.append(CONTAINER_NAME); - url.append("/"); - url.append("flowconditions"); - url.append("/"); - url.append(get_url_tail(key_in,val_in)); - - pfc_log_info("The Flow list URL: %s",url.c_str()); - - odl_flowlist_http_request flow_cond_request(&command_,url, NULL, is_entry_); - - odl_http_request odl_fc_create; - return odl_fc_create.handle_request(ctr, - Op, - &flow_cond_request, - conf_values_); - } - UncRespCode run_command(key& key_in, - value& val_old_in, - value& val_new_in, - unc::driver::controller *ctr, - unc::odcdriver::OdcDriverOps Op) { - ODC_FUNC_TRACE; - flowcondition command_; - //Copy Contents from key and val - copy(&command_,key_in,val_old_in, val_new_in); - - std::string url = ""; - url.append(BASE_URL); - url.append(CONTAINER_NAME); - url.append("/"); - url.append("flowconditions"); - url.append("/"); - url.append(get_url_tail(key_in,val_new_in)); - pfc_log_info("The Flow list URL: %s",url.c_str()); - - odl_flowlist_http_request flow_cond_request(&command_,url, NULL, is_entry_); - - - odl_http_request odl_fc_create; - return odl_fc_create.handle_request(ctr, - Op, - &flow_cond_request, - conf_values_); - } - UncRespCode odl_flow_condition_read_all( unc::driver::controller *ctr, - std::vector &cfgnode_vector) { - ODC_FUNC_TRACE; - flowConditions read_all_; - std::string url = ""; - url.append(RESTCONF_BASE); - url.append("/"); - url.append("vtn-flow-condition:vtn-flow-conditions"); - pfc_log_info("The Flow list URL: %s",url.c_str()); - - odl_flowlist_http_request flow_cond_request(NULL,url,&read_all_,is_entry_); - odl_http_request odl_fc_create; - UncRespCode ret (odl_fc_create.handle_request(ctr, - unc::odcdriver::CONFIG_READ, - &flow_cond_request, - conf_values_)); - if ( ret != UNC_RC_SUCCESS ) - return ret; - - return r_copy(&read_all_,cfgnode_vector); - } - -}; - - +using namespace unc::restjson; class OdcFlowListCommand: public - unc::driver::vtn_driver_command , - unc::odcdriver::OdcFlowConditionCmd + unc::driver::vtn_driver_command { public: @@ -266,7 +38,6 @@ public: * @param[in] - conf file values */ explicit OdcFlowListCommand(unc::restjson::ConfFileValues_t conf_values): - OdcFlowConditionCmd(conf_values,PFC_FALSE), conf_file_values_(conf_values) {} /** @@ -275,24 +46,15 @@ public: ~OdcFlowListCommand() {} UncRespCode create_cmd(key_flowlist &key_in, val_flowlist &val_in, - unc::driver::controller *ctr) { - ODC_FUNC_TRACE; - return run_command(key_in, - val_in, - ctr, - unc::odcdriver::CONFIG_UPDATE); - return UNC_RC_SUCCESS; - } + unc::driver::controller *ctr_ptr) ; UncRespCode delete_cmd(key_flowlist &key_in, val_flowlist &val_in, - unc::driver::controller *ctr) { - ODC_FUNC_TRACE; - return run_command(key_in, - val_in, - ctr, - unc::odcdriver::CONFIG_DELETE); - } + unc::driver::controller *ctr_ptr); + /** + * method to construct request body + */ + void create_request_body (key_flowlist &key_in, val_flowlist &val_in, flowlist& flowlist_st); UncRespCode update_cmd(key_flowlist &key_in, val_flowlist &val_old_in, val_flowlist &val_new_in, @@ -310,34 +72,26 @@ public: UncRespCode fetch_config( unc::driver::controller* ctr, void* parent_key, - std::vector &cfgnode_vector) { + std::vector &cfgnode_vector); - ODC_FUNC_TRACE; - return odl_flow_condition_read_all(ctr,cfgnode_vector); - } +UncRespCode r_copy(std::list &flowlist_detail, + std::vector &cfgnode_vector); - void copy (flowcondition* out, + void copy (ip_flowlist& ip_flowlist_st, key_flowlist& in_key, val_flowlist& in_val); - void copy (flowcondition* out, - key_flowlist& in_key, - val_flowlist& old_val, - val_flowlist& new_val); - UncRespCode r_copy (flowConditions *in, - std::vector &cfgnode_vector); - - std::string get_url_tail(key_flowlist& in_key, - val_flowlist& in_val); +void +delete_request_body(key_flowlist &key_in, + val_flowlist &val_in, + ip_flowlist& ip_flowlist_st); private: unc::restjson::ConfFileValues_t conf_file_values_; }; class OdcFlowListEntryCommand: public unc::driver::vtn_driver_command , - unc::odcdriver::OdcFlowConditionCmd { @@ -347,7 +101,6 @@ public: * @param[in] - conf file values */ explicit OdcFlowListEntryCommand(unc::restjson::ConfFileValues_t conf_values): - OdcFlowConditionCmd(conf_values, PFC_TRUE), conf_file_values_(conf_values) {} /** @@ -357,36 +110,17 @@ public: UncRespCode create_cmd(key_flowlist_entry &key_in, val_flowlist_entry &val_in, - unc::driver::controller *ctr) { - ODC_FUNC_TRACE; - return run_command(key_in, - val_in, - ctr, - unc::odcdriver::CONFIG_UPDATE); - } + unc::driver::controller *ctr); UncRespCode delete_cmd(key_flowlist_entry &key_in, val_flowlist_entry &val_in, - unc::driver::controller *ctr) { - ODC_FUNC_TRACE; - return run_command(key_in, - val_in, - ctr, - unc::odcdriver::CONFIG_DELETE); - } + unc::driver::controller *ctr); UncRespCode update_cmd(key_flowlist_entry &key_in, val_flowlist_entry &val_old_in, val_flowlist_entry &val_new_in, - unc::driver::controller *ctr) { - ODC_FUNC_TRACE; - return run_command(key_in, - val_old_in, - val_new_in, - ctr, - unc::odcdriver::CONFIG_UPDATE); - } + unc::driver::controller *ctr) ; /** * @brief - Method to fetch child configurations for the parent kt * @param[in] - controller pointer @@ -403,21 +137,18 @@ public: return UNC_RC_SUCCESS; } - void copy (flowcondition* out, + void copy (ip_flowlistentry& ip_flowlistentry_st, key_flowlist_entry& in_key, val_flowlist_entry& in_val); - void copy (flowcondition* out, + void copy (ip_flowlistentry& ip_flowlistentry_st, key_flowlist_entry& in_key, val_flowlist_entry& old_val, val_flowlist_entry& new_val); - UncRespCode r_copy (flowConditions *in, - std::vector &cfgnode_vector) { - return UNC_RC_SUCCESS; - } - - std::string get_url_tail(key_flowlist_entry& in_key, - val_flowlist_entry& in_val); +void +delete_request_body(key_flowlist_entry &key_in, + val_flowlist_entry &val_in, + ip_flowlistentry& ip_flowlistentry_st); private: unc::restjson::ConfFileValues_t conf_file_values_; diff --git a/coordinator/modules/odcdriver/nodes.rest b/coordinator/modules/odcdriver/nodes.rest index a64f3089..70b6ba17 100644 --- a/coordinator/modules/odcdriver/nodes.rest +++ b/coordinator/modules/odcdriver/nodes.rest @@ -142,6 +142,7 @@ type=object key="vtn-nodes" struct_name=vtn_node check_bool_set=yes +is_child=yes members=vtn_node # URL section diff --git a/coordinator/modules/odcdriver/odc_flowlist.cc b/coordinator/modules/odcdriver/odc_flowlist.cc index 4ac1ed92..bcccbced 100644 --- a/coordinator/modules/odcdriver/odc_flowlist.cc +++ b/coordinator/modules/odcdriver/odc_flowlist.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 NEC Corporation + * Copyright (c) 2014-2016 NEC Corporation * All rights reserved. * * This program and the accompanying materials are made available under the @@ -11,47 +11,123 @@ namespace unc { namespace odcdriver { - void -OdcFlowListCommand::copy(flowcondition* flow, +OdcFlowListCommand::copy(ip_flowlist& ip_flowlist_st, key_flowlist& key, val_flowlist& val) { ODC_FUNC_TRACE; - char *flowlist_name = reinterpret_cast (key.flowlist_name); - flow->name_.assign(flowlist_name); + ip_flowlist_st.input_flowlist_.valid = true; + ip_flowlist_st.input_flowlist_.ip_name = + reinterpret_cast (key.flowlist_name); + ip_flowlist_st.input_flowlist_.operation = + reinterpret_cast("SET"); + ip_flowlist_st.input_flowlist_.present = false; +} + +UncRespCode +OdcFlowListCommand::create_cmd(key_flowlist &key_in, val_flowlist &val_in, + unc::driver::controller *ctr_ptr) { + ODC_FUNC_TRACE; + PFC_ASSERT(ctr_ptr != NULL); + flowlist_class *req_obj = new flowlist_class(ctr_ptr); + ip_flowlist st_obj; + copy(st_obj, key_in, val_in); + flowlist_parser *parser_obj = new flowlist_parser(); + json_object *jobj = parser_obj->create_req(st_obj); + if (jobj == NULL) { + pfc_log_error("Error in create request"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + if(req_obj->set_post(jobj) != UNC_RC_SUCCESS) { + pfc_log_error("Flowlist Create Failed"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + delete req_obj; + delete parser_obj; + return UNC_RC_SUCCESS; +} + +UncRespCode +OdcFlowListCommand::delete_cmd(key_flowlist &key_in, val_flowlist &val_in, + unc::driver::controller *ctr_ptr) { + ODC_FUNC_TRACE; + PFC_ASSERT(ctr_ptr != NULL); + flowlist_class *req_obj = new flowlist_class(ctr_ptr); + ip_flowlist st_obj; + delete_request_body(key_in,val_in,st_obj); + flowlist_parser *parser_obj = new flowlist_parser(); + json_object *jobj = parser_obj->del_req(st_obj); + if (jobj == NULL) { + pfc_log_error("Error in delete request"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + if(req_obj->set_delete(jobj) != UNC_RC_SUCCESS) { + pfc_log_error("Flowlist Delete Failed"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + delete req_obj; + delete parser_obj; + return UNC_RC_SUCCESS; } + void -OdcFlowListCommand::copy(flowcondition* flow, - key_flowlist& key, - val_flowlist& val_old, - val_flowlist& val_new) { +OdcFlowListCommand::delete_request_body(key_flowlist &key_in, + val_flowlist &val_in, + ip_flowlist& ip_flowlist_st) { ODC_FUNC_TRACE; - char *flowlist_name = reinterpret_cast (key.flowlist_name); - flow->name_.assign(flowlist_name); + ip_flowlist_st.input_flowlist_.valid = true; + ip_flowlist_st.input_flowlist_.ip_name = + reinterpret_cast (key_in.flowlist_name); } -std::string -OdcFlowListCommand::get_url_tail(key_flowlist& key, - val_flowlist& val) { - ODC_FUNC_TRACE; - char *flowlist_name = reinterpret_cast (key.flowlist_name); - std::string url_string(flowlist_name); - return url_string; +UncRespCode OdcFlowListCommand::fetch_config( + unc::driver::controller* ctr_ptr, + void* parent_key, + std::vector &cfgnode_vector) { + flowlist_class *req_obj = new flowlist_class(ctr_ptr); + std::string url = req_obj->get_url(); + pfc_log_info("URL:%s",url.c_str()); + flowlist_parser *parser_obj = new flowlist_parser(); + UncRespCode ret_val = req_obj->get_response(parser_obj); + if (UNC_RC_SUCCESS != ret_val) { + pfc_log_error("Get response error"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + ret_val = parser_obj->set_flowlist(parser_obj->jobj); + if (UNC_RC_SUCCESS != ret_val) { + pfc_log_error("set_flowlist_conf error"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + ret_val = r_copy(parser_obj->flowlist_, cfgnode_vector); + if (UNC_RC_SUCCESS != ret_val) { + pfc_log_error("Error occured while parsing"); + delete req_obj; + delete parser_obj; + return ret_val; + } + return ret_val; } UncRespCode -OdcFlowListCommand::r_copy(flowConditions* in, - std::vector &cfgnode_vector) { +OdcFlowListCommand::r_copy(std::list &flowlist_detail, + std::vector &cfgnode_vector) { ODC_FUNC_TRACE; - unc::odcdriver::OdcUtil util; - if ( in == NULL ) - return UNC_DRV_RC_ERR_GENERIC; - - std::list::iterator list_iter = in->flowcondition_.begin(); + std::list::iterator list_iter = flowlist_detail.begin(); - while ( list_iter != in->flowcondition_.end() ) { - PFC_ASSERT(*list_iter != NULL); + while ( list_iter != flowlist_detail.end() ) { key_flowlist key_fl; val_flowlist val_fl; @@ -59,7 +135,8 @@ OdcFlowListCommand::r_copy(flowConditions* in, memset(&val_fl,0,sizeof(val_flowlist)); // Copy Condition NAme to key!! - strcpy(reinterpret_cast(key_fl.flowlist_name),(*list_iter)->name_.c_str()); + strcpy(reinterpret_cast(key_fl.flowlist_name), + (list_iter)->name.c_str()); // Create Val Structure val_fl.ip_type=UPLL_FLOWLIST_TYPE_IP; @@ -67,19 +144,19 @@ OdcFlowListCommand::r_copy(flowConditions* in, //Addto Cache unc::vtndrvcache::ConfigNode *cfgptr( - new unc::vtndrvcache::CacheElementUtil - (&key_fl,&val_fl, &val_fl, uint32_t(UNC_OP_READ))); + new unc::vtndrvcache::CacheElementUtil + (&key_fl,&val_fl, &val_fl, uint32_t(UNC_OP_READ))); PFC_ASSERT(cfgptr != NULL ); cfgnode_vector.push_back(cfgptr); //Check if Match list has entried to create flowlist entry structures - std::list::iterator match_iter = (*list_iter)->match_.begin(); + std::list::iterator match_iter = + (list_iter)->vtn_flow_match_.begin(); - while ( match_iter != (*list_iter)->match_.end () ) { - PFC_ASSERT(*match_iter != NULL); + while ( match_iter != (list_iter)->vtn_flow_match_.end () ) { - match *match_entry(*match_iter); // Create flowlist entry key key_flowlist_entry key_fl_entry; val_flowlist_entry val_fl_entry; @@ -88,95 +165,82 @@ OdcFlowListCommand::r_copy(flowConditions* in, memset(&val_fl_entry,0,sizeof(val_flowlist_entry)); memcpy(&key_fl_entry.flowlist_key, &key_fl,sizeof(key_flowlist)); - key_fl_entry.sequence_num=(*match_iter)->index_; - if ( match_entry->ethernet_) { - if ( match_entry->ethernet_->src_ != "" ) { - util.convert_macstring_to_uint8(match_entry->ethernet_->src_, - &val_fl_entry.mac_src[0]); + key_fl_entry.sequence_num=(match_iter)->flow_index; + if ( match_iter->vtn_ether_match_.valid == true) { + if ( match_iter->vtn_ether_match_.source_address != "" ) { + util.convert_macstring_to_uint8(match_iter-> + vtn_ether_match_.source_address,&val_fl_entry.mac_src[0]); val_fl_entry.valid[UPLL_IDX_MAC_SRC_FLE] = UNC_VF_VALID; } - if ( match_entry->ethernet_->dst_ != "" ) { - util.convert_macstring_to_uint8(match_entry->ethernet_->dst_, - &val_fl_entry.mac_dst[0]); + if ( match_iter->vtn_ether_match_.destination_address != "" ) { + util.convert_macstring_to_uint8(match_iter-> + vtn_ether_match_.destination_address, &val_fl_entry.mac_dst[0]); val_fl_entry.valid[UPLL_IDX_MAC_DST_FLE] = UNC_VF_VALID; } - if ( match_entry->ethernet_->type_ != -1 ) { - val_fl_entry.mac_eth_type=match_entry->ethernet_->type_; + if ( match_iter->vtn_ether_match_.ether_type != -1 ) { + val_fl_entry.mac_eth_type=match_iter->vtn_ether_match_.ether_type; val_fl_entry.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] = UNC_VF_VALID; } - if ( match_entry->ethernet_->vlanpri_ != -1 ) { - val_fl_entry.vlan_priority=match_entry->ethernet_->vlanpri_; + if ( match_iter->vtn_ether_match_.vlanpri != -1 ) { + val_fl_entry.vlan_priority=match_iter->vtn_ether_match_.vlanpri; val_fl_entry.valid[UPLL_IDX_VLAN_PRIORITY_FLE] = UNC_VF_VALID; } } - if ( match_entry->inetMatch_ ) { - if ( match_entry->inetMatch_->inet4_) { - if ( match_entry->inetMatch_->inet4_->src_ != "" ) { - util.convert_ip_to_inaddr(match_entry->inetMatch_->inet4_->src_, + if ( match_iter->vtn_inet_match_.valid == true) { + if ( match_iter->vtn_inet_match_.source_network != "" ) { + util.convert_ip_to_inaddr(match_iter->vtn_inet_match_.source_network, &val_fl_entry.src_ip); val_fl_entry.valid[UPLL_IDX_SRC_IP_FLE] = UNC_VF_VALID; } - if ( match_entry->inetMatch_->inet4_->dst_ != "" ) { - util.convert_ip_to_inaddr(match_entry->inetMatch_->inet4_->dst_, - &val_fl_entry.dst_ip); + if ( match_iter->vtn_inet_match_.destination_network != "" ) { + util.convert_ip_to_inaddr(match_iter-> + vtn_inet_match_.destination_network, &val_fl_entry.dst_ip); val_fl_entry.valid[UPLL_IDX_DST_IP_FLE] = UNC_VF_VALID; } - val_fl_entry.src_ip_prefixlen= 24; - val_fl_entry.valid[UPLL_IDX_SRC_IP_PREFIX_FLE]=UNC_VF_VALID; - val_fl_entry.dst_ip_prefixlen= 24; - val_fl_entry.valid[UPLL_IDX_DST_IP_PREFIX_FLE]=UNC_VF_VALID; - if ( match_entry->inetMatch_->inet4_->protocol_ != -1 ) { - val_fl_entry.ip_proto=match_entry->inetMatch_->inet4_->protocol_; + if ( match_iter->vtn_inet_match_.protocol != -1 ) { + val_fl_entry.ip_proto= match_iter->vtn_inet_match_.protocol; val_fl_entry.valid[UPLL_IDX_IP_PROTOCOL_FLE]=UNC_VF_VALID; } - if ( match_entry->inetMatch_->inet4_->dscp_ != -1 ) { - val_fl_entry.ip_dscp=match_entry->inetMatch_->inet4_->dscp_; + if ( match_iter->vtn_inet_match_.dscp != -1 ) { + val_fl_entry.ip_dscp=match_iter->vtn_inet_match_.dscp; val_fl_entry.valid[UPLL_IDX_IP_DSCP_FLE]=UNC_VF_VALID; } } - } - - if ( match_entry->l4Match_ ) { - if ( match_entry->l4Match_->icmp_ ) { - if ( match_entry->l4Match_->icmp_->type_ != -1 ) { - val_fl_entry.icmp_type = match_entry->l4Match_->icmp_->type_; + if ( match_iter->icmp_type != -1 ) { + val_fl_entry.icmp_type = match_iter->icmp_type; val_fl_entry.valid[UPLL_IDX_ICMP_TYPE_FLE]=UNC_VF_VALID; } - if ( match_entry->l4Match_->icmp_->code_ != -1 ) { - val_fl_entry.icmp_type = match_entry->l4Match_->icmp_->code_; + if ( match_iter->icmp_code != -1 ) { + val_fl_entry.icmp_type = match_iter->icmp_code; val_fl_entry.valid[UPLL_IDX_ICMP_CODE_FLE]=UNC_VF_VALID; } - } - if ( match_entry->l4Match_->tcp_) { - if ( match_entry->l4Match_->tcp_->dst_ ) { - if ( match_entry->l4Match_->tcp_->dst_->from_ != -1 ) { - val_fl_entry.l4_dst_port= match_entry->l4Match_->tcp_->dst_->from_; - val_fl_entry.valid[UPLL_IDX_L4_DST_PORT_FLE]=UNC_VF_VALID; + if ( match_iter->tcp_source_range_.valid == true ) { + if ( match_iter->tcp_source_range_.src_port_from != -1 ) { + val_fl_entry.l4_src_port= match_iter->tcp_source_range_.src_port_from; + val_fl_entry.valid[UPLL_IDX_L4_SRC_PORT_FLE]=UNC_VF_VALID; } - if ( match_entry->l4Match_->tcp_->dst_->to_ != -1 ) { - val_fl_entry.l4_dst_port_endpt= match_entry->l4Match_->tcp_->dst_->to_; - val_fl_entry.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE]=UNC_VF_VALID; + if ( match_iter->tcp_source_range_.src_port_to != -1 ) { + val_fl_entry.l4_src_port_endpt= match_iter->tcp_source_range_.src_port_from; + val_fl_entry.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE]=UNC_VF_VALID; } } - if ( match_entry->l4Match_->tcp_->src_ ) { - if ( match_entry->l4Match_->tcp_->src_->from_ != -1 ) { - val_fl_entry.l4_src_port= match_entry->l4Match_->tcp_->src_->from_; - val_fl_entry.valid[UPLL_IDX_L4_SRC_PORT_FLE]=UNC_VF_VALID; + if ( match_iter->tcp_destination_range_.valid == true) { + if ( match_iter->tcp_destination_range_.dst_port_from != -1 ) { + val_fl_entry.l4_dst_port= match_iter->tcp_destination_range_.dst_port_from; + val_fl_entry.valid[UPLL_IDX_L4_DST_PORT_FLE]=UNC_VF_VALID; } - if ( match_entry->l4Match_->tcp_->src_->to_ != -1 ) { - val_fl_entry.l4_src_port_endpt= match_entry->l4Match_->tcp_->src_->to_; - val_fl_entry.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE]=UNC_VF_VALID; + if ( match_iter->tcp_destination_range_.dst_port_to!= -1 ) { + val_fl_entry.l4_dst_port_endpt= match_iter->tcp_destination_range_.dst_port_to; + val_fl_entry.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE]=UNC_VF_VALID; } } - } - } - // Add to Cache unc::vtndrvcache::ConfigNode *entry_cfgptr( - new unc::vtndrvcache::CacheElementUtil + new unc::vtndrvcache::CacheElementUtil (&key_fl_entry,&val_fl_entry, &val_fl_entry, uint32_t(UNC_OP_READ))); PFC_ASSERT(entry_cfgptr != NULL ); @@ -188,22 +252,118 @@ OdcFlowListCommand::r_copy(flowConditions* in, return UNC_RC_SUCCESS; } +UncRespCode OdcFlowListEntryCommand::create_cmd(key_flowlist_entry &key_in, + val_flowlist_entry &val_in, + unc::driver::controller *ctr_ptr) { + ODC_FUNC_TRACE; + PFC_ASSERT(ctr_ptr != NULL); + char *cond_name = reinterpret_cast (key_in.flowlist_key.flowlist_name); + flowlistentry_class *req_obj = new flowlistentry_class(ctr_ptr,cond_name); + ip_flowlistentry st_obj; + copy(st_obj, key_in, val_in); + flowlistentry_parser *parser_obj = new flowlistentry_parser(); + json_object *jobj = parser_obj->create_req(st_obj); + if(jobj == NULL) { + pfc_log_error("Error in create request"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + if(req_obj->set_post(jobj) != UNC_RC_SUCCESS) { + pfc_log_error("Flowlistentry Create Failed"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + delete req_obj; + delete parser_obj; + return UNC_RC_SUCCESS; +} + +UncRespCode OdcFlowListEntryCommand::update_cmd(key_flowlist_entry &key_in, + val_flowlist_entry &val_old_in, + val_flowlist_entry &val_new_in, + unc::driver::controller *ctr_ptr) { + ODC_FUNC_TRACE; + PFC_ASSERT(ctr_ptr != NULL); + char *cond_name = reinterpret_cast (key_in.flowlist_key.flowlist_name); + flowlistentry_class *req_obj = new flowlistentry_class(ctr_ptr,cond_name); + ip_flowlistentry st_obj; + copy(st_obj, key_in, val_old_in, val_new_in); + flowlistentry_parser *parser_obj = new flowlistentry_parser(); + json_object *jobj = parser_obj->create_req(st_obj); + if(jobj == NULL) { + pfc_log_error("Error in create request"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + if(req_obj->set_put(jobj) != UNC_RC_SUCCESS) { + pfc_log_error("Flowlistentry update Failed"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + delete req_obj; + delete parser_obj; + return UNC_RC_SUCCESS; +} +UncRespCode +OdcFlowListEntryCommand::delete_cmd(key_flowlist_entry &key_in, + val_flowlist_entry &val_in, + unc::driver::controller *ctr_ptr) { + ODC_FUNC_TRACE; + PFC_ASSERT(ctr_ptr != NULL); + char *cond_name = reinterpret_cast (key_in.flowlist_key.flowlist_name); + char sequence_no[10]; + sprintf(sequence_no,"%d",key_in.sequence_num); + flowlistentry_class *req_obj = new flowlistentry_class(ctr_ptr,cond_name); + ip_flowlistentry st_obj; + delete_request_body(key_in,val_in,st_obj); + flowlistentry_parser *parser_obj = new flowlistentry_parser(); + json_object *jobj = parser_obj->del_req(st_obj); + if(jobj == NULL) { + pfc_log_error("Error in delete request"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + if(req_obj->set_delete(jobj) != UNC_RC_SUCCESS) { + pfc_log_error("Flowlistentry Create Failed"); + delete req_obj; + delete parser_obj; + return UNC_DRV_RC_ERR_GENERIC; + } + delete req_obj; + delete parser_obj; + return UNC_RC_SUCCESS; +} +void +OdcFlowListEntryCommand::delete_request_body(key_flowlist_entry &key_in, + val_flowlist_entry &val_in, + ip_flowlistentry& ip_flowlistentry_st){ + + ip_flowlistentry_st.in_flowcond_.valid = true; + ip_flowlistentry_st.in_flowcond_.name = reinterpret_cast ( + key_in.flowlist_key.flowlist_name); + match match_; + match_.index = key_in.sequence_num; + ip_flowlistentry_st.in_flowcond_.match_.push_back(match_); +} void -OdcFlowListEntryCommand::copy(flowcondition* flow, +OdcFlowListEntryCommand::copy(ip_flowlistentry& ip_flowlistentry_st, key_flowlist_entry& key, val_flowlist_entry& val) { ODC_FUNC_TRACE; - PFC_ASSERT ( flow != NULL ); - char *flowlist_name=reinterpret_cast (key.flowlist_key.flowlist_name); - flow->name_.assign(flowlist_name); unc::odcdriver::OdcUtil util; - - - match* flow_match=new match(); - flow_match->index_=key.sequence_num; + ip_flowlistentry_st.in_flowcond_.valid = true; + ip_flowlistentry_st.in_flowcond_.name = reinterpret_cast ( + key.flowlist_key.flowlist_name); + match match_; + match_.index = key.sequence_num; // Ethernet Match Values if ( val.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID || val.valid[UPLL_IDX_MAC_SRC_FLE] == UNC_VF_VALID || @@ -211,20 +371,19 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID ) { pfc_log_info("Filling Ethernet Match Details"); - flow_match->ethernet_=new ethernet(); + match_.ether_match_.valid = true; if ( val.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID ) - flow_match->ethernet_->dst_=util.macaddress_to_string(&val.mac_dst[0]); + match_.ether_match_.dest_addr = util.macaddress_to_string(&val.mac_dst[0]); if ( val.valid[UPLL_IDX_MAC_SRC_FLE] == UNC_VF_VALID ) - flow_match->ethernet_->src_=util.macaddress_to_string(&val.mac_src[0]); + match_.ether_match_.src_addr = util.macaddress_to_string(&val.mac_src[0]); if ( val.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] == UNC_VF_VALID ) - flow_match->ethernet_->type_=val.mac_eth_type; + match_.ether_match_.ether_type = val.mac_eth_type; if ( val.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID ) - flow_match->ethernet_->vlanpri_=val.vlan_priority; - + match_.ether_match_.vlanpri = val.vlan_priority; } if ( val.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALID || @@ -235,26 +394,33 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID ) { pfc_log_info("Filling Inet Match Details"); - flow_match->inetMatch_=new inetMatch(); - flow_match->inetMatch_->inet4_=new inet4(); + match_.inet_match_.valid = true; - if( val.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALID ) - flow_match->inetMatch_->inet4_->dst_.assign(inet_ntoa(val.dst_ip)); + if( val.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALID && + (val.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_VALID)){ + std::stringstream dst_ip; + dst_ip << inet_ntoa(val.dst_ip); + dst_ip << "/"; + int ip = val.dst_ip_prefixlen; + dst_ip << ip; + match_.inet_match_.dest_network = dst_ip.str(); - if( val.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALID ) - flow_match->inetMatch_->inet4_->src_.assign(inet_ntoa(val.src_ip)); - - if (val.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_VALID) - flow_match->inetMatch_->inet4_->dstsuffix_=val.dst_ip_prefixlen; - - if (val.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == UNC_VF_VALID) - flow_match->inetMatch_->inet4_->srcsuffix_=val.src_ip_prefixlen; + } + if( (val.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALID) && + (val.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == UNC_VF_VALID)) { + std::stringstream src_ip; + src_ip << inet_ntoa(val.src_ip); + src_ip << "/"; + int ip = val.src_ip_prefixlen; + src_ip << ip; + match_.inet_match_.src_network = src_ip.str(); + } if (val.valid[UPLL_IDX_IP_PROTOCOL_FLE] == UNC_VF_VALID) - flow_match->inetMatch_->inet4_->protocol_=val.ip_proto; + match_.inet_match_.protocol = val.ip_proto; if (val.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID) - flow_match->inetMatch_->inet4_->dscp_=val.ip_dscp; + match_.inet_match_.dscp = val.ip_dscp; } if ( val.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_VALID || @@ -265,63 +431,45 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID) { pfc_log_info("Filling L4 Match Details"); - flow_match->l4Match_ =new l4Match(); - - if( val.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID || - val.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID) { - - flow_match->l4Match_->icmp_ =new icmp(); if ( val.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID ) - flow_match->l4Match_->icmp_->type_=val.icmp_type; + match_.icmp_type = val.icmp_type; if ( val.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID ) - flow_match->l4Match_->icmp_->code_=val.icmp_code; + match_.icmp_code =val.icmp_code; - } else { - flow_match->l4Match_->tcp_=new tcp(); pfc_log_info("Filling L4 tcp Match Details"); if ( val.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL ) - flow_match->l4Match_->tcp_->dst_=new dst(); - flow_match->l4Match_->tcp_->dst_->from_=val.l4_dst_port; - } - if ( val.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL ) - flow_match->l4Match_->tcp_->dst_=new dst(); - flow_match->l4Match_->tcp_->dst_->to_=val.l4_dst_port_endpt; - } + match_.tcp_dest_range_.valid = true; + match_.tcp_dest_range_.dst_port_from = val.l4_dst_port; + match_.tcp_dest_range_.dst_port_to = val.l4_dst_port_endpt; if ( val.valid[UPLL_IDX_L4_SRC_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_=new src(); - flow_match->l4Match_->tcp_->src_->from_=val.l4_src_port; + match_.tcp_src_range_.valid = true; + match_.tcp_src_range_.src_port_from= val.l4_src_port; } if ( val.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_=new src(); - flow_match->l4Match_->tcp_->src_->to_=val.l4_src_port_endpt; + match_.tcp_src_range_.src_port_to = val.l4_src_port_endpt; } } } - flow->match_.push_back(flow_match); + ip_flowlistentry_st.in_flowcond_.match_.push_back(match_); } + // Method to handle two value structures during update operation void -OdcFlowListEntryCommand::copy(flowcondition* flow, +OdcFlowListEntryCommand::copy(ip_flowlistentry& ip_flowlistentry_st, key_flowlist_entry& key, val_flowlist_entry& val_old, val_flowlist_entry& val_new) { ODC_FUNC_TRACE; - PFC_ASSERT( flow != NULL ); - char *flowlist_name = reinterpret_cast ( - key.flowlist_key.flowlist_name); - flow->name_.assign(flowlist_name); unc::odcdriver::OdcUtil util; + ip_flowlistentry_st.in_flowcond_.valid = true; + ip_flowlistentry_st.in_flowcond_.name = reinterpret_cast ( + key.flowlist_key.flowlist_name); + match match_; + match_.index = key.sequence_num; - - match* flow_match = new match(); - flow_match->index_= key.sequence_num; // Ethernet Match Values if ( val_old.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID || val_new.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID || @@ -332,35 +480,35 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val_old.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID || val_new.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID ) { pfc_log_info("Filling Ethernet Match Details"); - flow_match->ethernet_=new ethernet(); + match_.ether_match_.valid = true; - if(val_new.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID) { - flow_match->ethernet_->dst_ = util.macaddress_to_string( - &val_new.mac_dst[0]); + if(val_new.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID) { + match_.ether_match_.dest_addr = + util.macaddress_to_string(&val_new.mac_dst[0]); } else if ( val_new.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_MAC_DST_FLE] == UNC_VF_VALID) { - flow_match->ethernet_->dst_ = util.macaddress_to_string( - &val_old.mac_dst[0]); + match_.ether_match_.dest_addr = + util.macaddress_to_string(&val_old.mac_dst[0]); } if ( val_new.valid[UPLL_IDX_MAC_SRC_FLE] == UNC_VF_VALID) { - flow_match->ethernet_->src_ = util.macaddress_to_string( - &val_new.mac_src[0]); + match_.ether_match_.src_addr = + util.macaddress_to_string(&val_new.mac_src[0]); } else if ( val_new.valid[UPLL_IDX_MAC_SRC_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_MAC_SRC_FLE] == UNC_VF_VALID ) { - flow_match->ethernet_->src_ = util.macaddress_to_string( + match_.ether_match_.src_addr = util.macaddress_to_string( &val_old.mac_src[0]); } - if ( val_new.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] == UNC_VF_VALID) { - flow_match->ethernet_->type_ = val_new.mac_eth_type; + if ( val_new.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] == UNC_VF_VALID) { + match_.ether_match_.ether_type = val_new.mac_eth_type; } else if ( val_new.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_MAC_ETH_TYPE_FLE] == UNC_VF_VALID ){ - flow_match->ethernet_->type_ = val_old.mac_eth_type; + match_.ether_match_.ether_type = val_old.mac_eth_type; } - if ( val_new.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID) { - flow_match->ethernet_->vlanpri_ = val_new.vlan_priority; + if ( val_new.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID) { + match_.ether_match_.vlanpri = val_new.vlan_priority; } else if ( val_new.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_VLAN_PRIORITY_FLE] == UNC_VF_VALID ){ - flow_match->ethernet_->vlanpri_ = val_old.vlan_priority; + match_.ether_match_.vlanpri= val_old.vlan_priority; } } @@ -379,61 +527,40 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val_old.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID ) { pfc_log_info("Filling Inet Match Details"); - flow_match->inetMatch_ = new inetMatch(); - flow_match->inetMatch_->inet4_ = new inet4(); + match_.inet_match_.valid = true; if (val_new.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALID || val_new.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALUE_NOT_MODIFIED) { - flow_match->inetMatch_->inet4_->dst_.assign(inet_ntoa(val_new.dst_ip)); - pfc_log_info("dst ip:%s",flow_match->inetMatch_->inet4_->dst_.c_str()); + match_.inet_match_.dest_network.assign( + inet_ntoa(val_new.dst_ip)); + pfc_log_info("dst ip:%s",match_.inet_match_.dest_network.c_str()); } else if ( val_new.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_DST_IP_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->dst_.assign(inet_ntoa(val_old.dst_ip)); - pfc_log_info("dst ip:%s",flow_match->inetMatch_->inet4_->dst_.c_str()); + match_.inet_match_.dest_network.assign(inet_ntoa(val_old.dst_ip)); + pfc_log_info("dst ip:%s",match_.inet_match_.dest_network.c_str()); } - if (val_new.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALID || + if (val_new.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALID || val_new.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALUE_NOT_MODIFIED) { - flow_match->inetMatch_->inet4_->src_.assign(inet_ntoa(val_new.src_ip)); - pfc_log_info("src ip:%s",flow_match->inetMatch_->inet4_->src_.c_str()); + match_.inet_match_.src_network.assign(inet_ntoa(val_new.src_ip)); + pfc_log_info("src ip:%s",match_.inet_match_.src_network.c_str()); } else if (val_new.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_SRC_IP_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->src_.assign(inet_ntoa(val_old.src_ip)); - pfc_log_info("src ip:%s",flow_match->inetMatch_->inet4_->src_.c_str()); - } - - if (val_new.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_VALID || - val_new.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_VALUE_NOT_MODIFIED){ - flow_match->inetMatch_->inet4_->dstsuffix_ = val_new.dst_ip_prefixlen; - pfc_log_info("prefixlen :%d",val_new.dst_ip_prefixlen); - } else if (val_new.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_INVALID && - val_old.valid[UPLL_IDX_DST_IP_PREFIX_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->dstsuffix_ = val_old.dst_ip_prefixlen; - pfc_log_info("Filling Inet Match Details dst len old struct"); + match_.inet_match_.src_network.assign(inet_ntoa(val_old.src_ip)); + pfc_log_info("src ip:%s",match_.inet_match_.src_network.c_str()); } - - if (val_new.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == UNC_VF_VALID || - val_new.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == - UNC_VF_VALUE_NOT_MODIFIED) { - flow_match->inetMatch_->inet4_->srcsuffix_ = val_new.src_ip_prefixlen; - pfc_log_info("prefixlen :%d",val_new.src_ip_prefixlen); - } else if (val_new.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == UNC_VF_INVALID && - val_old.valid[UPLL_IDX_SRC_IP_PREFIX_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->srcsuffix_ = val_old.src_ip_prefixlen; - } - - if (val_new.valid[UPLL_IDX_IP_PROTOCOL_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->protocol_ = val_new.ip_proto; + if (val_new.valid[UPLL_IDX_IP_PROTOCOL_FLE] == UNC_VF_VALID) { + match_.inet_match_.protocol = val_new.ip_proto; } else if (val_new.valid[UPLL_IDX_IP_PROTOCOL_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_IP_PROTOCOL_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->protocol_ = val_old.ip_proto; + match_.inet_match_.protocol= val_old.ip_proto; } - if (val_new.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->dscp_ = val_new.ip_dscp; + if (val_new.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID) { + match_.inet_match_.dscp = val_new.ip_dscp; } else if (val_new.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_IP_DSCP_FLE] == UNC_VF_VALID) { - flow_match->inetMatch_->inet4_->dscp_ = val_old.ip_dscp; + match_.inet_match_.dscp = val_old.ip_dscp; } } @@ -452,95 +579,68 @@ OdcFlowListEntryCommand::copy(flowcondition* flow, val_old.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID ) { pfc_log_info("Filling L4 Match Details"); - flow_match->l4Match_ =new l4Match(); if( val_new.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID || val_old.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID || val_new.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID || val_old.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID ) { - flow_match->l4Match_->icmp_ =new icmp(); - if ( val_new.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID) { - flow_match->l4Match_->icmp_->type_ = val_new.icmp_type; + if ( val_new.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID) { + match_.icmp_type = val_new.icmp_type; } else if ( val_new.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_ICMP_TYPE_FLE] == UNC_VF_VALID) { - flow_match->l4Match_->icmp_->type_ = val_old.icmp_type; + match_.icmp_type = val_old.icmp_type; } - if ( val_new.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID) { - flow_match->l4Match_->icmp_->code_ = val_new.icmp_code; + if ( val_new.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID) { + match_.icmp_code = val_new.icmp_code; } else if ( val_new.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_ICMP_CODE_FLE] == UNC_VF_VALID) { - flow_match->l4Match_->icmp_->code_ = val_old.icmp_code; + match_.icmp_code = val_old.icmp_code; } } else { - flow_match->l4Match_->tcp_ = new tcp(); pfc_log_info("Filling L4 tcp Match Details"); - if ( val_new.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL) - flow_match->l4Match_->tcp_->dst_ = new dst(); - flow_match->l4Match_->tcp_->dst_->from_ = val_new.l4_dst_port; + if ( val_new.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_VALID) { + match_.tcp_dest_range_.valid = true; + match_.tcp_dest_range_.dst_port_from = val_new.l4_dst_port; } else if ( val_new.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_L4_DST_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL ) - flow_match->l4Match_->tcp_->dst_ = new dst(); - flow_match->l4Match_->tcp_->dst_->from_ = val_old.l4_dst_port; + match_.tcp_dest_range_.valid = true; + match_.tcp_dest_range_.dst_port_from = val_old.l4_dst_port; } - if ( val_new.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL ) - flow_match->l4Match_->tcp_->dst_ = new dst(); - flow_match->l4Match_->tcp_->dst_->to_=val_new.l4_dst_port_endpt; + if ( val_new.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE] == UNC_VF_VALID) { + match_.tcp_dest_range_.valid = true; + match_.tcp_dest_range_.dst_port_to = val_new.l4_dst_port_endpt; } else if ( val_new.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_L4_DST_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->dst_ == NULL ) - flow_match->l4Match_->tcp_->dst_ = new dst(); - flow_match->l4Match_->tcp_->dst_->to_ = val_old.l4_dst_port_endpt; + match_.tcp_dest_range_.valid = true; + match_.tcp_dest_range_.dst_port_to = val_old.l4_dst_port_endpt; } - if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_ = new src(); - flow_match->l4Match_->tcp_->src_->from_ = val_new.l4_src_port; + if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_FLE] == UNC_VF_VALID) { + match_.tcp_src_range_.valid = true; + match_.tcp_src_range_.src_port_from = val_new.l4_src_port; } else if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_L4_SRC_PORT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_ = new src(); - flow_match->l4Match_->tcp_->src_->from_ = val_old.l4_src_port; + match_.tcp_src_range_.valid = true; + match_.tcp_src_range_.src_port_from = val_old.l4_src_port; } - - if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_ = new src(); - flow_match->l4Match_->tcp_->src_->to_ = val_new.l4_src_port_endpt; + if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE] == UNC_VF_VALID) { + match_.tcp_src_range_.valid = true; + match_.tcp_src_range_.src_port_to = val_new.l4_src_port_endpt; } else if ( val_new.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE] == UNC_VF_INVALID && val_old.valid[UPLL_IDX_L4_SRC_PORT_ENDPT_FLE] == UNC_VF_VALID) { - if ( flow_match->l4Match_->tcp_->src_ == NULL ) - flow_match->l4Match_->tcp_->src_ = new src(); - flow_match->l4Match_->tcp_->src_->to_ = val_old.l4_src_port_endpt; + match_.tcp_src_range_.valid = true; + match_.tcp_src_range_.src_port_to = val_old.l4_src_port_endpt; } } } - flow->match_.push_back(flow_match); + ip_flowlistentry_st.in_flowcond_.match_.push_back(match_); } -std::string -OdcFlowListEntryCommand::get_url_tail(key_flowlist_entry& key, - val_flowlist_entry& val) { - ODC_FUNC_TRACE; - char *flowlist_name=reinterpret_cast (key.flowlist_key.flowlist_name); - std::string url_string (""); - url_string.append(flowlist_name); - url_string.append("/"); - char sequence_no[10]; - sprintf(sequence_no,"%d",key.sequence_num); - url_string.append(sequence_no); - return url_string; -} - - } } diff --git a/coordinator/modules/odcdriver/port.rest b/coordinator/modules/odcdriver/port.rest index 57e66f6d..f6de3c93 100644 --- a/coordinator/modules/odcdriver/port.rest +++ b/coordinator/modules/odcdriver/port.rest @@ -97,6 +97,7 @@ key="vtn-node" struct_name=vtn_port members=vtn_port check_bool_set=yes +is_child=yes get_support=yes get_abstract=yes diff --git a/coordinator/modules/odcdriver/topo.rest b/coordinator/modules/odcdriver/topo.rest index 4dc3236b..9f5f4907 100644 --- a/coordinator/modules/odcdriver/topo.rest +++ b/coordinator/modules/odcdriver/topo.rest @@ -134,6 +134,7 @@ key="vtn-topology" is_child=yes struct_name=vtn_link check_bool_set=yes +is_child=yes members=vtn_link # URL section diff --git a/coordinator/modules/odcdriver/vbrif.rest b/coordinator/modules/odcdriver/vbrif.rest index 8840f6bb..7d9bc727 100644 --- a/coordinator/modules/odcdriver/vbrif.rest +++ b/coordinator/modules/odcdriver/vbrif.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -47,6 +47,7 @@ type=struct key="vinterface-config" struct_name=vbr_if_conf check_bool_set=no +is_child=yes members=enabled,description,valid build_support=no parse_support=yes @@ -55,6 +56,7 @@ parse_support=yes type=object key="vbridge-config" struct_name=vbr_if_conf +is_child=yes check_bool_set=yes members=vbr_if build_support=no diff --git a/coordinator/modules/odcdriver/vbrif_port.rest b/coordinator/modules/odcdriver/vbrif_port.rest index 6c6e672a..779246e2 100644 --- a/coordinator/modules/odcdriver/vbrif_port.rest +++ b/coordinator/modules/odcdriver/vbrif_port.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -223,7 +223,7 @@ parse_support=no [portmap_config] type=struct key="port-map-config" -is_child=yes +is_child=no check_bool_set=yes struct_name=portmap_config members=vlan,node_id,port diff --git a/coordinator/modules/odcdriver/vtermif.rest b/coordinator/modules/odcdriver/vtermif.rest index 8260def6..47c5a2fd 100644 --- a/coordinator/modules/odcdriver/vtermif.rest +++ b/coordinator/modules/odcdriver/vtermif.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -231,6 +231,7 @@ type=struct key="vinterface-config" struct_name=vterm_if_conf check_bool_set=no +is_child=yes members=enabled,description,valid build_support=no parse_support=yes diff --git a/coordinator/modules/odcdriver/vtermif_portmap.rest b/coordinator/modules/odcdriver/vtermif_portmap.rest index 2d719de5..58f1e254 100644 --- a/coordinator/modules/odcdriver/vtermif_portmap.rest +++ b/coordinator/modules/odcdriver/vtermif_portmap.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -88,7 +88,7 @@ response_members="vterminal-config" [vterm_if] type=struct key="port-map-config" -is_child=yes +is_child=no check_bool_set=yes struct_name=vterm_if members=vlan_id,node_id,port diff --git a/coordinator/modules/odcdriver/vterminal.rest b/coordinator/modules/odcdriver/vterminal.rest index 7e234969..159b40b6 100644 --- a/coordinator/modules/odcdriver/vterminal.rest +++ b/coordinator/modules/odcdriver/vterminal.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -81,6 +81,7 @@ type=struct key="vterminal-config" struct_name = vterminal_conf members=vterm_description,valid +is_child=yes build_support=no parse_support=yes diff --git a/coordinator/modules/odcdriver/vtn.rest b/coordinator/modules/odcdriver/vtn.rest index 12bb100d..12cd9570 100644 --- a/coordinator/modules/odcdriver/vtn.rest +++ b/coordinator/modules/odcdriver/vtn.rest @@ -1,4 +1,4 @@ -# Copyright (c) 2015 NEC Corporation +# Copyright (c) 2015-2016 NEC Corporation # All rights reserved. # # This program and the accompanying materials are made available under the @@ -85,6 +85,7 @@ type=struct key="vtenant-config" struct_name=vtn_conf members = description,valid +is_child=yes build_support=no parse_support=yes diff --git a/coordinator/modules/restjsonutil/include/json_build_parse.hh b/coordinator/modules/restjsonutil/include/json_build_parse.hh index c0cc14be..eba6afa3 100644 --- a/coordinator/modules/restjsonutil/include/json_build_parse.hh +++ b/coordinator/modules/restjsonutil/include/json_build_parse.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 NEC Corporation + * Copyright (c) 2013-2016 NEC Corporation * All rights reserved. * * This program and the accompanying materials are made available under the @@ -28,6 +28,7 @@ class JsonBuildParse { static json_object* create_json_obj(); static json_object* create_json_array_obj(); static void add_to_array ( json_object*, json_object *); + static json_object* create_json_int_obj (uint32_t value); /** * @brief - Template method which build the json request diff --git a/coordinator/modules/restjsonutil/json_build_parse.cc b/coordinator/modules/restjsonutil/json_build_parse.cc index 1f941b79..814a3ee6 100644 --- a/coordinator/modules/restjsonutil/json_build_parse.cc +++ b/coordinator/modules/restjsonutil/json_build_parse.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 NEC Corporation + * Copyright (c) 2013-2016 NEC Corporation * All rights reserved. * * This program and the accompanying materials are made available under the @@ -29,6 +29,11 @@ void JsonBuildParse::add_to_array (json_object *array, json_object_array_add (array,value); } +json_object* JsonBuildParse::create_json_int_obj(uint32_t val) { + ODC_FUNC_TRACE; + return json_object_new_int (val); + +} const char* JsonBuildParse::get_json_string(json_object* jobj) { if (json_object_is_type(jobj, json_type_null)) { return NULL; diff --git a/coordinator/test/modules/odcdriver/ut/Makefile b/coordinator/test/modules/odcdriver/ut/Makefile index f67dcced..68286e97 100644 --- a/coordinator/test/modules/odcdriver/ut/Makefile +++ b/coordinator/test/modules/odcdriver/ut/Makefile @@ -67,7 +67,6 @@ ODCDRIVER_SOURCES += odc_dataflow.cc ODCDRIVER_SOURCES += odc_vterminal.cc ODCDRIVER_SOURCES += odc_vterminal_if.cc ODCDRIVER_SOURCES += odc_flowlist.cc -ODCDRIVER_SOURCES += odc_flow_conditions.cc ODCDRIVER_SOURCES += odc_flow_filter.cc ODCDRIVER_SOURCES += odc_ctr_dataflow.cc ODCDRIVER_SOURCES += odc_vtn_dataflow.cc diff --git a/coordinator/test/modules/stub/restjsonutil/json_build_parse.hh b/coordinator/test/modules/stub/restjsonutil/json_build_parse.hh index 6a3963af..30c875e1 100644 --- a/coordinator/test/modules/stub/restjsonutil/json_build_parse.hh +++ b/coordinator/test/modules/stub/restjsonutil/json_build_parse.hh @@ -34,9 +34,14 @@ class JsonBuildParse { } static void add_to_array (json_object *array, - json_object* value) { + json_object* value) { json_object_array_add (array,value); - } + } + + static json_object* create_json_int_obj(uint32_t val) { + ODC_FUNC_TRACE; + return json_object_new_int (val); + } /** * @brief - Template method which build the json request -- 2.36.6