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"])
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"])
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)
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)