예제 #1
0
    def _create_subnet_from_pool(self, context, subnet, subnetpool_id):
        s = subnet['subnet']
        tenant_id = self._get_tenant_id_for_create(context, s)
        self._validate_pools_with_subnetpool(s)

        with context.session.begin(subtransactions=True):
            subnetpool = self._get_subnetpool(context, subnetpool_id)
            self._validate_ip_version_with_subnetpool(s, subnetpool)

            network = self._get_network(context, s["network_id"])
            allocator = subnet_alloc.SubnetAllocator(subnetpool, context)
            req = self._make_subnet_request(tenant_id, s, subnetpool)

            ipam_subnet = allocator.allocate_subnet(req)
            detail = ipam_subnet.get_details()
            subnet = self._save_subnet(
                context, network,
                self._make_subnet_args(context,
                                       network.shared,
                                       detail,
                                       s,
                                       subnetpool_id=subnetpool['id']),
                s['dns_nameservers'], s['host_routes'], s['allocation_pools'])
        if hasattr(network, 'external') and network.external:
            self._update_router_gw_ports(context, network, subnet)
        return self._make_subnet_dict(subnet)
예제 #2
0
 def test__allocation_value_for_tenant_no_allocations(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'],
                                   21, 4)
     sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
     value = sa._allocations_used_by_tenant(32)
     self.assertEqual(value, 0)
예제 #3
0
    def allocate_subnet(self, context, network, subnet, subnetpool_id):
        subnetpool = None
        if subnetpool_id and not subnetpool_id == constants.IPV6_PD_POOL_ID:
            subnetpool = self._get_subnetpool(context, id=subnetpool_id)
            self._validate_ip_version_with_subnetpool(subnet, subnetpool)

        # gateway_ip and allocation pools should be validated or generated
        # only for specific request
        if subnet['cidr'] is not constants.ATTR_NOT_SPECIFIED:
            subnet['gateway_ip'] = self._gateway_ip_str(subnet, subnet['cidr'])
            # allocation_pools are converted to list of IPRanges
            subnet['allocation_pools'] = self._prepare_allocation_pools(
                subnet['allocation_pools'], subnet['cidr'],
                subnet['gateway_ip'])

        subnet_request = ipam_req.SubnetRequestFactory.get_request(
            context, subnet, subnetpool)

        if subnetpool_id and not subnetpool_id == constants.IPV6_PD_POOL_ID:
            driver = subnet_alloc.SubnetAllocator(subnetpool, context)
            ipam_subnet = driver.allocate_subnet(subnet_request)
            subnet_request = ipam_subnet.get_details()

        subnet = self._save_subnet(
            context, network,
            self._make_subnet_args(subnet_request, subnet, subnetpool_id),
            subnet['dns_nameservers'], subnet['host_routes'], subnet_request)
        # ipam_subnet is not expected to be allocated for non pluggable ipam,
        # so just return None for it (second element in returned tuple)
        return subnet, None
 def test_insufficient_prefix_space_for_any_allocation(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.1.0/24', '192.168.1.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     sa = subnet_alloc.SubnetAllocator(sp)
     req = ipam.AnySubnetRequest(self._tenant_id, uuidutils.generate_uuid(),
                                 constants.IPv4, 21)
     self.assertRaises(n_exc.SubnetAllocationError, sa.allocate_subnet,
                       self.ctx.session, req)
예제 #5
0
 def test_insufficient_prefix_space_for_specific_allocation(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
     req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                          uuidutils.generate_uuid(),
                                          '10.1.0.0/21')
     self.assertRaises(n_exc.SubnetAllocationError, sa.allocate_subnet, req)
예제 #6
0
 def test_subnetpool_concurrent_allocation_exception(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['fe80::/48'],
                                   48, 6, default_quota=1)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
     req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                      uuidutils.generate_uuid(),
                                      'fe80::/63')
     with mock.patch("sqlalchemy.orm.query.Query.update", return_value=0):
         self.assertRaises(db_exc.RetryRequest, sa.allocate_subnet, req)
예제 #7
0
 def test_allocate_any_subnet_gateway(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with db_api.context_manager.writer.using(self.ctx):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.AnySubnetRequest(self._tenant_id,
                                         uuidutils.generate_uuid(),
                                         constants.IPv4, 21)
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         self.assertEqual(detail.gateway_ip, detail.subnet_cidr.network + 1)
예제 #8
0
 def test_subnetpool_default_quota_exceeded(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['fe80::/48'],
                                   48, 6, default_quota=1)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
     req = ipam.SpecificSubnetRequest(self._tenant_id,
                                      uuidutils.generate_uuid(),
                                      'fe80::/63')
     self.assertRaises(n_exc.SubnetPoolQuotaExceeded,
                       sa.allocate_subnet,
                       req)
 def test_allocate_any_subnet_gateway(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with self.ctx.session.begin(subtransactions=True):
         sa = subnet_alloc.SubnetAllocator(sp)
         req = ipam.AnySubnetRequest(self._tenant_id,
                                     uuidutils.generate_uuid(),
                                     constants.IPv4, 21)
         res = sa.allocate_subnet(self.ctx.session, req)
         detail = res.get_details()
         self.assertEqual(detail.gateway_ip, detail.subnet.network + 1)
예제 #10
0
 def test_allocate_specific_subnet(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     with db_api.context_manager.writer.using(self.ctx):
         sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '10.1.2.0/24')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         sp = self._get_subnetpool(self.ctx, self.plugin, sp['id'])
         self.assertEqual('10.1.2.0/24', str(detail.subnet_cidr))
         self.assertEqual(24, detail.prefixlen)
예제 #11
0
 def test_allocate_specific_subnet_specific_gateway(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with self.ctx.session.begin(subtransactions=True):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '10.1.2.0/24',
                                              gateway_ip='10.1.2.254')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         self.assertEqual(detail.gateway_ip,
                          netaddr.IPAddress('10.1.2.254'))
예제 #12
0
 def test_allocate_specific_subnet_specific_gateway(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with db_api.context_manager.writer.using(self.ctx):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '10.1.2.0/24',
                                              gateway_ip='10.1.2.254')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         self.assertEqual(netaddr.IPAddress('10.1.2.254'),
                          detail.gateway_ip)
예제 #13
0
 def test_allocate_specific_subnet(self):
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['10.1.0.0/16', '192.168.1.0/24'], 21, 4)
     with self.ctx.session.begin(subtransactions=True):
         sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '10.1.2.0/24')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         sp = self._get_subnetpool(self.ctx, self.plugin, sp['id'])
         self.assertEqual('10.1.2.0/24', str(detail.subnet_cidr))
         self.assertEqual(24, detail.prefixlen)
예제 #14
0
 def test_allocate_specific_ipv6_subnet_specific_gateway(self):
     # Same scenario as described in bug #1466322
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['2210::/64'], 64, 6)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with db_api.context_manager.writer.using(self.ctx):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '2210::/64',
                                              '2210::ffff:ffff:ffff:ffff')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         self.assertEqual(netaddr.IPAddress('2210::ffff:ffff:ffff:ffff'),
                          detail.gateway_ip)
예제 #15
0
 def test_allocate_specific_ipv6_subnet_specific_gateway(self):
     # Same scenario as described in bug #1466322
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   ['2210::/64'], 64, 6)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with self.ctx.session.begin(subtransactions=True):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam_req.SpecificSubnetRequest(self._tenant_id,
                                              uuidutils.generate_uuid(),
                                              '2210::/64',
                                              '2210::ffff:ffff:ffff:ffff')
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         self.assertEqual(detail.gateway_ip,
                          netaddr.IPAddress('2210::ffff:ffff:ffff:ffff'))
예제 #16
0
 def test_allocate_any_subnet(self):
     prefix_list = ['10.1.0.0/16', '192.168.1.0/24']
     sp = self._create_subnet_pool(self.plugin, self.ctx, 'test-sp',
                                   prefix_list, 21, 4)
     sp = self.plugin._get_subnetpool(self.ctx, sp['id'])
     with self.ctx.session.begin(subtransactions=True):
         sa = subnet_alloc.SubnetAllocator(sp, self.ctx)
         req = ipam.AnySubnetRequest(self._tenant_id,
                                     uuidutils.generate_uuid(),
                                     constants.IPv4, 21)
         res = sa.allocate_subnet(req)
         detail = res.get_details()
         prefix_set = netaddr.IPSet(iterable=prefix_list)
         allocated_set = netaddr.IPSet(iterable=[detail.subnet_cidr])
         self.assertTrue(allocated_set.issubset(prefix_set))
         self.assertEqual(detail.prefixlen, 21)
예제 #17
0
    def _allocate_subnet(self, context, network, subnet, subnetpool_id):
        subnetpool = None
        if subnetpool_id:
            subnetpool = self._get_subnetpool(context, subnetpool_id)
            self._validate_ip_version_with_subnetpool(subnet, subnetpool)

        subnet_request = ipam.SubnetRequestFactory.get_request(
            context, subnet, subnetpool)

        if subnetpool_id:
            driver = subnet_alloc.SubnetAllocator(subnetpool, context)
            ipam_subnet = driver.allocate_subnet(subnet_request)
            subnet_request = ipam_subnet.get_details()

        subnet = self._save_subnet(
            context, network,
            self._make_subnet_args(network.shared, subnet_request, subnet,
                                   subnetpool_id), subnet['dns_nameservers'],
            subnet['host_routes'], subnet['allocation_pools'])
        return subnet
    def allocate_subnet(self, context, network, subnet, subnetpool_id):
        subnetpool = None
        if subnetpool_id:
            subnetpool = self._get_subnetpool(context, subnetpool_id)
            self._validate_ip_version_with_subnetpool(subnet, subnetpool)

        # gateway_ip and allocation pools should be validated or generated
        # only for specific request
        if subnet['cidr'] is not attributes.ATTR_NOT_SPECIFIED:
            subnet['gateway_ip'] = self._gateway_ip_str(subnet,
                                                        subnet['cidr'])
            # allocation_pools are converted to list of IPRanges
            subnet['allocation_pools'] = self._prepare_allocation_pools(
                subnet['allocation_pools'],
                subnet['cidr'],
                subnet['gateway_ip'])

        subnet_request = ipam_req.SubnetRequestFactory.get_request(context,
                                                                   subnet,
                                                                   subnetpool)

        if subnetpool_id:
            driver = subnet_alloc.SubnetAllocator(subnetpool, context)
            ipam_subnet = driver.allocate_subnet(subnet_request)
            subnet_request = ipam_subnet.get_details()

        subnet = self._save_subnet(context,
                                   network,
                                   self._make_subnet_args(
                                       subnet_request,
                                       subnet,
                                       subnetpool_id),
                                   subnet['dns_nameservers'],
                                   subnet['host_routes'],
                                   subnet_request)
        return subnet