Skip to content

(MAINT) test vmpooler #1006

(MAINT) test vmpooler

(MAINT) test vmpooler #1006

---
name: Install test matrix
on:
pull_request:
paths:
- .github/workflows/**/*
- spec/**/*
- lib/**/*
- tasks/**/*
- functions/**/*
- types/**/*
- plans/**/*
- hiera/**/*
- manifests/**/*
- templates/**/*
- files/**/*
- metadata.json
- Rakefile
- Gemfile
- provision.yaml
- .rspec
- .rubocop.yml
- .puppet-lint.rc
- .fixtures.yml
branches: [main]
workflow_dispatch: {}
jobs:
test-install:
name: PE ${{ matrix.version }} ${{ matrix.architecture }} on ${{ matrix.image }}
runs-on: ubuntu-latest
env:
BOLT_GEM: true
BOLT_DISABLE_ANALYTICS: true
LANG: en_US.UTF-8
strategy:
fail-fast: false
matrix:
architecture: [standard-with-dr]
version: [2025.6.0]
image: [litmusimage/ubuntu:24.04]
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Activate Ruby 3.1
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.1'
bundler-cache: true
- name: Print bundle environment
if: ${{ github.repository_owner == 'puppetlabs' }}
run: |
echo ::group::info:bundler
bundle env
echo ::endgroup::
- name: Provision test cluster
timeout-minutes: 15
run: |
echo ::group::prepare
mkdir -p $HOME/.ssh
echo 'Host *' > $HOME/.ssh/config
echo ' ServerAliveInterval 150' >> $HOME/.ssh/config
echo ' ServerAliveCountMax 2' >> $HOME/.ssh/config
echo ' StrictHostKeyChecking no' >> $HOME/.ssh/config
echo ' UserKnownHostsFile /dev/null' >> $HOME/.ssh/config
echo ' ConnectTimeout 30' >> $HOME/.ssh/config
echo ' ConnectionAttempts 10' >> $HOME/.ssh/config
bundle exec rake spec_prep
echo ::endgroup::
echo ::group::provision
bundle exec bolt plan run peadm_spec::provision_test_cluster \
--modulepath spec/fixtures/modules \
provider=docker \
image=${{ matrix.image }} \
architecture=${{ matrix.architecture }} \
--log-level trace
echo ::endgroup::
echo ::group::list modules
ls -l ./spec/fixtures/modules || true; echo
echo ::endgroup::
echo ::group::update every 'ssh:' tag in ./inventory.yaml file to add 'native-ssh: true' under install_test_cluster and indent correctly
sed -i -e '/ssh:/a\ native-ssh: true' ./inventory.yaml || true; echo
# Also add additional SSH options for container environments
sed -i -e '/ssh:/a\ connect-timeout: 30' ./inventory.yaml || true; echo
sed -i -e '/ssh:/a\ host-key-check: false' ./inventory.yaml || true; echo
echo ::endgroup::
echo ::group::list contents of ./inventory.yaml
ls -l ./inventory.yaml || true; echo
cat ./inventory.yaml || true; echo
echo ::endgroup::
echo ::group::list contents of spec/docker/inventory.yaml
ls -l ./spec/docker/inventory.yaml || true; echo
cat ./spec/docker/inventory.yaml || true; echo
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
echo ::group::info:inventory
sed -e 's/password: .*/password: "[redacted]"/' < ./inventory.yaml || true
echo ::endgroup::
- name: Debug SSH connectivity
run: |
echo ::group::debug_ssh_connectivity
# Check if containers are running
docker ps
# Check SSH processes in containers
for container in $(docker ps --format "table {{.Names}}" | tail -n +2); do
echo "Testing SSH to container: $container"
echo "SSH processes in $container:"
docker exec $container ps aux | grep sshd || echo "No sshd processes found in $container"
# Test SSH connectivity directly
echo "Testing direct SSH connection to $container:"
container_ip=$(docker inspect $container | jq -r '.[0].NetworkSettings.IPAddress')
echo "Container IP: $container_ip"
# Get the mapped SSH port
ssh_port=$(docker port $container 22 | cut -d: -f2)
echo "SSH port mapping: localhost:$ssh_port -> $container:22"
# Test SSH connection with timeout
timeout 10 ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -p $ssh_port root@localhost 'echo "SSH connection successful"' || echo "SSH connection failed to $container"
done
echo ::endgroup::
- name: Wait for SSH to be ready
run: |
echo ::group::wait_for_ssh
# Look for SSH keys created by litmus
if [ -f ./id_rsa ]; then
SSH_KEY="./id_rsa"
elif [ -f ./.vagrant/machines/*/virtualbox/private_key ]; then
SSH_KEY="./.vagrant/machines/*/virtualbox/private_key"
elif [ -f ./spec/fixtures/id_rsa ]; then
SSH_KEY="./spec/fixtures/id_rsa"
else
echo "No SSH key found, trying password authentication"
SSH_KEY=""
fi
echo "Using SSH key: $SSH_KEY"
# Wait for SSH to be available on all containers via Bolt
for i in {1..12}; do
echo "Attempt $i: Testing Bolt SSH connectivity..."
# Build bolt command with appropriate auth
if [ -n "$SSH_KEY" ]; then
bolt_cmd="bundle exec bolt command run 'echo Bolt SSH test successful' \
--inventoryfile ./inventory.yaml \
--targets all \
--connect-timeout 30 \
--no-host-key-check \
--private-key $SSH_KEY \
--user root"
else
bolt_cmd="bundle exec bolt command run 'echo Bolt SSH test successful' \
--inventoryfile ./inventory.yaml \
--targets all \
--connect-timeout 30 \
--no-host-key-check"
fi
if eval $bolt_cmd; then
echo "All containers are accessible via Bolt SSH!"
break
fi
if [ $i -eq 12 ]; then
echo "Containers failed to become accessible after 12 attempts"
echo "Final inventory check:"
cat ./inventory.yaml
exit 1
fi
echo "Waiting 10 seconds before retry..."
sleep 10
done
echo ::endgroup::
- name: Install PE on test cluster
timeout-minutes: 120
run: |
bundle exec bolt plan run peadm_spec::install_test_cluster \
--inventoryfile ./inventory.yaml \
--modulepath spec/fixtures/modules \
architecture=${{ matrix.architecture }} \
version=${{ matrix.version }} \
console_password=${{ secrets.CONSOLE_PASSWORD }}
- name: Tear down test cluster
if: ${{ always() }}
continue-on-error: true
run: |-
if [ -f spec/fixtures/litmus_inventory.yaml ]; then
echo ::group::tear_down
bundle exec rake 'litmus:tear_down'
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
fi