X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FIPv4NodeAddress.py;h=de96c189e59abf519823e7e06c95f334f3d2e991;hp=8db9ffafe38011333b06e91019f8028eee273546;hb=12a51f968499f7710a5f54c7cc3bc2afa5c7bc3b;hpb=b92a827b1c7f48da4214e992e5503ebe1c182416 diff --git a/resources/libraries/python/IPv4NodeAddress.py b/resources/libraries/python/IPv4NodeAddress.py index 8db9ffafe3..de96c189e5 100644 --- a/resources/libraries/python/IPv4NodeAddress.py +++ b/resources/libraries/python/IPv4NodeAddress.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -13,92 +13,90 @@ """Robot framework variable file. - Create dictionary variable nodes_ipv4_addr of IPv4 addresses from - available networks. +Create dictionary variable nodes_ipv4_addr of IPv4 addresses from +available networks. """ + from ipaddress import IPv4Network +from resources.libraries.python.topology import Topology + # Default list of IPv4 subnets -IPV4_NETWORKS = ['20.20.20.0/24', - '10.10.10.0/24', - '1.1.1.0/30'] +IPV4_NETWORKS = ['192.168.{}.0/24'.format(i) for i in range(1, 100)] class IPv4NetworkGenerator(object): - """IPv4 network generator.""" + """IPv4 network generator. + + TODO: Conform to https://docs.python.org/2/library/stdtypes.html#typeiter + """ + def __init__(self, networks): + """Populate internal list of valid networks. + + :param networks: List of strings containing IPv4 subnet + with prefix length. + :type networks: list + :raise RuntimeError: If no IPv4 networks are added. """ - :param networks: list of strings containing IPv4 subnet - with prefix length - """ - self._networks = list() + self._networks = [] for network in networks: net = IPv4Network(unicode(network)) - subnet, _ = network.split('/') - self._networks.append((net, subnet)) - if len(self._networks) == 0: - raise Exception('No IPv4 networks') + self._networks.append(net) + if not self._networks: + raise RuntimeError("No IPv4 networks") def next_network(self): + """Pop and return network from internal list. + + :returns: Next network in form (IPv4Network, subnet). + :raises StopIteration: If there are no more elements. """ - :return: next network in form (IPv4Network, subnet) - """ - if len(self._networks): + if self._networks: return self._networks.pop() else: raise StopIteration() -def get_variables(networks=IPV4_NETWORKS[:]): - """ - Create dictionary of IPv4 addresses generated from provided subnet list. - - Example of returned dictionary: - network = { - 'NET1': { - 'subnet': '192.168.1.0', - 'prefix': 24, - 'port1': { - 'addr': '192.168.1.1', - }, - 'port2': { - 'addr': '192.168.1.0', - }, - }, - 'NET2': { - 'subnet': '192.168.2.0', - 'prefix': 24, - 'port1': { - 'addr': '192.168.2.1', - }, - 'port2': { - 'addr': '192.168.2.2', - }, - }, - } - - This function is called by RobotFramework automatically. - - :param networks: list of subnets in form a.b.c.d/length - :return: Dictionary of IPv4 addresses +def get_variables(nodes, networks=IPV4_NETWORKS[:]): + """Special robot framework method that returns dictionary nodes_ipv4_addr, + mapping of node and interface name to IPv4 address. + + :param nodes: Nodes of the test topology. + :param networks: List of available IPv4 networks. + :type nodes: dict + :type networks: list + + .. note:: + Robot framework calls it automatically. """ - net_object = IPv4NetworkGenerator(networks) - - network = {} - interface_count_per_node = 2 - - for subnet_num in range(len(networks)): - net, net_str = net_object.next_network() - key = 'NET{}'.format(subnet_num + 1) - network[key] = { - 'subnet': net_str, - 'prefix': net.prefixlen, - } - hosts = net.hosts() - for port_num in range(interface_count_per_node): - port = 'port{}'.format(port_num + 1) - network[key][port] = { - 'addr': str(next(hosts)), - } - - return {'DICT__nodes_ipv4_addr': network} + topo = Topology() + links = topo.get_links(nodes) + + if len(links) > len(networks): + raise Exception('Not enough available IPv4 networks for topology.') + + ip4_n = IPv4NetworkGenerator(networks) + + nets = {} + + for link in links: + ip4_net = ip4_n.next_network() + net_hosts = ip4_net.hosts() + port_idx = 0 + ports = {} + for node in nodes.values(): + if_key = topo.get_interface_by_link_name(node, link) + if_name = topo.get_interface_name(node, if_key) + if if_name is not None: + port = {'addr': str(next(net_hosts)), + 'node': node['host'], + 'if': if_name} + port_idx += 1 + port_id = 'port{0}'.format(port_idx) + ports.update({port_id: port}) + nets.update({link: {'net_addr': str(ip4_net.network_address), + 'prefix': ip4_net.prefixlen, + 'ports': ports}}) + + return {'DICT__nodes_ipv4_addr': nets}