summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorMaxime Peim <mpeim@cisco.com>2023-01-06 11:57:38 +0000
committerNeale Ranns <neale@graphiant.com>2023-02-02 00:22:06 +0000
commit2d1a62bfddbba92a0aeec5c68e9b0a7903b178da (patch)
treeb5a8306e9d345c18bb45a55b0cfa5786c02258f0 /test
parent3220d9f16b3db05fe9ea8d756395cd8aa7755863 (diff)
policer: API policer selection by index
Policer API calls were only by policer name. It is now possible to select a policer by its index. Some functionalities are also added to allow updating a policer configuration and to refill its token buckets. Some dead codes are being removed, and small fixes made. Type: improvement Signed-off-by: Maxime Peim <mpeim@cisco.com> Change-Id: I4cc8fda0fc7c635a4110da3e757356b150f9b606
Diffstat (limited to 'test')
-rw-r--r--test/test_policer_input.py79
-rw-r--r--test/vpp_policer.py59
2 files changed, 116 insertions, 22 deletions
diff --git a/test/test_policer_input.py b/test/test_policer_input.py
index 9d44fc1a21c..6b4ab54a37e 100644
--- a/test/test_policer_input.py
+++ b/test/test_policer_input.py
@@ -92,6 +92,85 @@ class TestPolicerInput(VppTestCase):
"""Output Policing"""
self.policer_interface_test(Dir.TX)
+ def test_policer_reset(self):
+ """Policer reset bucket"""
+ pkts = self.pkt * NUM_PKTS
+
+ action_tx = PolicerAction(
+ VppEnum.vl_api_sse2_qos_action_type_t.SSE2_QOS_ACTION_API_TRANSMIT, 0
+ )
+ policer = VppPolicer(
+ self,
+ "pol1",
+ 1,
+ 0,
+ 10000,
+ 0,
+ conform_action=action_tx,
+ exceed_action=action_tx,
+ violate_action=action_tx,
+ )
+ policer.add_vpp_config()
+
+ # Start policing on pg0
+ policer.apply_vpp_config(self.pg0.sw_if_index, Dir.RX, True)
+
+ self.send_and_expect(self.pg0, pkts, self.pg1, worker=0)
+ details = policer.get_details()
+
+ self.assertGreater(details.current_limit, details.current_bucket)
+
+ self.send_and_expect(self.pg0, pkts, self.pg1, worker=0)
+ self.vapi.policer_reset(policer_index=policer.policer_index)
+ details = policer.get_details()
+
+ self.assertEqual(details.current_limit, details.current_bucket)
+
+ policer.apply_vpp_config(self.pg0.sw_if_index, Dir.RX, False)
+
+ policer.remove_vpp_config()
+
+ def test_policer_update(self):
+ """Policer update"""
+ pkts = self.pkt * NUM_PKTS
+
+ action_tx = PolicerAction(
+ VppEnum.vl_api_sse2_qos_action_type_t.SSE2_QOS_ACTION_API_TRANSMIT, 0
+ )
+ policer = VppPolicer(
+ self,
+ "pol1",
+ 1,
+ 0,
+ 10000,
+ 0,
+ conform_action=action_tx,
+ exceed_action=action_tx,
+ violate_action=action_tx,
+ )
+ policer.add_vpp_config()
+
+ # Start policing on pg0
+ policer.apply_vpp_config(self.pg0.sw_if_index, Dir.RX, True)
+
+ self.send_and_expect(self.pg0, pkts, self.pg1, worker=0)
+ details_before = policer.get_details()
+
+ self.assertGreater(details_before.current_limit, details_before.current_bucket)
+
+ policer.cir = 8000
+ policer.commited_burst = 100000
+ policer.update()
+
+ details_after = policer.get_details()
+
+ self.assertGreater(details_after.cir, details_before.cir)
+ self.assertGreater(details_after.cb, details_before.cb)
+
+ policer.apply_vpp_config(self.pg0.sw_if_index, Dir.RX, False)
+
+ policer.remove_vpp_config()
+
def policer_handoff_test(self, dir: Dir):
pkts = self.pkt * NUM_PKTS
diff --git a/test/vpp_policer.py b/test/vpp_policer.py
index b0097b370e5..b48f4c6af1c 100644
--- a/test/vpp_policer.py
+++ b/test/vpp_policer.py
@@ -57,46 +57,54 @@ class VppPolicer(VppObject):
def policer_index(self):
return self._policer_index
+ @property
+ def config(self):
+ return {
+ "cir": self.cir,
+ "eir": self.eir,
+ "cb": self.commited_burst,
+ "eb": self.excess_burst,
+ "rate_type": self.rate_type,
+ "round_type": self.round_type,
+ "type": self.type,
+ "color_aware": self.color_aware,
+ "conform_action": self.conform_action.encode(),
+ "exceed_action": self.exceed_action.encode(),
+ "violate_action": self.violate_action.encode(),
+ }
+
def add_vpp_config(self):
- r = self._test.vapi.policer_add_del(
- name=self.name,
- cir=self.cir,
- eir=self.eir,
- cb=self.commited_burst,
- eb=self.excess_burst,
- rate_type=self.rate_type,
- round_type=self.round_type,
- type=self.type,
- color_aware=self.color_aware,
- conform_action=self.conform_action.encode(),
- exceed_action=self.exceed_action.encode(),
- violate_action=self.violate_action.encode(),
- )
+ r = self._test.vapi.policer_add(name=self.name, infos=self.config)
self._test.registry.register(self, self._test.logger)
self._policer_index = r.policer_index
return self
+ def update(self):
+ self._test.vapi.policer_update(
+ policer_index=self._policer_index, infos=self.config
+ )
+
def remove_vpp_config(self):
- self._test.vapi.policer_add_del(is_add=False, name=self.name)
+ self._test.vapi.policer_del(policer_index=self._policer_index)
self._policer_index = INVALID_INDEX
def bind_vpp_config(self, worker, bind):
- self._test.vapi.policer_bind(
- name=self.name, worker_index=worker, bind_enable=bind
+ self._test.vapi.policer_bind_v2(
+ policer_index=self._policer_index, worker_index=worker, bind_enable=bind
)
def apply_vpp_config(self, if_index, dir: Dir, apply):
if dir == Dir.RX:
- self._test.vapi.policer_input(
- name=self.name, sw_if_index=if_index, apply=apply
+ self._test.vapi.policer_input_v2(
+ policer_index=self._policer_index, sw_if_index=if_index, apply=apply
)
else:
- self._test.vapi.policer_output(
- name=self.name, sw_if_index=if_index, apply=apply
+ self._test.vapi.policer_output_v2(
+ policer_index=self._policer_index, sw_if_index=if_index, apply=apply
)
def query_vpp_config(self):
- dump = self._test.vapi.policer_dump(match_name_valid=True, match_name=self.name)
+ dump = self._test.vapi.policer_dump_v2(policer_index=self._policer_index)
for policer in dump:
if policer.name == self.name:
return True
@@ -105,6 +113,13 @@ class VppPolicer(VppObject):
def object_id(self):
return "policer-%s" % (self.name)
+ def get_details(self):
+ dump = self._test.vapi.policer_dump_v2(policer_index=self._policer_index)
+ for policer in dump:
+ if policer.name == self.name:
+ return policer
+ raise self._test.vapi.VPPValueError("Missing policer")
+
def get_stats(self, worker=None):
conform = self._test.statistics.get_counter("/net/policer/conform")
exceed = self._test.statistics.get_counter("/net/policer/exceed")