diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3d62026d..5a45a4ce 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -57,3 +57,10 @@ jobs: ansible-playbook playbooks/deploy.yaml - name: Run tests run: ./run_tests + - name: Upload logs + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: logs + path: logs.tar.gz + retention-days: 5 diff --git a/requirements.txt b/requirements.txt index 36f79075..4b1c23e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pytest-testinfra paramiko +apypie @ git+https://github.com/Apipie/apypie.git@foreman diff --git a/roles/foreman/defaults/main.yaml b/roles/foreman/defaults/main.yaml index 748a063e..32a31f61 100644 --- a/roles/foreman/defaults/main.yaml +++ b/roles/foreman/defaults/main.yaml @@ -1,3 +1,3 @@ --- foreman_container_image: "quay.io/evgeni/foreman-rpm" -foreman_container_tag: "3.12" +foreman_container_tag: "nightly" diff --git a/roles/pulp/tasks/main.yaml b/roles/pulp/tasks/main.yaml index 297e7388..1350fa7b 100644 --- a/roles/pulp/tasks/main.yaml +++ b/roles/pulp/tasks/main.yaml @@ -149,6 +149,12 @@ port: 24817 timeout: 300 +- name: Wait for Pulp API service to be accessible + ansible.builtin.wait_for: + host: "{{ ansible_hostname }}" + port: 24817 + timeout: 300 + - name: Start the Pulp Content services ansible.builtin.systemd: name: pulp-content diff --git a/run_tests b/run_tests index 130df808..5e9d766e 100755 --- a/run_tests +++ b/run_tests @@ -1,4 +1,4 @@ #!/bin/bash vagrant ssh-config > .vagrant/ssh-config -py.test --hosts=quadlet --sudo --ssh-config=.vagrant/ssh-config tests/*_test.py +py.test -vv --hosts=quadlet --sudo --ssh-config=.vagrant/ssh-config tests/*_test.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..b99bf548 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,45 @@ +import uuid + +import apypie +import paramiko +import pytest + + +@pytest.fixture(scope="module") +def ssh_config(): + config = paramiko.SSHConfig.from_path('./.vagrant/ssh-config') + return config.lookup('quadlet') + + +@pytest.fixture(scope="module") +def foremanapi(ssh_config): + return apypie.ForemanApi( + uri=f'https://{ssh_config['hostname']}', + username='admin', + password='changeme', + verify_ssl=False, + ) + +@pytest.fixture +def organization(foremanapi): + org = foremanapi.create('organizations', {'name': str(uuid.uuid4())}) + yield org + foremanapi.delete('organizations', org) + +@pytest.fixture +def product(organization, foremanapi): + prod = foremanapi.create('products', {'name': str(uuid.uuid4()), 'organization_id': organization['id']}) + yield prod + foremanapi.delete('products', prod) + +@pytest.fixture +def yum_repository(product, organization, foremanapi): + repo = foremanapi.create('repositories', {'name': str(uuid.uuid4()), 'product_id': product['id'], 'content_type': 'yum', 'url': 'https://fixtures.pulpproject.org/rpm-no-comps/'}) + yield repo + foremanapi.delete('repositories', repo) + +@pytest.fixture +def file_repository(product, organization, foremanapi): + repo = foremanapi.create('repositories', {'name': str(uuid.uuid4()), 'product_id': product['id'], 'content_type': 'file', 'url': 'https://fixtures.pulpproject.org/file/'}) + yield repo + foremanapi.delete('repositories', repo) diff --git a/tests/foreman_api_test.py b/tests/foreman_api_test.py new file mode 100644 index 00000000..4472084f --- /dev/null +++ b/tests/foreman_api_test.py @@ -0,0 +1,28 @@ +import urllib.parse + +import requests + + +def _repo_url(repo, ssh_config): + return urllib.parse.urlunparse(urllib.parse.urlparse(repo['full_path'])._replace(netloc=ssh_config['hostname'])) + + +def test_foreman_organization(organization): + assert organization + +def test_foreman_product(product): + assert product + +def test_foreman_yum_repository(yum_repository, foremanapi, ssh_config): + assert yum_repository + foremanapi.resource_action('repositories', 'sync', {'id': yum_repository['id']}) + repo_url = _repo_url(yum_repository, ssh_config) + assert requests.get(f'{repo_url}/repodata/repomd.xml', verify=False) + assert requests.get(f'{repo_url}/Packages/b/bear-4.1-1.noarch.rpm', verify=False) + + +def test_foreman_file_repository(file_repository, foremanapi, ssh_config): + assert file_repository + foremanapi.resource_action('repositories', 'sync', {'id': file_repository['id']}) + repo_url = _repo_url(file_repository, ssh_config) + assert requests.get(f'{repo_url}/1.iso', verify=False) diff --git a/tests/zzz_test.py b/tests/zzz_test.py new file mode 100644 index 00000000..e55c3316 --- /dev/null +++ b/tests/zzz_test.py @@ -0,0 +1,8 @@ +def test_collect_report(host): + host.run('mkdir -p logs') + for container, filename in [('foreman', '/var/log/foreman/production.log')]: + localfile = filename.replace('/', '_') + host.run(f'podman cp {container}:{filename} logs/{container}-{localfile}') + host.run('tar caf logs.tar.gz logs/') + with open('logs.tar.gz', 'wb') as logstar: + logstar.write(host.file('logs.tar.gz').content)