From 7f3fb9da40b6ef1644a9fc38275e320453ab0537 Mon Sep 17 00:00:00 2001 From: Dmitry Tyzhnenko Date: Mon, 29 Feb 2016 11:29:51 +0000 Subject: [PATCH] Replace ipaddr to netaddr Remove ipaddr from fuelweb_test/requirements.txt and use netaddr in test cases instead of ipaddr Use string for creation of netaddr instances Change-Id: Idc86dcaae6f10c13b04095fb11fa9351b130deb8 Closes-bug: #1544148 --- fuelweb_test/helpers/checkers.py | 7 ++-- fuelweb_test/helpers/utils.py | 6 +-- fuelweb_test/models/fuel_web_client.py | 42 ++++++++++--------- fuelweb_test/requirements.txt | 3 +- fuelweb_test/tests/test_multiple_networks.py | 16 ++++--- fuelweb_test/tests/test_net_templates_base.py | 16 +++---- .../tests/test_services_reconfiguration.py | 7 ++-- 7 files changed, 50 insertions(+), 47 deletions(-) diff --git a/fuelweb_test/helpers/checkers.py b/fuelweb_test/helpers/checkers.py index 1a060c9be..a0bc6701a 100644 --- a/fuelweb_test/helpers/checkers.py +++ b/fuelweb_test/helpers/checkers.py @@ -33,8 +33,8 @@ from fuelweb_test.settings import OPENSTACK_RELEASE_UBUNTU from fuelweb_test.settings import POOLS from fuelweb_test.settings import PUBLIC_TEST_IP -from ipaddr import IPAddress -from ipaddr import IPNetwork +from netaddr import IPAddress +from netaddr import IPNetwork from proboscis.asserts import assert_equal from proboscis.asserts import assert_true @@ -603,7 +603,8 @@ def check_stats_private_info(collector_remote, postgres_actions, # If IP address isn't public and doesn't belong to defined for # deployment pools (e.g. admin, public, storage), then skip it if any(re.search(_r, _match.group()) for _r in _not_public_regex) \ - and not any(IPAddress(_match.group()) in IPNetwork(net) for + and not any(IPAddress(str(_match.group())) in + IPNetwork(str(net)) for net in _used_networks): continue logger.debug('Usage statistics with public IP(s):\n {0}'. diff --git a/fuelweb_test/helpers/utils.py b/fuelweb_test/helpers/utils.py index 18194f638..53bd68874 100644 --- a/fuelweb_test/helpers/utils.py +++ b/fuelweb_test/helpers/utils.py @@ -23,7 +23,7 @@ import os import posixpath import re import signal -import ipaddr +import netaddr from proboscis import asserts from proboscis.asserts import assert_true @@ -625,8 +625,8 @@ def generate_floating_ranges(start_ip, end_ip, step): :return: """ ranges = [] - ip_start = ipaddr.IPAddress(start_ip) - ip_end = ipaddr.IPAddress(end_ip) + ip_start = netaddr.IPAddress(str(start_ip)) + ip_end = netaddr.IPAddress(str(end_ip)) while ip_end - step > ip_start: ranges.append([str(ip_start), str(ip_start + step)]) ip_start += (step + 1) diff --git a/fuelweb_test/models/fuel_web_client.py b/fuelweb_test/models/fuel_web_client.py index 43ed9b73b..f3566ea74 100644 --- a/fuelweb_test/models/fuel_web_client.py +++ b/fuelweb_test/models/fuel_web_client.py @@ -15,6 +15,10 @@ import re import time import traceback + +import yaml +import netaddr + from urllib2 import HTTPError from devops.error import DevopsCalledProcessError @@ -22,16 +26,13 @@ from devops.error import TimeoutError from devops.helpers.helpers import _wait from devops.helpers.helpers import wait from devops.models.node import Node -import ipaddr -from ipaddr import IPNetwork -from netaddr import EUI + from proboscis.asserts import assert_equal from proboscis.asserts import assert_false from proboscis.asserts import assert_is_not_none from proboscis.asserts import assert_not_equal from proboscis.asserts import assert_raises from proboscis.asserts import assert_true -import yaml from fuelweb_test import logger from fuelweb_test import logwrap @@ -818,10 +819,8 @@ class FuelWebClient(object): cluster_id)['external_net'])) ret = [] for pool in subnet['allocation_pools']: - ip = ipaddr.IPv4Address(pool['start']) - while ip <= ipaddr.IPv4Address(pool['end']): - ret.append(str(ip)) - ip += 1 + ret.extend([str(ip) for ip in + netaddr.iter_iprange(pool['start'], pool['end'])]) return ret @logwrap @@ -898,7 +897,7 @@ class FuelWebClient(object): Returns dict with nailgun slave node description if node is registered. Otherwise return None. """ - d_macs = {EUI(i.mac_address) for i in devops_node.interfaces} + d_macs = {netaddr.EUI(i.mac_address) for i in devops_node.interfaces} logger.debug('Verify that nailgun api is running') attempts = ATTEMPTS nodes = [] @@ -916,7 +915,8 @@ class FuelWebClient(object): time.sleep(TIMEOUT) logger.debug('Look for nailgun node by macs %s', d_macs) for nailgun_node in nodes: - macs = {EUI(i['mac']) for i in nailgun_node['meta']['interfaces']} + macs = {netaddr.EUI(i['mac']) for i in + nailgun_node['meta']['interfaces']} logger.debug('Look for macs returned by nailgun {0}'.format(macs)) # Because our HAproxy may create some interfaces if d_macs.issubset(macs): @@ -947,9 +947,11 @@ class FuelWebClient(object): :rtype: Devops Node or None """ nailgun_node = self.get_nailgun_node_by_fqdn(fqdn) - macs = {EUI(i['mac']) for i in nailgun_node['meta']['interfaces']} + macs = {netaddr.EUI(i['mac']) for i in + nailgun_node['meta']['interfaces']} for devops_node in devops_nodes: - devops_macs = {EUI(i.mac_address) for i in devops_node.interfaces} + devops_macs = {netaddr.EUI(i.mac_address) for i in + devops_node.interfaces} if devops_macs == macs: return devops_node @@ -962,7 +964,7 @@ class FuelWebClient(object): """ for node in self.environment.d_env.nodes(): for iface in node.interfaces: - if EUI(iface.mac_address) == EUI(mac_address): + if netaddr.EUI(iface.mac_address) == netaddr.EUI(mac_address): return node @logwrap @@ -1652,7 +1654,7 @@ class FuelWebClient(object): baremetal_net = self.environment.d_env.get_network( name='ironic').ip_network net_config['gateway'] = str( - list(IPNetwork(baremetal_net))[-2]) + list(netaddr.IPNetwork(str(baremetal_net)))[-2]) ip_network = baremetal_net else: ip_network = net_name @@ -1662,7 +1664,7 @@ class FuelWebClient(object): baremetal_net = self.environment.d_env.get_network( name='ironic').ip_network net_config['gateway'] = str( - list(IPNetwork(baremetal_net))[-2]) + list(netaddr.IPNetwork(str(baremetal_net)))[-2]) ip_network = baremetal_net else: net_config['gateway'] = self.environment.d_env.router(net_name) @@ -1679,7 +1681,7 @@ class FuelWebClient(object): net_config['ip_ranges'] = self.get_range(ip_network, -1) def get_range(self, ip_network, ip_range=0): - net = list(IPNetwork(ip_network)) + net = list(netaddr.IPNetwork(str(ip_network))) half = len(net) / 2 if ip_range == 0: return [[str(net[2]), str(net[-2])]] @@ -2221,7 +2223,8 @@ class FuelWebClient(object): for subnet in subnets_list: logger.debug("Check that subnet {0} is part of network {1}" .format(subnet, nailgun_cidr)) - assert_true(IPNetwork(subnet) in IPNetwork(nailgun_cidr), + assert_true(netaddr.IPNetwork(str(subnet)) in + netaddr.IPNetwork(str(nailgun_cidr)), 'Something goes wrong. Seems subnet {0} is out ' 'of net {1}'.format(subnet, nailgun_cidr)) @@ -2233,7 +2236,8 @@ class FuelWebClient(object): for subnet1, subnet2 in subnets_pairs: logger.debug("Check if the subnet {0} is part of the subnet {1}" .format(subnet1, subnet2)) - assert_true(IPNetwork(subnet1) not in IPNetwork(subnet2), + assert_true(netaddr.IPNetwork(str(subnet1)) not in + netaddr.IPNetwork(str(subnet2)), "Subnet {0} is part of subnet {1}" .format(subnet1, subnet2)) @@ -2560,7 +2564,7 @@ class FuelWebClient(object): for network in networks: if network['name'] != network_name: continue - old_cidr = IPNetwork(network['cidr']) + old_cidr = netaddr.IPNetwork(str(network['cidr'])) new_cidr = old_cidr.subnet(1)[0] assert_not_equal(old_cidr, new_cidr, 'Can\t create a subnet using default cidr {0} ' diff --git a/fuelweb_test/requirements.txt b/fuelweb_test/requirements.txt index 7d8689908..c3e9c27d2 100644 --- a/fuelweb_test/requirements.txt +++ b/fuelweb_test/requirements.txt @@ -3,9 +3,8 @@ git+git://github.com/openstack/fuel-devops.git@2.9.19 anyjson==0.3.1 paramiko proboscis==1.2.6.0 -ipaddr junitxml>=0.7.0 -netaddr +netaddr>=0.7.12,!=0.7.16 python-glanceclient==0.17.1 python-keystoneclient>=0.3.2 python-novaclient>=2.15.0 diff --git a/fuelweb_test/tests/test_multiple_networks.py b/fuelweb_test/tests/test_multiple_networks.py index bba5411e8..b1fc3341c 100644 --- a/fuelweb_test/tests/test_multiple_networks.py +++ b/fuelweb_test/tests/test_multiple_networks.py @@ -12,8 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -from ipaddr import IPAddress -from ipaddr import summarize_address_range import netaddr import json @@ -51,7 +49,7 @@ class TestMultipleClusterNets(TestBasic): for net in net_dict['networks']: if net_name in net['name'] and net['group_id'] == group_id: cidr = net['cidr'] - sliced_list = list(netaddr.IPNetwork(cidr))[5:-5] + sliced_list = list(netaddr.IPNetwork(str(cidr)))[5:-5] return [str(sliced_list[0]), str(sliced_list[-1])] @staticmethod @@ -67,7 +65,7 @@ class TestMultipleClusterNets(TestBasic): asserts.assert_true(len(default_admin_network) == 1, "Default 'admin/pxe' network not found " "in cluster network configuration!") - default_admin_range = [IPAddress(ip) for ip + default_admin_range = [netaddr.IPAddress(str(ip)) for ip in default_admin_network[0]["ip_ranges"][0]] new_admin_range = [default_admin_range[0] + number_excluded_ips, default_admin_range[1]] @@ -77,9 +75,8 @@ class TestMultipleClusterNets(TestBasic): @staticmethod def is_ip_in_range(ip_addr, ip_range_start, ip_range_end): - ip_addr_ranges = summarize_address_range(IPAddress(ip_range_start), - IPAddress(ip_range_end)) - return any(IPAddress(ip_addr) in iprange for iprange in ip_addr_ranges) + return netaddr.IPAddress(str(ip_addr)) in netaddr.iter_iprange( + str(ip_range_start), str(ip_range_end)) @staticmethod def is_update_dnsmasq_running(tasks): @@ -659,8 +656,9 @@ class TestMultipleClusterNets(TestBasic): } for k in check: - vip = IPAddress(current_settings['vips'][k]['ipaddr']) - custom_net = self.env.d_env.get_network(name=check[k]).ip + vip = netaddr.IPAddress(str(current_settings['vips'][k]['ipaddr'])) + custom_net = netaddr.IPNetwork( + str(self.env.d_env.get_network(name=check[k]).ip)) asserts.assert_true( vip in custom_net, '{0} is not from {1} network'.format(k, check[k])) diff --git a/fuelweb_test/tests/test_net_templates_base.py b/fuelweb_test/tests/test_net_templates_base.py index 6fcdb138a..09be5ff7e 100644 --- a/fuelweb_test/tests/test_net_templates_base.py +++ b/fuelweb_test/tests/test_net_templates_base.py @@ -12,8 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. -from ipaddr import IPAddress -from ipaddr import IPNetwork +import netaddr + from proboscis.asserts import assert_equal from proboscis.asserts import assert_true from proboscis.asserts import fail @@ -55,9 +55,8 @@ class TestNetworkTemplatesBase(TestBasic): '"{0}", which does not exist!'.format(nodegroup)) group_id = [n['id'] for n in nodegroups if n['name'] == nodegroup][0] - ip_network = IPNetwork(ip_nets[nodegroup]) - ip_subnets = ip_network.subnet( - int(ip_prefixlen) - int(ip_network.prefixlen)) + ip_network = netaddr.IPNetwork(str(ip_nets[nodegroup])) + ip_subnets = ip_network.subnet(int(ip_prefixlen)) for network, interface in networks: ip_subnet = ip_subnets.pop() networks_data.append( @@ -147,13 +146,14 @@ class TestNetworkTemplatesBase(TestBasic): raw_addresses = self.get_interface_ips(remote, iface_name) raw_ips = [raw_addr.split('/')[0] for raw_addr in raw_addresses] try: - ips = [IPAddress(raw_ip) for raw_ip in raw_ips] + ips = [netaddr.IPAddress(str(raw_ip)) for raw_ip in raw_ips] except ValueError: fail('Device {0} on remote node does not have a valid ' 'IPv4 address assigned!'.format(iface_name)) return - actual_networks = [IPNetwork(raw_addr) for raw_addr in raw_addresses] - network = IPNetwork(cidr) + actual_networks = [netaddr.IPNetwork(str(raw_addr)) for + raw_addr in raw_addresses] + network = netaddr.IPNetwork(str(cidr)) assert_true(network in actual_networks, 'Network(s) on {0} device differs than {1}: {2}'.format( iface_name, cidr, raw_addresses)) diff --git a/fuelweb_test/tests/test_services_reconfiguration.py b/fuelweb_test/tests/test_services_reconfiguration.py index 6475079a2..463eb7289 100644 --- a/fuelweb_test/tests/test_services_reconfiguration.py +++ b/fuelweb_test/tests/test_services_reconfiguration.py @@ -12,9 +12,9 @@ # License for the specific language governing permissions and limitations # under the License. -from ipaddr import IPAddress import random import time +import netaddr import traceback from devops.helpers import helpers @@ -103,7 +103,7 @@ class ServicesReconfiguration(TestBasic): lambda x: ((x['name'] != 'fuelweb_admin')and (x['name'] != 'private')), networks): - default_range = [IPAddress(ip) for ip + default_range = [netaddr.IPAddress(str(ip)) for ip in default_network["ip_ranges"][0]] if cut_from_start: new_range = [default_range[0], @@ -1349,7 +1349,8 @@ class ServicesReconfiguration(TestBasic): service_list = ['neutron-server', 'neutron-dhcp-agent', 'neutron-l3-agent', 'neutron-metadata-agent', 'nova-scheduler', 'nova-novncproxy', 'nova-conductor', - 'nova-api', 'nova-consoleauth', 'nova-cert'] + 'nova-api', 'nova-consoleauth', 'nova-objectstore', + 'nova-cert'] services_uptime = {} for service_name in service_list: services_uptime[service_name] = self.get_service_uptime(