Bump pre-commit flake8 to 6.1.0
[integration/test.git] / csit / libraries / BgpRpcClient.py
index fe60e2c3be422f06be598b13a40a94600a4b5d45..4a1ba83bd8c21bd0cee833bc9d29706b3a39bc89 100644 (file)
@@ -6,7 +6,8 @@ exa_ methods apply to test/tools/exabgp_files/exarpc.py
 play_ methods apply to test/tool/fastbgp/play.py  (only with --evpn used)
 """
 
-import xmlrpclib
+import re
+import xmlrpc.client
 
 
 class BgpRpcClient(object):
@@ -14,7 +15,7 @@ class BgpRpcClient(object):
 
     def __init__(self, peer_addr, port=8000):
         """Setup destination point of the rpc server"""
-        self.proxy = xmlrpclib.ServerProxy("http://{}:{}".format(peer_addr, port))
+        self.proxy = xmlrpc.client.ServerProxy("http://{}:{}".format(peer_addr, port))
 
     def exa_announce(self, full_exabgp_cmd):
         """The full command to be passed to exabgp."""
@@ -26,19 +27,19 @@ class BgpRpcClient(object):
 
     def exa_get_received_open_count(self):
         """Gets open messages counter."""
-        return self._exa_get_counter('open')
+        return self._exa_get_counter("open")
 
     def exa_get_received_keepalive_count(self):
         """Gets keepalive messages counter."""
-        return self._exa_get_counter('keepalive')
+        return self._exa_get_counter("keepalive")
 
     def exa_get_received_update_count(self):
         """Gets update messges counter."""
-        return self._exa_get_counter('update')
+        return self._exa_get_counter("update")
 
     def exa_get_received_route_refresh_count(self):
         """Gets route refresh message counter."""
-        return self._exa_get_counter('route_refresh')
+        return self._exa_get_counter("route_refresh")
 
     def _exa_clean_counter(self, msg_type):
         """Cleans counter on the server of given message type."""
@@ -46,19 +47,19 @@ class BgpRpcClient(object):
 
     def exa_clean_received_open_count(self):
         """Cleans open message counter."""
-        return self._exa_clean_counter('open')
+        return self._exa_clean_counter("open")
 
     def exa_clean_received_keepalive_count(self):
         """Cleans keepalive message counter."""
-        return self._exa_clean_counter('keepalive')
+        return self._exa_clean_counter("keepalive")
 
     def exa_clean_received_update_count(self):
         """Cleans update message counter."""
-        return self._exa_clean_counter('update')
+        return self._exa_clean_counter("update")
 
     def exa_clean_received_route_refresh_count(self):
         """Cleans route refresh message counter."""
-        return self._exa_clean_counter('route_refresh')
+        return self._exa_clean_counter("route_refresh")
 
     def _exa_clean_message(self, msg_type):
         """Cleans stored message on the server of given message type."""
@@ -66,7 +67,7 @@ class BgpRpcClient(object):
 
     def exa_clean_update_message(self):
         """Cleans update message."""
-        return self._exa_clean_message('update')
+        return self._exa_clean_message("update")
 
     def _exa_get_message(self, msg_type):
         """Gets stored message on the server of given message type."""
@@ -79,19 +80,26 @@ class BgpRpcClient(object):
         timestamp, ...). msg_only is a flag that we want just message content
         and no details.
         """
-        msg = self._exa_get_message('update')
+        msg = self._exa_get_message("update")
         if not msg_only:
             return msg
-        return msg if 'neighbor' not in msg else msg['neighbor']['message']
+        return msg if "neighbor" not in msg else msg["neighbor"]["message"]
 
     def play_send(self, hexstring):
         """Sends given hex data, already encoded bgp update message is expected."""
         return self.proxy.send(hexstring.rstrip())
 
-    def play_get(self, what='update'):
+    def play_get(self, what="update"):
         """Gets the last received (update) mesage as hex string."""
         return self.proxy.get(what)
 
-    def play_clean(self, what='update'):
+    def play_clean(self, what="update"):
         """Cleans the message (update) on the server."""
         return self.proxy.clean(what)
+
+    def sum_hex_message(self, hex_string):
+        """Verifies two hex messages are equal even in case, their arguments are misplaced.
+        Converts hex message arguments to integers and sums them up and returns the sum."""
+        return sum(
+            [int(x, 16) for x in re.compile(r"[a-f\d]{2}").findall(hex_string[32:])]
+        )