summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYuichi Ito <ito.yuichi0@gmail.com>2014-03-28 13:13:21 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2014-03-30 10:42:47 +0900
commitacdfd2347dadb2036b522f8c64deb7750db06f75 (patch)
tree72ad050448bdd47984be3ffe95781be3e4b29a7e
parent35688fc753854a37f83c7ff0598b28147349d151 (diff)
sw test tool: Add support for confirmation of installed meter entries
Signed-off-by: WATANABE Fumitaka <watanabe.fumitaka1@gmail.com> Signed-off-by: Yuichi Ito <ito.yuichi0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/tests/switch/tester.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/ryu/tests/switch/tester.py b/ryu/tests/switch/tester.py
index 1123e163..4d857415 100644
--- a/ryu/tests/switch/tester.py
+++ b/ryu/tests/switch/tester.py
@@ -105,6 +105,7 @@ STATE_UNMATCH_PKT_SEND = 8
STATE_FLOW_UNMATCH_CHK = 9
STATE_INIT_METER = 10
STATE_METER_INSTALL = 11
+STATE_METER_EXIST_CHK = 12
STATE_DISCONNECTED = 99
@@ -135,6 +136,10 @@ MSG = {STATE_INIT_FLOW:
{FAILURE: 'Added incorrect flows: %(flows)s',
TIMEOUT: 'Failed to add flows: flow stats request timeout.',
RCV_ERR: 'Failed to add flows: %(err_msg)s'},
+ STATE_METER_EXIST_CHK:
+ {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_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'},
@@ -335,6 +340,7 @@ class OfTester(app_manager.RyuApp):
self._test(STATE_FLOW_EXIST_CHK, flow)
elif isinstance(flow, ofproto_v1_3_parser.OFPMeterMod):
self._test(STATE_METER_INSTALL, flow)
+ self._test(STATE_METER_EXIST_CHK, flow)
# 2. Check flow matching.
for pkt in test.tests:
if KEY_EGRESS in pkt or KEY_PKT_IN in pkt:
@@ -408,6 +414,7 @@ class OfTester(app_manager.RyuApp):
STATE_FLOW_INSTALL: self._test_flow_install,
STATE_METER_INSTALL: self._test_meter_install,
STATE_FLOW_EXIST_CHK: self._test_flow_exist_check,
+ STATE_METER_EXIST_CHK: self._test_meter_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,
@@ -477,6 +484,23 @@ class OfTester(app_manager.RyuApp):
ng_stats.append(stats)
raise TestFailure(self.state, flows=', '.join(ng_stats))
+ def _test_meter_exist_check(self, meter_mod):
+ xid = self.target_sw.send_meter_config_stats()
+ self.send_msg_xids.append(xid)
+ self._wait()
+
+ ng_stats = []
+ for msg in self.rcv_msgs:
+ assert isinstance(
+ msg, ofproto_v1_3_parser.OFPMeterConfigStatsReply)
+ for stats in msg.body:
+ result, stats = self._compare_meter(stats, meter_mod)
+ if result:
+ return
+ else:
+ ng_stats.append(stats)
+ raise TestFailure(self.state, meters=', '.join(ng_stats))
+
def _test_get_packet_count(self, is_target):
sw = self.target_sw if is_target else self.tester_sw
xid = sw.send_port_stats()
@@ -618,6 +642,20 @@ class OfTester(app_manager.RyuApp):
return False, 'flow_stats(%s)' % ','.join(flow_stats)
return True, None
+ def _compare_meter(self, stats1, stats2):
+ """compare the message used to install and the message got from
+ the switch."""
+ attr_list = ['flags', 'meter_id', 'bands']
+ for attr in attr_list:
+ value1 = getattr(stats1, attr)
+ value2 = getattr(stats2, attr)
+ if str(value1) != str(value2):
+ meter_stats = []
+ for attr in attr_list:
+ meter_stats.append('%s=%s' % (attr, getattr(stats1, attr)))
+ return False, 'meter_stats(%s)' % ','.join(meter_stats)
+ return True, None
+
def _diff_packets(self, model_pkt, rcv_pkt):
msg = []
for rcv_p in rcv_pkt.protocols:
@@ -696,6 +734,17 @@ class OfTester(app_manager.RyuApp):
self.waiter.set()
hub.sleep(0)
+ @set_ev_cls(ofp_event.EventOFPMeterConfigStatsReply,
+ handler.MAIN_DISPATCHER)
+ def meter_config_stats_reply_handler(self, ev):
+ state_list = [STATE_METER_EXIST_CHK]
+ if self.state in state_list:
+ if self.waiter and ev.msg.xid in self.send_msg_xids:
+ self.rcv_msgs.append(ev.msg)
+ if not ev.msg.flags & ofproto_v1_3.OFPMPF_REPLY_MORE:
+ self.waiter.set()
+ hub.sleep(0)
+
@set_ev_cls(ofp_event.EventOFPTableStatsReply, handler.MAIN_DISPATCHER)
def table_stats_reply_handler(self, ev):
state_list = [STATE_GET_MATCH_COUNT,
@@ -833,6 +882,12 @@ class TargetSw(OpenFlowSw):
0, 0, parser.OFPMatch())
return self._send_msg(req)
+ def send_meter_config_stats(self):
+ """ Get all meter. """
+ parser = self.dp.ofproto_parser
+ stats = parser.OFPMeterConfigStatsRequest(self.dp)
+ return self._send_msg(stats)
+
def send_table_stats(self):
""" Get table stats. """
parser = self.dp.ofproto_parser