def read(self, request): """Handle read request, default is to return attributes.""" request_type = self.entity_type.schema.long_name(request.properties.get('type')) if request_type and self.type != request_type: raise NotFoundStatus("Entity type '%s' does match requested type '%s'" % (self.type, request_type)) return (OK, self.attributes)
def query(self, request): """Management node query operation""" entity_type = self.requested_type(request) if entity_type: all_attrs = set(entity_type.attributes.keys()) else: all_attrs = self._schema.all_attributes names = set(request.body.get('attributeNames')) if names: unknown = names - all_attrs if unknown: if entity_type: for_type = " for type %s" % entity_type.name else: for_type = "" raise NotFoundStatus("Unknown attributes %s%s." % (list(unknown), for_type)) else: names = all_attrs results = [] def add_result(entity): result = [] non_empty = False for name in names: result.append(entity.attributes.get(name)) if result[-1] is not None: non_empty = True if non_empty: results.append(result) self._agent.entities.map_type(add_result, entity_type) return (OK, {'attributeNames': list(names), 'results': results})
def find_entity(self, request): """Find the entity addressed by request""" requested_type = request.properties.get('type') if requested_type: requested_type = self.schema.entity_type(requested_type) # ids is a map of identifying attribute values ids = dict((k, request.properties.get(k)) for k in ['name', 'identity'] if k in request.properties) # Special case for management object: if no name/id and no conflicting type # then assume this is for "self" if not ids: if not requested_type or self.management.entity_type.is_a( requested_type): return self.management else: raise BadRequestStatus("%s: No name or identity provided" % requested_type) def attrvals(): """String form of the id attribute values for error messages""" return " ".join(["%s=%r" % (k, v) for k, v in ids.iteritems()]) k, v = ids.iteritems().next() # Get the first id attribute found = self.entities.map_filter(None, lambda e: e.attributes.get(k) == v) if len(found) == 1: entity = found[0] elif len(found) > 1: raise InternalServerErrorStatus( "Duplicate (%s) entities with %s=%r" % (len(found), k, v)) else: raise NotFoundStatus("No entity with %s" % attrvals()) for k, v in ids.iteritems(): if entity[k] != v: raise BadRequestStatus("Conflicting %s" % attrvals()) if requested_type: if not entity.entity_type.is_a(requested_type): raise BadRequestStatus( "Entity type '%s' does not extend requested type '%s'" % (entity.entity_type.name, requested_type)) return entity
def entity_type(self, type): try: return self.schema.entity_type(type) except ValidationError, e: raise NotFoundStatus(str(e))