Files
computer-playbook/plugins/filter
kevinveenbirkenbach 8ac8c07853 refactor(sys-svc-container): extract docker_restart_policy to swarm condition mapping into a filter
The mapping from compose-style `docker_restart_policy` (`no`,
`on-failure[:N]`, `always`, `unless-stopped`) to swarm's
`deploy.restart_policy.condition` (`none`, `on-failure`, `any`) was
seven lines of inline Jinja `{% set / if / elif / else %}` in
`roles/sys-svc-container/templates/deploy.yml.j2`. That made the
template noisy at the call site, hid the typo-safety logic from
unit tests, and forced every reviewer to re-derive the mapping table
from a chain of conditionals.

Move the mapping into a dedicated filter plugin so the call site is
a single readable expression and the mapping is exercised by a
focused test suite.

- plugins/filter/swarm_restart_condition.py: pure function, no Jinja
  context dependency (the input is the only thing that matters).
  Strips + str-casts the input so YAML-literal slop like `"  no  "`
  or a numeric `0` does not defeat the mapping. Output is always a
  member of the closed swarm condition set `{none, on-failure, any}`;
  unknown / typo inputs map to `any` (safe default -- a misconfigured
  long-running service still runs and the operator notices the typo
  via the literal `condition: any` in the rendered file, instead of
  silently degrading to `none` which would skip respawning a real
  service).
- tests/unit/plugins/filter/test_swarm_restart_condition.py: 12
  cases. Direct mapping per branch, `on-failure:N` suffix form
  (suffix dropped because swarm carries max-attempts in a separate
  `max_attempts` key), None / empty / whitespace fallback,
  stringification of non-string input, strip semantics, an explicit
  unknown-value test that pins the safe-default rationale, and a
  property test over twelve inputs that asserts the output is always
  inside the closed swarm condition set. A second test class
  verifies the filter is registered under the exact name
  `swarm_restart_condition` so a typo in the FilterModule shim does
  not silently fall back to the identity filter.
- roles/sys-svc-container/templates/deploy.yml.j2: thirteen lines of
  inline Jinja (`{% set _drp = … %}` + four `{% set
  _swarm_restart_condition = … %}` branches) collapse to a single
  filter expression:

        condition: {{ docker_restart_policy
                      | default(DOCKER_RESTART_POLICY)
                      | swarm_restart_condition }}

  The runtime mapping is identical to the pre-refactor inline
  version (verified by the new unit tests against the same input
  buckets), so nothing changes for existing roles.
2026-06-14 19:08:45 +02:00
..
…

Custom Filter Plugins for Infinito.Nexus

This directory contains custom Ansible filter plugins used within the Infinito.Nexus project.

When to Use a Filter Plugin

  • Transform values: Use filters to transform, extract, reformat, or compute values from existing variables or facts.
  • Inline data manipulation: Filters are designed for inline use in Jinja2 expressions (in templates, tasks, vars, etc.).
  • No external lookups: Filters only operate on data you explicitly pass to them and cannot access external files, the Ansible inventory, or runtime context.

Examples

{{ role_name | get_entity_name }}
{{ my_list | unique }}
{{ user_email | regex_replace('^(.+)@.*$', '\\1') }}

When not to Use a Filter Plugin

  • If you need to load data from an external source (e.g., file, environment, API), use a lookup plugin instead.
  • If your logic requires access to inventory, facts, or host-level information that is not passed as a parameter.

Further Reading