From ffec7909cc89e89c1dc1893d229d20e13c3489b9 Mon Sep 17 00:00:00 2001 From: Radek Vykydal Date: Oct 06 2021 14:43:59 +0000 Subject: Migrate dirinstall gating test from STI to TMT The Fedora rawhide CI tests are used. This pull request enables tests in the RHEL gating using `tmt` which also allows to easily execute and debug tests from your laptop: Run tests directly on your localhost: sudo dnf install -y tmt tmt run --all provision --how local Run tests in a virtual machine: sudo dnf install -y tmt-provision-virtual tmt run Check the documentation to learn more about the tool: https://docs.fedoraproject.org/en-US/ci/tmt/ Related: rhbz#2006718 --- diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/plans/integration.fmf b/plans/integration.fmf new file mode 100644 index 0000000..b2e3dbe --- /dev/null +++ b/plans/integration.fmf @@ -0,0 +1,12 @@ +summary: Integration tests for anaconda + +discover: + how: fmf + filter: 'tag: integration' + +execute: + how: tmt + +finish: + how: shell + script: command -v journalctl && journalctl -a || true diff --git a/tests/.fmf/version b/tests/.fmf/version deleted file mode 100644 index d00491f..0000000 --- a/tests/.fmf/version +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/tests/README.md b/tests/README.md deleted file mode 100644 index af2be65..0000000 --- a/tests/README.md +++ /dev/null @@ -1,56 +0,0 @@ -[Anaconda](https://github.com/rhinstaller/anaconda) installer gating tests. - -Additionally to the tests (`tests*.yml`) contains also playbooks for runnning the tests from localhost on a remote test runner. The runner can be provisioned by `linchpin`. See [run_tests_remotely.sh](run_tests_remotely.sh) script as an example of the playbooks usage. - -Running the tests remotely --------------------------- - -### Test runner - -The remote test runner can be provided in any way. To be used by the playbooks: - -* It has to allow ssh access as a remote user which is allowed to become root, using the ssh key configured by `private_key_file` in [ansible config](remote_config/ansible.cfg). By default the `remote_user` for running the tests is `root`. -* Test runner host name / IP should be configured for the playbooks in `gating_test_runner` group of [remote_config/inventory](remote_config/inventory). - -The runner can be provisioned in a cloud by linchpin as in the [script](run_tests_remotely.sh): - -* The cloud credentials need to be configured in the file and profile reffered by `credentials` variable of [topology](linchpin/topologies/gating-test.yml). So the credentials file [`clouds.yml`](linchpin/credentials/clouds.yml) should contain profile `ci-rhos`. The file can be placed to `~/.config/linchpin` directory or the directory containing the file can be set by `linchpin` `--creds-path` option. -* The ssh key is set by `keypair` value of linchpin [topology](linchpin/topologies/gating-test.yml) file. It should correspond to the key defined in [ansible config](remote_config/ansible.cfg). The [topology](linchpin/topologies/gating-test.yml) file also defines image to be used for test runner. -* The script populates the [inventory](remote_config/inventory) for playbooks with [inventory](linchpin/layouts/gating-test.yml) generated by linchpin. -* The script tries to find out which remote user should be used (`root`, `fedora`, `cloud-user`) and updates [ansible config](remote_config/ansible.cfg) with the value. - -### Test runner environment - -Test runner environment is prepared by [`prepare-test-runner.yml`](prepare-test-runner.yml) playbook: - -* It is possible to add repositories to the runner by defining [`test_runner_repos`](roles/prepare-test-runner/defaults/main.yml) variable. It can be useful for example for adding a repository with scratch build to be tested or adding repositories for test dependencies missing on remote runner. -* Empty directory for storing test artifacts is created on test runner based on the [`artifacts`](roles/prepare-test-runner/vars/main.yml) variable. - -### Test playbooks configuration - -#### Running on the remote runner: - -Normally the testing system runs all the `tests*.yml` playbooks. - -**WARNING:** -The test playbooks are run on `localhost` (test runner provided by the testing system). They change the test runner environment (eg install packages) so most probably you don't want to run them as they are - on your local host. -The [script](run_tests_remotely.sh) updates `hosts` value of the test playbooks to use remote host from [`gating_test_runner`](remote_config/inventory/hosts) group as test runner (using a [playbook](set_tests_to_run_on_remote.yml)). -If you want to run the tests playbooks separately make sure the `hosts` variable in the test playbook is set to remote test runner (eg. `gating_test_runner`). - - - - -The test playbooks need [`artifacts`](roles/prepare-test-runner/vars/main.yml) variable supplied as can be seen in the [script](run_tests_remotely.sh). (Normally testing system takes care of this.) - -#### Installation repositories: - -Repositories (base and additional) used for installation test are defined in [repos](roles/installation-repos/defaults/main.yml) configuration. Their URL can be either defined explicitly or looked up in specified repositories of the test runner. - -#### dirinstall test - -There is a text and a vnc variant of dirinstall test. Both will run all the kickstarts found in [roles/dirinstall/templates/kickstarts](roles/dirinstall/templates/kickstarts). - - -### The results - -The results and logs are fetched from remote host into local host directory defined by `artifacts` variable passed to the playbooks. This value can be passed also to the [script](run_tests_remotely.sh) with `-a` option. diff --git a/tests/check_and_set_remote_user.yml b/tests/check_and_set_remote_user.yml deleted file mode 100644 index 59df611..0000000 --- a/tests/check_and_set_remote_user.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Check if remote_user is reachable by ansible and set ansible.cfg -# if so. - -- hosts: gating_test_runner - become: True - gather_facts: False - remote_user: "{{ remote_user }}" - - tasks: - - name: Try a raw command as a check - raw: echo "CHECK OK" - register: result - - - debug: - msg: "{{ result }}" - - - name: Set ansible.cfg remote user to "{{ remote_user }}" - become: no - local_action: - module: lineinfile - path: ./remote_config/ansible.cfg - regexp: ^remote_user - line: "remote_user = {{ remote_user }}" - when: result.stdout_lines[0] == "CHECK OK" diff --git a/tests/dirinstall/dirinstall.fmf b/tests/dirinstall/dirinstall.fmf new file mode 100644 index 0000000..e49bfe1 --- /dev/null +++ b/tests/dirinstall/dirinstall.fmf @@ -0,0 +1,22 @@ +summary: Dirinstall test on regular os +contact: Radek Vykydal +path: /tests/dirinstall +test: ./dirinstall.sh +duration: 1h +tag: [integration] + +/text: + summary: Dirinstall test on regular os - text UI + require: + - anaconda + environment: + ANACONDA_UI_MODE: text + +/vnc: + summary: Dirinstall test on regular os - vnc UI + enabled: false + require: + - anaconda + - gnome-kiosk + environment: + ANACONDA_UI_MODE: vnc diff --git a/tests/dirinstall/dirinstall.sh b/tests/dirinstall/dirinstall.sh new file mode 100755 index 0000000..9bbae66 --- /dev/null +++ b/tests/dirinstall/dirinstall.sh @@ -0,0 +1,42 @@ +#!/bin/sh -eux + + +# Prepare test work directory + +WORK_DIR=$(mktemp -d /var/tmp/dirinstall.XXXXXX) + + +# Create kickstart + +KICKSTART_PATH=${WORK_DIR}/ks.cfg +source ./repositories +TEST_KICKSTART=./ks.dirinstall.cfg + +# Dump URLs of installation repositories found in local repositories whose names are configured in 'repositories' file +echo "url --metalink=$(dnf repoinfo $BASE_REPO | grep ^Repo-metalink | cut -d: -f2- | sed 's/^ *//')" > ${KICKSTART_PATH} +for repo in $REPOS; do + echo "repo --name=$repo --metalink=$(dnf repoinfo $repo | grep ^Repo-metalink | cut -d: -f2- | sed 's/^ *//')" >> ${KICKSTART_PATH} +done + +cat ${TEST_KICKSTART} >> ${KICKSTART_PATH} + +# Log the kickstart +cat ${KICKSTART_PATH} + + +# Run dirinstall + +INSTALL_DIR=${WORK_DIR}/install_dir +mkdir ${INSTALL_DIR} + +anaconda --dirinstall ${INSTALL_DIR} --kickstart ${KICKSTART_PATH} --${ANACONDA_UI_MODE} --noninteractive 2>&1 + + +# Remove test work directory + +rm -rf ${WORK_DIR} + + +# Show and remove the logs for this anaconda run + +./show_logs.sh diff --git a/tests/dirinstall/ks.dirinstall.cfg b/tests/dirinstall/ks.dirinstall.cfg new file mode 100644 index 0000000..9b54293 --- /dev/null +++ b/tests/dirinstall/ks.dirinstall.cfg @@ -0,0 +1,12 @@ +# The repository configuration (url, repo) needs to be added here. +# It varies by the product and version we are running on / testing + +lang en_US.UTF-8 +keyboard --vckeymap=us --xlayouts='us' +rootpw --plaintext redhat +timezone --utc Europe/Prague + +shutdown + +%packages +%end diff --git a/tests/dirinstall/repositories b/tests/dirinstall/repositories new file mode 100644 index 0000000..9fee07a --- /dev/null +++ b/tests/dirinstall/repositories @@ -0,0 +1,4 @@ +# Names of local repositories whose urls will be used for installation +# Repositories for "Fedora X" release: +BASE_REPO="fedora" +REPOS="fedora-modular" diff --git a/tests/dirinstall/show_logs.sh b/tests/dirinstall/show_logs.sh new file mode 100755 index 0000000..486ed25 --- /dev/null +++ b/tests/dirinstall/show_logs.sh @@ -0,0 +1,21 @@ +#!/bin/sh -x + +ls /tmp + +LOG_DIR=/tmp + +cd ${LOG_DIR} +KS_SCRIPT_LOGS=$(ls ks-script-*.log) +cd - + +ANACONDA_LOGS="anaconda.log storage.log packaging.log program.log dbus.log dnf.librepo.log ${KS_SCRIPT_LOGS}" + +for log in ${ANACONDA_LOGS} ; do + LOG_PATH=${LOG_DIR}/${log} + if [ -f ${LOG_PATH} ]; then + echo "----------------------- Dumping log file $LOG_PATH:" + cat $LOG_PATH + # clear for the following test + rm $LOG_PATH + fi +done diff --git a/tests/linchpin/PinFile b/tests/linchpin/PinFile deleted file mode 100644 index 4438a09..0000000 --- a/tests/linchpin/PinFile +++ /dev/null @@ -1,4 +0,0 @@ ---- -gating-test: - topology: gating-test.yml - layout: gating-test.yml diff --git a/tests/linchpin/credentials/clouds.yml b/tests/linchpin/credentials/clouds.yml deleted file mode 100644 index aafd9c4..0000000 --- a/tests/linchpin/credentials/clouds.yml +++ /dev/null @@ -1,7 +0,0 @@ -clouds: - ci-rhos: - auth: - auth_url: - project_name: - username: - password: diff --git a/tests/linchpin/inventories/empty b/tests/linchpin/inventories/empty deleted file mode 100644 index 10acfd5..0000000 --- a/tests/linchpin/inventories/empty +++ /dev/null @@ -1 +0,0 @@ -[gating_test_runner] diff --git a/tests/linchpin/layouts/gating-test.yml b/tests/linchpin/layouts/gating-test.yml deleted file mode 100644 index d511ace..0000000 --- a/tests/linchpin/layouts/gating-test.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -inventory_layout: - #inventory_file: "{% raw -%}{{ workspace }}/inventories/gating-test.inventory{%- endraw%}" - vars: - hostname: __IP__ - hosts: - gating_test_runner: - count: 1 - host_groups: - - gating_test_runner - diff --git a/tests/linchpin/linchpin.conf b/tests/linchpin/linchpin.conf deleted file mode 100644 index 81364e0..0000000 --- a/tests/linchpin/linchpin.conf +++ /dev/null @@ -1,295 +0,0 @@ -# This file is a well-documented, and commented out (mostly) file, which -# covers the configuration options available in LinchPin -# -# Used to override default configuration settings for LinchPin -# Defaults exist in linchpin/linchpin.constants file -# -# Uncommented options enable features found in v1.5.1 or newer and -# can be turned off by commenting them out. -# -# structured in INI style -# use %% to allow code interpolation -# use % to use config interpolation -# - -[DEFAULT] -# name of the python package (Redundant, but easier than programmatically -# obtaining the value. It's very unlikely to change.) -pkg = linchpin - -# Useful for storing the RunDB or other components like global credentials -# travis-ci doesn't like ~/.config/linchpin, use /tmp -#default_config_path = ~/.config/linchpin - -# When creating an provider not already included in LinchPin, this path -# extends where LinchPin will look to run the appropriate playbooks -#external_providers_path = %(default_config_path)s/linchpin-x - -# When adding anything to the lp section, it should be general for -# the entire application. -[lp] - -# load custom ansible modules from here -#module_folder = library - -# rundb tracks provisioning transactions -# If you add a new one, rundb/drivers.py needs to be updated to match -# rundb_conn is the location of the run database. -# A common reason to move it is to use the rundb centrally across -# the entire system, or in a central db on a shared filesystem. -# System-wide RunDB: rundb_conn = ~/.config/linchpin/rundb-::mac::.json -#rundb_conn = {{ workspace }}/.rundb/rundb-::mac::.json -rundb_conn = ~/.config/linchpin/rundb-::mac::.json - -# name the type of Run database. Currently only TinyRunDB exists -#rundb_type = TinyRunDB - -# How to connect to the RunDB, if it's on a separate server, -# it may be tcp or ssh -#rundb_conn_type = file - -# The schema is used because TinyDB is a NoSQL db. Another DB -# may use this as a way to manage fields in a specific table. -#rundb_schema = {"action": "", -# "inputs": [], -# "outputs": [], -# "start": "", -# "end": "", -# "rc": 0, -# "uhash": ""} - -# each entry in the RunDB contains a unique-ish hash (uhash). This -# sets the hashing mechanism used to generate the uhash. -#rundb_hash = sha256 - -# The default dateformat used in LinchPin. Specifically used in the -# RunDB for recording start and end dates, but also used elsewhere. -#dateformat = %%m/%%d/%%Y %%I:%%M:%%S %%p - -# The name of the pinfile. Someone could adjust this and use TopFile -# or somesuch. The ramifications of this would mean that the file in -# the workspace that linchpin reads would change to this value. -#default_pinfile = PinFile - -# By default, whenever linchpin performs an action -# (linchpin up/linchpin destroy), the data is read from the PinFile. -# Enabling 'use_rundb_for_actions' will allow destroy and certain up -# actions (specifically when using --run-id or --tx-id) to pull data -# from the RunDB instead. -#use_rundb_for_actions = False -use_rundb_for_actions = True - -# A user can request specific data distilled from the RunDB. This flag -# enables the Context Distiller. -# NOTE: This flag requires generate_resources = False. -#distill_data = False -distill_data = True - -# If desired, enabling distill_on_error will distill any successfully (and -# possibly failed) provisioned resources. This is predicated on the data -# being written to the RunDB (usually means _async tasks may never record -# data upon failure). -distill_on_error = False - -# User can make linchpin use the actual return codes for final return code -# if enabled True, even if one target provision is successfull linchpin -# returns exit code zero else returns the sum of all the return codes -# use_actual_rcs = False - -# LinchPin sets several extra_vars (evars) that are passed to the playbooks. -# This section controls those items. -[evars] - -# enables the ansible --check option -# _check_mode = False - -# enables the ansible async ability. For some providers, it allows multiple -# provisioning tasks to happen at once, then will collect the data afterward. -# The default is perform the provision actions in serial. -#_async = False - -# How long to wait before failing (in seconds) for an async task. -#async_timeout = 1000 - -# the uhash value will still exist, but will not be added to -# instances or the inventory_path -#enable_uhash = False -enable_uhash = True - -# in older versions of linchpin (/linchpin -# determined in the load_config method of # linchpin.cli.LinchpinCliContext - -# Each of the following items controls the path (usually along with the -# default values below) to the corresponding item. - -# In the workspace (generally), this is the location of the layouts and -# topologies looked up by the PinFile. If either of these change, the -# value in linchpin/templates must also change. -#layouts_folder = layouts -#topologies_folder = topologies - -# The relative location for hooks -#hooks_folder = hooks - -# The relative location for provider roles -#roles_folder = roles - -# The relative location for storing inventories -#inventories_folder = inventories - -# The relative location for resources output (deprecated) -#resources_folder = resources - -# The relative location to find schemas (deprecated) -#schemas_folder = schemas - -# The relative location to find playbooks -#playbooks_folder = provision - -# The default path to schemas for validation (deprecated) -#default_schemas_path = {{ lp_path }}/defaults/%(schemas_folder)s - -# The default path to topologies if they aren't in the workspace -#default_topologies_path = {{ lp_path }}/defaults/%(topologies_folder)s - -# The default path to inventory layouts if they aren't in the workspace -#default_layouts_path = {{ lp_path }}/defaults/%(layouts_folder)s - -# The default path for outputting ansible static inventories -#default_inventories_path = {{ lp_path }}/defaults/%(inventories_folder)s - -# The default path to the ansible roles which control the providers -#default_roles_path = {{ lp_path }}/%(playbooks_folder)s/%(roles_folder)s - -# In older versions (<1.2.x), the schema was held here. These schemas are -# deprecated. -#schema_v3 = %(default_schemas_path)s/schema_v3.json -#schema_v4 = %(default_schemas_path)s/schema_v4.json - -# The location where default credentials data would exist. This path doesn't -# automatically exist -#default_credentials_path = %(default_config_path)s - -# If desired, one could overwrite the location of the generated inventory path -#inventory_path = {{ workspace }}/{{inventories_folder}}/happy.inventory - -# Libvirt images can be stored almost anywhere (not /tmp). -# Unprivileged users need not setup sudo to manage a path to which they have rights. -# The following are specific settings to manage libvirt images and instances - -# the location to store generated ssh keys and the like -#default_ssh_key_path = ~/.ssh - -# Where to store the libvirt images for copying/booting instances -#libvirt_image_path = /var/lib/libvirt/images/ - -# What user to use to access libvirt. -# Using root means sudo without password must be setup -#libvirt_user = root - -# When using root or any privileged user, this must be set to yes. -# sudo without password must also be setup -#libvirt_become = yes - -# This section covers settings for the `linchpin init` command -#[init] - -# source path of files generated by linchpin init -#source = templates/ - -# formal name of the generated PinFile. Can be changed as desired. -#pinfile = PinFile - -# This section covers logging setup -[logger] - -# Turns off and on the logger functionality -#enable = True - -# Full path to the location of the linchpin log file -file = ~/.config/linchpin/linchpin.log - -# Log format used. See https://docs.python.org/2/howto/logging-cookbook.html -#format = %%(levelname)s %%(asctime)s %%(message)s - -# Date format used. See https://docs.python.org/2/howto/logging-cookbook.html -#dateformat = %%m/%%d/%%Y %%I:%%M:%%S %%p - -# Level of logging provided -#level = logging.DEBUG - -# Logging to the console via STDERR -#[console] - -# logging to the console should also be possible -# NOTE: Placeholder only, cannot disable. -#enable = True - -# Log format used. See https://docs.python.org/2/howto/logging-cookbook.html -#format = %%(message)s - -# Level of logging provided -#level = logging.INFO - -# LinchPin hooks have several states depending on the action. Currently, there -# are three hook states relating to tasks being completed. -# * up - when performing the up (provision) action -# * destroy - when performing the destroy (teardown) action -# * inv - when performing the internal inventory generation action -# (currently unimplemented) -#[hookstates] - -# when performing the up action, these hooks states are run -#up = pre,post,inv - -# when performing the inv action, these hooks states are run -#inv = post - -# when performing the destroy action, these hooks states are run -#destroy = pre,post - -# This section covers file extensions for generating or looking -# up specific files -#[extensions] - -# When looking for provider playbooks, use this extension -#playbooks = .yml - -# When generating inventory files, use this extension -#inventory = .inventory - -# This section controls the ansible settings for display or other settings -#[ansible] - -# If set to true, this enables verbose output automatically to the screen. -# This is equivalent of passing `-v` to the linchpin command line shell. -#console = False - -# When linchpin is run, certain states are called at certain points along the -# execution timeline. These STATES are defined below. -#[states] -# in future each state will have comma separated substates - -# The name of the state which occurs before (pre) provisioning (up) -#preup = preup - -# The name of the state which occurs before (pre) teardown (destroy) -#predestroy = predestroy - -# The name of the state which occurs after (post) provisioning (up) -#postup = postup - -# The name of the state which occurs after (pre) teardown (destroy) -#postdestroy = postdestroy - -# The name of the state which occurs after (post) inventory is generated (inv) -#postinv = inventory - diff --git a/tests/linchpin/topologies/gating-test.yml b/tests/linchpin/topologies/gating-test.yml deleted file mode 100644 index e34043a..0000000 --- a/tests/linchpin/topologies/gating-test.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -topology_name: gating-test -resource_groups: - - resource_group_name: gating-test - resource_group_type: openstack - resource_definitions: - - name: "gating_test_runner" - role: os_server - flavor: m1.small - image: RHEL-8.0-x86_64-nightly-latest - count: 1 - keypair: kstests - fip_pool: 10.8.240.0 - networks: - - installer-jenkins-priv-network - credentials: - filename: clouds.yml - profile: ci-rhos diff --git a/tests/prepare-test-runner.yml b/tests/prepare-test-runner.yml deleted file mode 100644 index f2f5f59..0000000 --- a/tests/prepare-test-runner.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# prepare test runner -- hosts: gating_test_runner - become: true - - roles: - - prepare-test-runner diff --git a/tests/provision.fmf b/tests/provision.fmf deleted file mode 100644 index 62a6eba..0000000 --- a/tests/provision.fmf +++ /dev/null @@ -1,5 +0,0 @@ ---- - -standard-inventory-qcow2: - qemu: - m: 2G diff --git a/tests/remote_config/ansible.cfg b/tests/remote_config/ansible.cfg deleted file mode 100644 index 6795cfa..0000000 --- a/tests/remote_config/ansible.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[defaults] -inventory = inventory -remote_user = root -host_key_checking = False -private_key_file = /path/to/private_key diff --git a/tests/remote_config/inventory/hosts b/tests/remote_config/inventory/hosts deleted file mode 100644 index 73cac65..0000000 --- a/tests/remote_config/inventory/hosts +++ /dev/null @@ -1,3 +0,0 @@ -[gating_test_runner] -[gating_test_runner:vars] -ansible_python_interpreter=/usr/libexec/platform-python diff --git a/tests/roles/dirinstall/tasks/ks-run.yml b/tests/roles/dirinstall/tasks/ks-run.yml deleted file mode 100644 index e33227e..0000000 --- a/tests/roles/dirinstall/tasks/ks-run.yml +++ /dev/null @@ -1,78 +0,0 @@ ---- - -- set_fact: - kickstart: "{{ kickstart_template | basename }}" - -- set_fact: - test_name_with_ks: "{{ test_name }}.{{ kickstart }}" - -- debug: - msg: "Running '{{ test_name }}' with kickstart '{{ kickstart }}'" - -- name: Copy installation kickstart - template: - src: "templates/kickstarts/{{ kickstart }}" - dest: "{{ kickstart_dest }}" - mode: 0755 - -- name: Clean target directory - file: - path: "{{ install_dir }}" - state: "{{ item }}" - mode: 0755 - with_items: - - absent - - directory - -- name: Clean installation logs - file: - path: "/tmp/{{ item }}" - state: absent - with_items: "{{ installation_logs }}" - -- name: Run dirinstall - shell: timeout -k 10s 3600s anaconda --dirinstall {{ install_dir }} --kickstart {{ kickstart_dest }} {{ method }} --noninteractive 2>&1 - register: result - ignore_errors: True - -- debug: - msg: "{{ result }}" - -- set_fact: - result_str: "PASS" - -- set_fact: - result_str: "FAIL" - global_result: "FAIL" - when: result.rc != 0 - -- name: Update global test.log - lineinfile: - path: "{{ local_artifacts }}/test.log" - line: "{{ result_str }} {{ test_name_with_ks }}" - create: yes - insertafter: EOF - -- name: Create this test log - copy: - content: "{{ result.stdout }}" - dest: "{{ local_artifacts }}/{{ result_str }}_{{ test_name_with_ks }}.log" - -- name: Create installation logs dir in artifacts - file: - path: "{{ local_artifacts }}/{{ test_name_with_ks }}" - state: directory - -- name: Copy input kickstart to artifacts - copy: - remote_src: True - src: "{{ kickstart_dest }}" - dest: "{{ local_artifacts }}/{{ test_name_with_ks }}/{{ kickstart_dest | basename }}" - -- name: Copy installation logs to artifacts - copy: - remote_src: True - src: "/tmp/{{ item }}" - dest: "{{ local_artifacts }}/{{ test_name_with_ks }}/{{ item }}" - with_items: "{{ installation_logs }}" - ignore_errors: True diff --git a/tests/roles/dirinstall/tasks/main.yml b/tests/roles/dirinstall/tasks/main.yml deleted file mode 100644 index 66cf52a..0000000 --- a/tests/roles/dirinstall/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Install vnc install dependencies - dnf: - name: - - metacity - state: latest - when: method == "--vnc" - -- include_tasks: ks-run.yml - with_fileglob: - - templates/kickstarts/* - loop_control: - loop_var: kickstart_template diff --git a/tests/roles/dirinstall/templates/kickstarts/basic b/tests/roles/dirinstall/templates/kickstarts/basic deleted file mode 100644 index d0c0db1..0000000 --- a/tests/roles/dirinstall/templates/kickstarts/basic +++ /dev/null @@ -1,12 +0,0 @@ -{{ base_repo_command }} -{{ "\n".join(repo_commands) }} -{{ "\n".join(additional_repo_commands) }} -lang en_US.UTF-8 -keyboard --vckeymap=us --xlayouts='us' -rootpw --plaintext redhat -timezone --utc Europe/Prague - -shutdown - -%packages -%end diff --git a/tests/roles/dirinstall/vars/main.yml b/tests/roles/dirinstall/vars/main.yml deleted file mode 100644 index 5438297..0000000 --- a/tests/roles/dirinstall/vars/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -install_dir: "/root/installdir" -kickstart_dest: "/root/ks.dirinstall.cfg" - diff --git a/tests/roles/global-result/tasks/main.yml b/tests/roles/global-result/tasks/main.yml deleted file mode 100644 index 80ec312..0000000 --- a/tests/roles/global-result/tasks/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Make the test fail based on individual test failures - -- fail: - msg: "The test has failed." - when: global_result is defined and global_result == "FAIL" diff --git a/tests/roles/installation-repos/defaults/main.yml b/tests/roles/installation-repos/defaults/main.yml deleted file mode 100644 index fad262e..0000000 --- a/tests/roles/installation-repos/defaults/main.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- - -### Base repository - -# Base repository command for kickstart - -#base_repo_command: "url --url=http://download.englab.brq.redhat.com/pub/fedora/development-rawhide/Everything/x86_64/os/" - -# If base_repo_command is not defined, look for base repo url -# in [base_repo_from_runner.repo] repository of -# /etc/yum.repos.d/base_repo_from_runner.file on test runner - -base_repo_from_runner: - file: rhel.repo - repo: rhel - - -### Additional repositories - -# Additional repo commands for kickstart: -# - undefine to allow detecting of repos from test runner by -# repos_from_runner variable -# - set to [] for no additional repositories - -#repo_commands: [] -#repo_commands: -# - "repo --baseurl=http://download.englab.brq.redhat.com/pub/fedora/development-rawhide/Everything/x86_64/os/" - -# If repo_commands is not defined, look for additinal repositories -# in [repo] repository of /etc/yum.repos.d/file of test runner. -# Multiple repositories can be defined here. - -repos_from_runner: - - file: rhel.repo - repo: rhel - - file: rhel.repo - repo: rhel-AppStream - - -# Additional repo commands to be used in any case, -# ie even in case additional repos are detected by repos_from_runner - -additional_repo_commands: [] diff --git a/tests/roles/installation-repos/tasks/main.yml b/tests/roles/installation-repos/tasks/main.yml deleted file mode 100644 index 0686004..0000000 --- a/tests/roles/installation-repos/tasks/main.yml +++ /dev/null @@ -1,87 +0,0 @@ ---- - -### Set up local facts from system repositories - -- name: Create facts directory for repository custom facts - file: - state: directory - recurse: yes - path: /etc/ansible/facts.d - -- name: Install base repository facts - copy: - remote_src: yes - src: "/etc/yum.repos.d/{{ base_repo_from_runner.file }}" - dest: "/etc/ansible/facts.d/{{ base_repo_from_runner.file}}.fact" - when: base_repo_command is not defined and base_repo_from_runner is defined - -- name: Install additional repositories facts - copy: - remote_src: yes - src: "/etc/yum.repos.d/{{ item.file }}" - dest: "/etc/ansible/facts.d/{{ item.file}}.fact" - with_items: "{{ repos_from_runner }}" - when: repo_commands is not defined and repos_from_runner is defined - -- name: Setup repository facts - setup: - filter: ansible_local - -### Base repository - -- name: Set base installation repository from system base metalink repository - set_fact: - base_repo_command: "url --metalink={{ ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['metalink'] }}" - when: ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['metalink'] is defined - -- name: Set base installation repository from system base mirrorlist repository - set_fact: - base_repo_command: "url --mirrorlist={{ ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['mirrorlist'] }}" - when: ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['mirrorlist'] is defined - -- name: Set base installation repository from system base url repository - set_fact: - base_repo_command: "url --url={{ ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['baseurl'] }}" - when: ansible_local[base_repo_from_runner.file][base_repo_from_runner.repo]['baseurl'] is defined - -### Additional repositories - -- name: Look for system metalink repositories - set_fact: - repos_metalink: "{{ repos_metalink | default([]) + [ 'repo --name=' + item.repo + ' --metalink=' + ansible_local[item.file][item.repo]['metalink'] ] }}" - #ignore_errors: true - with_items: "{{ repos_from_runner }}" - when: repo_commands is not defined and ansible_local[item.file][item.repo]['metalink'] is defined - -- name: Look for system mirrorlist repositories - set_fact: - repos_mirrorlist: "{{ repos_mirrorlist | default([]) + [ 'repo --name=' + item.repo + ' --mirrorlist=' + ansible_local[item.file][item.repo]['mirrorlist'] ] }}" - #ignore_errors: true - with_items: "{{ repos_from_runner }}" - when: repo_commands is not defined and ansible_local[item.file][item.repo]['mirrorlist'] is defined - -- name: Look for system baseurl repositories - set_fact: - repos_baseurl: "{{ repos_baseurl | default([]) + [ 'repo --name=' + item.repo + ' --baseurl=' + ansible_local[item.file][item.repo]['baseurl'] ] }}" - #ignore_errors: true - with_items: "{{ repos_from_runner }}" - when: repo_commands is not defined and ansible_local[item.file][item.repo]['baseurl'] is defined - - -- name: Set additional metalink installation repositories from system - set_fact: - repo_commands: "{{ repo_commands | default([]) + [ item ] }}" - with_items: "{{ repos_metalink }}" - when: repos_metalink is defined - -- name: Set additional mirrorlist installation repositories from system - set_fact: - repo_commands: "{{ repo_commands | default([]) + [ item ] }}" - with_items: "{{ repos_mirrorlist }}" - when: repos_mirrorlist is defined - -- name: Set additional baseurl installation repositories from system - set_fact: - repo_commands: "{{ repo_commands | default([]) + [ item ] }}" - with_items: "{{ repos_baseurl }}" - when: repos_baseurl is defined diff --git a/tests/roles/prepare-env/tasks/main.yml b/tests/roles/prepare-env/tasks/main.yml deleted file mode 100644 index 856ac28..0000000 --- a/tests/roles/prepare-env/tasks/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- name: Prepare testing environment - dnf: - name: - - anaconda - state: latest diff --git a/tests/roles/prepare-test-runner/defaults/main.yml b/tests/roles/prepare-test-runner/defaults/main.yml deleted file mode 100644 index 8332f3e..0000000 --- a/tests/roles/prepare-test-runner/defaults/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - -# Additional repos added to test runner, eg repo with builds to be tested -test_runner_repos: - rhel: - name: rhel - source: "baseurl=http://download.eng.bos.redhat.com/rhel-9/nightly/RHEL-9-Beta/latest-RHEL-9/compose/BaseOS/x86_64/os/" - rhel-AppStream: - name: rhel-AppStream - source: "baseurl=http://download.eng.bos.redhat.com/rhel-9/nightly/RHEL-9-Beta/latest-RHEL-9/compose/AppStream/x86_64/os/" diff --git a/tests/roles/prepare-test-runner/tasks/main.yml b/tests/roles/prepare-test-runner/tasks/main.yml deleted file mode 100644 index 2c01d47..0000000 --- a/tests/roles/prepare-test-runner/tasks/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - -- name: Add repositories - template: - src: repo.j2 - dest: "/etc/yum.repos.d/{{ test_runner_repos[item]['name']}}.repo" - with_items: "{{ test_runner_repos }}" - -- name: Create empty artifacts directory on local host - become: no - local_action: - module: file - path: "{{ artifacts }}" - state: "{{ item }}" - mode: 0755 - with_items: - - absent - - directory diff --git a/tests/roles/prepare-test-runner/templates/repo.j2 b/tests/roles/prepare-test-runner/templates/repo.j2 deleted file mode 100644 index 557cec8..0000000 --- a/tests/roles/prepare-test-runner/templates/repo.j2 +++ /dev/null @@ -1,5 +0,0 @@ -[{{ test_runner_repos[item]['name'] }}] -name={{ test_runner_repos[item]['name'] }} -{{ test_runner_repos[item]['source'] }} -enabled=1 -gpgcheck=0 diff --git a/tests/roles/sync-artifacts/defaults/main.yml b/tests/roles/sync-artifacts/defaults/main.yml deleted file mode 100644 index 0c46caa..0000000 --- a/tests/roles/sync-artifacts/defaults/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - -artifacts: "{{ lookup('env', 'TEST_ARTIFACTS')|default('./artifacts', true) }}" diff --git a/tests/roles/sync-artifacts/tasks/main.yml b/tests/roles/sync-artifacts/tasks/main.yml deleted file mode 100644 index 449fcac..0000000 --- a/tests/roles/sync-artifacts/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - -- name: Make sure rsync required to fetch artifacts is installed - dnf: - name: - - rsync - -- name: Fetch artifacts - synchronize: - mode: pull - delete: yes - src: "{{ local_artifacts }}/" - dest: "{{ artifacts }}" diff --git a/tests/run_tests_remotely.sh b/tests/run_tests_remotely.sh deleted file mode 100755 index 309d36c..0000000 --- a/tests/run_tests_remotely.sh +++ /dev/null @@ -1,161 +0,0 @@ -#!/bin/sh - -usage () { - cat <] - - Run gating tests on test runners provisioned by linchpin and deployed with ansible, - syncing artifacts to localhost. - - -c Run configuration check. - -a Local host directory for fetching artifacts from test runner. -HELP_USAGE -} - -CHECK_ONLY="no" -ARTIFACTS="/tmp/artifacts" - -while getopts "ca:" opt; do - case $opt in - c) - # Run only configuration check - CHECK_ONLY="yes" - ;; - a) - # Set up directory for fetching artifacts - ARTIFACTS="${OPTARG}" - ;; - *) - echo "Usage:" - usage - exit 1 - ;; - esac -done - -DEFAULT_CRED_FILENAME="clouds.yml" -CRED_DIR="${HOME}/.config/linchpin" -CRED_FILE_PATH=${CRED_DIR}/${DEFAULT_CRED_FILENAME} -TOPOLOGY_FILE_PATH="linchpin/topologies/gating-test.yml" -ANSIBLE_CFG_PATH="remote_config/ansible.cfg" - -CHECK_RESULT=0 - - -############################## Check the configuration - -echo -echo "========= Dependencies are installed" -echo "linchpin and ansible are required to be installed." -echo "For linchpin installation instructions see:" -echo "https://linchpin.readthedocs.io/en/latest/installation.html" -echo - -if ! type ansible &> /dev/null; then - echo "=> FAILED: ansible package is not installed" - CHECK_RESULT=1 -else - echo "=> OK: ansible is installed" -fi - -if ! type linchpin &> /dev/null; then - echo "=> FAILED: linchpin is not installed" - CHECK_RESULT=1 -else - echo "=> OK: linchpin is installed" -fi - - -echo -echo "========= Linchpin cloud credentials configuration" -echo "The credentials file for linchpin provisioner should be in ${CRED_DIR}" -echo "The name of the file and the profile to be used is defined by" -echo " resource_groups.credentials variables in the topology file" -echo " (${TOPOLOGY_FILE_PATH})" -echo - -config_changed=0 -if [[ -f ${TOPOLOGY_FILE_PATH} ]]; then - grep -q 'filename:.*'${DEFAULT_CRED_FILENAME} ${TOPOLOGY_FILE_PATH} - config_changed=$? -fi - -if [[ ${config_changed} -eq 0 ]]; then - if [[ -f ${CRED_FILE_PATH} ]]; then - echo "=> OK: ${CRED_FILE_PATH} exists" - else - echo "=> FAILED: ${CRED_FILE_PATH} does not exist" - CHECK_RESULT=1 - fi -else - echo "=> NOT CHECKING: seems like this has been configured in a different way" -fi - - -echo -echo "========== Deployment ssh key configuration" -echo "The ssh key used for deployment with ansible has to be defined by" -echo "private_key_file variable in ${ANSIBLE_CFG_PATH}" -echo "and match the key used for provisioning of the machines with linchpin" -echo "which is defined by resource_groups.resource_definitions.keypair variable" -echo "in topology file (${TOPOLOGY_FILE_PATH})." -echo - - -deployment_key_defined_line=$(grep 'private_key_file.*=.*[^\S]' ${ANSIBLE_CFG_PATH}) -if [[ -n "${deployment_key_defined_line}" ]]; then - echo "=> OK: ${ANSIBLE_CFG_PATH}: ${deployment_key_defined_line}" -else - echo "=> FAILED: deployment ssh key not defined in ${ANSIBLE_CFG_PATH}" - CHECK_RESULT=1 -fi - -linchpin_keypair=$(grep "keypair:" ${TOPOLOGY_FILE_PATH} | uniq) -echo "=> INFO: should be the same key as ${TOPOLOGY_FILE_PATH}: ${linchpin_keypair}" - - -if [[ ${CHECK_RESULT} -ne 0 ]]; then -echo -echo "=> Configuration check FAILED, see FAILED messages above." -echo -fi - -if [[ ${CHECK_ONLY} == "yes" || ${CHECK_RESULT} -ne 0 ]]; then - exit ${CHECK_RESULT} -fi - - -############################## Run the tests - -set -x - -### Clean the linchpin generated inventory -rm -rf linchpin/inventories/*.inventory - -### Provision test runner -linchpin -v --workspace linchpin -p linchpin/PinFile -c linchpin/linchpin.conf up - -### Pass inventory generated by linchpin to ansible -cp linchpin/inventories/*.inventory remote_config/inventory/linchpin.inventory - -### Use remote hosts in tests playbooks -ansible-playbook set_tests_to_run_on_remote.yml - -### Use the ansible configuration for running tests on remote host -export ANSIBLE_CONFIG=${ANSIBLE_CFG_PATH} - -### Configure remote user for playbooks -# By default root is used but it can be fedora or cloud-user for cloud images -for USER in root fedora cloud-user; do - ansible-playbook --extra-vars="remote_user=$USER" check_and_set_remote_user.yml -done - -### Prepare test runner -ansible-playbook --extra-vars="artifacts=${ARTIFACTS}" prepare-test-runner.yml -### Run test on test runner (supply artifacts variable which is testing system's job) -ansible-playbook --extra-vars="artifacts=${ARTIFACTS}" tests.yml - -### Destroy the test runner -linchpin -v --workspace linchpin -p linchpin/PinFile -c linchpin/linchpin.conf destroy - diff --git a/tests/set_tests_to_run_on_remote.yml b/tests/set_tests_to_run_on_remote.yml deleted file mode 100644 index 4a3b6c9..0000000 --- a/tests/set_tests_to_run_on_remote.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -# Replace hosts in test playbooks to run on remote host instead of localhost - -- hosts: localhost - become: False - gather_facts: False - - tasks: - - name: Replace hosts in tests*.yml playbooks - lineinfile: - path: "{{ item }}" - regexp: "- hosts: localhost\\S*" - line: "- hosts: gating_test_runner" - backrefs: yes - with_fileglob: - - tests*.yml - diff --git a/tests/tests.yml b/tests/tests.yml deleted file mode 100644 index e78df87..0000000 --- a/tests/tests.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# test anaconda -- hosts: localhost - become: true - tags: - - classic - vars_files: - - vars_tests.yml - - roles: - - role: prepare-env - tags: - - prepare-env - - role: installation-repos - - role: dirinstall - vars: - method: "--text" - test_name: dirinstall-text - tags: - - dirinstall-text - - role: sync-artifacts - - role: global-result diff --git a/tests/vars_tests.yml b/tests/vars_tests.yml deleted file mode 100644 index 3f23934..0000000 --- a/tests/vars_tests.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -# variables for tests.yml -installation_logs: - - anaconda.log - - dbus.log - - dnf.librepo.log - - hawkey.log - - ifcfg.log - - packaging.log - - program.log - - storage.log -local_artifacts: /tmp/artifacts