feat(integration_test): KVM/libvirt substrate role on the control node
This commit is contained in:
parent
65533be4d9
commit
ac6a01296a
9 changed files with 165 additions and 0 deletions
|
|
@ -8,3 +8,5 @@
|
||||||
roles:
|
roles:
|
||||||
- role: dev_env
|
- role: dev_env
|
||||||
tags: [dev_env]
|
tags: [dev_env]
|
||||||
|
- role: integration_test
|
||||||
|
tags: [integration_test]
|
||||||
|
|
|
||||||
35
roles/integration_test/README.md
Normal file
35
roles/integration_test/README.md
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
# integration_test
|
||||||
|
|
||||||
|
Installs the KVM/libvirt substrate on the control node (`ubongo`) so the agent
|
||||||
|
can boot throwaway Debian VMs for local integration testing (ADR-025).
|
||||||
|
|
||||||
|
This is a **non-service** role — no SECURITY/VERIFY/ACCESS/BACKUP files are
|
||||||
|
required. It does **not** make ubongo a production hypervisor; it only provides
|
||||||
|
the tooling needed to spin up short-lived test VMs (see ADR-015).
|
||||||
|
|
||||||
|
## Target group
|
||||||
|
|
||||||
|
`control` (i.e. `ubongo`)
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
1. Installs QEMU/KVM, libvirt daemon + clients, `virt-install`, and
|
||||||
|
cloud-image tools (`cloud-image-utils`, `genisoimage`).
|
||||||
|
2. Enables and starts `libvirtd`.
|
||||||
|
3. Adds the configured users (`sjat`, `claude`) to the `libvirt` and `kvm`
|
||||||
|
groups so VMs can be managed without `sudo`.
|
||||||
|
4. Creates `/var/lib/boma-integration` (owned `root:libvirt`, mode `2775`) as
|
||||||
|
the cache directory for golden images and overlays.
|
||||||
|
|
||||||
|
## Defaults
|
||||||
|
|
||||||
|
| Variable | Default | Purpose |
|
||||||
|
|-------------------------------|-------------------------------|----------------------------------|
|
||||||
|
| `integration_test__packages` | see `defaults/main.yml` | APT packages to install |
|
||||||
|
| `integration_test__users` | `[sjat, claude]` | Users granted libvirt/kvm access |
|
||||||
|
| `integration_test__cache_dir` | `/var/lib/boma-integration` | Image/overlay cache directory |
|
||||||
|
|
||||||
|
## Related decisions
|
||||||
|
|
||||||
|
- [ADR-025](../../docs/decisions/025-integration-testing.md) — local VM integration testing
|
||||||
|
- [ADR-015](../../docs/decisions/015-control-host.md) — control host scope (ubongo is not a hypervisor)
|
||||||
18
roles/integration_test/defaults/main.yml
Normal file
18
roles/integration_test/defaults/main.yml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
# integration_test — installs the local KVM/libvirt substrate on the control node
|
||||||
|
# (ubongo) so the agent can run throwaway VM integration tests (ADR-025). Non-service
|
||||||
|
# role; applied to the `control` group. Not a production hypervisor (ADR-015).
|
||||||
|
integration_test__packages:
|
||||||
|
- qemu-system-x86 # KVM
|
||||||
|
- qemu-utils # qemu-img (overlays)
|
||||||
|
- libvirt-daemon-system
|
||||||
|
- libvirt-clients # virsh
|
||||||
|
- virt-install # virt-install (trixie: the real pkg; `virtinst` is transitional)
|
||||||
|
- cloud-image-utils # cloud-localds (NoCloud seed)
|
||||||
|
- genisoimage # cloud-localds fallback
|
||||||
|
# Users granted libvirt/kvm access (run VMs without sudo).
|
||||||
|
integration_test__users:
|
||||||
|
- sjat
|
||||||
|
- claude
|
||||||
|
# Where the golden image + overlays live (outside the repo).
|
||||||
|
integration_test__cache_dir: "/var/lib/boma-integration"
|
||||||
1
roles/integration_test/handlers/main.yml
Normal file
1
roles/integration_test/handlers/main.yml
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
---
|
||||||
14
roles/integration_test/meta/main.yml
Normal file
14
roles/integration_test/meta/main.yml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: sjat
|
||||||
|
description: >-
|
||||||
|
Installs the KVM/libvirt substrate on the control node (ubongo) to enable
|
||||||
|
local VM integration testing (ADR-025). Non-service role; not a production
|
||||||
|
hypervisor (ADR-015).
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.17"
|
||||||
|
platforms:
|
||||||
|
- name: Debian
|
||||||
|
versions:
|
||||||
|
- trixie
|
||||||
|
dependencies: []
|
||||||
7
roles/integration_test/molecule/default/converge.yml
Normal file
7
roles/integration_test/molecule/default/converge.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
- name: Converge
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
gather_facts: true
|
||||||
|
roles:
|
||||||
|
- role: integration_test
|
||||||
31
roles/integration_test/molecule/default/molecule.yml
Normal file
31
roles/integration_test/molecule/default/molecule.yml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
dependency:
|
||||||
|
name: galaxy
|
||||||
|
options:
|
||||||
|
requirements-file: ../../requirements.yml
|
||||||
|
|
||||||
|
driver:
|
||||||
|
name: docker
|
||||||
|
|
||||||
|
platforms:
|
||||||
|
- name: instance
|
||||||
|
# Project-owned image built from .docker/molecule-debian13/Dockerfile
|
||||||
|
# and hosted in the Forgejo container registry.
|
||||||
|
# Build/push with: make molecule-image / make molecule-image-push
|
||||||
|
image: forgejo.nyumbani.baobab.band/sjat/molecule-debian13:latest
|
||||||
|
pre_build_image: true
|
||||||
|
privileged: true # required for systemd
|
||||||
|
cgroupns_mode: host
|
||||||
|
volumes:
|
||||||
|
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||||
|
command: /lib/systemd/systemd
|
||||||
|
|
||||||
|
provisioner:
|
||||||
|
name: ansible
|
||||||
|
inventory:
|
||||||
|
host_vars:
|
||||||
|
instance:
|
||||||
|
ansible_user: root
|
||||||
|
|
||||||
|
verifier:
|
||||||
|
name: ansible
|
||||||
25
roles/integration_test/molecule/default/verify.yml
Normal file
25
roles/integration_test/molecule/default/verify.yml
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
- name: Verify
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
gather_facts: false
|
||||||
|
tasks:
|
||||||
|
- name: Gather package facts
|
||||||
|
ansible.builtin.package_facts:
|
||||||
|
- name: Assert the substrate packages are installed
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- "'qemu-system-x86' in ansible_facts.packages"
|
||||||
|
- "'qemu-utils' in ansible_facts.packages"
|
||||||
|
- "'libvirt-daemon-system' in ansible_facts.packages"
|
||||||
|
- "'libvirt-clients' in ansible_facts.packages"
|
||||||
|
- "'virt-install' in ansible_facts.packages"
|
||||||
|
- "'cloud-image-utils' in ansible_facts.packages"
|
||||||
|
- "'genisoimage' in ansible_facts.packages"
|
||||||
|
- name: Cache dir exists
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /var/lib/boma-integration
|
||||||
|
register: _cache
|
||||||
|
- name: Assert cache dir
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that: [_cache.stat.isdir]
|
||||||
32
roles/integration_test/tasks/main.yml
Normal file
32
roles/integration_test/tasks/main.yml
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
- name: Install the KVM/libvirt substrate
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: "{{ integration_test__packages }}"
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
tags: [packages]
|
||||||
|
|
||||||
|
- name: Enable and start libvirtd
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: libvirtd
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
|
tags: [config]
|
||||||
|
|
||||||
|
- name: Grant users libvirt + kvm access
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: "{{ item }}"
|
||||||
|
groups: [libvirt, kvm]
|
||||||
|
append: true
|
||||||
|
loop: "{{ integration_test__users }}"
|
||||||
|
tags: [users]
|
||||||
|
|
||||||
|
- name: Create the integration cache dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ integration_test__cache_dir }}"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: libvirt
|
||||||
|
mode: "2775"
|
||||||
|
tags: [config]
|
||||||
Loading…
Add table
Reference in a new issue