def test_allocate_multiple_eui64_ips(self):
        mocks = self._prepare_ipam()
        ips = [{'subnet_id': self._gen_subnet_id(),
                'subnet_cidr': '2001:470:abcd::/64',
                'mac': '6c:62:6d:de:cf:49',
                'eui64_address': True},
               {'subnet_id': self._gen_subnet_id(),
                'subnet_cidr': '2001:360:abcd::/64',
                'mac': '6c:62:6d:de:cf:49',
                'eui64_address': True}]
        mocks['ipam']._ipam_allocate_ips(mock.ANY, mocks['driver'],
                                         mock.ANY, ips)

        eui64_ips = []
        request_ips = []
        i = 0
        requests = mocks['subnets'].allocate.call_args_list
        for ip in ips:
            eui64_ip = netutils.get_ipv6_addr_by_EUI64(ip['subnet_cidr'],
                                                       ip['mac'])
            self.assertIsInstance(requests[i][0][0],
                                  ipam_req.AutomaticAddressRequest)
            self.assertEqual(eui64_ip, requests[i][0][0].address)
            request_ips.append(requests[i][0][0].address)
            eui64_ips.append(eui64_ip)
            i += 1
        self.assertEqual(request_ips, eui64_ips)
Beispiel #2
0
 def _generate_eui64_address(self, **kwargs):
     if set(kwargs) != set(['prefix', 'mac']):
         raise ipam_exc.AddressCalculationFailure(
             address_type='eui-64',
             reason=_('must provide exactly 2 arguments - cidr and MAC'))
     prefix = kwargs['prefix']
     mac_address = kwargs['mac']
     return netutils.get_ipv6_addr_by_EUI64(prefix, mac_address)
Beispiel #3
0
 def _get_ips_from_subnet(self, **kwargs):
     subnet = self.create_subnet(self.network, **kwargs)
     port_mac = data_utils.rand_mac_address()
     port = self.create_port(self.network, mac_address=port_mac)
     real_ip = next(iter(port['fixed_ips']), None)['ip_address']
     eui_ip = str(netutils.get_ipv6_addr_by_EUI64(
         subnet['cidr'], port_mac))
     return real_ip, eui_ip
Beispiel #4
0
 def _build_ipv4v6_mac_ip_list(self, mac, ip_address, mac_ipv4_pairs, mac_ipv6_pairs):
     mac = str(netaddr.EUI(mac, dialect=mac_iptables))
     if netaddr.IPNetwork(ip_address).version == 4:
         mac_ipv4_pairs.append((mac, ip_address))
     else:
         mac_ipv6_pairs.append((mac, ip_address))
         lla = str(netutils.get_ipv6_addr_by_EUI64(constants.IPv6_LLA_PREFIX, mac))
         if (mac, lla) not in mac_ipv6_pairs:
             # only add once so we don't generate duplicate rules
             mac_ipv6_pairs.append((mac, lla))
Beispiel #5
0
def get_random_ip_address(version=4):
    if version == 4:
        ip_string = '10.%d.%d.%d' % (random.randint(3, 254),
                                     random.randint(3, 254),
                                     random.randint(3, 254))
        return netaddr.IPAddress(ip_string)
    else:
        ip = netutils.get_ipv6_addr_by_EUI64('2001:db8::/64',
                                             get_random_mac())
        return ip
Beispiel #6
0
 def test_automatic_address_request_eui64(self):
     subnet_cidr = '2607:f0d0:1002:51::/64'
     port_mac = 'aa:bb:cc:dd:ee:ff'
     eui_addr = str(netutils.get_ipv6_addr_by_EUI64(subnet_cidr,
                                                    port_mac))
     request = ipam_req.AutomaticAddressRequest(
         address_type=self.EUI64,
         prefix=subnet_cidr,
         mac=port_mac)
     self.assertEqual(request.address, netaddr.IPAddress(eui_addr))
Beispiel #7
0
 def __init__(self, port_dict, ovs_port, vlan_tag):
     self.id = port_dict['device']
     self.vlan_tag = vlan_tag
     self.mac = ovs_port.vif_mac
     self.lla_address = str(netutils.get_ipv6_addr_by_EUI64(
         lib_const.IPv6_LLA_PREFIX, self.mac))
     self.ofport = ovs_port.ofport
     self.sec_groups = list()
     self.fixed_ips = port_dict.get('fixed_ips', [])
     self.neutron_port_dict = port_dict.copy()
     self.allowed_pairs_v4 = self._get_allowed_pairs(port_dict, version=4)
     self.allowed_pairs_v6 = self._get_allowed_pairs(port_dict, version=6)
    def test_allocate_eui64_ip(self):
        mocks = self._prepare_ipam()
        ip = {
            "subnet_id": self._gen_subnet_id(),
            "subnet_cidr": "2001:470:abcd::/64",
            "mac": "6c:62:6d:de:cf:49",
            "eui64_address": True,
        }
        eui64_ip = netutils.get_ipv6_addr_by_EUI64(ip["subnet_cidr"], ip["mac"])
        mocks["ipam"]._ipam_allocate_ips(mock.ANY, mocks["driver"], mock.ANY, [ip])

        request = mocks["subnets"].allocate.call_args[0][0]
        self.assertIsInstance(request, ipam_req.AutomaticAddressRequest)
        self.assertEqual(eui64_ip, request.address)
Beispiel #9
0
 def test_dhcpv6_two_subnets(self):
     # NOTE: When one IPv6 subnet configured with dnsmasq SLAAC or DHCP
     # stateless and other IPv6 is with DHCP stateful, port shall receive
     # EUI-64 IP addresses from first subnet and DHCP address from second
     # one. Order of subnet creating should be unimportant.
     for order in ("slaac_first", "dhcp_first"):
         for ra_mode, add_mode in (
                 ('slaac', 'slaac'),
                 ('dhcpv6-stateless', 'dhcpv6-stateless'),
         ):
             kwargs = {'ipv6_ra_mode': ra_mode,
                       'ipv6_address_mode': add_mode}
             kwargs_dhcp = {'ipv6_address_mode': 'dhcpv6-stateful'}
             if order == "slaac_first":
                 subnet_slaac = self.create_subnet(self.network, **kwargs)
                 self.subnets.append(subnet_slaac)
                 subnet_dhcp = self.create_subnet(
                     self.network, **kwargs_dhcp)
                 self.subnets.append(subnet_dhcp)
             else:
                 subnet_dhcp = self.create_subnet(
                     self.network, **kwargs_dhcp)
                 self.subnets.append(subnet_dhcp)
                 subnet_slaac = self.create_subnet(self.network, **kwargs)
                 self.subnets.append(subnet_slaac)
             port_mac = data_utils.rand_mac_address()
             eui_ip = str(netutils.get_ipv6_addr_by_EUI64(
                 subnet_slaac['cidr'], port_mac))
             port = self.create_port(self.network, mac_address=port_mac)
             self.ports.append(port)
             real_ips = dict([(k['subnet_id'], k['ip_address'])
                              for k in port['fixed_ips']])
             real_dhcp_ip, real_eui_ip = [real_ips[sub['id']]
                                          for sub in [subnet_dhcp,
                                          subnet_slaac]]
             self.ports_client.delete_port(port['id'])
             self.ports.pop()
             body = self.ports_client.list_ports()
             ports_id_list = [i['id'] for i in body['ports']]
             self.assertNotIn(port['id'], ports_id_list)
             self._clean_network()
             self.assertEqual(real_eui_ip,
                              eui_ip,
                              'Real IP is {0}, but shall be {1}'.format(
                                  real_eui_ip,
                                  eui_ip))
             msg = ('Real IP address is {0} and it is NOT on '
                    'subnet {1}'.format(real_dhcp_ip, subnet_dhcp['cidr']))
             self.assertIn(netaddr.IPAddress(real_dhcp_ip),
                           netaddr.IPNetwork(subnet_dhcp['cidr']), msg)
    def test_allocate_eui64_ip(self):
        mocks = self._prepare_ipam()
        ip = {'subnet_id': self._gen_subnet_id(),
              'subnet_cidr': '2001:470:abcd::/64',
              'mac': '6c:62:6d:de:cf:49',
              'eui64_address': True}
        eui64_ip = netutils.get_ipv6_addr_by_EUI64(ip['subnet_cidr'],
                                                   ip['mac'])
        mocks['ipam']._ipam_allocate_ips(mock.ANY, mocks['driver'],
                                         mock.ANY, [ip])

        request = mocks['subnets'].allocate.call_args[0][0]
        self.assertIsInstance(request, ipam_req.AutomaticAddressRequest)
        self.assertEqual(eui64_ip, request.address)
 def _get_lla_gateway_ip_for_subnet(self, context, subnet):
     query = context.session.query(models_v2.Port.mac_address)
     query = query.join(models_v2.IPAllocation)
     query = query.filter(
         models_v2.IPAllocation.subnet_id == subnet['id'])
     query = query.filter(
         models_v2.IPAllocation.ip_address == subnet['gateway_ip'])
     query = query.filter(
         models_v2.Port.device_owner.in_(const.ROUTER_INTERFACE_OWNERS))
     try:
         mac_address = query.one()[0]
     except (exc.NoResultFound, exc.MultipleResultsFound):
         LOG.warning(_LW('No valid gateway port on subnet %s is '
                         'found for IPv6 RA'), subnet['id'])
         return
     lla_ip = str(netutils.get_ipv6_addr_by_EUI64(
         const.IPv6_LLA_PREFIX,
         mac_address))
     return lla_ip
    def _select_dhcp_ips_for_network_ids(self, context, network_ids):
        if not network_ids:
            return {}
        query = context.session.query(models_v2.Port.mac_address,
                                      models_v2.Port.network_id,
                                      models_v2.IPAllocation.ip_address)
        query = query.join(models_v2.IPAllocation)
        query = query.filter(models_v2.Port.network_id.in_(network_ids))
        owner = const.DEVICE_OWNER_DHCP
        query = query.filter(models_v2.Port.device_owner == owner)
        ips = {}

        for network_id in network_ids:
            ips[network_id] = []

        for mac_address, network_id, ip in query:
            if (netaddr.IPAddress(ip).version == 6
                and not netaddr.IPAddress(ip).is_link_local()):
                ip = str(netutils.get_ipv6_addr_by_EUI64(const.IPv6_LLA_PREFIX,
                    mac_address))
            if ip not in ips[network_id]:
                ips[network_id].append(ip)

        return ips
 def test_generate_IPv6_by_EUI64(self):
     addr = netutils.get_ipv6_addr_by_EUI64('2001:db8::',
                                            '00:16:3e:33:44:55')
     self.assertEqual('2001:db8::216:3eff:fe33:4455', addr.format())
Beispiel #14
0
 def test_generate_IPv6_with_IPv4_prefix(self):
     ipv4_prefix = '10.0.8'
     mac = '00:16:3e:33:44:55'
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(ipv4_prefix, mac))
Beispiel #15
0
 def test_generate_IPv6_with_bad_mac(self):
     bad_mac = '00:16:3e:33:44:5Z'
     prefix = '2001:db8::'
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(prefix, bad_mac))
 def test_generate_IPv6_with_error_prefix_type(self):
     mac = '00:16:3e:33:44:55'
     prefix = 123
     self.assertRaises(TypeError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(prefix, mac))
 def test_generate_IPv6_with_bad_prefix(self):
     mac = '00:16:3e:33:44:55'
     bad_prefix = 'bb'
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(bad_prefix, mac))
Beispiel #18
0
 def _get_lla(mac):
     lla = netutils.get_ipv6_addr_by_EUI64(n_const.IPv6_LLA_PREFIX,
                                           mac)
     return lla
Beispiel #19
0
 def test_generate_IPv6_with_error_prefix_type(self):
     mac = '00:16:3e:33:44:55'
     prefix = 123
     self.assertRaises(TypeError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(prefix, mac))
Beispiel #20
0
 def test_generate_IPv6_with_empty_prefix(self):
     mac = '00:16:3e:33:44:55'
     prefix = ''
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(prefix, mac))
Beispiel #21
0
 def test_generate_IPv6_by_EUI64(self):
     addr = netutils.get_ipv6_addr_by_EUI64('2001:db8::',
                                            '00:16:3e:33:44:55')
     self.assertEqual('2001:db8::216:3eff:fe33:4455', addr.format())
 def test_generate_IPv6_with_IPv4_prefix(self):
     ipv4_prefix = '10.0.8'
     mac = '00:16:3e:33:44:55'
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(ipv4_prefix, mac))
 def test_generate_IPv6_with_bad_mac(self):
     bad_mac = '00:16:3e:33:44:5Z'
     prefix = '2001:db8::'
     self.assertRaises(ValueError, lambda:
                       netutils.get_ipv6_addr_by_EUI64(prefix, bad_mac))
Beispiel #24
0
 def _get_lla(mac):
     lla = netutils.get_ipv6_addr_by_EUI64(n_const.IPv6_LLA_PREFIX,
                                           mac)
     return lla
Beispiel #25
0
from oslo_utils import netutils

print(netutils.escape_ipv6('fe80::f493:20ff:fe5b:6cf'))

print(
    netutils.get_ipv6_addr_by_EUI64('fe80::d480:b0ff:fe33:1543/64',
                                    'f2:2c:d8:c3:73:fb'))

print(netutils.get_my_ipv4())

print(netutils.is_ipv6_enabled())

print(netutils.is_valid_cidr('10.10.10.10/24'))

code_list = []
for n in range(-5, 5):
    code_list.append(netutils.is_valid_icmp_code(n))
print(code_list)

print(
    netutils.urlsplit(
        'https://foxfox.mybluemix.net.com:8443/index.html?auto=off'))
# SplitResult(scheme='https', netloc='foxfox.mybluemix.net.com:8443', path='/index.html', query='auto=off', fragment='')