def _get_provider_by_uuid(context, uuid): """Given a UUID, return a dict of information about the resource provider from the database. :raises: NotFound if no such provider was found :param uuid: The UUID to look up """ rpt = sa.alias(_RP_TBL, name="rp") parent = sa.alias(_RP_TBL, name="parent") root = sa.alias(_RP_TBL, name="root") rp_to_root = sa.join(rpt, root, rpt.c.root_provider_id == root.c.id) rp_to_parent = sa.outerjoin( rp_to_root, parent, rpt.c.parent_provider_id == parent.c.id) cols = [ rpt.c.id, rpt.c.uuid, rpt.c.name, rpt.c.generation, root.c.uuid.label("root_provider_uuid"), parent.c.uuid.label("parent_provider_uuid"), rpt.c.updated_at, rpt.c.created_at, ] sel = sa.select(cols).select_from(rp_to_parent).where(rpt.c.uuid == uuid) res = context.session.execute(sel).fetchone() if not res: raise exception.NotFound( 'No resource provider with uuid %s found' % uuid) return dict(res)
def _delete_inventory(context, rp, resource_class): """Delete up to one Inventory of the given resource_class string. :raises `exception.ResourceClassNotFound` if resource_class cannot be found in the DB. """ rc_id = context.rc_cache.id_from_string(resource_class) if not _delete_inventory_from_provider(context, rp, [rc_id]): raise exception.NotFound('No inventory of class %s found for delete' % resource_class) rp.increment_generation()
def _destroy(context, _id, name): # Don't delete the resource class if it is referred to in the # inventories table. num_inv = context.session.query(models.Inventory).filter( models.Inventory.resource_class_id == _id).count() if num_inv: raise exception.ResourceClassInUse(resource_class=name) res = context.session.query(models.ResourceClass).filter( models.ResourceClass.id == _id).delete() if not res: raise exception.NotFound()
def _delete(context, _id): # Do a quick check to see if the provider is a parent. If it is, don't # allow deleting the provider. Note that the foreign key constraint on # resource_providers.parent_provider_id will prevent deletion of the # parent within the transaction below. This is just a quick # short-circuit outside of the transaction boundary. if _has_child_providers(context, _id): raise exception.CannotDeleteParentResourceProvider() # Don't delete the resource provider if it has allocations. rp_allocations = context.session.query(models.Allocation).filter( models.Allocation.resource_provider_id == _id).count() if rp_allocations: raise exception.ResourceProviderInUse() # Delete any inventory associated with the resource provider query = context.session.query(models.Inventory) query = query.filter(models.Inventory.resource_provider_id == _id) query.delete(synchronize_session=False) # Delete any aggregate associations for the resource provider # The name substitution on the next line is needed to satisfy pep8 RPA_model = models.ResourceProviderAggregate context.session.query(RPA_model).filter( RPA_model.resource_provider_id == _id).delete() # delete any trait associations for the resource provider RPT_model = models.ResourceProviderTrait context.session.query(RPT_model).filter( RPT_model.resource_provider_id == _id).delete() # set root_provider_id to null to make deletion possible query = context.session.query(models.ResourceProvider) query = query.filter( models.ResourceProvider.id == _id, models.ResourceProvider.root_provider_id == _id) query.update({'root_provider_id': None}) # Now delete the RP record try: result = _delete_rp_record(context, _id) except sqla_exc.IntegrityError: # NOTE(jaypipes): Another thread snuck in and parented this # resource provider in between the above check for # _has_child_providers() and our attempt to delete the record raise exception.CannotDeleteParentResourceProvider() if not result: raise exception.NotFound()