class AttributeNodeFilter implements IgnitePredicate<ClusterNode> {
    /** */
    private static final long serialVersionUID = 0L;

    /** Attributes. */
    private final Map<String, Object> attrs;

    /**
     * Creates new node filter with a single attribute value.
     *
     * @param attrName Attribute name.
     * @param attrVal Attribute value.
     */
    public AttributeNodeFilter(String attrName, @Nullable Object attrVal) {
        A.notNull(attrName, "attrName");

        attrs = Collections.singletonMap(attrName, attrVal);
    }

    /**
     * Creates new node filter with a set of attributes.
     *
     * @param attrs Attributes.
     */
    public AttributeNodeFilter(Map<String, Object> attrs) {
        A.notNull(attrs, "attrs");

        this.attrs = attrs;
    }

    /** {@inheritDoc} */
    @Override public boolean apply(ClusterNode node) {<FILL_FUNCTION_BODY>}

    /**
     * Gets attributes.
     *
     * @return Attributes collection.
     */
    public Map<String, Object> getAttrs() {
        return new HashMap<>(attrs);
    }
}

        Map<String, Object> nodeAttrs = node.attributes();

        for (Map.Entry<String, Object> attr : attrs.entrySet()) {
            if (!F.eq(nodeAttrs.get(attr.getKey()), attr.getValue()))
                return false;
        }

        return true;
    
<no_super_class>