aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/IPv6Util.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/IPv6Util.py')
-rw-r--r--resources/libraries/python/IPv6Util.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/resources/libraries/python/IPv6Util.py b/resources/libraries/python/IPv6Util.py
new file mode 100644
index 0000000000..a96683b164
--- /dev/null
+++ b/resources/libraries/python/IPv6Util.py
@@ -0,0 +1,101 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""IPv6 utilities library."""
+
+import re
+from ssh import SSH
+
+
+class IPv6Util(object):
+ """IPv6 utilities"""
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def ipv6_ping(src_node, dst_addr, count=3, data_size=56, timeout=1):
+ """IPv6 ping.
+
+ Args:
+ src_node (Dict): Node where ping run.
+ dst_addr (str): Destination IPv6 address.
+ count (Optional[int]): Number of echo requests.
+ data_size (Optional[int]): Number of the data bytes.
+ timeout (Optional[int]): Time to wait for a response, in seconds.
+
+ Returns:
+ Number of lost packets.
+ """
+ ssh = SSH()
+ ssh.connect(src_node)
+
+ cmd = "ping6 -c {c} -s {s} -W {W} {dst}".format(c=count, s=data_size,
+ W=timeout,
+ dst=dst_addr)
+ (ret_code, stdout, _) = ssh.exec_command(cmd)
+
+ regex = re.compile(r'(\d+) packets transmitted, (\d+) received')
+ match = regex.search(stdout)
+ sent, received = match.groups()
+ packet_lost = int(sent) - int(received)
+
+ return packet_lost
+
+ @staticmethod
+ def ipv6_ping_port(nodes_ip, src_node, dst_node, port, cnt=3,
+ size=56, timeout=1):
+ """Send IPv6 ping to the node port.
+
+ Args:
+ nodes_ip (Dict): Nodes IPv6 adresses.
+ src_node (Dict): Node where ping run.
+ dst_node (Dict): Destination node.
+ port (str): Port on the destination node.
+ cnt (Optional[int]): Number of echo requests.
+ size (Optional[int]): Number of the data bytes.
+ timeout (Optional[int]): Time to wait for a response, in seconds.
+
+ Returns:
+ Number of lost packets.
+ """
+ dst_ip = IPv6Util.get_node_port_ipv6_address(dst_node, port, nodes_ip)
+ return IPv6Util.ipv6_ping(src_node, dst_ip, cnt, size, timeout)
+
+ @staticmethod
+ def get_node_port_ipv6_address(node, interface, nodes_addr):
+ """Return IPv6 address of the node port.
+
+ Args:
+ node (Dict): Node in the topology.
+ interface (str): Interface name of the node.
+ nodes_addr (Dict): Nodes IPv6 adresses.
+
+ Returns:
+ IPv6 address string.
+ """
+ for net in nodes_addr.values():
+ for port in net['ports'].values():
+ host = port.get('node')
+ dev = port.get('if')
+ if host == node['host'] and dev == interface:
+ ip = port.get('addr')
+ if ip is not None:
+ return ip
+ else:
+ raise Exception(
+ 'Node {n} port {p} IPv6 address is not set'.format(
+ n=node['host'], p=interface))
+
+ raise Exception('Node {n} port {p} IPv6 address not found.'.format(
+ n=node['host'], p=interface))