From 51a8bdda210a748f0a51f9f96061ea5df8101da5 Mon Sep 17 00:00:00 2001 From: "Eric D. Helms" Date: Tue, 5 May 2026 12:23:54 -0400 Subject: [PATCH] Scope Vagrant libvirt domains to allow multiple checkouts Use a hash of the absolute working directory path to generate a unique libvirt domain prefix per checkout, preventing collisions when multiple clones or git worktrees deploy Vagrant boxes simultaneously. Both the libvirt domain name prefix and the VM hostnames are scoped using the prefix, ensuring full isolation between deployments. Resolve VM FQDNs dynamically in CI and test fixtures instead of hardcoding the .example.com domain. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/test.yml | 8 +++++++- Vagrantfile | 14 +++++++++++--- tests/conftest.py | 8 ++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 10c21d23c..779dde6c9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -90,6 +90,12 @@ jobs: - name: Start VMs run: | ./forge vms start --vms "quadlet client ${{ matrix.database == 'external' && 'database' || '' }}" + - name: Resolve VM FQDNs + run: | + echo "QUADLET_FQDN=$(vagrant ssh quadlet -- hostname -f)" >> "${GITHUB_ENV}" + if [ "${{ matrix.database }}" = "external" ]; then + echo "DATABASE_FQDN=$(vagrant ssh database -- hostname -f)" >> "${GITHUB_ENV}" + fi - name: Configure remote-database if: matrix.database == 'external' run: | @@ -122,7 +128,7 @@ jobs: ./foremanctl pull-images - name: Run deployment run: | - ./foremanctl deploy --certificate-source=${{ matrix.certificate_source }} ${{ matrix.database == 'external' && '--database-mode=external --database-host=database.example.com --database-ssl-ca $(pwd)/.var/lib/foremanctl/db-ca.crt --database-ssl-mode verify-full' || '' }} ${{ matrix.certificate_source == 'custom_server' && '--certificate-server-certificate /root/custom-certificates/certs/quadlet.example.com.crt --certificate-server-key /root/custom-certificates/private/quadlet.example.com.key --certificate-server-ca-certificate /root/custom-certificates/certs/server-ca.crt' || '' }} --foreman-initial-admin-password=changeme --initial-organization "Foreman CI" --initial-location "Internet" --tuning development + ./foremanctl deploy --certificate-source=${{ matrix.certificate_source }} ${{ matrix.database == 'external' && format('--database-mode=external --database-host={0} --database-ssl-ca $(pwd)/.var/lib/foremanctl/db-ca.crt --database-ssl-mode verify-full', env.DATABASE_FQDN) || '' }} ${{ matrix.certificate_source == 'custom_server' && format('--certificate-server-certificate /root/custom-certificates/certs/{0}.crt --certificate-server-key /root/custom-certificates/private/{0}.key --certificate-server-ca-certificate /root/custom-certificates/certs/server-ca.crt', env.QUADLET_FQDN) || '' }} --foreman-initial-admin-password=changeme --initial-organization "Foreman CI" --initial-location "Internet" --tuning development - name: Add optional feature - hammer run: | ./foremanctl deploy --add-feature hammer diff --git a/Vagrantfile b/Vagrantfile index 4226a9765..42b781a5d 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -1,3 +1,7 @@ +require 'digest' + +prefix = Digest::MD5.hexdigest(Dir.pwd)[0..7] + Vagrant.configure("2") do |config| config.vm.synced_folder ".", "/vagrant" @@ -12,9 +16,10 @@ Vagrant.configure("2") do |config| config.vm.define "quadlet" do |override| override.vm.box = ENV.fetch("FOREMANCTL_BASE_BOX", "centos/stream9") - override.vm.hostname = "quadlet.example.com" + override.vm.hostname = "quadlet.#{prefix}.example.com" override.vm.provider "libvirt" do |libvirt, provider| + libvirt.default_prefix = prefix libvirt.memory = 10240 libvirt.cpus = 4 libvirt.machine_virtual_size = 30 @@ -23,19 +28,22 @@ Vagrant.configure("2") do |config| config.vm.define "client" do |override| override.vm.box = "centos/stream9" - override.vm.hostname = "client.example.com" + override.vm.hostname = "client.#{prefix}.example.com" override.vm.provider "libvirt" do |libvirt, provider| + libvirt.default_prefix = prefix libvirt.memory = 1024 end end config.vm.define "database" do |override| override.vm.box = "centos/stream9" - override.vm.hostname = "database.example.com" + override.vm.hostname = "database.#{prefix}.example.com" override.vm.provider "libvirt" do |libvirt, provider| + libvirt.default_prefix = prefix libvirt.memory = 2048 end end end + diff --git a/tests/conftest.py b/tests/conftest.py index 656632c90..385da6fcd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -30,8 +30,8 @@ def server_hostname(): @pytest.fixture(scope="module") -def server_fqdn(server_hostname): - return f'{server_hostname}.example.com' +def server_fqdn(server): + return server.check_output('hostname -f') @pytest.fixture(scope="module") @@ -40,8 +40,8 @@ def client_hostname(): @pytest.fixture(scope="module") -def client_fqdn(client_hostname): - return f'{client_hostname}.example.com' +def client_fqdn(client): + return client.check_output('hostname -f') @pytest.fixture(scope="module")