@classmethod
def reserve(cls, context, tag, node_id):
    """Get and reserve a node.

        To prevent other ManagerServices from manipulating the given
        Node while a Task is performed, mark it reserved by this host.

        :param cls: the :class:`Node`
        :param context: Security context.
        :param tag: A string uniquely identifying the reservation holder.
        :param node_id: A node ID or UUID.
        :raises: NodeNotFound if the node is not found.
        :returns: a :class:`Node` object.

        """
    db_node = cls.dbapi.reserve_node(tag, node_id)
    node = cls._from_db_object(context, cls(), db_node)
    return node
