RHEL 9.0.0 Alpha bootstrap
The content of this branch was automatically imported from Fedora ELN with the following as its source: https://src.fedoraproject.org/rpms/podman#d39daa9e872e111c03d8be9158f0273c336bc934
This commit is contained in:
parent
1fb40857aa
commit
93efda4b77
1388
.gitignore
vendored
1388
.gitignore
vendored
File diff suppressed because it is too large
Load Diff
14
gating.yaml
Normal file
14
gating.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
--- !Policy
|
||||
product_versions:
|
||||
- fedora-*
|
||||
decision_context: bodhi_update_push_stable
|
||||
subject_type: koji_build
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
|
||||
--- !Policy
|
||||
product_versions:
|
||||
- fedora-*
|
||||
decision_context: bodhi_update_push_testing
|
||||
subject_type: koji_build
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
|
5080
podman.spec
Normal file
5080
podman.spec
Normal file
File diff suppressed because it is too large
Load Diff
2
sources
Normal file
2
sources
Normal file
@ -0,0 +1,2 @@
|
||||
SHA512 (dnsname-8a6a8a4.tar.gz) = 7ee1edd091264f804056c69d5eac0ef8e825cbdae268caeed12700c966724c57348a14aee509e9ab559be349025b0c5357f441c3b4e34c3c02568a51ae223401
|
||||
SHA512 (podman-d30b4b7.tar.gz) = a7046b545b6a7ef69d6fcf7392abe0f8205ba148b98f162ecda3825766f2b6aeb27a0fb2e03a69c7444b5bd2b97f46e7805d350e2a6d7dedde5e8c32bc788860
|
25
tests/README
Normal file
25
tests/README
Normal file
@ -0,0 +1,25 @@
|
||||
I'm sorry. The playbooks here are a much-too-complicated way of saying:
|
||||
|
||||
- test podman (root and rootless) under cgroups v2
|
||||
- reboot into cgroups v1
|
||||
- repeat the same podman tests
|
||||
|
||||
We can't use standard-test-basic any more because, tl;dr, that has to
|
||||
be the last stanza in the playbook and it doesn't offer any mechanism
|
||||
for running a reboot in the middle of tests. (I actually found a way
|
||||
but it was even uglier than this approach).
|
||||
|
||||
The starting point is tests.yml . From there:
|
||||
|
||||
tests.yml
|
||||
\- test_podman.yml
|
||||
|- roles/rootless_user_ready/
|
||||
\- test_podman_cgroups_vn.yml (runs twice: cgroups v2, v1)
|
||||
|- roles/set_cgroups/
|
||||
\- roles/run_bats_tests/ (runs tests: root, rootless)
|
||||
|
||||
Principal result is the file 'artifacts/test.log'. It will contain
|
||||
one line for each test run, format will be '(PASS|FAIL|ERROR) <test name>'
|
||||
|
||||
For each completed test there will also be a 'test.<name>.bats.log'
|
||||
containing some setup blurbs (RPMs, environment) and the full BATS log.
|
36
tests/check_results.yml
Normal file
36
tests/check_results.yml
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
# Copied from standard-test-basic
|
||||
# ...and, 2020-05-13, updated, looks like they changed the whole thing around
|
||||
- name: Check the results
|
||||
local_action:
|
||||
module: shell
|
||||
cmd: |
|
||||
log="{{ artifacts }}/test.log"
|
||||
if [ ! -f "$log" ]; then
|
||||
echo ERROR
|
||||
echo "Test results not found." 1>&2
|
||||
elif grep ^ERROR "$log" 1>&2; then
|
||||
echo ERROR
|
||||
elif grep ^FAIL "$log" 1>&2; then
|
||||
echo FAIL
|
||||
elif grep -q ^PASS "$log"; then
|
||||
echo PASS
|
||||
else
|
||||
echo ERROR
|
||||
echo "No test results found." 1>&2
|
||||
fi
|
||||
register: test_results
|
||||
|
||||
- name: Set role result
|
||||
set_fact:
|
||||
role_result: "{{ test_results.stdout }}"
|
||||
role_message: "{{ test_results.stderr|d('test execution error.') }}"
|
||||
|
||||
- name: display results
|
||||
vars:
|
||||
msg: |
|
||||
role_result: {{ role_result|d('Undefined') }}
|
||||
{{ role_message|d('[No error messages found]') }}
|
||||
debug:
|
||||
msg: "{{ msg.split('\n') }}"
|
||||
failed_when: role_message|d("") != ""
|
6
tests/roles/rootless_user_ready/tasks/main.yml
Normal file
6
tests/roles/rootless_user_ready/tasks/main.yml
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
- name: make sure rootless account exists
|
||||
user: name={{ rootless_user }}
|
||||
|
||||
- name: rootless account | enable linger
|
||||
shell: loginctl enable-linger {{ rootless_user }}
|
60
tests/roles/run_bats_tests/files/run_bats_tests.sh
Executable file
60
tests/roles/run_bats_tests/files/run_bats_tests.sh
Executable file
@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Run bats tests for a given $TEST_PACKAGE, e.g. buildah, podman
|
||||
#
|
||||
# This is invoked by the 'run_bats_tests' role; we assume that
|
||||
# the package foo has a foo-tests subpackage which provides the
|
||||
# directory /usr/share/foo/test/system, containing one or more .bats
|
||||
# test files.
|
||||
#
|
||||
# We create two files:
|
||||
#
|
||||
# /tmp/test.summary.log - one-liner with FAIL, PASS, ERROR and a blurb
|
||||
# /tmp/test.bats.log - full log of this script, plus the BATS run
|
||||
#
|
||||
export PATH=/usr/local/bin:/usr/sbin:/usr/bin
|
||||
|
||||
FULL_LOG=/tmp/test.bats.log
|
||||
rm -f $FULL_LOG
|
||||
touch $FULL_LOG
|
||||
|
||||
# Preserve output to a log file, but also emit on stdout. This covers
|
||||
# RHEL (which preserves logfiles but runs ansible without --verbose)
|
||||
# and Fedora (which hides logfiles but runs ansible --verbose).
|
||||
exec &> >(tee -a $FULL_LOG)
|
||||
|
||||
# Log program versions
|
||||
echo "Packages:"
|
||||
rpm -qa |\
|
||||
egrep 'podman|conmon|crun|runc|iptable|slirp|systemd|container-selinux' |\
|
||||
sort |\
|
||||
sed -e 's/^/ /'
|
||||
|
||||
divider='------------------------------------------------------------------'
|
||||
echo $divider
|
||||
printenv | sort
|
||||
echo $divider
|
||||
|
||||
testdir=/usr/share/${TEST_PACKAGE}/test/system
|
||||
|
||||
if ! cd $testdir; then
|
||||
echo "FAIL ${TEST_NAME} : cd $testdir" > /tmp/test.summary.log
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "\$ bats ."
|
||||
bats .
|
||||
rc=$?
|
||||
|
||||
echo $divider
|
||||
echo "bats completed with status $rc"
|
||||
|
||||
status=PASS
|
||||
if [ $rc -ne 0 ]; then
|
||||
status=FAIL
|
||||
fi
|
||||
|
||||
echo "${status} ${TEST_NAME}" > /tmp/test.summary.log
|
||||
|
||||
# FIXME: for CI purposes, always exit 0. This allows subsequent tests.
|
||||
exit 0
|
10
tests/roles/run_bats_tests/tasks/main.yml
Normal file
10
tests/roles/run_bats_tests/tasks/main.yml
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
# Create empty results file, world-writable
|
||||
- name: initialize test.log file
|
||||
copy: dest=/tmp/test.log content='' force=yes mode=0666
|
||||
|
||||
- name: execute tests
|
||||
include: run_one_test.yml
|
||||
with_items: "{{ tests }}"
|
||||
loop_control:
|
||||
loop_var: test
|
87
tests/roles/run_bats_tests/tasks/run_one_test.yml
Normal file
87
tests/roles/run_bats_tests/tasks/run_one_test.yml
Normal file
@ -0,0 +1,87 @@
|
||||
---
|
||||
- name: "{{ test.name }} | install test packages"
|
||||
dnf: name="{{ test.package }}-tests" state=installed
|
||||
|
||||
- name: "{{ test.name }} | define helper variables"
|
||||
set_fact:
|
||||
test_name_oneword: "{{ test.name | replace(' ','-') }}"
|
||||
|
||||
# UGH. This is necessary because our caller sets some environment variables
|
||||
# and we need to set a few more based on other caller variables; then we
|
||||
# need to combine the two dicts when running the test. This seems to be
|
||||
# the only way to do it in ansible.
|
||||
- name: "{{ test.name }} | define local environment"
|
||||
set_fact:
|
||||
local_environment:
|
||||
TEST_NAME: "{{ test.name }}"
|
||||
TEST_PACKAGE: "{{ test.package }}"
|
||||
TEST_ENV: "{{ test.environment }}"
|
||||
|
||||
- name: "{{ test.name }} | setup/teardown helper | see if exists"
|
||||
local_action: stat path={{ role_path }}/files/helper.{{ test_name_oneword }}.sh
|
||||
register: helper
|
||||
|
||||
- name: "{{ test.name }} | setup/teardown helper | install"
|
||||
copy: src=helper.{{ test_name_oneword }}.sh dest=/tmp/helper.sh
|
||||
when: helper.stat.exists
|
||||
|
||||
# This is what runs the BATS tests.
|
||||
- name: "{{ test.name }} | run test"
|
||||
script: ./run_bats_tests.sh
|
||||
args:
|
||||
chdir: /usr/share/{{ test.package }}/test/system
|
||||
become: "{{ true if test.become is defined else false }}"
|
||||
become_user: "{{ rootless_user }}"
|
||||
environment: "{{ local_environment | combine(test.environment) }}"
|
||||
|
||||
# BATS tests will always exit zero and should leave behind two files:
|
||||
# a full log (test.bats.log) and a one-line PASS/FAIL file (.summary.log)
|
||||
- name: "{{ test.name }} | pull logs"
|
||||
fetch:
|
||||
src: "/tmp/test.{{ item }}.log"
|
||||
dest: "{{ artifacts }}/test.{{ test_name_oneword }}.{{ item }}.log"
|
||||
flat: yes
|
||||
with_items:
|
||||
- bats
|
||||
- summary
|
||||
|
||||
# Collect all the one-line PASS/FAIL results in one file, test.log
|
||||
# Write the same thing, in a different format, to results.yml
|
||||
# https://docs.fedoraproject.org/en-US/ci/standard-test-interface/
|
||||
- name: "{{ test.name }} | keep running tally of test results"
|
||||
local_action:
|
||||
module: shell
|
||||
cmd: |
|
||||
cd {{ artifacts }}
|
||||
cat "test.{{ test_name_oneword }}.summary.log" >>test.log
|
||||
|
||||
status=$(awk '{print $1}' <test.{{ test_name_oneword }}.summary.log | tr A-Z a-z)
|
||||
echo "- test: {{ test.name }}" >>results.yml
|
||||
echo " result: $status" >>results.yml
|
||||
echo " logs: test.{{ test_name_oneword }}.bats.log" >>results.yml
|
||||
|
||||
# delete the oneliner file, to keep artifacts dir clean
|
||||
rm -f test.{{ test_name_oneword }}.summary.log
|
||||
|
||||
- name: "{{ test.name }} | remove remote logs and helpers"
|
||||
file:
|
||||
dest=/tmp/{{ item }}
|
||||
state=absent
|
||||
with_items:
|
||||
- test.bats.log
|
||||
- test.summary.log
|
||||
- helper.sh
|
||||
|
||||
# AAAAARGH!
|
||||
#
|
||||
# Fedora gating tests are failing, because str-common-final/tasks/main.yml
|
||||
# tries to pull test.log and other logs from $remote_host:/tmp/artifacts .
|
||||
# Those don't exist, because I track status and artifacts locally, because
|
||||
# with the reboot I can't rely on /tmp being preserved.
|
||||
# I see no way to tell str-common-final to skip this step; so let's just
|
||||
# push logs over upon completion of each subtest.
|
||||
- name: keep remote artifacts synced
|
||||
synchronize:
|
||||
src: "{{ artifacts }}/"
|
||||
dest: "{{ remote_artifacts|d('/tmp/artifacts') }}/"
|
||||
mode: push
|
75
tests/roles/set_cgroups/tasks/main.yml
Normal file
75
tests/roles/set_cgroups/tasks/main.yml
Normal file
@ -0,0 +1,75 @@
|
||||
---
|
||||
# Check the CURRENT cgroup level; we get this from /proc/cmdline
|
||||
- name: check current kernel options
|
||||
shell: fgrep systemd.unified_cgroup_hierarchy=0 /proc/cmdline
|
||||
register: result
|
||||
ignore_errors: true
|
||||
|
||||
- name: determine current cgroups | assume v2
|
||||
set_fact: current_cgroups=2
|
||||
|
||||
- name: determine current cgroups | looks like v1
|
||||
set_fact: current_cgroups=1
|
||||
when: result is succeeded
|
||||
|
||||
- debug:
|
||||
msg: "want: v{{ want_cgroups }} actual: v{{ current_cgroups }}"
|
||||
|
||||
- name: grubenv, pre-edit, cat
|
||||
shell: cat /boot/grub2/grubenv
|
||||
register: grubenv
|
||||
|
||||
- name: grubenv, pre-edit, show
|
||||
debug:
|
||||
msg: "{{ grubenv.stdout_lines }}"
|
||||
|
||||
# Update grubenv file to reflect the desired cgroup level
|
||||
- name: remove cgroup option from kernel flags
|
||||
shell:
|
||||
cmd: sed -i -e "s/^\(kernelopts=.*\)systemd\.unified_cgroup_hierarchy=.\(.*\)/\1 \2/" /boot/grub2/grubenv
|
||||
warn: false
|
||||
|
||||
- name: add it with the desired value
|
||||
shell:
|
||||
cmd: sed -i -e "s/^\(kernelopts=.*\)/\1 systemd.unified_cgroup_hierarchy=0/" /boot/grub2/grubenv
|
||||
warn: false
|
||||
when: want_cgroups == 1
|
||||
|
||||
- name: grubenv, post-edit, cat
|
||||
shell: cat /boot/grub2/grubenv
|
||||
register: grubenv
|
||||
|
||||
- name: grubenv, post-edit, show
|
||||
debug:
|
||||
msg: "post: {{ grubenv.stdout_lines }}"
|
||||
|
||||
# If want != have, reboot
|
||||
- name: reboot and wait
|
||||
block:
|
||||
- name: reboot
|
||||
reboot:
|
||||
reboot_timeout: 900
|
||||
ignore_errors: yes
|
||||
- name: wait and reconnect
|
||||
wait_for_connection:
|
||||
timeout: 900
|
||||
when: want_cgroups|int != current_cgroups|int
|
||||
|
||||
- set_fact:
|
||||
expected_fstype:
|
||||
- none
|
||||
- tmpfs
|
||||
- cgroup2fs
|
||||
|
||||
- name: confirm cgroups setting
|
||||
shell: stat -f -c "%T" /sys/fs/cgroup
|
||||
register: fstype
|
||||
|
||||
- debug:
|
||||
msg: "stat(/sys/fs/cgroup) = {{ fstype.stdout }}"
|
||||
|
||||
- name: system cgroups is the expected type
|
||||
assert:
|
||||
that:
|
||||
- fstype.stdout == expected_fstype[want_cgroups|int]
|
||||
fail_msg: "stat(/sys/fs/cgroup) = {{ fstype.stdout }} (expected {{ expected_fstype[want_cgroups|int] }})"
|
44
tests/test_podman.yml
Normal file
44
tests/test_podman.yml
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tags:
|
||||
- classic
|
||||
- container
|
||||
vars:
|
||||
- artifacts: ./artifacts
|
||||
rootless_user: testuser
|
||||
roles:
|
||||
- role: rootless_user_ready
|
||||
|
||||
tasks:
|
||||
# At the start of a run, clean up state. Useful for test reruns.
|
||||
- name: local artifacts directory exists
|
||||
local_action: file path="{{ artifacts }}" state=directory
|
||||
|
||||
- name: remove stale log files
|
||||
local_action: shell rm -f {{ artifacts }}/test*.log
|
||||
|
||||
- name: clear test results (test.log)
|
||||
local_action: command truncate --size=0 {{ artifacts }}/test.log
|
||||
|
||||
- name: clear test results (results.yml)
|
||||
local_action: copy content="results:\n" dest={{ artifacts }}/results.yml
|
||||
|
||||
# These are the actual tests: set cgroups vN, then run root/rootless tests.
|
||||
#
|
||||
# FIXME FIXME FIXME: 2020-05-21: 'loop' should be '2, 1' but there's some
|
||||
# nightmarish bug in CI wherein reboots hang forever. There's a bug open[1]
|
||||
# but it seems dead. Without a working reboot, there's no way to test v1.
|
||||
# [1] https://redhat.service-now.com/surl.do?n=PNT0808530
|
||||
# I'm leaving this as a 'loop' in (foolish? vain?) hope that the bug will
|
||||
# be fixed. Let's revisit this after, say, 2020-08. If the bug persists
|
||||
# then let's just revert the entire cgroups v1 change, and go back to
|
||||
# using standard-test-basic.
|
||||
- name: set cgroups and run podman tests
|
||||
include_tasks: test_podman_cgroups_vn.yml
|
||||
loop: [ 2 ]
|
||||
loop_control:
|
||||
loop_var: want_cgroups
|
||||
|
||||
# Postprocessing: check for FAIL or ERROR in any test, exit 1 if so
|
||||
- name: check results
|
||||
include_tasks: check_results.yml
|
19
tests/test_podman_cgroups_vn.yml
Normal file
19
tests/test_podman_cgroups_vn.yml
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
# Requires: 'want_cgroups' variable set to 1 or 2
|
||||
- include_role:
|
||||
name: set_cgroups
|
||||
- include_role:
|
||||
name: run_bats_tests
|
||||
vars:
|
||||
tests:
|
||||
# Yes, this is horrible duplication, but trying to refactor in ansible
|
||||
# yields even more horrible unreadable code. This is the lesser evil.
|
||||
- name: podman root cgroupsv{{ want_cgroups }}
|
||||
package: podman
|
||||
environment:
|
||||
PODMAN: /usr/bin/podman
|
||||
- name: podman rootless cgroupsv{{ want_cgroups }}
|
||||
package: podman
|
||||
environment:
|
||||
PODMAN: /usr/bin/podman
|
||||
become: true
|
1
tests/tests.yml
Normal file
1
tests/tests.yml
Normal file
@ -0,0 +1 @@
|
||||
- import_playbook: test_podman.yml
|
Loading…
Reference in New Issue
Block a user