Skip to content

Commit

Permalink
Add eco vcenter upstream ci capabilities (#538)
Browse files Browse the repository at this point in the history
SUMMARY
This PR aims to insert self hosted runner to enable integration tests to run on the eco vcenter environment.
This includes several adjustments to the code and additional action to be triggered for each PR, and run all the
integration tests on that env with the PR's new code.

Reviewed-by: mikemorency
Reviewed-by: Anna Savina
  • Loading branch information
shellymiron authored Oct 28, 2024
1 parent 3958614 commit d1b5e83
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 0 deletions.
46 changes: 46 additions & 0 deletions .github/eco-vcenter-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
name: Ansible Eco vCenter Integration Test
on:
pull_request_target:
types: [opened, synchronize]
push:
branches:
- main
- 'release-\d.\d'
permissions:
contents: read
jobs:
ansible_integration_test:
runs-on: ["self-hosted", linux, X64]
steps:
- name: Update pip, git
if: runner.os == 'Linux' && startsWith(runner.name, 'ubuntu')
run: |
set -euxo pipefail
sudo apt-get update
sudo apt-get install podman
- name: Checkout repo
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: ansible_collections/vmware/vmware_rest

- name: Generate integration config
working-directory: ansible_collections/vmware/vmware_rest/tests/integration
run: |
chmod +x generate_integration_config.sh
./generate_integration_config.sh
env:
VCENTER_HOSTNAME: ${{ secrets.VCENTER_HOSTNAME }}
VCENTER_USERNAME: ${{ secrets.VCENTER_USERNAME }}
VCENTER_PASSWORD: ${{ secrets.VCENTER_PASSWORD }}

- name: Run integration tests
run: |
python3 -m venv .venv
source .venv/bin/activate
make eco-vcenter-ci
working-directory: ansible_collections/vmware/vmware_rest
env:
ANSIBLE_COLLECTIONS_PATH: "${{ github.workspace }}"
36 changes: 36 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Define ANSI escape codes for colors
GREEN=\033[0;32m
RED=\033[0;31m
NC=\033[0m # No Color

.PHONY: prepare_symlinks
prepare_symlinks:
ansible-playbook tools/prepare_symlinks.yml

.PHONY: remove_aliases
remove_aliases:
@find tests/integration/targets/ -name "aliases" -exec rm -f {} +

.PHONY: eco-vcenter-ci
eco-vcenter-ci: prepare_symlinks remove_aliases
@[ -f /tmp/vmware_rest_tests_report.txt ] && rm /tmp/vmware_rest_tests_report.txt || true; \
@failed=0; \
total=0; \
echo "===============" >> /tmp/vmware_rest_tests_report.txt; \
echo "Tests Summary" >> /tmp/vmware_rest_tests_report.txt; \
echo "===============" >> /tmp/vmware_rest_tests_report.txt; \
for dir in $(shell ansible-test integration --list-target --no-temp-workdir | grep 'vmware_rest_'); do \
echo "Running integration test for $$dir"; \
total=$$((total + 1)); \
if ansible-test integration --no-temp-workdir $$dir; then \
echo -e "Test: $$dir ${GREEN}Passed${NC}" | tee -a /tmp/vmware_rest_tests_report.txt; \
else \
echo -e "Test: $$dir ${RED}Failed${NC}" | tee -a /tmp/vmware_rest_tests_report.txt; \
failed=$$((failed + 1)); \
fi; \
done; \
echo "$$failed test(s) failed out of $$total." >> /tmp/vmware_rest_tests_report.txt; \
cat /tmp/vmware_rest_tests_report.txt; \
if [ $$failed -gt 0 ]; then \
exit 1; \
fi
2 changes: 2 additions & 0 deletions changelogs/fragments/538-add-eco-ci-job.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- add a new ci job to the collection to run integration tests on bm vmware env
14 changes: 14 additions & 0 deletions tests/integration/generate_integration_config.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# shellcheck disable=SC2155,SC2086

# Resolve the script's directory reliably
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"
cd "$SCRIPT_DIR" || exit 1

# Truncate the output file
truncate -s 0 integration_config.yml

# Read the template and substitute environment variables
while read -r line; do
eval 'echo "'"$line"'"' >> integration_config.yml
done < "integration_config.yml.tpl"
6 changes: 6 additions & 0 deletions tests/integration/integration_config.yml.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
VMWARE_HOST: ${VCENTER_HOSTNAME}
VMWARE_USER: ${VCENTER_USERNAME}
VMWARE_PASSWORD: ${VCENTER_PASSWORD}
VMWARE_VALIDATE_CERTS=no
ansible_tags: eco-vcenter-ci
14 changes: 14 additions & 0 deletions tests/integration/targets/init-eco.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# shellcheck disable=SC2155,SC2086

export DEFAULT_COLLECTIONS_PATH="$ANSIBLE_COLLECTIONS_PATH/ansible_collections"

# Check if the variable is already set (e.g., in CI)
if [ -z "$ANSIBLE_COLLECTIONS_PATH" ]; then
# If not, use base collections path
ANSIBLE_COLLECTIONS_PATH="$DEFAULT_COLLECTIONS_PATH"
fi

echo "ANSIBLE_COLLECTIONS_PATH: $ANSIBLE_COLLECTIONS_PATH"
BASE_DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
export ANSIBLE_ROLES_PATH=${BASE_DIR}
14 changes: 14 additions & 0 deletions tests/integration/targets/runme.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
source ../init-eco.sh

# Generates a string starting with 'test-' followed by 4 random lowercase characters
TINY_PREFIX="test-$(uuidgen | tr -d '-' | cut -c1-4 | tr '[:upper:]' '[:lower:]')"

# Extract the ansible_tags from integration_config.yml
ANSIBLE_TAGS=$(awk '/ansible_tags/ {print $2}' ../../integration_config.yml)

# Check if the ANSIBLE_TAGS variable is set
if [[ -n "$ANSIBLE_TAGS" ]]; then
echo "ANSIBLE_TAGS is set to: $ANSIBLE_TAGS"
exec ansible-playbook playbook.yml --tags "$ANSIBLE_TAGS" --extra-vars "tiny_prefix=$TINY_PREFIX"
fi
20 changes: 20 additions & 0 deletions tools/prepare_symlinks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
- name: Create symlink to the runme.sh script in specific target directories
hosts: localhost
tasks:
- name: Find all target directories with specific prefix
ansible.builtin.find:
paths: ../tests/integration/targets
recurse: false
file_type: directory
register: target_dirs

- name: Create symlink and set executable permission in each target directory with prefix 'vmware_rest'
ansible.builtin.file:
src: "{{ playbook_dir }}/../tests/integration/targets/runme.sh"
dest: "{{ item.path }}/runme.sh"
state: link
mode: '0755'
force: true
loop: "{{ target_dirs.files }}"
when: item.path | basename | regex_search('^vmware_rest')

0 comments on commit d1b5e83

Please sign in to comment.