Files
matrix-docker-ansible-deploy/molecule-shared/tasks/homeserver-stub.yml
T
Slavi PantaleevandClaude Opus 5 f320bfc93b Add a Molecule scenario for mautrix-whatsapp, and a shared playbook context
The second scenario, chosen to be a bridge rather than another HTTP
component: bridges are roughly 40 of the 70 roles here, and validating the
shape on role two is cheaper than discovering it on role forty. It found
two things the first role could not.

Bridges read a whole family of variables from outside themselves -
matrix_bridges_relay_enabled, _encryption_enabled, _encryption_default,
_msc4190_enabled, _self_sign_enabled, plus matrix_admin - all defined in
matrix-base. Since every bridge reads them, they belong in shared context
rather than in each bridge's scenario: molecule-shared/playbook-context.yml
now carries them along with the identity and path variables the first
scenario had inline. Note it is loaded through vars_files, which outranks
inventory group_vars, so it is authoritative; a scenario that wants to prove
one of these reaches the rendered configuration should say so explicitly.

Appservices call /whoami while starting and refuse to run if the id returned
is not the bot user they were configured as - mautrix-whatsapp exits 17 with
"Unexpected user ID in whoami call". The shared stub now takes the id it
should claim to be. Expect every bridge and bot to need this.

What the scenario proves: the bridge starts and stays up, opens its
appservice port, its rendered config and appservice registration carry the
scenario's tokens and bot user, it created its sqlite database under the
role's data path as the role's uid, and it runs the version the role pins.
It does not bridge anything and never will.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 18:02:53 +03:00

82 lines
3.1 KiB
YAML

# SPDX-FileCopyrightText: 2026 Slavi Pantaleev
#
# SPDX-License-Identifier: AGPL-3.0-or-later
---
# Stands up a stand-in homeserver on a container network, for scenarios whose
# component contacts a homeserver while starting up.
#
# Include from a scenario's prepare.yml:
#
# - name: Ensure the homeserver stub is running
# ansible.builtin.include_tasks:
# file: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/../../../molecule-shared/tasks/homeserver-stub.yml"
# vars:
# molecule_shared_stub_network: "{{ <role>_container_network }}"
# molecule_shared_stub_joined_rooms: ["!some-room:molecule.local"]
#
# The component should then be pointed at http://matrix.molecule.local:8008.
#
# See molecule-shared/homeserver-stub.py for what it answers and, more
# importantly, for what it is not.
- name: Ensure the homeserver stub script is present
ansible.builtin.copy:
src: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/../../../molecule-shared/homeserver-stub.py"
dest: /root/molecule-homeserver-stub.py
mode: "0755"
- name: Ensure a previous homeserver stub is gone
ansible.builtin.command:
argv:
- docker
- rm
- --force
- "{{ molecule_shared_stub_name | default('matrix-homeserver-stub') }}"
register: molecule_shared_stub_removal
changed_when: molecule_shared_stub_removal.rc == 0
failed_when: false
# The alias is what the component resolves, so its configuration can name a
# hostname rather than a container name.
- name: Ensure the homeserver stub is running
ansible.builtin.command:
argv:
- docker
- run
- --detach
- --name={{ molecule_shared_stub_name | default('matrix-homeserver-stub') }}
- --network={{ molecule_shared_stub_network }}
- --network-alias={{ molecule_shared_stub_hostname | default('matrix.molecule.local') }}
- --env=STUB_SERVER_NAME={{ molecule_shared_stub_server_name | default('molecule.local') }}
- --env=STUB_JOINED_ROOMS={{ (molecule_shared_stub_joined_rooms | default([])) | join(',') }}
# Appservices call /whoami on startup and refuse to run if the id
# returned is not the bot user they were configured as, so a scenario
# bridging anything has to tell the stub who it should claim to be.
- --env=STUB_USER_ID={{ molecule_shared_stub_user_id | default('@stub:' + (molecule_shared_stub_server_name | default('molecule.local'))) }}
- --volume=/root/molecule-homeserver-stub.py:/stub.py:ro
- "{{ molecule_shared_image_python }}"
- python3
- /stub.py
register: molecule_shared_stub_start
changed_when: molecule_shared_stub_start.rc == 0
- name: Wait for the homeserver stub to answer
ansible.builtin.command:
argv:
- docker
- run
- --rm
- --network={{ molecule_shared_stub_network }}
- "{{ molecule_shared_image_curl }}"
- --silent
- --fail
- --max-time
- "5"
- "http://{{ molecule_shared_stub_hostname | default('matrix.molecule.local') }}:8008/_matrix/client/versions"
register: molecule_shared_stub_ready
changed_when: false
until: molecule_shared_stub_ready.rc == 0
retries: 12
delay: 5