diff options
author | Maxime Peim <mpeim@cisco.com> | 2023-01-06 11:57:38 +0000 |
---|---|---|
committer | Neale Ranns <neale@graphiant.com> | 2023-02-02 00:22:06 +0000 |
commit | 2d1a62bfddbba92a0aeec5c68e9b0a7903b178da (patch) | |
tree | b5a8306e9d345c18bb45a55b0cfa5786c02258f0 /test | |
parent | 3220d9f16b3db05fe9ea8d756395cd8aa7755863 (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.py | 79 | ||||
-rw-r--r-- | test/vpp_policer.py | 59 |
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") |