From 1392b078ab9348d35cd6073761694ef574bd06d1 Mon Sep 17 00:00:00 2001 From: Alexandre Pujol Date: Sat, 1 Mar 2025 16:15:55 +0100 Subject: [PATCH] tests: add Justile, used as integration environment helper. --- Justfile | 162 ++++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile | 27 -------- tests/Vagrantfile | 62 ------------------ tests/boxes.yml | 51 --------------- 4 files changed, 162 insertions(+), 140 deletions(-) create mode 100644 Justfile delete mode 100644 tests/Makefile delete mode 100644 tests/Vagrantfile delete mode 100644 tests/boxes.yml diff --git a/Justfile b/Justfile new file mode 100644 index 000000000..7b39fb8a6 --- /dev/null +++ b/Justfile @@ -0,0 +1,162 @@ +# apparmor.d - Full set of apparmor profiles +# Copyright (C) 2025 Alexandre Pujol +# SPDX-License-Identifier: GPL-2.0-only + +# Integration environment for apparmor.d +# +# Usage: +# just +# just img ubuntu24 server +# just vm ubuntu24 server +# just up ubuntu24 server +# just ssh ubuntu24 server +# just halt ubuntu24 server +# just destroy ubuntu24 server +# just list +# just images +# just available +# just clean + +base_dir := home_dir() / ".libvirt/base" +vm := home_dir() / ".vm" +output := base_dir / "packer" +disk_size := "15G" +prefix := "aa-" +c := "--connect=qemu:///system" +sshopt := "-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" + +[doc('Show this help message')] +default: + @echo -e "Integration environment helper for apparmor.d\n" + @just --list --unsorted + @echo -e "\nSee https://apparmor.pujol.io/development/vm/ for more information." + +[doc('Build the apparmor.d package')] +package dist: + #!/usr/bin/env bash + set -eu -o pipefail + dist="{{dist}}" + [[ $dist =~ ubuntu* ]] && dist=ubuntu + [[ $dist =~ debian* ]] && dist=debian + make package dist=$dist + +[doc('Build the image')] +img dist flavor: (package dist) + @mkdir -p {{base_dir}} + packer build -force \ + -var dist={{dist}} \ + -var flavor={{flavor}} \ + -var disk_size={{disk_size}} \ + -var prefix={{prefix}} \ + -var base_dir={{base_dir}} \ + -var output={{output}} \ + tests/packer/ + +[doc('Create the machine')] +vm dist flavor: + @cp -f {{base_dir}}/{{prefix}}{{dist}}-{{flavor}}.qcow2 {{vm}}/{{prefix}}{{dist}}-{{flavor}}.qcow2 + virt-install {{c}} \ + --import \ + --name {{prefix}}{{dist}}-{{flavor}} \ + --vcpus 6 \ + --ram 4096 \ + --machine q35 \ + --boot uefi \ + --memorybacking source.type=memfd,access.mode=shared \ + --disk path={{vm}}/{{prefix}}{{dist}}-{{flavor}}.qcow2,format=qcow2,bus=virtio \ + --filesystem "`pwd`,0a31bc478ef8e2461a4b1cc10a24cc4",accessmode=passthrough,driver.type=virtiofs \ + --os-variant "`just get_osinfo {{dist}}`" \ + --graphics spice \ + --audio id=1,type=spice \ + --sound model=ich9 \ + --noautoconsole + +[doc('Start a machine')] +up dist flavor: + @virsh {{c}} start {{prefix}}{{dist}}-{{flavor}} + +[doc('Stops the machine')] +halt dist flavor: + @virsh {{c}} shutdown {{prefix}}{{dist}}-{{flavor}} + +[doc('Destroy the machine')] +destroy dist flavor: + @virsh {{c}} destroy {{prefix}}{{dist}}-{{flavor}} || true + @virsh {{c}} undefine {{prefix}}{{dist}}-{{flavor}} --nvram + @rm -fv {{vm}}/{{prefix}}{{dist}}-{{flavor}}.qcow2 + +[doc('Connect to the machine')] +ssh dist flavor: + @ssh {{sshopt}} user@`just get_ip {{dist}} {{flavor}}` + +[doc('List the machines')] +list: + @echo -e '\033[1m Id Name State\033[0m' + @virsh {{c}} list --all | grep {{prefix}} + +[doc('List the machine images')] +images: + #!/usr/bin/env bash + set -eu -o pipefail + ls -lh {{base_dir}} | awk ' + BEGIN { + printf("\033[1m%-18s %-10s %-5s %s\033[0m\n", "Distribution", "Flavor", "Size", "Date") + } + { + if ($9 ~ /^{{prefix}}.*\.qcow2$/) { + split($9, arr, "-|\\.") + printf("%-18s %-10s %-5s %s %s %s\n", arr[2], arr[3], $5, $6, $7, $8) + } + } + ' + +[doc('List the machine that can be created')] +available: + #!/usr/bin/env bash + set -eu -o pipefail + ls -lh tests/cloud-init | awk ' + BEGIN { + printf("\033[1m%-18s %s\033[0m\n", "Distribution", "Flavor") + } + { + if ($9 ~ /^.*\.user-data.yml$/) { + split($9, arr, "-|\\.") + printf("%-18s %s\n", arr[1], arr[2]) + } + } + ' + +[doc('Run the integration tests on the machine')] +integration dist flavor: + @ssh {{sshopt}} user@`just get_ip {{dist}} {{flavor}}` \ + cp -rf /home/user/Projects/apparmor.d/tests/integration/ /home/user/Projects + @ssh {{sshopt}} user@`just get_ip {{dist}} {{flavor}}` \ + sudo umount /home/user/Projects/apparmor.d + @ssh {{sshopt}} user@`just get_ip {{dist}} {{flavor}}` \ + @bats --recursive --timing --print-output-on-failure Projects/integration/ + +[doc('Run the linters')] +lint: + @packer fmt packer/ + @packer validate --syntax-only packer/ + +[doc('Remove the machine images')] +clean: + @rm -fv {{base_dir}}/{{prefix}}*.qcow2 + +get_ip dist flavor: + @virsh --quiet --readonly {{c}} domifaddr {{prefix}}{{dist}}-{{flavor}} | \ + grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' + +get_osinfo dist: + #!/usr/bin/env python3 + osinfo = { + "archlinux": "archlinux", + "debian12": "debian12", + "debian13": "debian13", + "ubuntu22": "ubuntu22.04", + "ubuntu24": "ubuntu24.04", + "ubuntu25": "ubuntu25.04", + "opensuse": "opensusetumbleweed", + } + print(osinfo.get("{{dist}}", "{{dist}}")) diff --git a/tests/Makefile b/tests/Makefile deleted file mode 100644 index 3453ecee8..000000000 --- a/tests/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/make -f -# apparmor.d - Full set of apparmor profiles -# Copyright (C) 2023-2024 Alexandre Pujol -# SPDX-License-Identifier: GPL-2.0-only - -# Usage: -# make archlinux flavor=gnome -# vagrant up arch-gnome -# vagrant ssh archl-gnome - -# Build variables -flavor ?= -disk ?= 10G - -BASE = archlinux debian ubuntu22 ubuntu24 opensuse fedora - -.PHONY: ${BASE} lint - -$(BASE): - @make --directory=../ package dist=${@} - @packer build -force \ - -var disk_size=${disk} -var flavor="${flavor}" \ - -only=qemu.${@} packer/ - -lint: - @packer fmt --check packer/ - @packer validate --syntax-only packer/ diff --git a/tests/Vagrantfile b/tests/Vagrantfile deleted file mode 100644 index 4bdaac985..000000000 --- a/tests/Vagrantfile +++ /dev/null @@ -1,62 +0,0 @@ -# -*- mode: ruby -*- -# apparmor.d - Full set of apparmor profiles -# Copyright (C) 2023-2024 Alexandre Pujol -# SPDX-License-Identifier: GPL-2.0-only - -require 'yaml' - -machines = YAML.load_file(File.join(File.dirname(__FILE__), 'boxes.yml')) -default = machines['defaults'] - -Vagrant.require_version '>= 2.0.0' - -Vagrant.configure("2") do |config| - - config.ssh.keys_only = true - config.ssh.insert_key = false - config.ssh.private_key_path = [ '~/.ssh/id_ed25519' ] - config.ssh.username = 'user' - - machines['boxes'].each do |instance| - - # Configure the VMs per details in boxes.yml - config.vm.define instance['name'] do |srv| - srv.vm.box = instance['box'] - srv.vm.box_check_update = false - srv.vm.post_up_message = instance.to_yaml - srv.vm.synced_folder '.', '/vagrant', disabled: true - if !ENV['AA_INTEGRATION'] - srv.vm.synced_folder '../', '/home/user/Projects/apparmor.d', type: 'virtiofs', mount: false - end - - # Configure Libvirt provider - srv.vm.provider 'libvirt' do |libvirt| - libvirt.driver = 'kvm' - libvirt.default_prefix = 'aa-' - libvirt.connect_via_ssh = false - libvirt.storage_pool_name = 'ssd' - libvirt.memory = instance.fetch('ram', default['ram']) - libvirt.cpus = instance.fetch('cpu', default['cpu']) - libvirt.cpu_mode = 'host-passthrough' - libvirt.machine_type = 'q35' - libvirt.video_type = 'virtio' - libvirt.graphics_type = 'spice' - libvirt.sound_type = 'ich9' - libvirt.tpm_model = 'tpm-crb' - libvirt.tpm_type = 'emulator' - libvirt.tpm_version = '2.0' - libvirt.random model: 'random' - libvirt.memorybacking 'source', type: 'memfd' - libvirt.memorybacking 'access', mode: 'shared' - libvirt.channel type: 'unix', target_name: 'org.qemu.guest_agent.0', target_type: 'virtio' - (1..2).each do - libvirt.redirdev :type => "spicevmc" - end - if instance.fetch('uefi', default['uefi']) - libvirt.loader = '/usr/share/edk2/x64/OVMF_CODE.fd' - end - end - - end - end -end diff --git a/tests/boxes.yml b/tests/boxes.yml deleted file mode 100644 index 3e15fc304..000000000 --- a/tests/boxes.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- - -defaults: - uefi: true - ram: '3072' - cpu: '6' - -boxes: - - name: arch-gnome - box: aa-archlinux-gnome - uefi: false - - - name: arch-kde - box: aa-archlinux-kde - uefi: false - - - name: arch-xfce - box: aa-archlinux-xfce - uefi: false - - - name: arch-cosmic - box: aa-archlinux-cosmic - uefi: false - - - name: arch-server - box: aa-archlinux-server - uefi: false - - - name: ubuntu22-desktop - box: aa-ubuntu22-desktop - - - name: ubuntu24-desktop - box: aa-ubuntu24-desktop - - - name: ubuntu22-server - box: aa-ubuntu22-server - - - name: ubuntu24-server - box: aa-ubuntu24-server24 - - - name: debian-server - box: aa-debian-server - - - name: debian-gnome - box: aa-debian-gnome - - - name: debian-kde - box: aa-debian-kde - - - name: opensuse-kde - box: aa-opensuse-kde