# `Linx.Netlink.Rtnl.Reconcile.Report`
[🔗](https://github.com/oshlabs/linx/blob/v0.2.0/lib/linx/netlink/rtnl/reconcile/report.ex#L1)

The outcome of one `Linx.Netlink.Rtnl.Reconcile.reconcile/4` pass.

rtnl ops are ordered (addresses must exist before the routes that use them),
so a pass is **fail-fast**: it stops at the first op that errors, and the ops
it had not yet reached become `:pending`. The level-triggered next pass
re-converges them. (This is the same report shape as
`Linx.Sysctl.Reconcile.Report`; the strategy differs because rtnl ops are
ordered where sysctl's are independent — see the reconcile design notes.)

Fields:

  * `:converged?` — `true` iff nothing was left undone (`:failed` and
    `:pending` both empty).
  * `:applied` — ops that succeeded this pass, in apply order. Each is a
    `Linx.Netlink.Rtnl.Diff` op (`{:create | :update | :delete, struct}`).
  * `:failed` — `{op, error}` for the op that stopped the pass (at most one,
    fail-fast).
  * `:pending` — ops not attempted after the failure.
  * `:last_applied` — the **updated** ownership map to thread into the next
    pass: `%{addresses: MapSet.t()}` of `Diff.address_key/1` values. (Routes
    are owned by their `rtm_protocol` tag, so they need no last-applied set.)

## Inspect

    #Linx.Netlink.Rtnl.Reconcile.Report<converged: 4 applied>
    #Linx.Netlink.Rtnl.Reconcile.Report<2 applied, 1 failed, 3 pending>

# `t`

```elixir
@type t() :: %Linx.Netlink.Rtnl.Reconcile.Report{
  applied: [Linx.Netlink.Rtnl.Diff.op()],
  converged?: boolean(),
  failed: [{Linx.Netlink.Rtnl.Diff.op(), term()}],
  last_applied: %{optional(:addresses) =&gt; MapSet.t()},
  pending: [Linx.Netlink.Rtnl.Diff.op()]
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
