def add_uuid_filter(query, value): if utils.is_int_like(value): return query.filter_by(id=value) elif uuidutils.is_uuid_like(value): return query.filter_by(uuid=value) else: raise exception.InvalidUUID(uuid=value)
def destroy_node(self, node): session = get_session() with session.begin(): query = model_query(models.Node, session=session) query = add_identity_filter(query, node) try: node_ref = query.one() except NoResultFound: raise exception.NodeNotFound(node=node) if node_ref['reservation'] is not None: raise exception.NodeLocked(node=node) # Get node ID, if an UUID was supplied. The ID is # required for deleting all ports, attached to the node. if uuidutils.is_uuid_like(node): node_id = node_ref['id'] else: node_id = node port_query = model_query(models.Port, session=session) port_query = add_port_filter_by_node(port_query, node_id) port_query.delete() query.delete()
def test_create_port_generate_uuid(self): pdict = dbutils.get_test_port() del pdict['uuid'] self.post_json('/ports', pdict) result = self.get_json('/ports/%s' % pdict['address']) self.assertEqual(pdict['address'], result['address']) self.assertTrue(uuidutils.is_uuid_like(result['uuid']))
def test_create_chassis_generate_uuid(self): cdict = dbutils.get_test_chassis() del cdict['uuid'] self.post_json('/chassis', cdict) result = self.get_json('/chassis') self.assertEqual(cdict['description'], result['items'][0]['description']) self.assertTrue(uuidutils.is_uuid_like(result['items'][0]['uuid']))
def get_node_by_instance(self, instance): if not uuidutils.is_uuid_like(instance): raise exception.InvalidUUID(uuid=instance) query = model_query(models.Node).filter_by(instance_uuid=instance) try: result = query.one() except NoResultFound: raise exception.InstanceNotFound(instance=instance) return result
def get_node_by_instance(self, instance): query = model_query(models.Node) if uuidutils.is_uuid_like(instance): query = query.filter_by(instance_uuid=instance) else: query = query.filter_by(instance_name=instance) try: result = query.one() except NoResultFound: raise exception.InstanceNotFound(instance=instance) return result
def _init_completion_cache(self): cache_write = getattr(self.manager, 'write_to_completion_cache', None) if not cache_write: return # NOTE(sirp): ensure `id` is already present because if it isn't we'll # enter an infinite loop of __getattr__ -> get -> __init__ -> # __getattr__ -> ... if 'id' in self.__dict__ and uuidutils.is_uuid_like(self.id): cache_write('uuid', self.id) if self.human_id: cache_write('human_id', self.human_id)
def add_identity_filter(query, value): """Adds an identity filter to a query. Filters results by ID, if supplied value is a valid integer. Otherwise attempts to filter results by UUID. :param query: Initial query to add filter to. :param value: Value for filtering results by. :return: Modified query. """ if utils.is_int_like(value): return query.filter_by(id=value) elif uuidutils.is_uuid_like(value): return query.filter_by(uuid=value) else: raise exception.InvalidIdentity(identity=value)
def add_filter_by_many_identities(query, model, values): """Adds an identity filter to a query for values list. Filters results by ID, if supplied values contain a valid integer. Otherwise attempts to filter results by UUID. :param query: Initial query to add filter to. :param model: Model for filter. :param values: Values for filtering results by. :return: tuple (Modified query, filter field name). """ if not values: raise exception.InvalidIdentity(identity=values) value = values[0] if utils.is_int_like(value): return query.filter(getattr(model, 'id').in_(values)), 'id' elif uuidutils.is_uuid_like(value): return query.filter(getattr(model, 'uuid').in_(values)), 'uuid' else: raise exception.InvalidIdentity(identity=value)
def destroy_node(self, node): session = get_session() with session.begin(): query = model_query(models.Node, session=session) query = add_identity_filter(query, node) # Get node ID, if an UUID was supplied. The ID is # required for deleting all ports, attached to the node. if uuidutils.is_uuid_like(node): try: node_id = query.one()["id"] except NoResultFound: raise exception.NodeNotFound(node=node) else: node_id = node count = query.delete() if count != 1: raise exception.NodeNotFound(node=node) query = model_query(models.Port, session=session) query = add_port_filter_by_node(query, node_id) query.delete()
def find_resource(manager, name_or_id, **find_args): """Look for resource in a given manager. Used as a helper for the _find_* methods. Example: .. code-block:: python def _find_hypervisor(cs, hypervisor): #Get a hypervisor by name or ID. return cliutils.find_resource(cs.hypervisors, hypervisor) """ # first try to get entity as integer id try: return manager.get(int(name_or_id)) except (TypeError, ValueError, exceptions.NotFound): pass # now try to get entity as uuid try: if six.PY2: tmp_id = strutils.safe_encode(name_or_id) else: tmp_id = strutils.safe_decode(name_or_id) if uuidutils.is_uuid_like(tmp_id): return manager.get(tmp_id) except (TypeError, ValueError, exceptions.NotFound): pass # for str id which is not uuid if getattr(manager, "is_alphanum_id_allowed", False): try: return manager.get(name_or_id) except exceptions.NotFound: pass try: try: return manager.find(human_id=name_or_id, **find_args) except exceptions.NotFound: pass # finally try to find entity by name try: resource = getattr(manager, "resource_class", None) name_attr = resource.NAME_ATTR if resource else "name" kwargs = {name_attr: name_or_id} kwargs.update(find_args) return manager.find(**kwargs) except exceptions.NotFound: msg = _("No %(name)s with a name or " "ID of '%(name_or_id)s' exists.") % { "name": manager.resource_class.__name__.lower(), "name_or_id": name_or_id, } raise exceptions.CommandError(msg) except exceptions.NoUniqueMatch: msg = _("Multiple %(name)s matches found for " "'%(name_or_id)s', use an ID to be more specific.") % { "name": manager.resource_class.__name__.lower(), "name_or_id": name_or_id, } raise exceptions.CommandError(msg)
def find_resource(manager, name_or_id, **find_args): """Look for resource in a given manager. Used as a helper for the _find_* methods. Example: .. code-block:: python def _find_hypervisor(cs, hypervisor): #Get a hypervisor by name or ID. return cliutils.find_resource(cs.hypervisors, hypervisor) """ # first try to get entity as integer id try: return manager.get(int(name_or_id)) except (TypeError, ValueError, exceptions.NotFound): pass # now try to get entity as uuid try: if six.PY2: tmp_id = strutils.safe_encode(name_or_id) else: tmp_id = strutils.safe_decode(name_or_id) if uuidutils.is_uuid_like(tmp_id): return manager.get(tmp_id) except (TypeError, ValueError, exceptions.NotFound): pass # for str id which is not uuid if getattr(manager, 'is_alphanum_id_allowed', False): try: return manager.get(name_or_id) except exceptions.NotFound: pass try: try: return manager.find(human_id=name_or_id, **find_args) except exceptions.NotFound: pass # finally try to find entity by name try: resource = getattr(manager, 'resource_class', None) name_attr = resource.NAME_ATTR if resource else 'name' kwargs = {name_attr: name_or_id} kwargs.update(find_args) return manager.find(**kwargs) except exceptions.NotFound: msg = _("No %(name)s with a name or " "ID of '%(name_or_id)s' exists.") % \ { "name": manager.resource_class.__name__.lower(), "name_or_id": name_or_id } raise exceptions.CommandError(msg) except exceptions.NoUniqueMatch: msg = _("Multiple %(name)s matches found for " "'%(name_or_id)s', use an ID to be more specific.") % \ { "name": manager.resource_class.__name__.lower(), "name_or_id": name_or_id } raise exceptions.CommandError(msg)