# Copyright 2016 Hewlett Packard Enterprise Development Company # # 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. import netaddr from tempest.lib import exceptions as lib_exc def get_unused_ip_addresses(ports_client, subnets_client, network_id, subnet_id, count): """Return a list with the specified number of unused IP addresses This method uses the given ports_client to find the specified number of unused IP addresses on the given subnet using the supplied subnets_client """ ports = ports_client.list_ports(network_id=network_id)['ports'] subnet = subnets_client.show_subnet(subnet_id) ip_net = netaddr.IPNetwork(subnet['subnet']['cidr']) subnet_set = netaddr.IPSet(ip_net.iter_hosts()) alloc_set = netaddr.IPSet() # prune out any addresses already allocated to existing ports for port in ports: for fixed_ip in port.get('fixed_ips'): alloc_set.add(fixed_ip['ip_address']) # exclude gateway_ip of subnet gateway_ip = subnet['subnet']['gateway_ip'] if gateway_ip: alloc_set.add(gateway_ip) av_set = subnet_set - alloc_set addrs = [] for cidr in reversed(av_set.iter_cidrs()): for ip in reversed(cidr): addrs.append(str(ip)) if len(addrs) == count: return addrs msg = "Insufficient IP addresses available" raise lib_exc.BadRequest(message=msg) def get_ping_payload_size(mtu, ip_version): """Return the maximum size of ping payload that will fit into MTU.""" if not mtu: return None if ip_version == 4: ip_header = 20 icmp_header = 8 else: ip_header = 40 icmp_header = 4 res = mtu - ip_header - icmp_header if res < 0: raise lib_exc.BadRequest( message='MTU = %(mtu)d is too low for IPv%(ip_version)d' % { 'mtu': mtu, 'ip_version': ip_version, }) return res