Example #1
0
 def test_mac_address_ranges(self):
     mr1_mac = netaddr.EUI("AA:AA:AA:00:00:00")
     mr1 = {"cidr": "AA:AA:AA/24", "do_not_use": False,
            "first_address": mr1_mac.value,
            "last_address": netaddr.EUI("AA:AA:AA:FF:FF:FF").value,
            "next_auto_assign_mac": mr1_mac.value}
     with self._fixtures([mr1]):
         with self.context.session.begin():
             ranges = db_api.mac_address_range_find_allocation_counts(
                 self.context)
             self.assertTrue(ranges[0]["cidr"], mr1["cidr"])
Example #2
0
 def test_mac_address_ranges(self):
     mr1_mac = netaddr.EUI("AA:AA:AA:00:00:00")
     mr1 = {
         "cidr": "AA:AA:AA/24",
         "do_not_use": False,
         "first_address": mr1_mac.value,
         "last_address": netaddr.EUI("AA:AA:AA:FF:FF:FF").value,
         "next_auto_assign_mac": mr1_mac.value
     }
     with self._fixtures([mr1]):
         with self.context.session.begin():
             ranges = db_api.mac_address_range_find_allocation_counts(
                 self.context)
             self.assertTrue(ranges[0]["cidr"], mr1["cidr"])
Example #3
0
    def allocate_mac_address(self,
                             context,
                             net_id,
                             port_id,
                             reuse_after,
                             mac_address=None):
        if mac_address:
            mac_address = netaddr.EUI(mac_address).value

        deallocated_mac = db_api.mac_address_find(context,
                                                  reuse_after=reuse_after,
                                                  scope=db_api.ONE,
                                                  address=mac_address)
        if deallocated_mac:
            return db_api.mac_address_update(context,
                                             deallocated_mac,
                                             deallocated=False,
                                             deallocated_at=None)

        ranges = db_api.mac_address_range_find_allocation_counts(
            context, address=mac_address)
        for result in ranges:
            rng, addr_count = result
            if rng["last_address"] - rng["first_address"] <= addr_count:
                continue

            next_address = None
            if mac_address:
                next_address = mac_address
            else:
                address = True
                while address:
                    next_address = rng["next_auto_assign_mac"]
                    rng["next_auto_assign_mac"] = next_address + 1
                    address = db_api.mac_address_find(
                        context,
                        tenant_id=context.tenant_id,
                        scope=db_api.ONE,
                        address=next_address)

            address = db_api.mac_address_create(context,
                                                address=next_address,
                                                mac_address_range_id=rng["id"])
            return address

        raise exceptions.MacAddressGenerationFailure(net_id=net_id)
Example #4
0
    def allocate_mac_address(self, context, net_id, port_id, reuse_after,
                             mac_address=None):
        if mac_address:
            mac_address = netaddr.EUI(mac_address).value

        with context.session.begin(subtransactions=True):
            deallocated_mac = db_api.mac_address_find(
                context, lock_mode=True, reuse_after=reuse_after,
                scope=db_api.ONE, address=mac_address)
            if deallocated_mac:
                return db_api.mac_address_update(
                    context, deallocated_mac, deallocated=False,
                    deallocated_at=None)

        with context.session.begin(subtransactions=True):
            ranges = db_api.mac_address_range_find_allocation_counts(
                context, address=mac_address)
            for result in ranges:
                rng, addr_count = result
                last = rng["last_address"]
                first = rng["first_address"]
                if last - first <= addr_count:
                    continue
                next_address = None
                if mac_address:
                    next_address = mac_address
                else:
                    address = True
                    while address:
                        next_address = rng["next_auto_assign_mac"]
                        rng["next_auto_assign_mac"] = next_address + 1
                        address = db_api.mac_address_find(
                            context, tenant_id=context.tenant_id,
                            scope=db_api.ONE, address=next_address)

                address = db_api.mac_address_create(
                    context, address=next_address,
                    mac_address_range_id=rng["id"])
                return address

        raise exceptions.MacAddressGenerationFailure(net_id=net_id)