diff options
-rw-r--r-- | ryu/tests/switch/tester.py | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/ryu/tests/switch/tester.py b/ryu/tests/switch/tester.py index 674f8f19..57652123 100644 --- a/ryu/tests/switch/tester.py +++ b/ryu/tests/switch/tester.py @@ -133,6 +133,7 @@ STATE_GET_THROUGHPUT = 16 STATE_THROUGHPUT_CHK = 17 STATE_INIT_GROUP = 18 STATE_GROUP_INSTALL = 19 +STATE_GROUP_EXIST_CHK = 20 STATE_DISCONNECTED = 99 @@ -178,6 +179,10 @@ MSG = {STATE_INIT_FLOW: {FAILURE: 'Added incorrect meters: %(meters)s', TIMEOUT: 'Failed to add meters: meter config stats request timeout.', RCV_ERR: 'Failed to add meters: %(err_msg)s'}, + STATE_GROUP_EXIST_CHK: + {FAILURE: 'Added incorrect groups: %(groups)s', + TIMEOUT: 'Failed to add groups: group desc stats request timeout.', + RCV_ERR: 'Failed to add groups: %(err_msg)s'}, STATE_TARGET_PKT_COUNT: {TIMEOUT: 'Failed to request port stats from target: request timeout.', RCV_ERR: 'Failed to request port stats from target: %(err_msg)s'}, @@ -402,6 +407,8 @@ class OfTester(app_manager.RyuApp): self.target_sw.send_meter_config_stats, flow) elif isinstance(flow, ofproto_v1_3_parser.OFPGroupMod): self._test(STATE_GROUP_INSTALL, self.target_sw, flow) + self._test(STATE_GROUP_EXIST_CHK, + self.target_sw.send_group_desc_stats, flow) # Do tests. for pkt in test.tests: @@ -512,6 +519,7 @@ class OfTester(app_manager.RyuApp): STATE_FLOW_EXIST_CHK: self._test_exist_check, STATE_THROUGHPUT_FLOW_EXIST_CHK: self._test_exist_check, STATE_METER_EXIST_CHK: self._test_exist_check, + STATE_GROUP_EXIST_CHK: self._test_exist_check, STATE_TARGET_PKT_COUNT: self._test_get_packet_count, STATE_TESTER_PKT_COUNT: self._test_get_packet_count, STATE_FLOW_MATCH_CHK: self._test_flow_matching_check, @@ -561,6 +569,10 @@ class OfTester(app_manager.RyuApp): OpenFlowSw.send_meter_config_stats.__name__: { 'reply': ofproto_v1_3_parser.OFPMeterConfigStatsReply, 'compare': self._compare_meter + }, + OpenFlowSw.send_group_desc_stats.__name__: { + 'reply': ofproto_v1_3_parser.OFPGroupDescStatsReply, + 'compare': self._compare_group } } xid = method() @@ -582,7 +594,9 @@ class OfTester(app_manager.RyuApp): OpenFlowSw.send_flow_stats.__name__: {'flows': ', '.join(ng_stats)}, OpenFlowSw.send_meter_config_stats.__name__: - {'meters': ', '.join(ng_stats)} + {'meters': ', '.join(ng_stats)}, + OpenFlowSw.send_group_desc_stats.__name__: + {'groups': ', '.join(ng_stats)} } raise TestFailure(self.state, **error_dict[method.__name__]) @@ -829,6 +843,18 @@ class OfTester(app_manager.RyuApp): return False, 'meter_stats(%s)' % ','.join(meter_stats) return True, None + def _compare_group(self, stats1, stats2): + attr_list = ['type', 'group_id', 'buckets'] + for attr in attr_list: + value1 = getattr(stats1, attr) + value2 = getattr(stats2, attr) + if str(value1) != str(value2): + group_stats = [] + for attr in attr_list: + group_stats.append('%s=%s' % (attr, getattr(stats1, attr))) + return False, 'group_stats(%s)' % ','.join(group_stats) + return True, None + def _diff_packets(self, model_pkt, rcv_pkt): msg = [] for rcv_p in rcv_pkt.protocols: @@ -956,7 +982,9 @@ class OfTester(app_manager.RyuApp): @set_ev_cls([ofp_event.EventOFPFlowStatsReply, ofp_event.EventOFPMeterConfigStatsReply, ofp_event.EventOFPTableStatsReply, - ofp_event.EventOFPPortStatsReply], handler.MAIN_DISPATCHER) + ofp_event.EventOFPPortStatsReply, + ofp_event.EventOFPGroupDescStatsReply], + handler.MAIN_DISPATCHER) def stats_reply_handler(self, ev): # keys: stats reply event classes # values: states in which the events should be processed @@ -972,7 +1000,9 @@ class OfTester(app_manager.RyuApp): STATE_FLOW_UNMATCH_CHK], ofp_event.EventOFPPortStatsReply: [STATE_TARGET_PKT_COUNT, - STATE_TESTER_PKT_COUNT] + STATE_TESTER_PKT_COUNT], + ofp_event.EventOFPGroupDescStatsReply: + [STATE_GROUP_EXIST_CHK] } if self.state in event_states[ev.__class__]: if self.waiter and ev.msg.xid in self.send_msg_xids: @@ -1112,6 +1142,11 @@ class OpenFlowSw(object): stats = parser.OFPMeterConfigStatsRequest(self.dp) return self.send_msg(stats) + def send_group_desc_stats(self): + parser = self.dp.ofproto_parser + stats = parser.OFPGroupDescStatsRequest(self.dp) + return self.send_msg(stats) + def send_table_stats(self): """ Get table stats. """ parser = self.dp.ofproto_parser |