Hi,
On 2016年03月29日 05:44, Jason Kölker wrote:
> Paramaterizes type converions in function to allow calling code to
> specify if responses should be converted to user friendly display
> (strings) or type perserved.
>
> Signed-off-by: Jason Kölker <[email protected]>
> ---
> ryu/lib/ofctl_v1_3.py | 296
> ++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 212 insertions(+), 84 deletions(-)
>
> diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py
> index 9c72c1e..09bb549 100644
> --- a/ryu/lib/ofctl_v1_3.py
> +++ b/ryu/lib/ofctl_v1_3.py
> @@ -434,7 +434,14 @@ def match_vid_to_str(value, mask):
> return value
>
>
> -def get_desc_stats(dp, waiters):
> +def wrap_dpid_dict(dp, value, to_user=True):
> + if to_user:
> + return {str(dp.id): value}
> +
> + return {dp.id: value}
> +
> +
> +def get_desc_stats(dp, waiters, to_user=True):
> stats = dp.ofproto_parser.OFPDescStatsRequest(dp, 0)
> msgs = []
> ofctl_common.send_stats_request(dp, stats, waiters, msgs, LOG)
> @@ -447,11 +454,11 @@ def get_desc_stats(dp, waiters):
> 'sw_desc': stats.sw_desc,
> 'serial_num': stats.serial_num,
> 'dp_desc': stats.dp_desc}
> - desc = {str(dp.id): s}
> - return desc
(This is a scope of the existing code though.)
I wonder if users want to get the dpid in the response.
I guess users already know the dpid because the dpid is required in the request
parameters.
What do you think about it?
Thanks,
Iwase
>
> + return wrap_dpid_dict(dp, s, to_user)
>
> -def get_queue_stats(dp, waiters, port=None, queue_id=None):
> +
> +def get_queue_stats(dp, waiters, port=None, queue_id=None, to_user=True):
> ofp = dp.ofproto
>
> if port is None:
> @@ -480,11 +487,11 @@ def get_queue_stats(dp, waiters, port=None,
> queue_id=None):
> 'tx_bytes': stat.tx_bytes,
> 'tx_errors': stat.tx_errors,
> 'tx_packets': stat.tx_packets})
> - desc = {str(dp.id): s}
> - return desc
> +
> + return wrap_dpid_dict(dp, s, to_user)
>
>
> -def get_queue_config(dp, port, waiters):
> +def get_queue_config(dp, port, waiters, to_user=True):
> port = UTIL.ofp_port_from_user(port)
> stats = dp.ofproto_parser.OFPQueueGetConfigRequest(dp, port)
> msgs = []
> @@ -509,19 +516,33 @@ def get_queue_config(dp, port, waiters):
> p['experimenter'] = prop.experimenter
> p['data'] = prop.data
> prop_list.append(p)
> - q = {'port': UTIL.ofp_port_to_user(queue.port),
> - 'properties': prop_list,
> - 'queue_id': UTIL.ofp_queue_to_user(queue.queue_id)}
> +
> + q = {'properties': prop_list}
> +
> + if to_user:
> + q['port'] = UTIL.ofp_port_to_user(queue.port)
> + q['queue_id'] = UTIL.ofp_queue_to_user(queue.queue_id)
> +
> + else:
> + q['port'] = queue.port
> + q['queue_id'] = queue.queue_id
> +
> queue_list.append(q)
> - c = {'port': UTIL.ofp_port_to_user(config.port),
> - 'queues': queue_list}
> +
> + c = {'queues': queue_list}
> +
> + if to_user:
> + c['port'] = UTIL.ofp_port_to_user(config.port)
> +
> + else:
> + c['port'] = config.port
> +
> configs.append(c)
> - configs = {str(dp.id): configs}
>
> - return configs
> + return wrap_dpid_dict(dp, configs, to_user)
>
>
> -def get_flow_stats(dp, waiters, flow=None):
> +def get_flow_stats(dp, waiters, flow=None, to_user=True):
> flow = flow if flow else {}
> table_id = UTIL.ofp_table_from_user(
> flow.get('table_id', dp.ofproto.OFPTT_ALL))
> @@ -544,29 +565,34 @@ def get_flow_stats(dp, waiters, flow=None):
> flows = []
> for msg in msgs:
> for stats in msg.body:
> - actions = actions_to_str(stats.instructions)
> - match = match_to_str(stats.match)
> -
> s = {'priority': stats.priority,
> 'cookie': stats.cookie,
> 'idle_timeout': stats.idle_timeout,
> 'hard_timeout': stats.hard_timeout,
> - 'actions': actions,
> - 'match': match,
> 'byte_count': stats.byte_count,
> 'duration_sec': stats.duration_sec,
> 'duration_nsec': stats.duration_nsec,
> 'packet_count': stats.packet_count,
> - 'table_id': UTIL.ofp_table_to_user(stats.table_id),
> 'length': stats.length,
> 'flags': stats.flags}
> +
> + if to_user:
> + s['actions'] = actions_to_str(stats.instructions)
> + s['match'] = match_to_str(stats.match)
> + s['table_id'] = UTIL.ofp_table_to_user(stats.table_id)
> +
> + else:
> + s['actions'] = stats.instructions
> + s['instructions'] = stats.instructions
> + s['match'] = stats.match
> + s['table_id'] = stats.table_id
> +
> flows.append(s)
> - flows = {str(dp.id): flows}
>
> - return flows
> + return wrap_dpid_dict(dp, flows, to_user)
>
>
> -def get_aggregate_flow_stats(dp, waiters, flow=None):
> +def get_aggregate_flow_stats(dp, waiters, flow=None, to_user=True):
> flow = flow if flow else {}
> table_id = UTIL.ofp_table_from_user(
> flow.get('table_id', dp.ofproto.OFPTT_ALL))
> @@ -593,12 +619,11 @@ def get_aggregate_flow_stats(dp, waiters, flow=None):
> 'byte_count': stats.byte_count,
> 'flow_count': stats.flow_count}
> flows.append(s)
> - flows = {str(dp.id): flows}
>
> - return flows
> + return wrap_dpid_dict(dp, flows, to_user)
>
>
> -def get_table_stats(dp, waiters):
> +def get_table_stats(dp, waiters, to_user=True):
> stats = dp.ofproto_parser.OFPTableStatsRequest(dp, 0)
> msgs = []
> ofctl_common.send_stats_request(dp, stats, waiters, msgs, LOG)
> @@ -607,17 +632,22 @@ def get_table_stats(dp, waiters):
> for msg in msgs:
> stats = msg.body
> for stat in stats:
> - s = {'table_id': UTIL.ofp_table_to_user(stat.table_id),
> - 'active_count': stat.active_count,
> + s = {'active_count': stat.active_count,
> 'lookup_count': stat.lookup_count,
> 'matched_count': stat.matched_count}
> +
> + if to_user:
> + s['table_id'] = UTIL.ofp_table_to_user(stat.table_id)
> +
> + else:
> + s['table_id'] = stat.table_id
> +
> tables.append(s)
> - desc = {str(dp.id): tables}
>
> - return desc
> + return wrap_dpid_dict(dp, tables, to_user)
>
>
> -def get_table_features(dp, waiters):
> +def get_table_features(dp, waiters, to_user=True):
> stats = dp.ofproto_parser.OFPTableFeaturesStatsRequest(dp, 0, [])
> msgs = []
> ofproto = dp.ofproto
> @@ -641,6 +671,9 @@ def get_table_features(dp, waiters):
> ofproto.OFPTFPT_EXPERIMENTER_MISS: 'EXPERIMENTER_MISS'
> }
>
> + if not to_user:
> + prop_type = dict((k, k) for k in prop_type.keys())
> +
> p_type_instructions = [ofproto.OFPTFPT_INSTRUCTIONS,
> ofproto.OFPTFPT_INSTRUCTIONS_MISS]
>
> @@ -699,21 +732,26 @@ def get_table_features(dp, waiters):
> elif prop.type in p_type_experimenter:
> pass
> properties.append(p)
> - s = {'table_id': UTIL.ofp_table_to_user(stat.table_id),
> - 'name': stat.name.decode('utf-8'),
> + s = {'name': stat.name.decode('utf-8'),
> 'metadata_match': stat.metadata_match,
> 'metadata_write': stat.metadata_write,
> 'config': stat.config,
> 'max_entries': stat.max_entries,
> 'properties': properties,
> }
> +
> + if to_user:
> + s['table_id'] = UTIL.ofp_table_to_user(stat.table_id)
> +
> + else:
> + s['table_id'] = stat.table_id
> +
> tables.append(s)
> - desc = {str(dp.id): tables}
>
> - return desc
> + return wrap_dpid_dict(dp, tables, to_user)
>
>
> -def get_port_stats(dp, waiters, port=None):
> +def get_port_stats(dp, waiters, port=None, to_user=True):
> if port is None:
> port = dp.ofproto.OFPP_ANY
> else:
> @@ -727,8 +765,7 @@ def get_port_stats(dp, waiters, port=None):
> ports = []
> for msg in msgs:
> for stats in msg.body:
> - s = {'port_no': UTIL.ofp_port_to_user(stats.port_no),
> - 'rx_packets': stats.rx_packets,
> + s = {'rx_packets': stats.rx_packets,
> 'tx_packets': stats.tx_packets,
> 'rx_bytes': stats.rx_bytes,
> 'tx_bytes': stats.tx_bytes,
> @@ -742,12 +779,19 @@ def get_port_stats(dp, waiters, port=None):
> 'collisions': stats.collisions,
> 'duration_sec': stats.duration_sec,
> 'duration_nsec': stats.duration_nsec}
> +
> + if to_user:
> + s['port_no'] = UTIL.ofp_port_to_user(stats.port_no)
> +
> + else:
> + s['port_no'] = stats.port_no
> +
> ports.append(s)
> - ports = {str(dp.id): ports}
> - return ports
> +
> + return wrap_dpid_dict(dp, ports, to_user)
>
>
> -def get_meter_stats(dp, waiters, meter_id=None):
> +def get_meter_stats(dp, waiters, meter_id=None, to_user=True):
> if meter_id is None:
> meter_id = dp.ofproto.OFPM_ALL
> else:
> @@ -766,20 +810,26 @@ def get_meter_stats(dp, waiters, meter_id=None):
> b = {'packet_band_count': band.packet_band_count,
> 'byte_band_count': band.byte_band_count}
> bands.append(b)
> - s = {'meter_id': UTIL.ofp_meter_to_user(stats.meter_id),
> - 'len': stats.len,
> + s = {'len': stats.len,
> 'flow_count': stats.flow_count,
> 'packet_in_count': stats.packet_in_count,
> 'byte_in_count': stats.byte_in_count,
> 'duration_sec': stats.duration_sec,
> 'duration_nsec': stats.duration_nsec,
> 'band_stats': bands}
> +
> + if to_user:
> + s['meter_id'] = UTIL.ofp_meter_to_user(stats.meter_id)
> +
> + else:
> + s['meter_id'] = stats.meter_id
> +
> meters.append(s)
> - meters = {str(dp.id): meters}
> - return meters
>
> + return wrap_dpid_dict(dp, meters, to_user)
>
> -def get_meter_features(dp, waiters):
> +
> +def get_meter_features(dp, waiters, to_user=True):
>
> ofp = dp.ofproto
> type_convert = {ofp.OFPMBT_DROP: 'DROP',
> @@ -800,22 +850,34 @@ def get_meter_features(dp, waiters):
> band_types = []
> for k, v in type_convert.items():
> if (1 << k) & feature.band_types:
> - band_types.append(v)
> +
> + if to_user:
> + band_types.append(v)
> +
> + else:
> + band_types.append(k)
> +
> capabilities = []
> for k, v in sorted(capa_convert.items()):
> if k & feature.capabilities:
> - capabilities.append(v)
> +
> + if to_user:
> + capabilities.append(v)
> +
> + else:
> + capabilities.append(k)
> +
> f = {'max_meter': feature.max_meter,
> 'band_types': band_types,
> 'capabilities': capabilities,
> 'max_bands': feature.max_bands,
> 'max_color': feature.max_color}
> features.append(f)
> - features = {str(dp.id): features}
> - return features
> +
> + return wrap_dpid_dict(dp, features, to_user)
>
>
> -def get_meter_config(dp, waiters, meter_id=None):
> +def get_meter_config(dp, waiters, meter_id=None, to_user=True):
> flags = {dp.ofproto.OFPMF_KBPS: 'KBPS',
> dp.ofproto.OFPMF_PKTPS: 'PKTPS',
> dp.ofproto.OFPMF_BURST: 'BURST',
> @@ -840,9 +902,15 @@ def get_meter_config(dp, waiters, meter_id=None):
> for config in msg.body:
> bands = []
> for band in config.bands:
> - b = {'type': band_type.get(band.type, ''),
> - 'rate': band.rate,
> + b = {'rate': band.rate,
> 'burst_size': band.burst_size}
> +
> + if to_user:
> + b['type'] = band_type.get(band.type, '')
> +
> + else:
> + b['type'] = band.type
> +
> if band.type == dp.ofproto.OFPMBT_DSCP_REMARK:
> b['prec_level'] = band.prec_level
> elif band.type == dp.ofproto.OFPMBT_EXPERIMENTER:
> @@ -851,16 +919,27 @@ def get_meter_config(dp, waiters, meter_id=None):
> c_flags = []
> for k, v in sorted(flags.items()):
> if k & config.flags:
> - c_flags.append(v)
> + if to_user:
> + c_flags.append(v)
> +
> + else:
> + c_flags.append(k)
> +
> c = {'flags': c_flags,
> - 'meter_id': UTIL.ofp_meter_to_user(config.meter_id),
> 'bands': bands}
> +
> + if to_user:
> + c['meter_id'] = UTIL.ofp_meter_to_user(config.meter_id)
> +
> + else:
> + c['meter_id'] = config.meter_id
> +
> configs.append(c)
> - configs = {str(dp.id): configs}
> - return configs
>
> + return wrap_dpid_dict(dp, configs, to_user)
>
> -def get_group_stats(dp, waiters, group_id=None):
> +
> +def get_group_stats(dp, waiters, group_id=None, to_user=True):
> if group_id is None:
> group_id = dp.ofproto.OFPG_ALL
> else:
> @@ -880,19 +959,25 @@ def get_group_stats(dp, waiters, group_id=None):
> 'byte_count': bucket_stat.byte_count}
> bucket_stats.append(c)
> g = {'length': stats.length,
> - 'group_id': UTIL.ofp_group_to_user(stats.group_id),
> 'ref_count': stats.ref_count,
> 'packet_count': stats.packet_count,
> 'byte_count': stats.byte_count,
> 'duration_sec': stats.duration_sec,
> 'duration_nsec': stats.duration_nsec,
> 'bucket_stats': bucket_stats}
> +
> + if to_user:
> + g['group_id'] = UTIL.ofp_group_to_user(stats.group_id)
> +
> + else:
> + g['group_id'] = stats.group_id
> +
> groups.append(g)
> - groups = {str(dp.id): groups}
> - return groups
> +
> + return wrap_dpid_dict(dp, groups, to_user)
>
>
> -def get_group_features(dp, waiters):
> +def get_group_features(dp, waiters, to_user=True):
>
> ofp = dp.ofproto
> type_convert = {ofp.OFPGT_ALL: 'ALL',
> @@ -930,31 +1015,56 @@ def get_group_features(dp, waiters):
> types = []
> for k, v in type_convert.items():
> if (1 << k) & feature.types:
> - types.append(v)
> + if to_user:
> + types.append(v)
> +
> + else:
> + types.append(k)
> +
> capabilities = []
> for k, v in cap_convert.items():
> if k & feature.capabilities:
> - capabilities.append(v)
> - max_groups = []
> - for k, v in type_convert.items():
> - max_groups.append({v: feature.max_groups[k]})
> + if to_user:
> + capabilities.append(v)
> +
> + else:
> + capabilities.append(k)
> +
> + if to_user:
> + max_groups = []
> + for k, v in type_convert.items():
> + max_groups.append({v: feature.max_groups[k]})
> +
> + else:
> + max_groups = feature.max_groups
> +
> actions = []
> for k1, v1 in type_convert.items():
> acts = []
> for k2, v2 in act_convert.items():
> if (1 << k2) & feature.actions[k1]:
> - acts.append(v2)
> - actions.append({v1: acts})
> + if to_user:
> + acts.append(v2)
> +
> + else:
> + acts.append(k2)
> +
> + if to_user:
> + actions.append({v1: acts})
> +
> + else:
> + actions.append({k1: acts})
> +
> f = {'types': types,
> 'capabilities': capabilities,
> 'max_groups': max_groups,
> 'actions': actions}
> features.append(f)
> - features = {str(dp.id): features}
> - return features
> +
> + return wrap_dpid_dict(dp, features, to_user)
>
>
> -def get_group_desc(dp, waiters):
> +def get_group_desc(dp, waiters, to_user=True):
>
> type_convert = {dp.ofproto.OFPGT_ALL: 'ALL',
> dp.ofproto.OFPGT_SELECT: 'SELECT',
> @@ -972,21 +1082,33 @@ def get_group_desc(dp, waiters):
> for bucket in stats.buckets:
> actions = []
> for action in bucket.actions:
> - actions.append(action_to_str(action))
> + if to_user:
> + actions.append(action_to_str(action))
> +
> + else:
> + actions.append(action)
> +
> b = {'weight': bucket.weight,
> 'watch_port': bucket.watch_port,
> 'watch_group': bucket.watch_group,
> 'actions': actions}
> buckets.append(b)
> - d = {'type': type_convert.get(stats.type),
> - 'group_id': UTIL.ofp_group_to_user(stats.group_id),
> - 'buckets': buckets}
> +
> + d = {'buckets': buckets}
> + if to_user:
> + d['group_id'] = UTIL.ofp_group_to_user(stats.group_id)
> + d['type'] = type_convert.get(stats.type)
> +
> + else:
> + d['group_id'] = stats.group_id
> + d['type'] = stats.type
> +
> descs.append(d)
> - descs = {str(dp.id): descs}
> - return descs
>
> + return wrap_dpid_dict(dp, descs, to_user)
>
> -def get_port_desc(dp, waiters):
> +
> +def get_port_desc(dp, waiters, to_user=True):
>
> stats = dp.ofproto_parser.OFPPortDescStatsRequest(dp, 0)
> msgs = []
> @@ -997,8 +1119,7 @@ def get_port_desc(dp, waiters):
> for msg in msgs:
> stats = msg.body
> for stat in stats:
> - d = {'port_no': UTIL.ofp_port_to_user(stat.port_no),
> - 'hw_addr': stat.hw_addr,
> + d = {'hw_addr': stat.hw_addr,
> 'name': stat.name.decode('utf-8'),
> 'config': stat.config,
> 'state': stat.state,
> @@ -1008,9 +1129,16 @@ def get_port_desc(dp, waiters):
> 'peer': stat.peer,
> 'curr_speed': stat.curr_speed,
> 'max_speed': stat.max_speed}
> +
> + if to_user:
> + d['port_no'] = UTIL.ofp_port_to_user(stat.port_no)
> +
> + else:
> + d['port_no'] = stat.port_no
> +
> descs.append(d)
> - descs = {str(dp.id): descs}
> - return descs
> +
> + return wrap_dpid_dict(dp, descs, to_user)
>
>
> def mod_flow_entry(dp, flow, cmd):
>
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel