Filters
Shape what APIC returns with property filters, DN wildcard patterns, and subscription filters — without writing any filter strings by hand.
Filters narrow the result set on APIC's side — not after the data lands in Fabrik. That distinction matters. Filtering at the source is faster, travels less data over the wire, and is gentler on large fabrics where the difference between "every object" and "every object matching a pattern" can be a hundredfold.
A Filter node sits after a Class node and drops into the APIC REST URL as a filter clause. Three types are supported, each producing a different shape of clause: Property, Query Target Filter (Wildcard), and Subscription.
Where filters live
Filters can be expressed in two places on the canvas, and the choice affects ergonomics more than behaviour.
| Location | Use when |
|---|---|
| Inline on a Class node | You need a simple property filter scoped to that one class (for example, fvBD.name eq vlan100). Fast to configure in the class's right panel. |
| Standalone Filter node | You need anything richer — DN wildcard patterns, grouped conditions, variables, subscriptions, or filters that span a pipeline stage. |
Rule of thumb: start inline. Move to a standalone Filter node the moment you reach for wildcards, groups, or a template variable.
Pre-requisite: a parent class
A Filter node only makes sense downstream of a Class node — every property and DN it can filter on comes from the Class's MIM metadata. If the Filter is unconnected or sits after something that isn't a Class, the configuration panel shows an amber "Connect to Class Node" banner and nothing else works until you wire it up.
Property filter
The common case: "rows where property X matches value Y." Three fields drive it.
1. Property. Click the property field to open a searchable picker of the parent class's properties (pulled from the MIM). The picker shows property names, types, categories, and whether each one is configurable or naming.
2. Operator. Eight operators are supported:
| Operator | Meaning |
|---|---|
eq | Equals (=) — case-sensitive exact match |
ne | Not equals (≠) — case-sensitive |
gt | Greater than |
lt | Less than |
ge | Greater or equal |
le | Less or equal |
wcard | Regex match (APIC's wildcard operator, regex semantics) |
contains | Substring match — Fabrik-side, case-insensitive convenience operator that compiles to a wcard with .*value.* semantics |
3. Value. The value input adapts to the property's type:
- Enums — a dropdown of the declared values.
- Booleans —
true/falsedropdown. - Integers — a number input bounded by the min/max the MIM declares. Out-of-range values are rejected client-side.
- Strings — a text input. If the property has a maximum length in the MIM, the input's
maxLengthis set accordingly.
Turning the value into a variable. The wrench icon next to the value field converts it into a template variable (${varId}). At run time Fabrik prompts for a value instead of baking one in — the full flow is documented in Variables.
Query Target Filter (Wildcard)
Wildcard filters match on Distinguished Names (DNs) using regex semantics. They're the right tool whenever you're slicing by "where the object lives" rather than "what property it has."
Three patterns come up repeatedly:
prefix.*— DN starts with a prefix..*suffix— DN ends with a suffix..*value.*— DN contains a value.
These are regexes, not globs — wcard in APIC means regex match. A bare prod doesn't do substring matching; use .*prod.* if that's what you mean.
Pattern Builder
The Filter node's wildcard mode uses the Pattern Builder — a small two-tier UI:
- Patterns inside a group combine with an inner logical operator (
ANDorOR). - Groups combine with an outer operator, also
ANDorOR.
That gives you clauses like (A AND B) OR (C AND D) without having to write the expression by hand. Each pattern inside a group has its own property picker, operator, and value, and each one can be backed by a template variable via the wrench icon.
Subscription
Subscription filters are a different kind of filter: they don't narrow the result set, they tell APIC to stream changes matching the query for as long as the subscription is active.
Two subtypes:
- Audit Logs — subscribe to audit events on the matched set.
- Events — subscribe to runtime events.
Subscription filters pair with Fabrik's notification and Time Machine pipelines, not with ad-hoc querying. Use them when you want "tell me whenever a matching object changes," not "show me the current state."
Combining multiple filters
Chain two Filter nodes in series and each one narrows the result further. APIC composes them into a single filter expression on its end.
A recipe that shows up often:
- First Filter: a property filter for scope (
status eq active). - Second Filter: a wildcard filter for DN shape (
dn matches uni/tn-prod/.*).
The order on the canvas doesn't affect correctness — filter composition is commutative on APIC's side — but left-to-right usually reads most naturally.
Switching filter types
Changing the Filter Type dropdown resets the node's configuration: property, value, wildcard patterns, and subscription settings all clear. This is deliberate — the three types have incompatible configs, and silently preserving, say, a property picker into subscription mode would quietly produce wrong queries.
If you want the previous configuration back, use browser undo or reconstruct it manually.
What the backend does with your filter
You never type APIC filter strings yourself; Fabrik assembles them at run time from the node's configuration. Roughly:
| Filter node setting | APIC query fragment |
|---|---|
Property, eq, name=vlan100 | query-target-filter=eq(fvBD.name,"vlan100") |
Wildcard, pattern uni/tn-prod/.* on dn | query-target-filter=wcard(fvBD.dn,"uni/tn-prod/.*") |
Subscription, audit | subscription=yes with audit-specific auxiliary params |
The Execution page covers the full graph-to-URL compilation, including how multiple filters fold into a single query-target-filter expression.
Troubleshooting
The filter behaviours that confuse people most often, and what they actually mean:
- "Property list is empty." The parent class has no configurable properties the picker is willing to show (rare), or the MIM is incomplete for this class. Verify by opening the class in the Class Browser — if the property is missing there too, the MIM needs to be re-installed from MIM Management.
- "Filter runs but returns everything." Usually
wcardwith a plain string. APIC'swcardis regex, soprodmatches anything; use.*prod.*for substring. - "Equality filter seems case-sensitive." It is — APIC's
eqis case-sensitive. Switch towcardwith a case-insensitive regex pattern if you need loose matching. - "Int filter refuses my value." Fabrik sources the allowed range from the MIM and rejects out-of-range values before sending anything to APIC. Widen the value, or check that you've picked the right property.
- "Subscription doesn't seem to do anything." Subscriptions stream events; they don't change the current-state results. Pair the query with a Notifications route or a Time Machine snapshot to actually see the events.
Filters shape what APIC sends back. The next page — Post-processors — reshapes what's already on the way home.
Connection rules
Why the canvas refuses some edges — the structural rules, the ACI hierarchy enforced through the Class Browser, and the pipeline exception.
Post-processors
Reshape APIC results after they come back — filter rows, extract fields, run regex, sort, aggregate — with a visual top-to-bottom pipeline on the canvas.