def create_locks(context, network_ids, addresses): """Creates locks for each IP address that is null-routed. The function creates the IP address if it is not present in the database. """ for address in addresses: address_model = None try: address_model = _find_or_create_address(context, network_ids, address) lock_holder = None if address_model.lock_id: lock_holder = db_api.lock_holder_find( context, lock_id=address_model.lock_id, name=LOCK_NAME, scope=db_api.ONE) if not lock_holder: LOG.info("Creating lock holder on IPAddress %s with id %s", address_model.address_readable, address_model.id) db_api.lock_holder_create(context, address_model, name=LOCK_NAME, type="ip_address") except Exception: LOG.exception("Failed to create lock holder on IPAddress %s", address_model) continue context.session.flush()
def create_locks(context, network_ids, addresses): """Creates locks for each IP address that is null-routed. The function creates the IP address if it is not present in the database. """ for address in addresses: address_model = None try: address_model = _find_or_create_address( context, network_ids, address) lock_holder = None if address_model.lock_id: lock_holder = db_api.lock_holder_find( context, lock_id=address_model.lock_id, name=LOCK_NAME, scope=db_api.ONE) if not lock_holder: LOG.info("Creating lock holder on IPAddress %s with id %s", address_model.address_readable, address_model.id) db_api.lock_holder_create( context, address_model, name=LOCK_NAME, type="ip_address") except Exception: LOG.exception("Failed to create lock holder on IPAddress %s", address_model) continue context.session.flush()
def test_find_lock_holder(self): kwargs = {"address": netaddr.IPAddress("192.168.2.1")} ip_address = db_api.ip_address_create(self.context, **kwargs) kwargs = {"type": "ip_address", "name": "because i said so"} lock_holder = db_api.lock_holder_create( self.context, ip_address, **kwargs) self.context.session.refresh(ip_address) self.assertEqual(ip_address.lock_id, lock_holder.lock_id) lock_holders = db_api.lock_holder_find( self.context, lock_id=ip_address.lock_id, name=kwargs["name"], scope=db_api.ALL) self.assertEqual(len(lock_holders), 1) self.assertEqual(lock_holders[0]["lock_id"], ip_address.lock_id) self.assertEqual(lock_holders[0]["name"], kwargs["name"])
def delete_locks(context, network_ids, addresses): """Deletes locks for each IP address that is no longer null-routed.""" addresses_no_longer_null_routed = _find_addresses_to_be_unlocked( context, network_ids, addresses) LOG.info("Deleting %s lock holders on IPAddress with ids: %s", len(addresses_no_longer_null_routed), [addr.id for addr in addresses_no_longer_null_routed]) for address in addresses_no_longer_null_routed: lock_holder = None try: lock_holder = db_api.lock_holder_find( context, lock_id=address.lock_id, name=LOCK_NAME, scope=db_api.ONE) if lock_holder: db_api.lock_holder_delete(context, address, lock_holder) except Exception: LOG.exception("Failed to delete lock holder %s", lock_holder) continue context.session.flush()
def test_create_locks_lock_holder_exists(self): network = db_api.network_create(self.context) address_model = db_api.ip_address_create( self.context, address=netaddr.IPAddress("192.168.10.1"), network=network) db_api.lock_holder_create( self.context, address_model, name=null_routes.LOCK_NAME, type="ip_address") self.context.session.flush() addresses = netaddr.IPSet(netaddr.IPNetwork(self.sub_cidr)) null_routes.create_locks(self.context, [network.id], addresses) lock_holders = db_api.lock_holder_find( self.context, lock_id=address_model.lock_id, name=null_routes.LOCK_NAME, scope=db_api.ALL) self.assertEqual(len(lock_holders), 1)
def delete_locks(context, network_ids, addresses): """Deletes locks for each IP address that is no longer null-routed.""" addresses_no_longer_null_routed = _find_addresses_to_be_unlocked( context, network_ids, addresses) LOG.info("Deleting %s lock holders on IPAddress with ids: %s", len(addresses_no_longer_null_routed), [addr.id for addr in addresses_no_longer_null_routed]) for address in addresses_no_longer_null_routed: lock_holder = None try: lock_holder = db_api.lock_holder_find(context, lock_id=address.lock_id, name=LOCK_NAME, scope=db_api.ONE) if lock_holder: db_api.lock_holder_delete(context, address, lock_holder) except Exception: LOG.exception("Failed to delete lock holder %s", lock_holder) continue context.session.flush()