├── .fmf └── version ├── compose ├── compose.cs10 ├── compose.f42-iot ├── compose.rawhide ├── compose.f43 ├── compose.f44-iot ├── compose.f43-iot ├── compose.94 ├── compose.95 ├── compose.96 ├── compose.cs9 └── compose.810 ├── .gitignore ├── ansible.cfg ├── tmt ├── tests │ ├── iot-test.fmf │ ├── edge-test.fmf │ ├── export-tc-to-polarion.fmf │ └── test.sh └── plans │ ├── export-to-polarion-plan.fmf │ ├── iot-test.fmf │ └── edge-test.fmf ├── files ├── fdo │ ├── rendezvous-server.yml │ ├── serviceinfo-api-server.yml │ ├── owner-onboarding-server.yml │ └── manufacturing-server.yml ├── fedora-41.json ├── fedora-42.json ├── fedora-43.json ├── centos-stream-9.json ├── centos-stream-10.json └── rhel-8-10-0-sha512.json ├── key ├── ostree_key.pub └── ostree_key ├── .yamllint.yml ├── .github └── workflows │ ├── cleanup-aws-ami.yaml │ ├── cleanup-vsphere.yaml │ ├── lint.yml │ ├── clear-compose-file.yml │ ├── trigger-fdo-container.yml │ ├── export-tc-to-polarion.yml │ ├── rhel-8-10.yml │ ├── export-tmt-tests-to-polarion.yml │ ├── trigger-fedora.yml │ ├── fedora-43.yml │ ├── fedora-rawhide.yml │ ├── fedora-iot-42.yml │ ├── fedora-iot-43.yml │ ├── fedora-iot-44.yml │ ├── fdo-container.yml │ ├── trigger-iot.yml │ ├── rhel-9-5.yml │ ├── rhel-9-6.yml │ ├── rhel-9-4.yaml │ └── centos-stream-9.yml ├── LICENSE ├── tools ├── vsphere-cleanup.py └── aws-ami-cleanup.sh ├── CI.md ├── HELP.md ├── iot-setup.sh ├── iot-installer.sh ├── iot-bootc-image.sh ├── iot-raw-image.sh ├── README.md └── setup.sh /.fmf/version: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /compose/compose.cs10: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /compose/compose.f42-iot: -------------------------------------------------------------------------------- 1 | Fedora-IoT-42-20250910.0 2 | Fedora-IoT-42-20250912.0 3 | Fedora-IoT-42-20250914.0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | beaker-job.xml 2 | job-result-output.xml 3 | log/ 4 | container.toml 5 | report.xml 6 | upgrade-container.toml 7 | .idea/workspace.xml 8 | -------------------------------------------------------------------------------- /compose/compose.rawhide: -------------------------------------------------------------------------------- 1 | Fedora-Rawhide-20251009.n.0 2 | Fedora-Rawhide-20251021.n.0 3 | Fedora-Rawhide-20251020.n.1 4 | Fedora-Rawhide-20251029.n.0 5 | Fedora-Rawhide-20251110.n.0 6 | -------------------------------------------------------------------------------- /compose/compose.f43: -------------------------------------------------------------------------------- 1 | Fedora-43-20251008.n.0 2 | Fedora-43-20251009.n.0 3 | Fedora-43-20251012.n.0 4 | Fedora-43-20251019.n.0 5 | Fedora-43-20251018.n.1 6 | Fedora-43-20251020.n.0 7 | Fedora-43-20251024.n.0 8 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | timeout = 30 3 | # human-readable stdout/stderr results display 4 | stdout_callback = default 5 | 6 | [ssh_connection] 7 | scp_if_ssh=True 8 | pipelining=False 9 | 10 | [callback_default] 11 | result_format = yaml 12 | -------------------------------------------------------------------------------- /tmt/tests/iot-test.fmf: -------------------------------------------------------------------------------- 1 | summary: downstream iot test case 2 | component: 3 | - component2 4 | description: invoke specific IoT test script for koji composes artifacts 5 | contact: Mario Cattamo 6 | test: ./test.sh 7 | duration: 90m 8 | id: 2f8ab735-17df-44e2-af6f-5ea2269db01b 9 | -------------------------------------------------------------------------------- /tmt/tests/edge-test.fmf: -------------------------------------------------------------------------------- 1 | summary: downstream edge test case 2 | component: 3 | - component1 4 | description: invoke specific edge test script for osbuild generated artifacts 5 | contact: Mario Cattamo 6 | test: ./test.sh 7 | duration: 300m 8 | id: 81e69342-1a8c-4046-9274-659632db220c 9 | -------------------------------------------------------------------------------- /tmt/tests/export-tc-to-polarion.fmf: -------------------------------------------------------------------------------- 1 | summary: Exporting test run to Polarion test 2 | component: 3 | - component1 4 | description: This is a first test to export tmt test case run to Polarion 5 | contact: Mario Cattamo 6 | test: tmt --help 7 | id: 06898805-7efb-46d4-9f62-f73a9a9e8e0e 8 | -------------------------------------------------------------------------------- /compose/compose.f44-iot: -------------------------------------------------------------------------------- 1 | Fedora-IoT-44-20251123.0 2 | Fedora-IoT-44-20251125.0 3 | Fedora-IoT-44-20251126.0 4 | Fedora-IoT-44-20251127.0 5 | Fedora-IoT-44-20251201.0 6 | Fedora-IoT-44-20251202.0 7 | Fedora-IoT-44-20251204.0 8 | Fedora-IoT-44-20251208.0 9 | Fedora-IoT-44-20251210.0 10 | Fedora-IoT-44-20251211.0 11 | -------------------------------------------------------------------------------- /files/fdo/rendezvous-server.yml: -------------------------------------------------------------------------------- 1 | --- 2 | storage_driver: 3 | Directory: 4 | path: /etc/fdo/stores/rendezvous_registered 5 | session_store_driver: 6 | Directory: 7 | path: /etc/fdo/stores/rendezvous_sessions 8 | trusted_manufacturer_keys_path: /etc/fdo/keys/manufacturer_cert.pem 9 | max_wait_seconds: ~ 10 | bind: "0.0.0.0:8082" 11 | -------------------------------------------------------------------------------- /compose/compose.f43-iot: -------------------------------------------------------------------------------- 1 | Fedora-IoT-43-20251125.0 2 | Fedora-IoT-43-20251126.0 3 | Fedora-IoT-43-20251127.0 4 | Fedora-IoT-43-20251201.0 5 | Fedora-IoT-43-20251202.0 6 | Fedora-IoT-43-20251204.0 7 | Fedora-IoT-43-20251208.0 8 | Fedora-IoT-43-20251209.0 9 | Fedora-IoT-43-20251210.0 10 | Fedora-IoT-43-20251215.0 11 | Fedora-IoT-43-20251218.0 12 | -------------------------------------------------------------------------------- /compose/compose.94: -------------------------------------------------------------------------------- 1 | RHEL-9.4.0-updates-20250923.1 2 | RHEL-9.4.0-updates-20250930.0 3 | RHEL-9.4.0-updates-20251001.0 4 | RHEL-9.4.0-updates-20251005.0 5 | RHEL-9.4.0-updates-20251008.0 6 | RHEL-9.4.0-updates-20251012.1 7 | RHEL-9.4.0-updates-20251013.1 8 | RHEL-9.4.0-updates-20251015.0 9 | RHEL-9.4.0-updates-20251019.0 10 | RHEL-9.4.0-updates-20251021.0 11 | -------------------------------------------------------------------------------- /compose/compose.95: -------------------------------------------------------------------------------- 1 | RHEL-9.5.0-updates-20250320.1 2 | RHEL-9.5.0-updates-20250323.1 3 | RHEL-9.5.0-updates-20250324.1 4 | RHEL-9.5.0-updates-20250330.1 5 | RHEL-9.5.0-updates-20250401.1 6 | RHEL-9.5.0-updates-20250402.1 7 | RHEL-9.5.0-updates-20250411.1 8 | RHEL-9.5.0-updates-20250427.1 9 | RHEL-9.5.0-updates-20250502.1 10 | RHEL-9.5.0-updates-20250504.1 11 | -------------------------------------------------------------------------------- /compose/compose.96: -------------------------------------------------------------------------------- 1 | RHEL-9.6.0-updates-20251001.0 2 | RHEL-9.6.0-updates-20251005.0 3 | RHEL-9.6.0-updates-20251008.1 4 | RHEL-9.6.0-updates-20251009.0 5 | RHEL-9.6.0-updates-20251011.0 6 | RHEL-9.6.0-updates-20251015.1 7 | RHEL-9.6.0-updates-20251019.1 8 | RHEL-9.6.0-updates-20251021.0 9 | RHEL-9.6.0-updates-20251020.1 10 | RHEL-9.6.0-updates-20251022.0 11 | -------------------------------------------------------------------------------- /compose/compose.cs9: -------------------------------------------------------------------------------- 1 | CentOS-Stream-9-20251111.0 2 | CentOS-Stream-9-20251117.0 3 | CentOS-Stream-9-20251118.0 4 | CentOS-Stream-9-20251119.0 5 | CentOS-Stream-9-20251122.0 6 | CentOS-Stream-9-20251201.0 7 | CentOS-Stream-9-20251208.0 8 | CentOS-Stream-9-20251210.0 9 | CentOS-Stream-9-20251211.0 10 | CentOS-Stream-9-20251215.0 11 | CentOS-Stream-9-20251218.0 12 | -------------------------------------------------------------------------------- /compose/compose.810: -------------------------------------------------------------------------------- 1 | RHEL-8.10.0-updates-20250928.0 2 | RHEL-8.10.0-updates-20250930.0 3 | RHEL-8.10.0-updates-20251004.0 4 | RHEL-8.10.0-updates-20251007.1 5 | RHEL-8.10.0-updates-20251008.0 6 | RHEL-8.10.0-updates-20251010.1 7 | RHEL-8.10.0-updates-20251014.1 8 | RHEL-8.10.0-updates-20251018.0 9 | RHEL-8.10.0-updates-20251019.1 10 | RHEL-8.10.0-updates-20251021.1 11 | -------------------------------------------------------------------------------- /key/ostree_key.pub: -------------------------------------------------------------------------------- 1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzxo5dEcS+LDK/OFAfHo6740EyoDM8aYaCkBala0FnWfMMTOq7PQe04ahB0eFLS3IlQtK5bpgzxBdFGVqF6uT5z4hhaPjQec0G3+BD5Pxo6V+SxShKZo+ZNGU3HVrF9p2V7QH0YFQj5B8F6AicA3fYh2BVUFECTPuMpy5A52ufWu0r4xOFmbU7SIhRQRAQz2u4yjXqBsrpYptAvyzzoN4gjUhNnwOHSPsvFpWoBFkWmqn0ytgHg3Vv9DlHW+45P02QH1UFedXR2MqLnwRI30qqtaOkVS+9rE/dhnR+XPpHHG+hv2TgMDAuQ3IK7Ab5m/yCbN73cxFifH4LST0vVG3Jx45xn+GTeHHhfkAfBSCtya6191jixbqyovpRunCBKexI5cfRPtWOitM3m7Mq26r7LpobMM+oOLUm4p0KKNIthWcmK9tYwXWSuGGfUQ+Y8gt7E0G06ZGbCPHOrxJ8lYQqXsif04piONPA/c9Hq43O99KPNGShONCS9oPFdOLRT3U= ostree-image-test 2 | -------------------------------------------------------------------------------- /files/fdo/serviceinfo-api-server.yml: -------------------------------------------------------------------------------- 1 | --- 2 | service_info: 3 | initial_user: null 4 | files: null 5 | commands: null 6 | diskencryption_clevis: 7 | - disk_label: /dev/vda4 8 | reencrypt: true 9 | binding: 10 | pin: tpm2 11 | config: '{}' 12 | additional_serviceinfo: null 13 | bind: 0.0.0.0:8083 14 | service_info_auth_token: 2IOtlXsSqfcGjnhBLZjPiHIteskzZEW3lncRzpEmgqI= 15 | admin_auth_token: Va40bSkLcxwnfml1pmIuaWaOZG96mSMB6fu0xuzcueg= 16 | device_specific_store_driver: 17 | Directory: 18 | path: /etc/fdo/stores/serviceinfo_api_devices 19 | -------------------------------------------------------------------------------- /.yamllint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | yaml-files: 4 | - '*.yaml' 5 | - '*.yml' 6 | - '.yamllint' 7 | 8 | rules: 9 | braces: enable 10 | brackets: enable 11 | colons: enable 12 | commas: enable 13 | comments: 14 | level: warning 15 | comments-indentation: 16 | level: warning 17 | document-end: disable 18 | document-start: 19 | level: warning 20 | empty-lines: enable 21 | empty-values: disable 22 | hyphens: enable 23 | indentation: enable 24 | key-duplicates: enable 25 | key-ordering: disable 26 | line-length: disable 27 | new-line-at-end-of-file: enable 28 | new-lines: enable 29 | octal-values: disable 30 | quoted-strings: disable 31 | trailing-spaces: enable 32 | truthy: disable 33 | -------------------------------------------------------------------------------- /.github/workflows/cleanup-aws-ami.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: AWS edge ami cleanup job 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | # Run every four hours 8 | - cron: '0 */4 * * *' 9 | 10 | jobs: 11 | cleanup-ami: 12 | # Do not run this job on any fork repos 13 | if: github.repository == 'virt-s1/rhel-edge' 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Clone repository 17 | uses: actions/checkout@v3 18 | - name: Cleanup aws resources 19 | run: ./tools/aws-ami-cleanup.sh 20 | env: 21 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} 22 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 23 | AWS_DEFAULT_REGION: us-east-1 24 | timeout-minutes: 60 25 | -------------------------------------------------------------------------------- /files/fdo/owner-onboarding-server.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ownership_voucher_store_driver: 3 | Directory: 4 | path: /etc/fdo/stores/owner_vouchers 5 | session_store_driver: 6 | Directory: 7 | path: /etc/fdo/stores/owner_onboarding_sessions 8 | trusted_device_keys_path: /etc/fdo/keys/device_ca_cert.pem 9 | owner_private_key_path: /etc/fdo/keys/owner_key.der 10 | owner_public_key_path: /etc/fdo/keys/owner_cert.pem 11 | bind: "0.0.0.0:8081" 12 | service_info_api_url: "http://192.168.100.1:8083/device_info" 13 | service_info_api_authentication: 14 | BearerToken: 15 | token: 2IOtlXsSqfcGjnhBLZjPiHIteskzZEW3lncRzpEmgqI= 16 | owner_addresses: 17 | - transport: http 18 | addresses: 19 | - ip_address: 192.168.100.1 20 | port: 8081 21 | report_to_rendezvous_endpoint_enabled: true 22 | -------------------------------------------------------------------------------- /.github/workflows/cleanup-vsphere.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Vsphere cleanup job 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | # run at 2:00 everyday 8 | - cron: '0 2 * * *' 9 | 10 | jobs: 11 | cleanup-vsphere: 12 | # Do not run this job on any fork repos 13 | if: github.repository == 'virt-s1/rhel-edge' 14 | runs-on: [kite, x86_64, rhos-01, rhel-9-3, medium] 15 | steps: 16 | - name: Clone repository 17 | uses: actions/checkout@v3 18 | - name: Install python 19 | run: sudo dnf install -y python3 20 | - name: Setup govc 21 | run: sudo curl -L -o - "https://github.com/vmware/govmomi/releases/download/v0.30.5/govc_Linux_x86_64.tar.gz" | sudo tar -C /usr/local/bin -xvzf - govc 22 | - name: Cleanup vsphere 23 | run: python tools/vsphere-cleanup.py 24 | env: 25 | GOVC_URL: ${{ secrets.GOVC_URL }} 26 | GOVC_USERNAME: ${{ secrets.GOVC_USERNAME }} 27 | GOVC_PASSWORD: ${{ secrets.GOVC_PASSWORD }} 28 | GOVC_INSECURE: true 29 | timeout-minutes: 30 30 | -------------------------------------------------------------------------------- /files/fdo/manufacturing-server.yml: -------------------------------------------------------------------------------- 1 | --- 2 | session_store_driver: 3 | Directory: 4 | path: /etc/fdo/stores/manufacturing_sessions 5 | ownership_voucher_store_driver: 6 | Directory: 7 | path: /etc/fdo/stores/owner_vouchers 8 | public_key_store_driver: 9 | Directory: 10 | path: /etc/fdo/stores/manufacturer_keys 11 | bind: "0.0.0.0:8080" 12 | protocols: 13 | plain_di: false 14 | diun: 15 | mfg_string_type: SerialNumber 16 | key_type: SECP384R1 17 | allowed_key_storage_types: 18 | - FileSystem 19 | key_path: /etc/fdo/keys/diun_key.der 20 | cert_path: /etc/fdo/keys/diun_cert.pem 21 | rendezvous_info: 22 | - deviceport: 8082 23 | ip_address: 192.168.100.1 24 | ownerport: 8082 25 | protocol: http 26 | manufacturing: 27 | manufacturer_cert_path: /etc/fdo/keys/manufacturer_cert.pem 28 | device_cert_ca_private_key: /etc/fdo/keys/device_ca_key.der 29 | device_cert_ca_chain: /etc/fdo/keys/device_ca_cert.pem 30 | owner_cert_path: /etc/fdo/keys/owner_cert.pem 31 | manufacturer_private_key: /etc/fdo/keys/manufacturer_key.der 32 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Lint 3 | 4 | on: 5 | pull_request: 6 | branches: 7 | - "*" 8 | 9 | jobs: 10 | commitlint: 11 | name: "📇 commitlint" 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: wagoid/commitlint-github-action@v5 16 | 17 | spellcheck: 18 | name: "📋 spellcheck" 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v3 22 | - uses: codespell-project/actions-codespell@v1 23 | with: 24 | check_filenames: true 25 | ignore_words_list: bu 26 | 27 | shellcheck: 28 | name: "🔭 Shellcheck" 29 | runs-on: ubuntu-latest 30 | steps: 31 | - uses: actions/checkout@v3 32 | - uses: ludeeus/action-shellcheck@master 33 | env: 34 | SHELLCHECK_OPTS: -e SC1091 -e SC2002 -e SC2317 -e SC2329 35 | 36 | yamllint: 37 | name: "🔬 yamlint" 38 | runs-on: ubuntu-latest 39 | steps: 40 | - uses: actions/checkout@v3 41 | - uses: ibiqlik/action-yamllint@v3 42 | with: 43 | config_file: .yamllint.yml 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 virt-s1 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tmt/plans/export-to-polarion-plan.fmf: -------------------------------------------------------------------------------- 1 | summary: Basic smoke test 2 | 3 | execute: 4 | how: tmt 5 | 6 | discover: 7 | how: fmf 8 | test: export-tc-to-polarion 9 | 10 | provision: 11 | hardware: 12 | virtualization: 13 | is-supported: true 14 | cpu: 15 | processors: ">= 2" 16 | memory: ">= 6 GB" 17 | 18 | prepare: 19 | - how: shell 20 | script: | 21 | # Ensure reporter and client are available (adjust if your base image has them) 22 | if command -v dnf >/dev/null 2>&1; then 23 | sudo dnf -y install tmt-report-polarion python3-pylero 24 | fi 25 | # Write ~/.pylero with values from env (provided by the action) 26 | install -m 600 /dev/null "$HOME/.pylero" 27 | cat > "${HOME}/.pylero" << EOF 28 | [webservice] 29 | url=${POLARION_URL}/polarion 30 | svn_repo=${POLARION_URL}/repo 31 | user=${POLARION_USER} 32 | password=${POLARION_PASSWORD} 33 | default_project=${POLARION_PROJECT} 34 | EOF 35 | sudo find / -iname pylero 36 | pwd 37 | cat ~/.pylero 38 | cat "${HOME}"/.pylero 39 | 40 | report: 41 | - how: junit 42 | file: test.xml 43 | - how: polarion 44 | file: test.xml 45 | project-id: ${POLARION_PROJECT} 46 | title: test_title 47 | -------------------------------------------------------------------------------- /tmt/plans/iot-test.fmf: -------------------------------------------------------------------------------- 1 | summary: Fedora iot test plan 2 | discover: 3 | how: fmf 4 | test: iot-test 5 | execute: 6 | how: tmt 7 | provision: 8 | hardware: 9 | virtualization: 10 | is-supported: true 11 | cpu: 12 | processors: ">= 2" 13 | memory: ">= 16 GB" 14 | disk: 15 | - size: ">= 60 GB" 16 | 17 | /iot-x86-installer: 18 | summary: Test fedora-iot x86_64 installer ISO image 19 | environment+: 20 | TEST_CASE: iot-installer 21 | 22 | /iot-x86-simplified-installer: 23 | summary: Test fedora-iot x86_64 simplified installer ISO image 24 | environment+: 25 | TEST_CASE: iot-simplified-installer 26 | 27 | /iot-x86-raw-image: 28 | summary: Test fedora-iot x86_64 raw image 29 | environment+: 30 | TEST_CASE: iot-raw-image 31 | 32 | /iot-x86-bootc: 33 | summary: Test fedora-iot x86_64 bootc image 34 | environment+: 35 | TEST_CASE: iot-bootc 36 | 37 | /iot-aarch64-installer: 38 | summary: Test fedora-iot aarch64 installer ISO image 39 | environment+: 40 | TEST_CASE: iot-installer 41 | 42 | /iot-aarch64-simplified-installer: 43 | summary: Test fedora-iot aarch64 simplified installer ISO image 44 | environment+: 45 | TEST_CASE: iot-simplified-installer 46 | 47 | /iot-aarch64-raw-image: 48 | summary: Test fedora-iot aarch64 raw image 49 | environment+: 50 | TEST_CASE: iot-raw-image 51 | 52 | /iot-aarch64-bootc: 53 | summary: Test fedora-iot aarch64 bootc image 54 | environment+: 55 | TEST_CASE: iot-bootc 56 | -------------------------------------------------------------------------------- /tmt/tests/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euox pipefail 3 | 4 | cd ../../ || exit 1 5 | 6 | function run_tests() { 7 | if [ "$TEST_CASE" = "edge-commit" ]; then 8 | ./ostree.sh 9 | elif [ "$TEST_CASE" = "edge-installer" ]; then 10 | ./ostree-ng.sh 11 | elif [ "$TEST_CASE" = "edge-raw-image" ]; then 12 | ./ostree-raw-image.sh 13 | elif [ "$TEST_CASE" = "edge-ami-image" ]; then 14 | ./ostree-ami-image.sh 15 | elif [ "$TEST_CASE" = "edge-simplified-installer" ]; then 16 | ./ostree-simplified-installer.sh 17 | elif [ "$TEST_CASE" = "edge-vsphere" ]; then 18 | ./ostree-vsphere.sh 19 | elif [ "$TEST_CASE" = "edge-fdo-aio" ]; then 20 | ./ostree-fdo-aio.sh 21 | elif [ "$TEST_CASE" = "edge-fdo-db" ]; then 22 | ./ostree-fdo-db.sh 23 | elif [ "$TEST_CASE" = "edge-ignition" ]; then 24 | ./ostree-ignition.sh 25 | elif [ "$TEST_CASE" = "edge-pulp" ]; then 26 | ./ostree-pulp.sh 27 | elif [ "$TEST_CASE" = "edge-8to9" ]; then 28 | ./ostree-8-to-9.sh 29 | elif [ "$TEST_CASE" = "edge-9to9" ]; then 30 | ./ostree-9-to-9.sh 31 | elif [ "$TEST_CASE" = "edge-fdo-container" ]; then 32 | ./ostree-fdo-container.sh 33 | elif [ "$TEST_CASE" = "iot-installer" ]; then 34 | ./iot-installer.sh 35 | elif [ "$TEST_CASE" = "iot-simplified-installer" ]; then 36 | ./iot-simplified-installer.sh 37 | elif [ "$TEST_CASE" = "iot-raw-image" ]; then 38 | ./iot-raw-image.sh 39 | elif [ "$TEST_CASE" = "iot-bootc" ]; then 40 | ./iot-bootc-image.sh 41 | else 42 | echo "Error: Test case $TEST_CASE not found!" 43 | exit 1 44 | fi 45 | } 46 | 47 | run_tests 48 | exit 0 49 | -------------------------------------------------------------------------------- /.github/workflows/clear-compose-file.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Clear all compose files 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | # every two weeks 8 | - cron: '0 0 */15 * *' 9 | 10 | jobs: 11 | clear-compose-file: 12 | if: github.repository == 'virt-s1/rhel-edge' 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Shorten compose file if it's long than 10 lines 18 | run: | 19 | for filename in compose/compose.*; do 20 | len=$(wc -l < $filename) 21 | if (( $len > 10 )); then 22 | cut_len=$(( $len - 10 )) 23 | sed -i -e "1,${cut_len}d" $filename 24 | fi 25 | done 26 | 27 | - name: Get current date 28 | id: date 29 | run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT 30 | 31 | - name: Create Pull Request 32 | id: cpr 33 | uses: peter-evans/create-pull-request@v3 34 | with: 35 | token: ${{ secrets.GITHUB_TOKEN }} 36 | commit-message: "Clear compose file - ${{ steps.date.outputs.date }}" 37 | committer: cloudkitebot 38 | author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> 39 | branch: cpr 40 | branch-suffix: random 41 | delete-branch: true 42 | title: "Clear compose file - ${{ steps.date.outputs.date }}" 43 | labels: needs-review,auto-merge 44 | body: | 45 | Clear compose file 46 | - Date: ${{ steps.date.outputs.date }} 47 | 48 | - name: Enable Pull Request Automerge 49 | if: steps.cpr.outputs.pull-request-operation == 'created' 50 | uses: peter-evans/enable-pull-request-automerge@v2 51 | with: 52 | token: ${{ secrets.GITHUB_TOKEN }} 53 | pull-request-number: ${{ steps.cpr.outputs.pull-request-number }} 54 | merge-method: rebase 55 | -------------------------------------------------------------------------------- /key/ostree_key: -------------------------------------------------------------------------------- 1 | -----BEGIN OPENSSH PRIVATE KEY----- 2 | b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn 3 | NhAAAAAwEAAQAAAYEAs8aOXRHEviwyvzhQHx6Ou+NBMqAzPGmGgpAWpWtBZ1nzDEzquz0H 4 | tOGoQdHhS0tyJULSuW6YM8QXRRlaherk+c+IYWj40HnNBt/gQ+T8aOlfksUoSmaPmTRlNx 5 | 1axfadle0B9GBUI+QfBegInAN32IdgVVBRAkz7jKcuQOdrn1rtK+MThZm1O0iIUUEQEM9r 6 | uMo16gbK6WKbQL8s86DeII1ITZ8Dh0j7LxaVqARZFpqp9MrYB4N1b/Q5R1vuOT9NkB9VBX 7 | nV0djKi58ESN9KqrWjpFUvvaxP3YZ0flz6Rxxvob9k4DAwLkNyCuwG+Zv8gmze93MRYnx+ 8 | C0k9L1RtyceOcZ/hk3hx4X5AHwUgrcmutfdY4sW6sqL6UbpwgSnsSOXH0T7VjorTN5uzKt 9 | uq+y6aGzDPqDi1JuKdCijSLYVnJivbWMF1krhhn1EPmPILexNBtOmRmwjxzq8SfJWEKl7I 10 | n9OKYjjTwP3PR6uNzvfSjzRkoTjQkvaDxXTi0U91AAAFiBiBlykYgZcpAAAAB3NzaC1yc2 11 | EAAAGBALPGjl0RxL4sMr84UB8ejrvjQTKgMzxphoKQFqVrQWdZ8wxM6rs9B7ThqEHR4UtL 12 | ciVC0rlumDPEF0UZWoXq5PnPiGFo+NB5zQbf4EPk/GjpX5LFKEpmj5k0ZTcdWsX2nZXtAf 13 | RgVCPkHwXoCJwDd9iHYFVQUQJM+4ynLkDna59a7SvjE4WZtTtIiFFBEBDPa7jKNeoGyuli 14 | m0C/LPOg3iCNSE2fA4dI+y8WlagEWRaaqfTK2AeDdW/0OUdb7jk/TZAfVQV51dHYyoufBE 15 | jfSqq1o6RVL72sT92GdH5c+kccb6G/ZOAwMC5DcgrsBvmb/IJs3vdzEWJ8fgtJPS9UbcnH 16 | jnGf4ZN4ceF+QB8FIK3JrrX3WOLFurKi+lG6cIEp7Ejlx9E+1Y6K0zebsyrbqvsumhswz6 17 | g4tSbinQoo0i2FZyYr21jBdZK4YZ9RD5jyC3sTQbTpkZsI8c6vEnyVhCpeyJ/TimI408D9 18 | z0erjc730o80ZKE40JL2g8V04tFPdQAAAAMBAAEAAAGBAJIAmtQ5PwiXyqsD6AYuAgvTt7 19 | qO4q2YojZdIRc9MUPniH2f5i8klKKxdb3m30sQPebHC26vxAqeoatruNnz9/xuMLuzzgc6 20 | NGn13iQlz1zA0+7WEi/CdbMeG2mUfIk0Da2aa7D1nr/7X7qjRIK4SlffMjx3WyM8NDt59x 21 | WdHQmxhdbTt6IUQFyiPpuG9K5CVqEgEIM8+wRqId6GpNJD/sJ/G452qx3vBpiqheaLiXLT 22 | L15wctw/RlwjA3XR0npJzq6g066BMKYAnyT5wiCWisVFKxIudT0dphj4qmz74yC967U6ji 23 | AB9hZ8j9OhBDA/pypXbb781Lo4iBqM6auoZqbieOE+v9v6uDozmfxtQO5y2kFP7mBMsGwG 24 | L8oEfEPqWRTIXgvDVuBwoqdsmYzFP8SiyUDkOfcHcK924FzvyJ2LWlpNp9POXYdjTDm/oB 25 | k1xs9UkhCImavqUnKiAplLnzMNuYbLmofoesI/2LnuYc2BOx9zub3pru6AdGi6N2EWzQAA 26 | AMEAjbtZe+6sW5yepxKOEb0wOAmZhRGL7d50fuPuJYsljU+nQaI7NMAAZ+G3kAiaTd8npb 27 | A5MKZ2oW++YXjJNAD+Bifnz8LojjmCqCuJL52+VNwpordW23XxRNQdoEvdN516qLyMI4i7 28 | i1AxNbU73SUrSCkSb1ngrhiHHQz986VciRU4X13ENbUSzPYInLoP9wTt+5CUtgiQnxe5PF 29 | K125TVwnFaDMPUKHMhKFIkMJuAkCSKQT7n11wwO2uH9k48LxW6AAAAwQDelZf6e+Un0s1A 30 | jLTG+r8VLG2kClXtECrRQjlzwMfc+lKOB00jBEdBLgIg3h2ECPOqh3OD9S0SU2Ja/+zb0r 31 | wrkyzWdndhh0IOEJCqzdlJe9JBJEWwQTr9MH9s1ORyIA1XGp5GPMFIZhT393Zkichzfyoz 32 | aACW+glGfsw27THJvI5PGJkPiuzKvwGixRcBpf72bk/30Q/qkekErdxtT3Kea41X9QOYjb 33 | jwrWKHARpSmLP1dJrOmYh8HWzpAKghIX8AAADBAM7DunVgA++cHvG/8B5Nodb/S0D7MvOb 34 | OtaHMfUdIIiczwOEvyoRsPyAMEGMtAMHy2YIGQYsK6CZEYP7x3sOmDOocmwjcMpjywN0b/ 35 | g895R16d19MDzUU/SnfUsQgbEXV9KxBGa9mDiyoEiP/QduQU/YlJdQjQXvYjrTRzV6AHQo 36 | PCE/JIQfRcvypKQU1XOdLhSIFDbvAcVgvULwe08robTn2ooR/on4+MHOE0q9RyA4lKS7CQ 37 | 77li4GQONWrqyhCwAAABFvc3RyZWUtaW1hZ2UtdGVzdA== 38 | -----END OPENSSH PRIVATE KEY----- 39 | -------------------------------------------------------------------------------- /tools/vsphere-cleanup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import datetime 3 | 4 | # Prepare govc environment 5 | GOVC_CREDENTIALS = "GOVC_URL=%s GOVC_USERNAME=%s GOVC_PASSWORD=%s GOVC_INSECURE=%s" % ( 6 | os.environ.get("GOVC_URL"), 7 | os.environ.get("GOVC_USERNAME"), 8 | os.environ.get("GOVC_PASSWORD"), 9 | os.environ.get("GOVC_INSECURE") 10 | ) 11 | DATACENTER_70 = "Datacenter7.0" 12 | # DATACENTER_67 = "Datacenter6.7" 13 | 14 | class VM: 15 | def __init__(self, name, date, dc) -> None: 16 | self.name = name 17 | self.date = date 18 | self.dc = dc 19 | def expired(self): 20 | vm_date = datetime.datetime.strptime(self.date, "%Y-%m-%d %H:%M:%S") 21 | current_date = datetime.datetime.now() 22 | age = current_date - vm_date 23 | if age.days >= 2: 24 | return True 25 | return False 26 | def destroy(self): 27 | cmd = GOVC_CREDENTIALS + " govc vm.destroy -dc=%s %s" % (self.dc, self.name) 28 | os.system(cmd) 29 | 30 | # Get all edge vms in vsphere environment 31 | def get_all_vms(): 32 | vms = [] 33 | name = "" 34 | date = "" 35 | # Get edge vms in datacenter7.0 36 | cmd = GOVC_CREDENTIALS + " govc vm.info -dc=%s *-70 > 70vm.txt" % (DATACENTER_70) 37 | os.system(cmd) 38 | with open("70vm.txt", "r") as f: 39 | for line in f: 40 | if "Name" in line.strip(): 41 | name = line[5:].strip() 42 | if "Boot time" in line.strip(): 43 | date = line[12:].strip()[0:19] 44 | vms.append(VM(name, date, DATACENTER_70)) 45 | # # Get edge vms in datacenter6.7 46 | # cmd = GOVC_CREDENTIALS + " govc vm.info -dc=%s *-67 > 67vm.txt" % (DATACENTER_67) 47 | # os.system(cmd) 48 | # with open("67vm.txt", "r") as f: 49 | # for line in f: 50 | # if "Name" in line.strip(): 51 | # name = line[5:].strip() 52 | # if "Boot time" in line.strip(): 53 | # date = line[12:].strip()[0:19] 54 | # vms.append(VM(name, date, DATACENTER_67)) 55 | return vms 56 | 57 | if __name__ == "__main__": 58 | vms = get_all_vms() 59 | if len(vms) == 0: 60 | print("No edge vm found in vsphere, exit now") 61 | exit() 62 | 63 | print("Found existing edge vms:") 64 | for vm in vms: 65 | print("> Name:%s, Date:%s" % (vm.name, vm.date)) 66 | 67 | print("Check vm date and destroy expired vm") 68 | destroy = False 69 | for vm in vms: 70 | if vm.expired(): 71 | destroy = True 72 | vm.destroy() 73 | print("> VM %s is destroyed (date: %s)" % (vm.name, vm.date)) 74 | if not destroy: 75 | print("No expire edge vm found, exit now") 76 | -------------------------------------------------------------------------------- /.github/workflows/trigger-fdo-container.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: FDO container test trigger 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | # run 8:05 every Sunday 8 | - cron: '5 8 * * 0' 9 | # run 8:05 every Thursday 10 | - cron: '5 8 * * 4' 11 | # run every day 12 | - cron: '0 3 * * *' 13 | 14 | jobs: 15 | fdo-container-community: 16 | if: github.repository == 'virt-s1/rhel-edge' && github.event.schedule == '5 8 * * 0' 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - name: Make change for PR creating 22 | run: | 23 | echo "fdo-container" > fdo-container.run 24 | 25 | - name: Get current date 26 | id: date 27 | run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT 28 | 29 | - name: Create Pull Request 30 | id: cpr 31 | uses: peter-evans/create-pull-request@v7.0.5 32 | with: 33 | token: ${{ secrets.GITHUB_TOKEN }} 34 | commit-message: "FDO community container test - ${{ steps.date.outputs.date }}" 35 | committer: cloudkitebot 36 | author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> 37 | branch: cpr 38 | branch-suffix: random 39 | delete-branch: true 40 | title: "FDO community container test - ${{ steps.date.outputs.date }}" 41 | labels: DO_NOT_MERGE,fdo-container 42 | body: | 43 | FDO community container test 44 | - Date: ${{ steps.date.outputs.date }} 45 | 46 | - name: Add a comment to trigger test workflow 47 | uses: peter-evans/create-or-update-comment@v4 48 | with: 49 | token: ${{ secrets.PAT }} 50 | issue-number: ${{ steps.cpr.outputs.pull-request-number }} 51 | body: /test-fdo-container-community 52 | 53 | fdo-container-official: 54 | if: github.repository == 'virt-s1/rhel-edge' && github.event.schedule == '5 8 * * 4' 55 | runs-on: ubuntu-latest 56 | steps: 57 | - uses: actions/checkout@v3 58 | 59 | - name: Make change for PR creating 60 | run: | 61 | echo "fdo-container" > fdo-container.run 62 | 63 | - name: Get current date 64 | id: date 65 | run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT 66 | 67 | - name: Create Pull Request 68 | id: cpr 69 | uses: peter-evans/create-pull-request@v7.0.5 70 | with: 71 | token: ${{ secrets.GITHUB_TOKEN }} 72 | commit-message: "FDO official container test - ${{ steps.date.outputs.date }}" 73 | committer: cloudkitebot 74 | author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> 75 | branch: cpr 76 | branch-suffix: random 77 | delete-branch: true 78 | title: "FDO official container test - ${{ steps.date.outputs.date }}" 79 | labels: DO_NOT_MERGE,fdo-container 80 | body: | 81 | FDO official container test 82 | - Date: ${{ steps.date.outputs.date }} 83 | 84 | - name: Add a comment to trigger test workflow 85 | uses: peter-evans/create-or-update-comment@v4 86 | with: 87 | token: ${{ secrets.PAT }} 88 | issue-number: ${{ steps.cpr.outputs.pull-request-number }} 89 | body: /test-fdo-container-official 90 | -------------------------------------------------------------------------------- /CI.md: -------------------------------------------------------------------------------- 1 | # RHEL for Edge CI 2 | 3 | ## RHEL 8.x and 9.x nightly compose CI 4 | 5 | RHEL 8 compose trigger and RHEL 9 compose trigger will be run four times every day. They will check **COMPOSE_ID** of their **latest** compose link. If the **COMPOSE_ID** can't be found in ***compose/compose.8x*** or ***compose/compose.9x***, a new pull request will be created, auto merge will be enabled, and a comment */test-rhel-8-x* or */test-rhel-9-x* will be added. That will trigger all RHEL for Edge tests on RHEL 8.x and 9.x VM deployed on PSI OpenStack. 6 | 7 | ## CentOS Stream 8 and 9 compose CI 8 | 9 | CentOS Stream compose trigger will be run twice every day. They will check **COMPOSE_ID** of their **latest** compose link. If the **COMPOSE_ID** can't be found in ***compose/compose.cs8*** or ***compose/compose.cs9***, a new pull request will be created, auto merge will be enabled, and a comment */test-cs8* or */test-cs9* will be added. That will trigger all RHEL for Edge tests on CentOS Stream 8 or 9 VM which will be deployed on Google Cloud. 10 | 11 | ## Fedora compose CI 12 | 13 | Fedora 3x compose will be triggered once a day. It's a cron job. The tests will be deployed and run on Google Cloud 14 | 15 | Fedora rawhide compose trigger will be run twice every day. They will check **COMPOSE_ID** of their **latest** compose link. If the **COMPOSE_ID** can't be found in ***compose/compose.rawhide***, a new pull request will be created, auto merge will be enabled, and a comment */test-rawhide* will be added. That will trigger all tests on Fedora rawhide VM which will be deployed on Google Cloud. 16 | 17 | ## How to run compose test manually 18 | 19 | Send a pull request and add comment according to the following table: 20 | 21 | | Comment Content | Triggered Tests | 22 | | --------------- | --------------- | 23 | | `/test-rhel-8-x` | `ostree.sh`, `ostree-ng.sh`, `ostree-raw-image.sh`, `ostree-simplified-installer.sh`, `ostree-rebase.sh` | 24 | | `/test-rhel-9-x` | `ostree.sh`, `ostree-ng.sh`, `ostree-raw-image.sh`, `ostree-simplified-installer.sh`, `ostree-8-to-9.sh` | 25 | | `/test-rhel-8-x-virt`, `/test-rhel-9-x-virt`, `/test-cs8-virt`, `/test-cs9-virt`, `test-f3x-virt`, `test-rawhide-virt` | `ostree.sh` | 26 | | `/test-rhel-8-x-ng`, `/test-rhel-9-x-ng`, `/test-cs8-ng`, `/test-cs9-ng`, `test-f3x-ng`, `test-rawhide-ng` | `ostree-ng.sh` | 27 | | `/test-rhel-8-x-raw`, `/test-rhel-9-x-raw`, `/test-cs8-raw`, `/test-cs9-raw`, `test-f3x-raw`, `test-rawhide-raw` | `ostree-raw-image.sh` | 28 | | `/test-rhel-8-x-simplified`, `/test-rhel-9-x-simplified`, `/test-cs8-simplified`, `/test-cs9-simplified` | `ostree-simplified-installer.sh` | 29 | | `/test-rhel-9-x-8to9`, `/test-cs9-8to9` | `ostree-8-to-9.sh` | 30 | | `/test-rhel-9-x-9to9` | `ostree-9-to-9.sh` | 31 | | `/test-rhel-9-x-ignition`, `/test-cs9-ignition` | `ostree-ignition.sh` | 32 | | `/test-f3x-minimal`, `/test-rawhide-minimal` | `minimal-raw.sh` | 33 | 34 | ## rhel-edge repository CI 35 | 36 | Any pull request will trigger **Lint** job automatically. Edge tests will not be run by default. To run Edge test, add comment with content according to above table. 37 | 38 | ## FDO container CI 39 | 40 | FDO container test will be run weekly. The `latest` tag containers will be pulled. 41 | 42 | ## RHEL for Edge package CI 43 | 44 | RHEL for Edge packages, like `ostree`, `rpm-ostree`, `greenboot`, `rust-coreos-installer`, `fido-device-onboard`, will be monitored by brew message on UMB. The message will be cached when package finished its building and the test will be run against new package. 45 | 46 | ## Customer case 47 | 48 | Customer case related test will be run weekly for regression. 49 | -------------------------------------------------------------------------------- /HELP.md: -------------------------------------------------------------------------------- 1 | # RHEL for Edge Resource 2 | 3 | ## RHEL for Edge Documentation 4 | 5 | [Composing, Installing, and Managing RHEL for Edge Images on Red Hat Enterprise Linux 8](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/composing_installing_and_managing_rhel_for_edge_images/index) 6 | 7 | [Composing, installing, and managing RHEL for Edge Images on Red Hat Enterprise Linux 9](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/composing_installing_and_managing_rhel_for_edge_images) 8 | 9 | ## RHEL for Edge Demonstration Video 10 | 11 | 1. [RHEL for Edge Part 1: Creating an Image](https://www.youtube.com/watch?v=RwOMEdDBjbw) 12 | 13 | 2. [RHEL for Edge Part 2: Installing an Image](https://www.youtube.com/watch?v=XNkIOYvCPWY) 14 | 15 | 3. [RHEL for Edge Part 3: Updating an Image](https://www.youtube.com/watch?v=_zu3eNkuc2Y) 16 | 17 | 4. [RHEL for Edge Part 4: Manually Rolling Back an Image](https://www.youtube.com/watch?v=7uZurpXRPQk) 18 | 19 | 5. [RHEL for Edge Part 5: Automating Image Roll Back with Greenboot](https://www.youtube.com/watch?v=13EczN44r8o) 20 | 21 | 6. [RHEL for Edge Part 6: Configuring Automatic Updates](https://www.youtube.com/watch?v=7_BJXZtvWyI) 22 | 23 | 7. [RHEL for Edge Part 7: rpm-ostree Filesystem](https://www.youtube.com/watch?v=KpUkUhOvqbw&t=8s) 24 | 25 | 26 | ## RHEL for Edge Demo on Summit 2021 27 | 28 | 1. Video [link](https://drive.google.com/file/d/1gAuhfDQ8q1pODjjnfczceXJTn2g68bcM/view) 29 | 2. Code [repo](https://github.com/rlucente-se-jboss/RFESummit2021) 30 | 31 | 32 | ## ostree and rpm-ostree Introduction 33 | 34 | 1. [ostree manual](https://ostreedev.github.io/ostree/) 35 | 36 | 37 | * [ostree deployment](https://ostreedev.github.io/ostree/deployment/) 38 | * [Boot Loader Specification](https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/) 39 | * [Assembling a new deployment directory](https://ostreedev.github.io/ostree/atomic-upgrades/#assembling-a-new-deployment-directory) 40 | 41 | 42 | 2. [ostree repository](https://github.com/ostreedev/ostree) 43 | 44 | 3. [rpm-ostree manual](https://coreos.github.io/rpm-ostree/) 45 | 46 | 4. [rpm-ostree repository](https://github.com/coreos/rpm-ostree) 47 | 48 | 49 | 50 | ## RHEL for Edge Test Plan 51 | 52 | * [RHEL for Edge Test Plan](https://docs.engineering.redhat.com/display/~xiaofwan/RHEL+for+Edge+Test+Plan) 53 | 54 | 55 | ## RHEL for Edge CI and Test Code 56 | 57 | 1. [Downstream CI](https://jenkins-cloudci-prod-virt-qe-3rd.apps.ocp4.prod.psi.redhat.com/job/rhel-edge/job/rhel_edge_x86_64/) 58 | 59 | 2. [Upstream CI](https://osbuildci.cloud.paas.psi.redhat.com/blue/organizations/jenkins/osbuild%2Fosbuild-composer/activity) 60 | 61 | 3. [Downstream test code](https://github.com/virt-s1/rhel-edge.git) 62 | 63 | 4. [Upstream test code](https://github.com/osbuild/osbuild-composer/tree/main/test/cases) 64 | 65 | 66 | ## Test Resource 67 | 68 | 1. [beaker](https://beaker.engineering.redhat.com) 69 | 70 | 2. [beaker doc](https://beaker-project.org/docs/) 71 | 72 | 2. [PSI OpenStack](https://rhos-d.infra.prod.upshift.rdu2.redhat.com) 73 | 74 | 3. [PSI OpenShift](https://console-openshift-console.apps.ocp4.prod.psi.redhat.com/) 75 | 76 | 4. [Ansible doc](https://docs.ansible.com/ansible/2.9/user_guide/index.html) 77 | 78 | 5. [Kickstart doc](https://docs.centos.org/en-US/8-docs/advanced-install/assembly_kickstart-commands-and-options-reference/) 79 | 80 | 6. [virt-install doc](https://www.mankier.com/1/virt-install) 81 | 82 | 7. [QEMU-KVM](https://www.redhat.com/en/topics/virtualization/what-is-KVM) 83 | 84 | 8. [systemd](https://systemd.io/) 85 | 86 | 9. [HTTP boot](https://hackmd.io/@xiaofwan/S1Ge3q8Ku) 87 | -------------------------------------------------------------------------------- /.github/workflows/export-tc-to-polarion.yml: -------------------------------------------------------------------------------- 1 | name: export tmt test run to Polarion 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | compose: 7 | required: true 8 | default: Fedora-42 9 | arch: 10 | required: true 11 | default: x86_64 12 | 13 | jobs: 14 | pr-info: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Query author repository permissions 18 | uses: octokit/request-action@v2.x 19 | id: user_permission 20 | with: 21 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 22 | env: 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | 25 | - name: Check if user does have correct permissions 26 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 27 | id: check_user_perm 28 | run: | 29 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 30 | echo "allowed_user=true" >> $GITHUB_OUTPUT 31 | 32 | - name: Get information for pull request 33 | if: ${{ github.event_name == 'pull_request' }} 34 | uses: octokit/request-action@v2.x 35 | id: pr-api 36 | with: 37 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 38 | env: 39 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 40 | 41 | - name: Defaults for manual runs 42 | if: ${{ github.event_name == 'workflow_dispatch' }} 43 | id: manual-defaults 44 | run: | 45 | echo "sha=${{ github.sha }}" >> $GITHUB_OUTPUT 46 | echo "ref=${{ github.ref_name }}" >> $GITHUB_OUTPUT 47 | echo "repo_url=https://github.com/${{ github.repository }}" >> $GITHUB_OUTPUT 48 | echo "compose_id=${{ inputs.compose }}" >> $GITHUB_OUTPUT 49 | 50 | outputs: 51 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 52 | sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || steps['manual-defaults'].outputs.sha }} 53 | ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || steps['manual-defaults'].outputs.ref }} 54 | repo_url: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.html_url || steps['manual-defaults'].outputs.repo_url }} 55 | compose_id: ${{ github.event_name == 'pull_request' && github.event.pull_request.title || steps['manual-defaults'].outputs.compose_id }} 56 | 57 | export-test-case: 58 | needs: pr-info 59 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' }} 60 | continue-on-error: true 61 | runs-on: ubuntu-latest 62 | steps: 63 | - uses: actions/checkout@v4 64 | 65 | - name: Export the test case to Polarion 66 | uses: sclorg/testing-farm-as-github-action@v3.1.2 67 | with: 68 | compose: Fedora-42 69 | arch: x86_64 70 | api_key: ${{ secrets.TF_API_KEY }} 71 | git_url: ${{ needs.pr-info.outputs.repo_url }} 72 | git_ref: ${{ needs.pr-info.outputs.ref }} 73 | update_pull_request_status: ${{ github.event_name == 'pull_request' }} 74 | tmt_context: "arch=${{ inputs.arch }};distro=fedora-42" 75 | pull_request_status_name: "edge-fedora-42-x86" 76 | tmt_plan_regex: "export-to-polarion-plan" 77 | secrets: "POLARION_USER=${{ secrets.POLARION_USER }};POLARION_PASSWORD=${{ secrets.POLARION_PASSWORD }};POLARION_PROJECT=${{ secrets.POLARION_PROJECT }};POLARION_URL=${{ secrets.POLARION_URL }}" 78 | -------------------------------------------------------------------------------- /files/fedora-41.json: -------------------------------------------------------------------------------- 1 | { 2 | "x86_64": [ 3 | { 4 | "name": "fedora", 5 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/releases/41/Everything/x86_64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGTSYSwBEACTHP7OFONk+1B1awJeYToUFMVbYZIjNvj9M7zwf5vzH52FlpXX\ndsbs1AWh6NUe0zV1J5JjCGiI24Vjacysg7L2zsbgT48vVv3mXrXorjYOzT/cxsAh\n7PNhEx+OevKzAx3oy0Ok27c11Dz0W4ynwVy80gB6XHI2rd04v74TiC0xQYlxj1Sh\nj6irdLmHMD/NtTCWmCM7MRf91UcC4rk6JOap715UKey2fk1h/wylv0guMP3o+CpG\njxDHENkfl/GsWCSYBaHec7o5/qg5RoAkN5NImVI00CqiEO1WHPBaCJalgwbuQCiW\n006jwVDHJHRoufS85PEKaY9yqd5Fr76kdqCLsf3Ys9yxGVfOTvCaKOa+ElWBo+i6\nyOtEO6Qp1Qd5spomBJ+FVPjU89lR9aDnvxIVX7X6zu638qV0K3Lb2HKmqiVG6ccJ\nIdxNVXJAekvu7ypwvRzEc0mGgfkZ47flaj7X8SxiebbXhYWdqRBF0rMYc7ppkbCp\n5NsD+KJilkfeOGb7VK6Rx5vXmySiNCb9GqN51KRl4Z1qllrc/Q1k5CCMt3AUq0hv\n1fwK3eFGtd4/YgF9LoZ0tW8WFZ6h/zWnRvJ/SDBPhtovoSpxptCd18MWiakwvwW0\nsxueKFlctdDjW1a/gri3V4RdTOZbr0AqDjGGcYndt/oxMeLxaK9qvs2xIQARAQAB\ntDFGZWRvcmEgKDQxKSA8ZmVkb3JhLTQxLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEERmzy2LYLwwV6qUU+0GIkYumdatEFAmTSYSwCGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ0GIkYumdatFHIQ//bTSVGDvJGmUxgHJw\nMnGM2G6Rc9PNAKuXbh6t4qsrRKp22pWNnMmqqcGaoiBxKP989a2cJgIVP49SsC4C\newaafEYhsitUtKagx6z3F7UObnvQpOz5U5iFcJCvRDtC4FXq+VkMdhT09zMZY4Ey\nia29bV1B1R7pe7yXh6l3WyVj9AAXUSEBR/OsakaYEMzScLnROBEU1YbWR9iHsc7M\nrEsqju8tVUh1XAqIqJgLW3VrKs0g0nDVR0rBc8aDhrtVfylwWVl61gHsPFJfAkjj\nOPgvQgThrhlCWo23EZSk/Hj8YRrnhUbEDnk+Z3Xv5Uyl1kxGRk5dGBnv+7u3CKvV\nG6sU3tPtna/8rFblfKSMZIPhzTADdsUZ88Fn9pZkfqgPi8LZ4sS8vHtaykZmbfj6\nt9a2mBYJQ+/pxiH8olzyhKMdNyesLPeQmESgwM/qlJ+b2Hbogwuuzp8o2JMezxIe\nCAwLoPh+hxMPGnBRklh6Vj5R5z29wIZd6pKCavVRfJ+ON94wuOSEofhBfQNZIIFV\njagEbk60iksysxsObfVEHFhtGnZCEgCRC87BfX6tzIIDv23Zs4Bv9gcaaRXTAml2\nkZXktduHkV9q3hhcoha5FgGSe244C4GsMUkWCsZtuN6tevUPo+n2ZZAA7ikQ768r\nIz9rPOI8/Ra7qnwSlNIVnkTb9bc=\n=e2ew\n-----END PGP PUBLIC KEY BLOCK-----\n", 7 | "check_gpg": true 8 | } 9 | ], 10 | "aarch64": [ 11 | { 12 | "name": "fedora", 13 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/releases/41/Everything/aarch64/os/", 14 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGTSYSwBEACTHP7OFONk+1B1awJeYToUFMVbYZIjNvj9M7zwf5vzH52FlpXX\ndsbs1AWh6NUe0zV1J5JjCGiI24Vjacysg7L2zsbgT48vVv3mXrXorjYOzT/cxsAh\n7PNhEx+OevKzAx3oy0Ok27c11Dz0W4ynwVy80gB6XHI2rd04v74TiC0xQYlxj1Sh\nj6irdLmHMD/NtTCWmCM7MRf91UcC4rk6JOap715UKey2fk1h/wylv0guMP3o+CpG\njxDHENkfl/GsWCSYBaHec7o5/qg5RoAkN5NImVI00CqiEO1WHPBaCJalgwbuQCiW\n006jwVDHJHRoufS85PEKaY9yqd5Fr76kdqCLsf3Ys9yxGVfOTvCaKOa+ElWBo+i6\nyOtEO6Qp1Qd5spomBJ+FVPjU89lR9aDnvxIVX7X6zu638qV0K3Lb2HKmqiVG6ccJ\nIdxNVXJAekvu7ypwvRzEc0mGgfkZ47flaj7X8SxiebbXhYWdqRBF0rMYc7ppkbCp\n5NsD+KJilkfeOGb7VK6Rx5vXmySiNCb9GqN51KRl4Z1qllrc/Q1k5CCMt3AUq0hv\n1fwK3eFGtd4/YgF9LoZ0tW8WFZ6h/zWnRvJ/SDBPhtovoSpxptCd18MWiakwvwW0\nsxueKFlctdDjW1a/gri3V4RdTOZbr0AqDjGGcYndt/oxMeLxaK9qvs2xIQARAQAB\ntDFGZWRvcmEgKDQxKSA8ZmVkb3JhLTQxLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEERmzy2LYLwwV6qUU+0GIkYumdatEFAmTSYSwCGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ0GIkYumdatFHIQ//bTSVGDvJGmUxgHJw\nMnGM2G6Rc9PNAKuXbh6t4qsrRKp22pWNnMmqqcGaoiBxKP989a2cJgIVP49SsC4C\newaafEYhsitUtKagx6z3F7UObnvQpOz5U5iFcJCvRDtC4FXq+VkMdhT09zMZY4Ey\nia29bV1B1R7pe7yXh6l3WyVj9AAXUSEBR/OsakaYEMzScLnROBEU1YbWR9iHsc7M\nrEsqju8tVUh1XAqIqJgLW3VrKs0g0nDVR0rBc8aDhrtVfylwWVl61gHsPFJfAkjj\nOPgvQgThrhlCWo23EZSk/Hj8YRrnhUbEDnk+Z3Xv5Uyl1kxGRk5dGBnv+7u3CKvV\nG6sU3tPtna/8rFblfKSMZIPhzTADdsUZ88Fn9pZkfqgPi8LZ4sS8vHtaykZmbfj6\nt9a2mBYJQ+/pxiH8olzyhKMdNyesLPeQmESgwM/qlJ+b2Hbogwuuzp8o2JMezxIe\nCAwLoPh+hxMPGnBRklh6Vj5R5z29wIZd6pKCavVRfJ+ON94wuOSEofhBfQNZIIFV\njagEbk60iksysxsObfVEHFhtGnZCEgCRC87BfX6tzIIDv23Zs4Bv9gcaaRXTAml2\nkZXktduHkV9q3hhcoha5FgGSe244C4GsMUkWCsZtuN6tevUPo+n2ZZAA7ikQ768r\nIz9rPOI8/Ra7qnwSlNIVnkTb9bc=\n=e2ew\n-----END PGP PUBLIC KEY BLOCK-----\n", 15 | "check_gpg": true 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /files/fedora-42.json: -------------------------------------------------------------------------------- 1 | { 2 | "x86_64": [ 3 | { 4 | "name": "fedora", 5 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/releases/42/Everything/x86_64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGXKg9EBEACvsAjRcllcH6mVReU/0hi5YnwqulP7gNgUM4jYPiqucF51g0oW\nMbFk0VjDn3QXjrwLNLtj4oxsU+E6OW0jl1732qvjUJ9geEZBuidyFZgq0CCn9K8d\n661dPDjN/DzWWogFhnDySFHRLdh6dYCuu75/HKSIVfCud2IFCvT7Bhk4AOpxv4c7\nmmX874LFgi49jkAYC0M6UbJ9o3KSCndipf/k0ra2g9dGacqlPfn3PMiTszPDr99d\no4qZ5dVZYC6Sna8GjNhN7b/2xLGQuzdd9LHgPHC/PX7XsvBLu42rqi3q0umJBtjZ\nCyFxF5Dp0VMwmVfrKFZOHvVsGjPLrxomLU16/EDzIrw6cHikdQKLf4sl0rX0m8j0\nPNAGOSDmE9YgByiPo12CGMOuAvsDUI0JID4p4WqpBShTBuiIrITn8XVTCOQ+tKq9\ndE/qI+mm2hnZjJajM2UWfKE0mVH4SDOiSilgKR/h5HuLZqwtYXFExDZsAcxaLfRB\nKCrIOyJdpV7YIj8PaP89XeycHM2MaIfwdHSx3Pz39zZNzi6vJkLj9SWdQT7lOvZx\nxTQ3dK0Rcpjx+rGHgihMT4yBd+JO9mZS3ghNGbypYnNn/mohPOAxguXuPuPRj00o\nC7C3lIEEL/hZXZbN1SuiopZjxbU/x/5lO8n0Un1GCzynObPDvpDLTjsdKQARAQAB\ntDFGZWRvcmEgKDQyKSA8ZmVkb3JhLTQyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEEsPSVBFj2nhFQxsXtyKxJFhBe+UQFAmXKg9ECGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyKxJFhBe+US4mQ//e4gIGhA6TJuEqrVP\ngKtSnDawIj30TGbkXIywECtKCu9N8anTlkU2/XSKGyE3ZDdKDO77O11382Ci1xJg\nCpdbqKg4G02ecEKT1Dtng37gt55SkhffQ0EeDb3Zl+Pu5qohHQUiMzio4B4q8n0H\nD+L9klQ3I1rLmymguBRd34jQH/z025GE2SBbCpDnQCChZT7Fq1D/onOQgC6skN6Q\nE2dvYqOnSlHkkfuVlRRYoLNmynxHKlL6VZkiM7m1zKi7cMEK63mKJQ3jH3Mc9grh\n+OwBDxOjx5UoYMeYqq7oXyTPKvvf6ssuHtjWM3tNkyi5R1nB+4SHMttrbt2pLMSH\nJg6pNXoLAP8ahlvxdgVRjgN/6OMC/DwXnLxippelBXXDyBnwVd8/WohbJDcq7e5t\ndymZpRsNxzhWSuwbHzeJY1DKtePhbjblShLjxTzLnS4GBPJV5TXpHkZWgQmz2aA0\nCHV47j37P6kAOEtsJkJUWWz+/Rx1N5Mm5lxvghaAzlTBtwQhRgl9Y8kCTznG40QQ\n64N2FOrcExUJmujLRISDjM2Ps9MtBlbYs7H4JDziX4jpNyvhVAbEdjbzVfL5oi35\nl+K/QRtQJnt78qhLpNNB7SdQkNmD8eMeXF7mA/MH6eFM88hF4l6NeKklyMIa5thg\nLFx0UyEgoLXDBg+thUzby61gnA8=\n=OCXB\n-----END PGP PUBLIC KEY BLOCK-----\n", 7 | "check_gpg": true 8 | } 9 | ], 10 | "aarch64": [ 11 | { 12 | "name": "fedora", 13 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/releases/42/Everything/aarch64/os/", 14 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGXKg9EBEACvsAjRcllcH6mVReU/0hi5YnwqulP7gNgUM4jYPiqucF51g0oW\nMbFk0VjDn3QXjrwLNLtj4oxsU+E6OW0jl1732qvjUJ9geEZBuidyFZgq0CCn9K8d\n661dPDjN/DzWWogFhnDySFHRLdh6dYCuu75/HKSIVfCud2IFCvT7Bhk4AOpxv4c7\nmmX874LFgi49jkAYC0M6UbJ9o3KSCndipf/k0ra2g9dGacqlPfn3PMiTszPDr99d\no4qZ5dVZYC6Sna8GjNhN7b/2xLGQuzdd9LHgPHC/PX7XsvBLu42rqi3q0umJBtjZ\nCyFxF5Dp0VMwmVfrKFZOHvVsGjPLrxomLU16/EDzIrw6cHikdQKLf4sl0rX0m8j0\nPNAGOSDmE9YgByiPo12CGMOuAvsDUI0JID4p4WqpBShTBuiIrITn8XVTCOQ+tKq9\ndE/qI+mm2hnZjJajM2UWfKE0mVH4SDOiSilgKR/h5HuLZqwtYXFExDZsAcxaLfRB\nKCrIOyJdpV7YIj8PaP89XeycHM2MaIfwdHSx3Pz39zZNzi6vJkLj9SWdQT7lOvZx\nxTQ3dK0Rcpjx+rGHgihMT4yBd+JO9mZS3ghNGbypYnNn/mohPOAxguXuPuPRj00o\nC7C3lIEEL/hZXZbN1SuiopZjxbU/x/5lO8n0Un1GCzynObPDvpDLTjsdKQARAQAB\ntDFGZWRvcmEgKDQyKSA8ZmVkb3JhLTQyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEEsPSVBFj2nhFQxsXtyKxJFhBe+UQFAmXKg9ECGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyKxJFhBe+US4mQ//e4gIGhA6TJuEqrVP\ngKtSnDawIj30TGbkXIywECtKCu9N8anTlkU2/XSKGyE3ZDdKDO77O11382Ci1xJg\nCpdbqKg4G02ecEKT1Dtng37gt55SkhffQ0EeDb3Zl+Pu5qohHQUiMzio4B4q8n0H\nD+L9klQ3I1rLmymguBRd34jQH/z025GE2SBbCpDnQCChZT7Fq1D/onOQgC6skN6Q\nE2dvYqOnSlHkkfuVlRRYoLNmynxHKlL6VZkiM7m1zKi7cMEK63mKJQ3jH3Mc9grh\n+OwBDxOjx5UoYMeYqq7oXyTPKvvf6ssuHtjWM3tNkyi5R1nB+4SHMttrbt2pLMSH\nJg6pNXoLAP8ahlvxdgVRjgN/6OMC/DwXnLxippelBXXDyBnwVd8/WohbJDcq7e5t\ndymZpRsNxzhWSuwbHzeJY1DKtePhbjblShLjxTzLnS4GBPJV5TXpHkZWgQmz2aA0\nCHV47j37P6kAOEtsJkJUWWz+/Rx1N5Mm5lxvghaAzlTBtwQhRgl9Y8kCTznG40QQ\n64N2FOrcExUJmujLRISDjM2Ps9MtBlbYs7H4JDziX4jpNyvhVAbEdjbzVfL5oi35\nl+K/QRtQJnt78qhLpNNB7SdQkNmD8eMeXF7mA/MH6eFM88hF4l6NeKklyMIa5thg\nLFx0UyEgoLXDBg+thUzby61gnA8=\n=OCXB\n-----END PGP PUBLIC KEY BLOCK-----\n", 15 | "check_gpg": true 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /files/fedora-43.json: -------------------------------------------------------------------------------- 1 | { 2 | "x86_64": [ 3 | { 4 | "name": "fedora", 5 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/development/43/Everything/x86_64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGa23M8BEAC47NwKLi/g2S9I2p5JtUbJ0y3m2St9zqkSENmYw/+R+WKvaP3S\nKSFQF3Qi6pqGXJ88ADJUkFYpOGGyoc0dieLCmIPqtWbwGvBVMxBRBeU3+hClwbSQ\nsysVnr8VxUwidfsIjNJavCZwB0ZoZbxdCPMQMOgQyTLX4OI/uKlPUzeymDHwxjb/\ntllflSTOGtdYe3giRzidxN+xbCb6UoXkl0+lJEFbsmp41O5D/Ur5N05lBrsEXoDu\nFr99Kfv3Av7f3JfzDlkqC/EhmfxZEZvWj3hRdAfi2fFmtVcrdLfGIpQg6Y2Baphp\nPhaHqKl9zD5GWqu5GSXGoLaGXusBvwBKjS/g+VLo7pJfMsUF3sUduJNG3UThAsrp\nQLV3wQz0AMHVElRErOWdBDY0ddAKLPL7/mtxj39pGEpZ/dNtQkzgm7VCdP10QnQZ\nrwR2l8k7CPu0pylPCXmXvKFWV1uv9RnztlWY6BRmufKn+lJsN3Blh7ndi5rlCjR6\nmHVrQD/l6+8VmSD3/mDnbEXPyzBkSY5D1wpR7M5VXN5jVHROc4ZA5M88SyI48ESG\nNmeAwtGar45/X+wG47+EC4+JXpNO7BQrEvHgJxBdyoQ6KLDrEaqn/OQpxB4Gfmcv\nSwkWDpSk8wFm/pGlFK6J4b+ba7eOetW+aXrWSiFB1sTAg0OY+gds67OpWQARAQAB\ntDFGZWRvcmEgKDQzKSA8ZmVkb3JhLTQzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJSBBMBCAA8FiEExufwgc+A4TFGZ26IgptgZjFkVTEFAma23M8CGw8FCwkI\nBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEIKbYGYxZFUxagQP/RYWw5j0Gfvv\nlWkDQTjTVAnHtbKuQLYM13Lx5d3W1k0g6Xdrolf4yPjh4YPYVQDXksB4i6ULLbMo\n8u46UCPMQwCXTd3Ax9imYn+V74Isl/CkBbKQD9YfSJjhW3mSlPa27jo2uhqpdV0S\nxp05NWYnWrZN+GbtCUs1+rNTBevagOURtlZ8f0iPVRA/PxWzpjbRaGrCHlIYc3JO\nGKLUuQueLvOUg2pP8dtpll7S3xUe5Abyq2ifT34T0wHi6hJA3bfpXo1uNXRvGrNw\ngbJ7V6P7ioTcvyhS1h4zjelKFyvTnOKOy5D08HKmvTMWZQWEL7kDNymh1jMV7Abg\n4TPp808EiPF1GGAzXU56feaURSvIuix3MkjhGZsSQQH2kkkEIzq6j/EwmpyEMW38\ndtql4T2bVS/cTk/hRaqUKZlyrsL657g/4mFA1wDDM3895fYkHOpYF4JZ9SeDrhuc\nTgpC7/TW55l6vSiFtnQvcMfjpfCA6mCA4b75k+/xG9RxxBnYU0qVuUo/8pON31yQ\nD2AM2v7WbJBYVRYLlqPrkAZU5fe7+2wY7P7N0IAPwVA0TFJ1x6as3Kezdi/304mg\noC98DBLjHaUpX2bTxKMtCzlmeqPiwtyNkA9O9IQO7qQzArBKxmAgof4wblN5SL8i\nfsjiJUqsK/gTYwJ744I/tzxOy5FXjA7z\n=Bqds\n-----END PGP PUBLIC KEY BLOCK-----\n", 7 | "check_gpg": true 8 | } 9 | ], 10 | "aarch64": [ 11 | { 12 | "name": "fedora", 13 | "baseurl": "https://dl.fedoraproject.org/pub/fedora/linux/development/43/Everything/aarch64/os/", 14 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGa23M8BEAC47NwKLi/g2S9I2p5JtUbJ0y3m2St9zqkSENmYw/+R+WKvaP3S\nKSFQF3Qi6pqGXJ88ADJUkFYpOGGyoc0dieLCmIPqtWbwGvBVMxBRBeU3+hClwbSQ\nsysVnr8VxUwidfsIjNJavCZwB0ZoZbxdCPMQMOgQyTLX4OI/uKlPUzeymDHwxjb/\ntllflSTOGtdYe3giRzidxN+xbCb6UoXkl0+lJEFbsmp41O5D/Ur5N05lBrsEXoDu\nFr99Kfv3Av7f3JfzDlkqC/EhmfxZEZvWj3hRdAfi2fFmtVcrdLfGIpQg6Y2Baphp\nPhaHqKl9zD5GWqu5GSXGoLaGXusBvwBKjS/g+VLo7pJfMsUF3sUduJNG3UThAsrp\nQLV3wQz0AMHVElRErOWdBDY0ddAKLPL7/mtxj39pGEpZ/dNtQkzgm7VCdP10QnQZ\nrwR2l8k7CPu0pylPCXmXvKFWV1uv9RnztlWY6BRmufKn+lJsN3Blh7ndi5rlCjR6\nmHVrQD/l6+8VmSD3/mDnbEXPyzBkSY5D1wpR7M5VXN5jVHROc4ZA5M88SyI48ESG\nNmeAwtGar45/X+wG47+EC4+JXpNO7BQrEvHgJxBdyoQ6KLDrEaqn/OQpxB4Gfmcv\nSwkWDpSk8wFm/pGlFK6J4b+ba7eOetW+aXrWSiFB1sTAg0OY+gds67OpWQARAQAB\ntDFGZWRvcmEgKDQzKSA8ZmVkb3JhLTQzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJSBBMBCAA8FiEExufwgc+A4TFGZ26IgptgZjFkVTEFAma23M8CGw8FCwkI\nBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEIKbYGYxZFUxagQP/RYWw5j0Gfvv\nlWkDQTjTVAnHtbKuQLYM13Lx5d3W1k0g6Xdrolf4yPjh4YPYVQDXksB4i6ULLbMo\n8u46UCPMQwCXTd3Ax9imYn+V74Isl/CkBbKQD9YfSJjhW3mSlPa27jo2uhqpdV0S\nxp05NWYnWrZN+GbtCUs1+rNTBevagOURtlZ8f0iPVRA/PxWzpjbRaGrCHlIYc3JO\nGKLUuQueLvOUg2pP8dtpll7S3xUe5Abyq2ifT34T0wHi6hJA3bfpXo1uNXRvGrNw\ngbJ7V6P7ioTcvyhS1h4zjelKFyvTnOKOy5D08HKmvTMWZQWEL7kDNymh1jMV7Abg\n4TPp808EiPF1GGAzXU56feaURSvIuix3MkjhGZsSQQH2kkkEIzq6j/EwmpyEMW38\ndtql4T2bVS/cTk/hRaqUKZlyrsL657g/4mFA1wDDM3895fYkHOpYF4JZ9SeDrhuc\nTgpC7/TW55l6vSiFtnQvcMfjpfCA6mCA4b75k+/xG9RxxBnYU0qVuUo/8pON31yQ\nD2AM2v7WbJBYVRYLlqPrkAZU5fe7+2wY7P7N0IAPwVA0TFJ1x6as3Kezdi/304mg\noC98DBLjHaUpX2bTxKMtCzlmeqPiwtyNkA9O9IQO7qQzArBKxmAgof4wblN5SL8i\nfsjiJUqsK/gTYwJ744I/tzxOy5FXjA7z\n=Bqds\n-----END PGP PUBLIC KEY BLOCK-----\n", 15 | "check_gpg": true 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.github/workflows/rhel-8-10.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on RHEL 8.10.0 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-rhel-8-10')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 41 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 42 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 43 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 44 | 45 | edge-rhel-810-x86: 46 | needs: pr-info 47 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | continue-on-error: true 49 | runs-on: ubuntu-latest 50 | 51 | steps: 52 | - name: Clone repository 53 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 54 | with: 55 | ref: ${{ needs.pr-info.outputs.sha }} 56 | fetch-depth: 0 57 | 58 | - name: Run the tests 59 | uses: sclorg/testing-farm-as-github-action@v2 60 | with: 61 | compose: RHEL-8.10.0-Nightly 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.pr-info.outputs.repo_url }} 65 | git_ref: ${{ needs.pr-info.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=rhel-8-10" 68 | pull_request_status_name: "edge-rhel-8.10-x86" 69 | tmt_plan_regex: edge-x86 70 | tf_scope: private 71 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }}" 72 | variables: "ARCH=x86_64" 73 | 74 | - name: Send test results to Slack via webhook 75 | if: always() 76 | run: | 77 | if [ "${{ job.status }}" = "success" ]; then 78 | emoji=":white_check_mark:" 79 | else 80 | emoji=":x:" 81 | fi 82 | 83 | curl -X POST -H 'Content-type: application/json' --data '{ 84 | "text": "Testing Farm Results for RHEL 8.10 x86", 85 | "blocks": [ 86 | { 87 | "type": "section", 88 | "text": { 89 | "type": "mrkdwn", 90 | "text": "'"$emoji"' *RHEL-8.10 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 91 | } 92 | } 93 | ] 94 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 95 | -------------------------------------------------------------------------------- /tmt/plans/edge-test.fmf: -------------------------------------------------------------------------------- 1 | summary: Edge test plan 2 | discover: 3 | how: fmf 4 | test: edge-test 5 | execute: 6 | how: tmt 7 | provision: 8 | hardware: 9 | virtualization: 10 | is-supported: true 11 | cpu: 12 | processors: ">= 4" 13 | memory: ">= 16 GB" 14 | disk: 15 | - size: ">= 60 GB" 16 | 17 | /edge-x86-commit: 18 | summary: Test edge commit 19 | environment+: 20 | TEST_CASE: edge-commit 21 | 22 | /edge-x86-installer: 23 | summary: Test edge installer image 24 | environment+: 25 | TEST_CASE: edge-installer 26 | 27 | /edge-x86-raw-image: 28 | summary: Test edge raw image 29 | environment+: 30 | TEST_CASE: edge-raw-image 31 | 32 | /edge-x86-simplified-installer: 33 | summary: Test edge simplified installer image 34 | environment+: 35 | TEST_CASE: edge-simplified-installer 36 | adjust+: 37 | - when: arch != x86_64 or distro == fedora 38 | enabled: false 39 | 40 | /edge-x86-fdo-aio: 41 | summary: Test edge with fdo aio service 42 | environment+: 43 | TEST_CASE: edge-fdo-aio 44 | adjust+: 45 | - when: arch != x86_64 46 | enabled: false 47 | - when: distro == fedora 48 | enabled: false 49 | - when: distro==cs-9 50 | enabled: false 51 | - when: distro == rhel-8-10 52 | enabled: false 53 | - when: distro==rhel-9-4 54 | enabled: false 55 | - when: distro==rhel-9-5 56 | enabled: false 57 | - when: distro==rhel-9-6 58 | enabled: false 59 | 60 | /edge-x86-fdo-db: 61 | summary: Test edge with fdo package with db 62 | environment+: 63 | TEST_CASE: edge-fdo-db 64 | adjust+: 65 | - when: arch != x86_64 or distro == fedora 66 | enabled: false 67 | - when: distro == rhel-8-10 68 | enabled: false 69 | - when: distro==cs-9 70 | enabled: false 71 | - when: distro==rhel-9-5 72 | enabled: false 73 | - when: distro==rhel-9-4 74 | enabled: false 75 | - when: distro==rhel-9-6 76 | enabled: false 77 | 78 | /edge-x86-ignition: 79 | summary: Test edge ignition feature 80 | environment+: 81 | TEST_CASE: edge-ignition 82 | adjust+: 83 | - when: arch != x86_64 or distro == fedora 84 | enabled: false 85 | - when: distro == rhel-8-10 86 | enabled: false 87 | 88 | /edge-x86-pulp: 89 | summary: Test edge pulp feature 90 | environment+: 91 | TEST_CASE: edge-pulp 92 | adjust+: 93 | - when: arch != x86_64 94 | enabled: false 95 | - when: distro == fedora 96 | enabled: false 97 | - when: distro==cs-9 98 | enabled: false 99 | - when: distro == rhel-8-10 100 | enabled: false 101 | - when: distro==rhel-9-4 102 | enabled: false 103 | - when: distro==rhel-9-5 104 | enabled: false 105 | - when: distro==rhel-9-6 106 | enabled: false 107 | 108 | /edge-x86-vsphere: 109 | summary: Test edge vsphere image 110 | environment+: 111 | TEST_CASE: edge-vsphere 112 | adjust+: 113 | - when: arch != x86_64 or distro == fedora 114 | enabled: false 115 | - when: distro == rhel-8-10 116 | enabled: false 117 | - when: distro==cs-9 118 | enabled: false 119 | 120 | /edge-x86-ami-image: 121 | summary: Test edge ami image 122 | environment+: 123 | TEST_CASE: edge-ami-image 124 | adjust+: 125 | - when: distro == fedora 126 | enabled: false 127 | - when: distro == rhel-8-10 128 | enabled: false 129 | 130 | /edge-x86-8to9: 131 | summary: Test edge installer image 132 | environment+: 133 | TEST_CASE: edge-8to9 134 | adjust+: 135 | - when: distro == fedora 136 | enabled: false 137 | - when: distro == rhel-8-10 138 | enabled: false 139 | - when: distro==cs-9 140 | enabled: false 141 | 142 | /edge-x86-9to9: 143 | summary: Test edge installer image 144 | environment+: 145 | TEST_CASE: edge-9to9 146 | adjust+: 147 | - when: distro == fedora 148 | enabled: false 149 | - when: distro == rhel-8-10 150 | enabled: false 151 | - when: distro==cs-9 152 | enabled: false 153 | 154 | /edge-arm-ami-image: 155 | summary: Test edge ami image 156 | environment+: 157 | TEST_CASE: edge-ami-image 158 | adjust+: 159 | - when: distro == fedora 160 | enabled: false 161 | 162 | /edge-fdo-container: 163 | summary: Test fdo container image 164 | environment+: 165 | TEST_CASE: edge-fdo-container 166 | -------------------------------------------------------------------------------- /.github/workflows/export-tmt-tests-to-polarion.yml: -------------------------------------------------------------------------------- 1 | name: Export tmt tests to Polarion work items 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | dry_run: 7 | type: boolean 8 | default: false 9 | description: Export preview only 10 | 11 | jobs: 12 | pr-info: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.actor }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | if: ${{ github.event_name == 'pull_request' }} 32 | uses: octokit/request-action@v2.x 33 | id: pr-api 34 | with: 35 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | 39 | outputs: 40 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 41 | 42 | export-to-polarion: 43 | needs: pr-info 44 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' }} 45 | continue-on-error: true 46 | runs-on: ubuntu-latest 47 | permissions: 48 | contents: write 49 | pull-requests: write 50 | steps: 51 | - uses: actions/checkout@v4 52 | with: 53 | token: ${{ secrets.GITHUB_TOKEN }} 54 | fetch-depth: 0 55 | 56 | - name: Setup Python 57 | uses: actions/setup-python@v5 58 | with: 59 | python-version: '3.11' 60 | 61 | - name: Install tmt and Polarion exporter 62 | run: | 63 | python -m pip install --upgrade pip 64 | # Install tmt 65 | pip install tmt 66 | # tmt report polarion export plugin 67 | pip install tmt-polarion pylero 68 | 69 | - name: Configure pylero 70 | env: 71 | POLARION_URL: ${{ secrets.POLARION_URL }} 72 | POLARION_USER: ${{ secrets.POLARION_USER }} 73 | POLARION_PASSWORD: ${{ secrets.POLARION_PASSWORD }} 74 | POLARION_PROJECT: ${{ secrets.POLARION_PROJECT }} 75 | run: | 76 | install -m 600 /dev/null "${HOME}/.pylero" 77 | cat > "${HOME}/.pylero" << EOF 78 | [webservice] 79 | url=${POLARION_URL}/polarion 80 | svn_repo=${POLARION_URL}/repo 81 | user=${POLARION_USER} 82 | password=${POLARION_PASSWORD} 83 | default_project=${POLARION_PROJECT} 84 | cert_path="${HOME}" 85 | EOF 86 | 87 | - name: Dry run test cases not exported to Polarion 88 | if: ${{ inputs.dry_run }} 89 | env: 90 | POLARION_PROJECT: ${{ secrets.POLARION_PROJECT }} 91 | run: | 92 | tmt tests export --how polarion --project-id "$POLARION_PROJECT" --dry 93 | 94 | - name: Export (create new, optionally update existing) 95 | if: ${{ !inputs.dry_run }} 96 | env: 97 | POLARION_PROJECT: ${{ secrets.POLARION_PROJECT }} 98 | run: | 99 | tmt tests export --how polarion --project-id "$POLARION_PROJECT" --create 100 | 101 | - name: Create Pull Request with TMT IDs 102 | if: ${{ !inputs.dry_run }} 103 | uses: peter-evans/create-pull-request@v7 104 | with: 105 | token: ${{ secrets.GITHUB_TOKEN }} 106 | commit-message: "chore: append Polarion identifiers to tmt test cases" 107 | title: "chore: Append Polarion identifiers to tmt test cases" 108 | body: | 109 | This PR was automatically created after exporting tmt test cases to Polarion. 110 | 111 | The following test case files have been updated with TMT IDs created by Polarion: 112 | - Files in `tmt/tests/` directory with appended `id:` field. 113 | 114 | **Note:** These identifiers are required by Polarion to link tmt test cases to future test run results that will be exported with testing-farm request command. 115 | 116 | Please review the changes and merge if everything looks correct. 117 | branch: update-polarion-ids-${{ github.run_number }} 118 | delete-branch: true 119 | labels: | 120 | automation 121 | polarion 122 | draft: false 123 | -------------------------------------------------------------------------------- /.github/workflows/trigger-fedora.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Fedora compose trigger 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: '0 8 * * *' 8 | 9 | env: 10 | COMPOSE_URL_F43: https://dl.fedoraproject.org/pub/fedora/linux/development/43 11 | COMPOSE_URL_RAWHIDE: https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide 12 | 13 | jobs: 14 | check-compose: 15 | if: github.repository == 'virt-s1/rhel-edge' 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: actions/checkout@v3 19 | 20 | - name: Check if fedora 43 compose is new 21 | id: check_compose_id_43 22 | run: | 23 | curl -s "${COMPOSE_URL_F43}/COMPOSE_ID" --output COMPOSE_ID 24 | COMPOSE_ID=$(cat COMPOSE_ID) 25 | TESTED_COMPOSE=( $( cat compose/compose.f43 ) ) 26 | if [[ " ${TESTED_COMPOSE[*]} " =~ "$COMPOSE_ID" ]]; then 27 | echo "need_pr=false" >> $GITHUB_OUTPUT 28 | exit 0 29 | fi 30 | 31 | gh pr list -R virt-s1/rhel-edge --state open --json title --jq '.[].title' > PR_LIST 32 | PR_LIST=$(cat PR_LIST) 33 | if [[ $PR_LIST == *"$COMPOSE_ID"* ]]; then 34 | echo "need_pr=false" >> $GITHUB_OUTPUT 35 | exit 0 36 | fi 37 | echo "need_pr=true" >> $GITHUB_OUTPUT 38 | echo "compose_id=$COMPOSE_ID" >> $GITHUB_OUTPUT 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 41 | 42 | - name: Check if fedora rawhide compose is new 43 | id: check_compose_id_rawhide 44 | run: | 45 | curl -s "${COMPOSE_URL_RAWHIDE}/COMPOSE_ID" --output COMPOSE_ID 46 | COMPOSE_ID=$(cat COMPOSE_ID) 47 | TESTED_COMPOSE=( $( cat compose/compose.rawhide ) ) 48 | if [[ " ${TESTED_COMPOSE[*]} " =~ "$COMPOSE_ID" ]]; then 49 | echo "need_pr=false" >> $GITHUB_OUTPUT 50 | exit 0 51 | fi 52 | 53 | gh pr list -R virt-s1/rhel-edge --state open --json title --jq '.[].title' > PR_LIST 54 | PR_LIST=$(cat PR_LIST) 55 | if [[ $PR_LIST == *"$COMPOSE_ID"* ]]; then 56 | echo "need_pr=false" >> $GITHUB_OUTPUT 57 | exit 0 58 | fi 59 | echo "need_pr=true" >> $GITHUB_OUTPUT 60 | echo "compose_id=$COMPOSE_ID" >> $GITHUB_OUTPUT 61 | env: 62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 63 | 64 | outputs: 65 | compose_id_rawhide: ${{ steps.check_compose_id_rawhide.outputs.compose_id }} 66 | need_pr_rawhide: ${{ steps.check_compose_id_rawhide.outputs.need_pr }} 67 | compose_id_43: ${{ steps.check_compose_id_43.outputs.compose_id }} 68 | need_pr_43: ${{ steps.check_compose_id_43.outputs.need_pr }} 69 | 70 | # fedora-rawhide: 71 | # needs: check-compose 72 | # if: ${{ needs.check-compose.outputs.need_pr_rawhide == 'true' }} 73 | # runs-on: ubuntu-latest 74 | # steps: 75 | # - uses: actions/checkout@v3 76 | 77 | # - name: Add new compose id in compose.rawhide 78 | # run: | 79 | # compose_id="${{ needs.check-compose.outputs.compose_id_rawhide }}" 80 | # echo $compose_id >> compose/compose.rawhide 81 | # cat compose/compose.rawhide 82 | 83 | # - name: Create Pull Request for fedora rawhide 84 | # id: create-pr 85 | # uses: peter-evans/create-pull-request@v4 86 | # with: 87 | # title: "${{ needs.check-compose.outputs.compose_id_rawhide }}" 88 | # branch: cpr 89 | # branch-suffix: random 90 | # base: main 91 | # body: "${{ needs.check-compose.outputs.compose_id_rawhide }}" 92 | # commit-message: "Add compose ID ${{ needs.check-compose.outputs.compose_id_rawhide }} to compose file" 93 | # labels: | 94 | # automated-pr 95 | # env: 96 | # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 97 | 98 | # - name: Add a comment to trigger test workflow 99 | # uses: peter-evans/create-or-update-comment@v2 100 | # with: 101 | # token: ${{ secrets.PAT }} 102 | # issue-number: ${{ steps.create-pr.outputs.pull-request-number }} 103 | # body: /test-rawhide 104 | 105 | fedora-43: 106 | needs: check-compose 107 | if: ${{ needs.check-compose.outputs.need_pr_43 == 'true' }} 108 | runs-on: ubuntu-latest 109 | steps: 110 | - uses: actions/checkout@v3 111 | 112 | - name: Add new compose id in compose.f43 113 | run: | 114 | compose_id="${{ needs.check-compose.outputs.compose_id_43 }}" 115 | echo $compose_id >> compose/compose.f43 116 | cat compose/compose.f43 117 | 118 | - name: Create Pull Request for fedora 43 119 | id: create-pr 120 | uses: peter-evans/create-pull-request@v4 121 | with: 122 | title: "${{ needs.check-compose.outputs.compose_id_43 }}" 123 | branch: cpr 124 | branch-suffix: random 125 | base: main 126 | body: "${{ needs.check-compose.outputs.compose_id_43 }}" 127 | commit-message: "Add compose ID ${{ needs.check-compose.outputs.compose_id_43 }} to compose file" 128 | labels: | 129 | automated-pr 130 | env: 131 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 132 | 133 | - name: Add a comment to trigger test workflow 134 | uses: peter-evans/create-or-update-comment@v2 135 | with: 136 | token: ${{ secrets.PAT }} 137 | issue-number: ${{ steps.create-pr.outputs.pull-request-number }} 138 | body: /test-f43 139 | -------------------------------------------------------------------------------- /.github/workflows/fedora-43.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on Fedora 43 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-f43')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | - name: Get information for pull request 30 | uses: octokit/request-action@v2.x 31 | id: pr-api 32 | with: 33 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | 37 | outputs: 38 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 39 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 40 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 41 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url}} 42 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 43 | 44 | iot-f43-x86: 45 | needs: pr-info 46 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 47 | continue-on-error: true 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 53 | with: 54 | ref: ${{ needs.pr-info.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | with: 60 | compose: Fedora-43 61 | api_key: ${{ secrets.TF_API_KEY }} 62 | git_url: ${{ needs.pr-info.outputs.repo_url }} 63 | git_ref: ${{ needs.pr-info.outputs.ref }} 64 | update_pull_request_status: true 65 | pull_request_status_name: "iot-f43-x86" 66 | tmt_context: "arch=x86_64;distro=fedora" 67 | tmt_plan_regex: edge-x86 68 | tf_scope: private 69 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 70 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 71 | 72 | - name: Send test results to Slack via webhook 73 | if: always() 74 | run: | 75 | if [ "${{ job.status }}" = "success" ]; then 76 | emoji=":white_check_mark:" 77 | else 78 | emoji=":x:" 79 | fi 80 | 81 | curl -X POST -H 'Content-type: application/json' --data '{ 82 | "text": "Testing Farm Results for Fedora 43 x86_64", 83 | "blocks": [ 84 | { 85 | "type": "section", 86 | "text": { 87 | "type": "mrkdwn", 88 | "text": "'"$emoji"' *Fedora-43 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 89 | } 90 | } 91 | ] 92 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 93 | 94 | # iot-rawhide-arm: 95 | # needs: pr-info 96 | # if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 97 | # continue-on-error: true 98 | # runs-on: ubuntu-latest 99 | 100 | # steps: 101 | # - name: Clone repository 102 | # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 103 | # with: 104 | # ref: ${{ needs.pr-info.outputs.sha }} 105 | # fetch-depth: 0 106 | 107 | # - name: Run the tests 108 | # uses: sclorg/testing-farm-as-github-action@v3.1.2 109 | # with: 110 | # compose: Fedora-Rawhide-Nightly 111 | # api_key: ${{ secrets.TF_API_KEY }} 112 | # git_url: ${{ needs.pr-info.outputs.repo_url }} 113 | # git_ref: ${{ needs.pr-info.outputs.ref }} 114 | # update_pull_request_status: true 115 | # pull_request_status_name: "iot-rawhide-arm" 116 | # tmt_context: "arch=aarch64;distro=fedora" 117 | # tmt_plan_regex: edge-arm 118 | # tf_scope: private 119 | # secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 120 | # variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 121 | -------------------------------------------------------------------------------- /.github/workflows/fedora-rawhide.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on Fedora rawhide 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-rawhide')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | - name: Get information for pull request 30 | uses: octokit/request-action@v2.x 31 | id: pr-api 32 | with: 33 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | 37 | outputs: 38 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 39 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 40 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 41 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url}} 42 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 43 | 44 | iot-rawhide-x86: 45 | needs: pr-info 46 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 47 | continue-on-error: true 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 53 | with: 54 | ref: ${{ needs.pr-info.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | with: 60 | compose: Fedora-Rawhide-Nightly 61 | api_key: ${{ secrets.TF_API_KEY }} 62 | git_url: ${{ needs.pr-info.outputs.repo_url }} 63 | git_ref: ${{ needs.pr-info.outputs.ref }} 64 | update_pull_request_status: true 65 | pull_request_status_name: "iot-rawhide-x86" 66 | tmt_context: "arch=x86_64;distro=fedora" 67 | tmt_plan_regex: edge-x86 68 | tf_scope: private 69 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 70 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 71 | 72 | - name: Send test results to Slack via webhook 73 | if: always() 74 | run: | 75 | if [ "${{ job.status }}" = "success" ]; then 76 | emoji=":white_check_mark:" 77 | else 78 | emoji=":x:" 79 | fi 80 | 81 | curl -X POST -H 'Content-type: application/json' --data '{ 82 | "text": "Testing Farm Results for Fedora 44 x86", 83 | "blocks": [ 84 | { 85 | "type": "section", 86 | "text": { 87 | "type": "mrkdwn", 88 | "text": "'"$emoji"' *Fedora-44 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 89 | } 90 | } 91 | ] 92 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 93 | 94 | # iot-rawhide-arm: 95 | # needs: pr-info 96 | # if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 97 | # continue-on-error: true 98 | # runs-on: ubuntu-latest 99 | 100 | # steps: 101 | # - name: Clone repository 102 | # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 103 | # with: 104 | # ref: ${{ needs.pr-info.outputs.sha }} 105 | # fetch-depth: 0 106 | 107 | # - name: Run the tests 108 | # uses: sclorg/testing-farm-as-github-action@v3.1.2 109 | # with: 110 | # compose: Fedora-Rawhide-Nightly 111 | # api_key: ${{ secrets.TF_API_KEY }} 112 | # git_url: ${{ needs.pr-info.outputs.repo_url }} 113 | # git_ref: ${{ needs.pr-info.outputs.ref }} 114 | # update_pull_request_status: true 115 | # pull_request_status_name: "iot-rawhide-arm" 116 | # tmt_context: "arch=aarch64;distro=fedora" 117 | # tmt_plan_regex: edge-arm 118 | # tf_scope: private 119 | # secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 120 | # variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 121 | -------------------------------------------------------------------------------- /.github/workflows/fedora-iot-42.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Fedora 42 IoT test 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | check-permissions: 11 | runs-on: ubuntu-latest 12 | if: ${{ github.event.issue.pull_request && 13 | (endsWith(github.event.comment.body, '/test-f42-iot')) }} 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).body }} 41 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 42 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 43 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 44 | 45 | iot-42-x86: 46 | needs: check-permissions 47 | if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@v4 53 | with: 54 | ref: ${{ needs.check-permissions.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | id: run-test 60 | with: 61 | compose: Fedora-42 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.check-permissions.outputs.repo_url }} 65 | git_ref: ${{ needs.check-permissions.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=fedora-42" 68 | pull_request_status_name: "iot-f42-x86" 69 | tmt_plan_regex: iot-x86 70 | tf_scope: private 71 | variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 72 | 73 | - name: Send test results to Slack via webhook 74 | if: always() 75 | run: | 76 | if [ "${{ job.status }}" = "success" ]; then 77 | emoji=":white_check_mark:" 78 | else 79 | emoji=":x:" 80 | fi 81 | 82 | curl -X POST -H 'Content-type: application/json' --data '{ 83 | "text": "Testing Farm Results for Fedora 42 IoT x86", 84 | "blocks": [ 85 | { 86 | "type": "section", 87 | "text": { 88 | "type": "mrkdwn", 89 | "text": "'"$emoji"' *Fedora-42 | x86_64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 90 | } 91 | } 92 | ] 93 | }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 94 | 95 | # iot-42-aarch64: 96 | # needs: check-permissions 97 | # if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 98 | # runs-on: ubuntu-latest 99 | 100 | # steps: 101 | # - name: Clone repository 102 | # uses: actions/checkout@v4 103 | # with: 104 | # ref: ${{ needs.check-permissions.outputs.sha }} 105 | # fetch-depth: 0 106 | 107 | # - name: Run the tests 108 | # uses: sclorg/testing-farm-as-github-action@v3.1.2 109 | # id: run-test 110 | # with: 111 | # compose: Fedora-42 112 | # arch: aarch64 113 | # api_key: ${{ secrets.TF_API_KEY }} 114 | # git_url: ${{ needs.check-permissions.outputs.repo_url }} 115 | # git_ref: ${{ needs.check-permissions.outputs.ref }} 116 | # update_pull_request_status: true 117 | # tmt_context: "arch=aarch64;distro=fedora-42" 118 | # pull_request_status_name: "iot-f42-aarch64" 119 | # tmt_plan_regex: iot-aarch64 120 | # tf_scope: private 121 | # variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 122 | 123 | # - name: Send test results to Slack via webhook 124 | # if: always() 125 | # run: | 126 | # if [ "${{ job.status }}" = "success" ]; then 127 | # emoji=":white_check_mark:" 128 | # else 129 | # emoji=":x:" 130 | # fi 131 | 132 | # curl -X POST -H 'Content-type: application/json' --data '{ 133 | # "text": "Testing Farm Results for Fedora 42 IoT aarch64", 134 | # "blocks": [ 135 | # { 136 | # "type": "section", 137 | # "text": { 138 | # "type": "mrkdwn", 139 | # "text": "'"$emoji"' *Fedora-42 | aarch64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 140 | # } 141 | # } 142 | # ] 143 | # }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 144 | -------------------------------------------------------------------------------- /.github/workflows/fedora-iot-43.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Fedora 43 IoT test 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | check-permissions: 11 | runs-on: ubuntu-latest 12 | if: ${{ github.event.issue.pull_request && 13 | (endsWith(github.event.comment.body, '/test-f43-iot')) }} 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).body }} 41 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 42 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 43 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 44 | 45 | iot-43-x86: 46 | needs: check-permissions 47 | if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@v4 53 | with: 54 | ref: ${{ needs.check-permissions.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | id: run-test 60 | with: 61 | compose: Fedora-43 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.check-permissions.outputs.repo_url }} 65 | git_ref: ${{ needs.check-permissions.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=fedora-43" 68 | pull_request_status_name: "iot-f43-x86" 69 | tmt_plan_regex: iot-x86 70 | tf_scope: private 71 | variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 72 | 73 | - name: Send test results to Slack via webhook 74 | if: always() 75 | run: | 76 | if [ "${{ job.status }}" = "success" ]; then 77 | emoji=":white_check_mark:" 78 | else 79 | emoji=":x:" 80 | fi 81 | 82 | curl -X POST -H 'Content-type: application/json' --data '{ 83 | "text": "Testing Farm Results for Fedora 43 IoT x86", 84 | "blocks": [ 85 | { 86 | "type": "section", 87 | "text": { 88 | "type": "mrkdwn", 89 | "text": "'"$emoji"' *Fedora-43 | x86_64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 90 | } 91 | } 92 | ] 93 | }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 94 | 95 | # iot-43-aarch64: 96 | # needs: check-permissions 97 | # if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 98 | # runs-on: ubuntu-latest 99 | 100 | # steps: 101 | # - name: Clone repository 102 | # uses: actions/checkout@v4 103 | # with: 104 | # ref: ${{ needs.check-permissions.outputs.sha }} 105 | # fetch-depth: 0 106 | 107 | # - name: Run the tests 108 | # uses: sclorg/testing-farm-as-github-action@v3.1.2 109 | # id: run-test 110 | # with: 111 | # compose: Fedora-43 112 | # arch: aarch64 113 | # api_key: ${{ secrets.TF_API_KEY }} 114 | # git_url: ${{ needs.check-permissions.outputs.repo_url }} 115 | # git_ref: ${{ needs.check-permissions.outputs.ref }} 116 | # update_pull_request_status: true 117 | # tmt_context: "arch=aarch64;distro=fedora-43" 118 | # pull_request_status_name: "iot-f43-aarch64" 119 | # tmt_plan_regex: iot-aarch64 120 | # tf_scope: private 121 | # variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 122 | 123 | # - name: Send test results to Slack via webhook 124 | # if: always() 125 | # run: | 126 | # if [ "${{ job.status }}" = "success" ]; then 127 | # emoji=":white_check_mark:" 128 | # else 129 | # emoji=":x:" 130 | # fi 131 | 132 | # curl -X POST -H 'Content-type: application/json' --data '{ 133 | # "text": "Testing Farm Results for Fedora 43 IoT aarch64", 134 | # "blocks": [ 135 | # { 136 | # "type": "section", 137 | # "text": { 138 | # "type": "mrkdwn", 139 | # "text": "'"$emoji"' *Fedora-43 | aarch64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 140 | # } 141 | # } 142 | # ] 143 | # }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 144 | -------------------------------------------------------------------------------- /.github/workflows/fedora-iot-44.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Fedora 44 IoT test 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | check-permissions: 11 | runs-on: ubuntu-latest 12 | if: ${{ github.event.issue.pull_request && 13 | (endsWith(github.event.comment.body, '/test-f44-iot')) }} 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).body }} 41 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 42 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 43 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 44 | 45 | iot-44-x86: 46 | needs: check-permissions 47 | if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@v4 53 | with: 54 | ref: ${{ needs.check-permissions.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | id: run-test 60 | with: 61 | compose: Fedora-Rawhide 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.check-permissions.outputs.repo_url }} 65 | git_ref: ${{ needs.check-permissions.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=fedora-44" 68 | pull_request_status_name: "iot-f44-x86" 69 | tmt_plan_regex: iot-x86 70 | tf_scope: private 71 | variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 72 | 73 | - name: Send test results to Slack via webhook 74 | if: always() 75 | run: | 76 | if [ "${{ job.status }}" = "success" ]; then 77 | emoji=":white_check_mark:" 78 | else 79 | emoji=":x:" 80 | fi 81 | 82 | curl -X POST -H 'Content-type: application/json' --data '{ 83 | "text": "Testing Farm Results for Fedora 44 IoT x86", 84 | "blocks": [ 85 | { 86 | "type": "section", 87 | "text": { 88 | "type": "mrkdwn", 89 | "text": "'"$emoji"' *Fedora-44 | x86_64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 90 | } 91 | } 92 | ] 93 | }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 94 | 95 | # iot-44-aarch64: 96 | # needs: check-permissions 97 | # if: ${{ needs.check-permissions.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 98 | # runs-on: ubuntu-latest 99 | 100 | # steps: 101 | # - name: Clone repository 102 | # uses: actions/checkout@v4 103 | # with: 104 | # ref: ${{ needs.check-permissions.outputs.sha }} 105 | # fetch-depth: 0 106 | 107 | # - name: Run the tests 108 | # uses: sclorg/testing-farm-as-github-action@v3.1.2 109 | # id: run-test 110 | # with: 111 | # compose: Fedora-Rawhide 112 | # arch: aarch64 113 | # api_key: ${{ secrets.TF_API_KEY }} 114 | # git_url: ${{ needs.check-permissions.outputs.repo_url }} 115 | # git_ref: ${{ needs.check-permissions.outputs.ref }} 116 | # update_pull_request_status: true 117 | # tmt_context: "arch=aarch64;distro=fedora-44" 118 | # pull_request_status_name: "iot-f44-aarch64" 119 | # tmt_plan_regex: iot-aarch64 120 | # tf_scope: private 121 | # variables: "COMPOSE=${{ needs.check-permissions.outputs.compose_id }}" 122 | 123 | # - name: Send test results to Slack via webhook 124 | # if: always() 125 | # run: | 126 | # if [ "${{ job.status }}" = "success" ]; then 127 | # emoji=":white_check_mark:" 128 | # else 129 | # emoji=":x:" 130 | # fi 131 | 132 | # curl -X POST -H 'Content-type: application/json' --data '{ 133 | # "text": "Testing Farm Results for Fedora 44 IoT aarch64", 134 | # "blocks": [ 135 | # { 136 | # "type": "section", 137 | # "text": { 138 | # "type": "mrkdwn", 139 | # "text": "'"$emoji"' *Fedora-44 | aarch64 | Compose-id: ${{ needs.check-permissions.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 140 | # } 141 | # } 142 | # ] 143 | # }' ${{ secrets.SLACK_WEBHOOK_URL_FEDORA_IOT_CI }} 144 | -------------------------------------------------------------------------------- /.github/workflows/fdo-container.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: FDO Container Test on CentOS Stream 9 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-fdo-container-community') || 13 | endsWith(github.event.comment.body, '/test-fdo-container-official')) }} 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Query author repository permissions 17 | uses: octokit/request-action@v2.x 18 | id: user_permission 19 | with: 20 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | 24 | # restrict running of tests to users with admin or write permission for the repository 25 | # see https://docs.github.com/en/free-pro-team@latest/rest/reference/repos#get-repository-permissions-for-a-user 26 | - name: Check if user does have correct permissions 27 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 28 | id: check_user_perm 29 | run: | 30 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 31 | echo "allowed_user=true" >> $GITHUB_OUTPUT 32 | - name: Get information for pull request 33 | uses: octokit/request-action@v2.x 34 | id: pr-api 35 | with: 36 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 37 | env: 38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 39 | 40 | outputs: 41 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 42 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 43 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 44 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 45 | 46 | fdo-container-community: 47 | needs: pr-info 48 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request && endsWith(github.event.comment.body, '/test-fdo-container-community') }} 49 | continue-on-error: true 50 | runs-on: ubuntu-latest 51 | env: 52 | STATUS_NAME: fdo-container-community 53 | 54 | steps: 55 | - name: Clone repository 56 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 57 | with: 58 | ref: ${{ needs.pr-info.outputs.sha }} 59 | fetch-depth: 0 60 | 61 | - name: run ostree-fdo-container.sh 62 | uses: sclorg/testing-farm-as-github-action@v3.1.0 63 | with: 64 | compose: CentOS-Stream-9 65 | arch: x86_64 66 | api_key: ${{ secrets.TF_API_KEY }} 67 | git_url: ${{ needs.pr-info.outputs.repo_url }} 68 | git_ref: ${{ needs.pr-info.outputs.ref }} 69 | update_pull_request_status: true 70 | tmt_context: "arch=x86_64;distro=centos-stream-9" 71 | pull_request_status_name: "fdo-container-community-cs9" 72 | tmt_plan_regex: edge-fdo-container 73 | tf_scope: private 74 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 75 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1;FDO_REGISTRY=quay.io/fido-fdo; OWNER_ONBOARDING_SERVER_NAME=owner-onboarding-server; MANUFACTURING_SERVER_NAME=manufacturing-server; RENDEZVOUS_SERVER_NAME=rendezvous-server; SERVICEINFO_API_SERVER_NAME=serviceinfo-api-server" 76 | 77 | fdo-container-official: 78 | needs: pr-info 79 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request && endsWith(github.event.comment.body, '/test-fdo-container-official') }} 80 | continue-on-error: true 81 | runs-on: ubuntu-latest 82 | env: 83 | STATUS_NAME: fdo-container-official 84 | 85 | steps: 86 | - name: Clone repository 87 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 88 | with: 89 | ref: ${{ needs.pr-info.outputs.sha }} 90 | fetch-depth: 0 91 | 92 | - name: run ostree-fdo-container.sh 93 | uses: sclorg/testing-farm-as-github-action@v3.1.0 94 | with: 95 | compose: RHEL-9.5.0-Nightly 96 | arch: x86_64 97 | api_key: ${{ secrets.TF_API_KEY }} 98 | git_url: ${{ needs.pr-info.outputs.repo_url }} 99 | git_ref: ${{ needs.pr-info.outputs.ref }} 100 | update_pull_request_status: true 101 | tmt_context: "arch=x86_64;distro=rhel-9-5" 102 | pull_request_status_name: "fdo-container-official-rhel95" 103 | tmt_plan_regex: edge-fdo-container 104 | tf_scope: private 105 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }};FDO_REGISTRY=${{ secrets.FDO_OFFICIAL_REGISTRY }}" 106 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1;OWNER_ONBOARDING_SERVER_NAME=rhel9-fdo-owner-onboarding-server;MANUFACTURING_SERVER_NAME=rhel9-fdo-manufacturing-server;RENDEZVOUS_SERVER_NAME=rhel9-fdo-rendezvous-server;SERVICEINFO_API_SERVER_NAME=rhel9-fdo-serviceinfo-api-server" 107 | -------------------------------------------------------------------------------- /.github/workflows/trigger-iot.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Trigger Fedora-IoT image test 3 | 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: '0 13 * * *' 8 | 9 | env: 10 | COMPOSE_URL_44: https://kojipkgs.fedoraproject.org/compose/iot/latest-Fedora-IoT-44 11 | COMPOSE_URL_43: https://kojipkgs.fedoraproject.org/compose/iot/latest-Fedora-IoT-43 12 | 13 | jobs: 14 | check-compose: 15 | if: github.repository == 'virt-s1/rhel-edge' 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Get compose ID for Fedora 43 IoT 22 | id: get-compose-f43 23 | run: | 24 | status=$(curl -s ${COMPOSE_URL_43}/STATUS) 25 | if [ "$status" != "FINISHED" ]; then 26 | echo "Compose status: $status - no PR needed" 27 | echo "need-pr-f43=false" >> $GITHUB_OUTPUT 28 | exit 0 29 | fi 30 | 31 | compose_id_f43=$(curl -s ${COMPOSE_URL_43}/COMPOSE_ID) 32 | echo "compose-id-f43=$compose_id_f43" >> $GITHUB_OUTPUT 33 | 34 | if grep -q "$compose_id_f43" compose/compose.f43-iot; then 35 | echo "This compose has been tested already" 36 | echo "need-pr-f43=false" >> $GITHUB_OUTPUT 37 | exit 0 38 | fi 39 | 40 | response=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ 41 | "https://api.github.com/repos/${{ github.repository }}/pulls?state=open") 42 | if echo "$response" | grep -q "$compose_id_f43"; then 43 | echo "This compose is being tested now, skip it." 44 | echo "need-pr-f43=false" >> $GITHUB_OUTPUT 45 | else 46 | echo "This is a new compose, will trigger test soon." 47 | echo "need-pr-f43=true" >> $GITHUB_OUTPUT 48 | fi 49 | 50 | - name: Get compose ID for Fedora 44 IoT 51 | id: get-compose-f44 52 | run: | 53 | status=$(curl -s ${COMPOSE_URL_44}/STATUS) 54 | if [ "$status" != "FINISHED" ]; then 55 | echo "Compose status: $status - no PR needed" 56 | echo "need-pr-f44=false" >> $GITHUB_OUTPUT 57 | exit 0 58 | fi 59 | 60 | compose_id_f44=$(curl -s ${COMPOSE_URL_44}/COMPOSE_ID) 61 | echo "compose-id-f44=$compose_id_f44" >> $GITHUB_OUTPUT 62 | 63 | if grep -q "$compose_id_f44" compose/compose.f44-iot; then 64 | echo "This compose has been tested already" 65 | echo "need-pr-f44=false" >> $GITHUB_OUTPUT 66 | exit 0 67 | fi 68 | 69 | response=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ 70 | "https://api.github.com/repos/${{ github.repository }}/pulls?state=open") 71 | if echo "$response" | grep -q "$compose_id_f44"; then 72 | echo "This compose is being tested now, skip it." 73 | echo "need-pr-f44=false" >> $GITHUB_OUTPUT 74 | else 75 | echo "This is a new compose, will trigger test soon." 76 | echo "need-pr-f44=true" >> $GITHUB_OUTPUT 77 | fi 78 | 79 | outputs: 80 | need-pr-f43: ${{ steps.get-compose-f43.outputs.need-pr-f43 }} 81 | compose-id-f43: ${{ steps.get-compose-f43.outputs.compose-id-f43 }} 82 | need-pr-f44: ${{ steps.get-compose-f44.outputs.need-pr-f44 }} 83 | compose-id-f44: ${{ steps.get-compose-f44.outputs.compose-id-f44 }} 84 | 85 | create-pr-f43: 86 | runs-on: ubuntu-latest 87 | needs: check-compose 88 | if: needs.check-compose.outputs.need-pr-f43 == 'true' 89 | steps: 90 | - name: Checkout repository 91 | uses: actions/checkout@v4 92 | 93 | - name: Update compose_id_43 file 94 | run: | 95 | echo "${{ needs.check-compose.outputs.compose-id-f43 }}" >> compose/compose.f43-iot 96 | 97 | - name: Create Pull Request for IoT 43 98 | id: create-pr 99 | uses: peter-evans/create-pull-request@v4 100 | with: 101 | title: "${{ needs.check-compose.outputs.compose-id-f43 }}" 102 | branch: cpr 103 | branch-suffix: random 104 | base: main 105 | body: "${{ needs.check-compose.outputs.compose-id-f43 }}" 106 | commit-message: "Add compose ID ${{ needs.check-compose.outputs.compose-id-f43 }} to compose file" 107 | labels: | 108 | automated-pr 109 | env: 110 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 111 | 112 | - name: Add test comment to PR 113 | if: steps.create-pr.outputs.pull-request-number 114 | uses: peter-evans/create-or-update-comment@v2 115 | with: 116 | token: ${{ secrets.PAT }} 117 | issue-number: ${{ steps.create-pr.outputs.pull-request-number }} 118 | body: /test-f43-iot 119 | 120 | create-pr-f44: 121 | runs-on: ubuntu-latest 122 | needs: check-compose 123 | if: needs.check-compose.outputs.need-pr-f44 == 'true' 124 | steps: 125 | - name: Checkout repository 126 | uses: actions/checkout@v4 127 | 128 | - name: Update compose_id_44 file 129 | run: | 130 | echo "${{ needs.check-compose.outputs.compose-id-f44 }}" >> compose/compose.f44-iot 131 | 132 | - name: Create Pull Request for IoT 44 133 | id: create-pr 134 | uses: peter-evans/create-pull-request@v4 135 | with: 136 | title: "${{ needs.check-compose.outputs.compose-id-f44 }}" 137 | branch: cpr 138 | branch-suffix: random 139 | base: main 140 | body: "${{ needs.check-compose.outputs.compose-id-f44 }}" 141 | commit-message: "Add compose ID ${{ needs.check-compose.outputs.compose-id-f44 }} to compose file" 142 | labels: | 143 | automated-pr 144 | env: 145 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 146 | 147 | - name: Add test comment to PR 148 | if: steps.create-pr.outputs.pull-request-number 149 | uses: peter-evans/create-or-update-comment@v2 150 | with: 151 | token: ${{ secrets.PAT }} 152 | issue-number: ${{ steps.create-pr.outputs.pull-request-number }} 153 | body: /test-f44-iot 154 | -------------------------------------------------------------------------------- /iot-setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | 4 | # Color definitions 5 | COLOR_CYAN='\033[0;36m' 6 | COLOR_GREEN='\033[1;32m' 7 | COLOR_RESET='\033[0m' 8 | 9 | # Logging functions 10 | log_info() { 11 | echo -e "${COLOR_CYAN}[INFO]${COLOR_RESET} $*" 12 | } 13 | 14 | log_success() { 15 | echo -e "${COLOR_GREEN}[SUCCESS]${COLOR_RESET} $*" 16 | } 17 | 18 | # Function to display system specifications 19 | display_system_specs() { 20 | local cpus mem disk hostname user arch kernel 21 | 22 | cpus=$(nproc) 23 | mem=$(free -m | awk '/^Mem:/ {print $2}') 24 | disk=$(df -h / | awk 'NR==2 {print $2}' | sed 's/G//') 25 | hostname=$(uname -n) 26 | user=$(whoami) 27 | arch=$(uname -m) 28 | kernel=$(uname -r) 29 | 30 | echo -e "${COLOR_CYAN}" 31 | cat << EOF 32 | ------------------------------------------------------------------------------ 33 | CI MACHINE SPECS 34 | ------------------------------------------------------------------------------ 35 | Hostname: ${hostname} 36 | User: ${user} 37 | CPUs: ${cpus} 38 | RAM: ${mem} MB 39 | DISK: ${disk} GB 40 | ARCH: ${arch} 41 | KERNEL: ${kernel} 42 | ------------------------------------------------------------------------------ 43 | EOF 44 | 45 | log_info "CPU details:" 46 | lscpu 47 | echo -e "${COLOR_RESET}" 48 | } 49 | 50 | # Function to install required packages 51 | install_packages() { 52 | local packages=( 53 | glibc-langpack-en 54 | httpd 55 | podman 56 | skopeo 57 | wget 58 | firewalld 59 | lorax 60 | xorriso 61 | curl 62 | jq 63 | expect 64 | qemu-img 65 | qemu-kvm 66 | libvirt-client 67 | libvirt-daemon-kvm 68 | libvirt-daemon 69 | virt-install 70 | gobject-introspection 71 | rpmdevtools 72 | createrepo_c 73 | lsof 74 | ansible-core 75 | ) 76 | 77 | log_info "Installing required packages" 78 | sudo dnf install -y --nogpgcheck "${packages[@]}" 79 | sudo ansible-galaxy collection install community.general 80 | 81 | # Set locale to en_US.UTF-8 82 | sudo localectl set-locale LANG=en_US.UTF-8 83 | } 84 | 85 | # Function to check and fix key permissions 86 | check_key_permissions() { 87 | local key_path="key/ostree_key" 88 | 89 | if [[ -f "${key_path}" ]]; then 90 | local key_perms 91 | key_perms=$(stat -L -c "%a" "${key_path}") 92 | 93 | if [[ "${key_perms}" != "600" ]]; then 94 | log_info "File permissions too open (${key_perms}), changing to 600" 95 | chmod 600 "${key_path}" 96 | fi 97 | else 98 | log_info "Key file not found: ${key_path}" 99 | fi 100 | } 101 | 102 | # Function to configure services 103 | configure_services() { 104 | log_info "Configuring services" 105 | 106 | # Enable and start services 107 | sudo systemctl enable --now httpd.service 108 | sudo systemctl enable --now firewalld 109 | 110 | # Configure libvirt permissions 111 | log_info "Configuring libvirt permissions" 112 | sudo tee /etc/polkit-1/rules.d/50-libvirt.rules > /dev/null << 'EOF' 113 | polkit.addRule(function(action, subject) { 114 | if (action.id == "org.libvirt.unix.manage" && 115 | subject.isInGroup("adm")) { 116 | return polkit.Result.YES; 117 | } 118 | }); 119 | EOF 120 | 121 | # Start libvirtd 122 | log_info "Starting libvirt daemon" 123 | sudo systemctl start libvirtd 124 | 125 | # Verify libvirt is working 126 | if ! sudo virsh list --all > /dev/null; then 127 | echo "Failed to connect to libvirt" >&2 128 | return 1 129 | fi 130 | } 131 | 132 | # Function to setup libvirt network 133 | setup_libvirt_network() { 134 | local network_xml="/tmp/integration.xml" 135 | 136 | log_info "Setting up libvirt network" 137 | 138 | # Create network configuration 139 | sudo tee "${network_xml}" > /dev/null << 'EOF' 140 | 141 | integration 142 | 1c8fe98c-b53a-4ca4-bbdb-deb0f26b3579 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | EOF 165 | 166 | # Define network if it doesn't exist 167 | if ! sudo virsh net-info integration > /dev/null 2>&1; then 168 | sudo virsh net-define "${network_xml}" 169 | fi 170 | 171 | # Start network if not active 172 | if [[ $(sudo virsh net-info integration | awk '/Active/ {print $2}') == "no" ]]; then 173 | sudo virsh net-start integration 174 | fi 175 | } 176 | 177 | # Function to check and free port 8081 if needed 178 | check_port_8081() { 179 | log_info "Checking port 8081 availability" 180 | 181 | if lsof -Pi :8081 -sTCP:LISTEN -t >/dev/null; then 182 | log_info "Port 8081 is in use, attempting to free it" 183 | sudo fuser -k 8081/tcp || true 184 | sleep 2 185 | fi 186 | } 187 | 188 | 189 | log_info "Starting CI environment setup" 190 | 191 | # Display system specifications 192 | display_system_specs 193 | 194 | # Get OS data 195 | source /etc/os-release 196 | log_info "Detected OS: ${ID} ${VERSION_ID}" 197 | 198 | # Install required packages 199 | install_packages 200 | 201 | # Check and fix key permissions 202 | check_key_permissions 203 | 204 | # Configure services 205 | configure_services 206 | 207 | # Setup libvirt network 208 | setup_libvirt_network 209 | 210 | # Check port 8081 211 | check_port_8081 212 | 213 | log_success "CI environment setup completed successfully" 214 | -------------------------------------------------------------------------------- /tools/aws-ami-cleanup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Ignore Shellcheck error SC2016: 3 | # Expressions don't expand in single quotes, use double quotes for that. 4 | # This error appears due to the single quotes in "--query" option of 5 | # awscli commands 6 | # shellcheck disable=SC2016 7 | set -euox pipefail 8 | 9 | # Set up variables. 10 | # Maximum idle timeout in hours 11 | IDLE_TO=4 12 | UPSTREAM_PREFIX_NAME="composer-ci-" 13 | DOWNSTREAM_PREFIX_NAME="rhel-edge-" 14 | BUCKET_LIST=bucket_list.json 15 | SNAPSHOT_LIST=snapshot_list.json 16 | IMAGES_LIST=images_list.json 17 | KEYPAIR_LIST=keypair_list.json 18 | INSTANCES_LIST=instances_list.json 19 | UPSTREAM_TAG="rhel-edge-ci" 20 | DOWNSTREAM_TAG="composer-ci" 21 | 22 | # Colorful output. 23 | function greenprint { 24 | echo -e "\033[1;32m${1}\033[0m" 25 | } 26 | 27 | # Calculate how old is the resource 28 | time_subtraction () { 29 | current_time=$(date +%s) 30 | creation_time=$1 31 | 32 | hours_old_float=$( 33 | echo "${current_time}" \ 34 | "$(date -d "${creation_time}" +%s)" \ 35 | | awk '{print ($1 - $2) / 3600}' 36 | ) 37 | hours_old_int=$(printf "%.0f\n" "${hours_old_float}") 38 | if [[ "${hours_old_int}" -ge "${IDLE_TO}" ]]; then 39 | echo 1 40 | else 41 | echo 0 42 | fi 43 | } 44 | 45 | greenprint "🧼 Cleaning up AWS resources in region ${AWS_DEFAULT_REGION}" 46 | 47 | # List Upstream and Downstream AWS EC2 instances 48 | greenprint "Checking AWS EC2 Idle Instances 🖥️" 49 | aws ec2 describe-instances \ 50 | --filters Name=tag:Name,Values=${UPSTREAM_TAG},${DOWNSTREAM_TAG} \ 51 | Name=instance-state-name,Values=running \ 52 | --query 'Reservations[*].Instances[*].InstanceId' \ 53 | --output text \ 54 | | sed -r 's/[\t]+|[ ]+/\n/g' \ 55 | > "${INSTANCES_LIST}" || : 56 | 57 | if [[ -z $(cat "${INSTANCES_LIST}") ]]; then 58 | echo "No idle instances to remove" 59 | else 60 | mapfile -t INSTANCE_ARRAY < "${INSTANCES_LIST}" 61 | for line in "${INSTANCE_ARRAY[@]}"; do 62 | CREATION_DATE=$( 63 | aws ec2 describe-instances \ 64 | --instance-ids "${line}" \ 65 | --output text \ 66 | --query 'Reservations[*].Instances[*].LaunchTime' 67 | ) 68 | INSTANCE_AGE=$(time_subtraction "${CREATION_DATE}") 69 | if [[ "${INSTANCE_AGE}" == 1 ]]; then 70 | echo "Removing idle instance ${line}" 71 | aws ec2 terminate-instances \ 72 | --instance-ids "${line}" 73 | aws ec2 wait instance-terminated \ 74 | --instance-ids "${line}" 75 | fi 76 | done 77 | fi 78 | rm "${INSTANCES_LIST}" 79 | 80 | # List Upstream and Downstream Buckets 81 | greenprint "Checking AWS S3 Idle Buckets 🪣" 82 | aws s3 ls \ 83 | | grep -e "${UPSTREAM_PREFIX_NAME}" \ 84 | -e "${DOWNSTREAM_PREFIX_NAME}" \ 85 | > "${BUCKET_LIST}" || : 86 | if [[ -z $(cat "${BUCKET_LIST}") ]]; then 87 | echo "No buckets to remove" 88 | else 89 | mapfile -t BUCKET_ARRAY < "${BUCKET_LIST}" 90 | rm "${BUCKET_LIST}" 91 | 92 | for line in "${BUCKET_ARRAY[@]}"; do 93 | CREATION_DATE=$( 94 | echo "${line}" \ 95 | | awk -F " |" '{print ($1" "$2)}' 96 | ) 97 | BUCKET_NAME=$( 98 | echo "${line}" \ 99 | | awk -F " |" '{print ($3)}' 100 | ) 101 | BUCKET_AGE=$(time_subtraction "${CREATION_DATE}") 102 | if [[ "${BUCKET_AGE}" == 1 ]]; then 103 | echo "Removing bucket ${line}" 104 | aws s3 rb "s3://${BUCKET_NAME}" --force > /dev/null 105 | fi 106 | done 107 | fi 108 | 109 | # List Registered Images 110 | greenprint "Checking AWS EC2 Idle AMIs 💽" 111 | aws ec2 describe-images \ 112 | --owners self \ 113 | --query 'Images[?(Tags[?Value == `composer-ci`].Value)]' \ 114 | | jq -r '.[] | .ImageId' > "${IMAGES_LIST}" 115 | aws ec2 describe-images \ 116 | --owners self \ 117 | --query 'Images[?(Tags[?Value == `rhel-edge-ci`].Value)]' \ 118 | | jq -r '.[] | .ImageId' >> "${IMAGES_LIST}" 119 | mapfile -t IMAGES_ARRAY < "${IMAGES_LIST}" 120 | rm "${IMAGES_LIST}" 121 | 122 | for line in "${IMAGES_ARRAY[@]}"; do 123 | CREATION_DATE=$( 124 | aws ec2 describe-images \ 125 | --image-ids "${line}" \ 126 | | jq -r '.Images[] | .CreationDate' 127 | ) 128 | IMAGE_ID="${line}" 129 | IMAGE_AGE=$(time_subtraction "${CREATION_DATE}") 130 | if [[ "${IMAGE_AGE}" == 1 ]]; then 131 | echo "De-registering image ${CREATION_DATE} ${IMAGE_ID}" 132 | aws ec2 deregister-image --image-id "${IMAGE_ID}" || : 133 | fi 134 | done 135 | 136 | # List Snapshots 137 | greenprint "Checking AWS EC2 Idle Snapshots 💾" 138 | aws ec2 describe-snapshots \ 139 | --owner-ids self \ 140 | --query 'Snapshots[?(Tags[?Value == `composer-ci`].Value)]' \ 141 | | jq -r '.[] | .SnapshotId' > "${SNAPSHOT_LIST}" 142 | aws ec2 describe-snapshots \ 143 | --owner-ids self \ 144 | --query 'Snapshots[?(Tags[?Value == `rhel-edge-ci`].Value)]' \ 145 | | jq -r '.[] | .SnapshotId' >> "${SNAPSHOT_LIST}" 146 | mapfile -t SNAPSHOTID_ARRAY < "${SNAPSHOT_LIST}" 147 | rm "${SNAPSHOT_LIST}" 148 | 149 | for line in "${SNAPSHOTID_ARRAY[@]}"; do 150 | CREATION_DATE=$( 151 | aws ec2 describe-snapshots \ 152 | --snapshot-ids "${line}" \ 153 | | jq -r '.Snapshots[] | .StartTime' 154 | ) 155 | SNAPSHOT_ID="${line}" 156 | SNAPSHOT_AGE=$(time_subtraction "${CREATION_DATE}") 157 | if [[ ${SNAPSHOT_AGE} == 1 ]]; then 158 | echo "Removing snapshot ${CREATION_DATE} ${SNAPSHOT_ID}" 159 | aws ec2 delete-snapshot --snapshot-id "${SNAPSHOT_ID}" || : 160 | fi 161 | done 162 | 163 | # Clean idle key-pairs 164 | greenprint "Checking AWS EC2 Idle key-pairs🔐" 165 | aws ec2 describe-key-pairs \ 166 | --query 'KeyPairs[?(Tags[?Value == `composer-ci`].Value)]' \ 167 | | jq -r '.[] | .KeyName' > "${KEYPAIR_LIST}" 168 | aws ec2 describe-key-pairs \ 169 | --query 'KeyPairs[?(Tags[?Value == `rhel-edge-ci`].Value)]' \ 170 | | jq -r '.[] | .KeyName' >> "${KEYPAIR_LIST}" 171 | mapfile -t KEYPAIR_ARRAY < "${KEYPAIR_LIST}" 172 | rm "${KEYPAIR_LIST}" 173 | 174 | for line in "${KEYPAIR_ARRAY[@]}"; do 175 | CREATION_DATE=$( 176 | aws ec2 describe-key-pairs \ 177 | --key-name "${line}" \ 178 | | jq -r '.KeyPairs[] | .CreateTime' 179 | ) 180 | KEYPAIR_NAME="${line}" 181 | KEYPAIR_AGE=$(time_subtraction "${CREATION_DATE}") 182 | if [[ ${KEYPAIR_AGE} == 1 ]]; then 183 | echo "Removing keypair ${CREATION_DATE} ${KEYPAIR_NAME}" 184 | aws ec2 delete-key-pair --key-name "${KEYPAIR_NAME}" || : 185 | fi 186 | done 187 | 188 | exit 0 189 | -------------------------------------------------------------------------------- /.github/workflows/rhel-9-5.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on RHEL 9.5.0 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-rhel-9-5')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 41 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 42 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 43 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 44 | 45 | edge-rhel-95-x86: 46 | needs: pr-info 47 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | continue-on-error: true 49 | runs-on: ubuntu-latest 50 | 51 | steps: 52 | - name: Clone repository 53 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 54 | with: 55 | ref: ${{ needs.pr-info.outputs.sha }} 56 | fetch-depth: 0 57 | 58 | - name: Run the tests 59 | uses: sclorg/testing-farm-as-github-action@v3.1.2 60 | with: 61 | compose: RHEL-9.5.0-Nightly 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.pr-info.outputs.repo_url }} 65 | git_ref: ${{ needs.pr-info.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=rhel-9-5" 68 | pull_request_status_name: "edge-rhel-9.5-x86" 69 | tmt_plan_regex: edge-x86 70 | tf_scope: private 71 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 72 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 73 | 74 | - name: Send test results to Slack via webhook 75 | if: always() 76 | run: | 77 | if [ "${{ job.status }}" = "success" ]; then 78 | emoji=":white_check_mark:" 79 | else 80 | emoji=":x:" 81 | fi 82 | 83 | curl -X POST -H 'Content-type: application/json' --data '{ 84 | "text": "Testing Farm Results for RHEL 9.5 x86", 85 | "blocks": [ 86 | { 87 | "type": "section", 88 | "text": { 89 | "type": "mrkdwn", 90 | "text": "'"$emoji"' *RHEL-9.5 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 91 | } 92 | } 93 | ] 94 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 95 | 96 | edge-rhel-95-arm: 97 | needs: pr-info 98 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 99 | continue-on-error: true 100 | runs-on: ubuntu-latest 101 | 102 | steps: 103 | - name: Clone repository 104 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 105 | with: 106 | ref: ${{ needs.pr-info.outputs.sha }} 107 | fetch-depth: 0 108 | 109 | - name: Run the tests 110 | uses: sclorg/testing-farm-as-github-action@v3.1.2 111 | with: 112 | compose: RHEL-9.5.0-Nightly 113 | arch: aarch64 114 | api_key: ${{ secrets.TF_API_KEY }} 115 | git_url: ${{ needs.pr-info.outputs.repo_url }} 116 | git_ref: ${{ needs.pr-info.outputs.ref }} 117 | update_pull_request_status: true 118 | tmt_context: "arch=aarch64;distro=rhel-9-5" 119 | pull_request_status_name: "edge-rhel-9.5-arm" 120 | tmt_plan_regex: edge-arm 121 | tf_scope: private 122 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 123 | variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 124 | 125 | - name: Send test results to Slack via webhook 126 | if: always() 127 | run: | 128 | if [ "${{ job.status }}" = "success" ]; then 129 | emoji=":white_check_mark:" 130 | else 131 | emoji=":x:" 132 | fi 133 | 134 | curl -X POST -H 'Content-type: application/json' --data '{ 135 | "text": "Testing Farm Results for RHEL 9.5 aarch64", 136 | "blocks": [ 137 | { 138 | "type": "section", 139 | "text": { 140 | "type": "mrkdwn", 141 | "text": "'"$emoji"' *RHEL-9.5 | aarch64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 142 | } 143 | } 144 | ] 145 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 146 | -------------------------------------------------------------------------------- /.github/workflows/rhel-9-6.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on RHEL 9.6.0 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-rhel-9-6')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 41 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 42 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 43 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 44 | 45 | edge-rhel-96-x86: 46 | needs: pr-info 47 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | continue-on-error: true 49 | runs-on: ubuntu-latest 50 | 51 | steps: 52 | - name: Clone repository 53 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 54 | with: 55 | ref: ${{ needs.pr-info.outputs.sha }} 56 | fetch-depth: 0 57 | 58 | - name: Run the tests 59 | uses: sclorg/testing-farm-as-github-action@v3.1.2 60 | with: 61 | compose: RHEL-9.6.0-Nightly 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.pr-info.outputs.repo_url }} 65 | git_ref: ${{ needs.pr-info.outputs.ref }} 66 | update_pull_request_status: true 67 | tmt_context: "arch=x86_64;distro=rhel-9-6" 68 | pull_request_status_name: "edge-rhel-9.6-x86" 69 | tmt_plan_regex: edge-x86 70 | tf_scope: private 71 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 72 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 73 | 74 | - name: Send test results to Slack via webhook 75 | if: always() 76 | run: | 77 | if [ "${{ job.status }}" = "success" ]; then 78 | emoji=":white_check_mark:" 79 | else 80 | emoji=":x:" 81 | fi 82 | 83 | curl -X POST -H 'Content-type: application/json' --data '{ 84 | "text": "Testing Farm Results for RHEL 9.6 x86", 85 | "blocks": [ 86 | { 87 | "type": "section", 88 | "text": { 89 | "type": "mrkdwn", 90 | "text": "'"$emoji"' *RHEL-9.6 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 91 | } 92 | } 93 | ] 94 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 95 | 96 | edge-rhel-96-arm: 97 | needs: pr-info 98 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 99 | continue-on-error: true 100 | runs-on: ubuntu-latest 101 | 102 | steps: 103 | - name: Clone repository 104 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 105 | with: 106 | ref: ${{ needs.pr-info.outputs.sha }} 107 | fetch-depth: 0 108 | 109 | - name: Run the tests 110 | uses: sclorg/testing-farm-as-github-action@v3.1.2 111 | with: 112 | compose: RHEL-9.6.0-Nightly 113 | arch: aarch64 114 | api_key: ${{ secrets.TF_API_KEY }} 115 | git_url: ${{ needs.pr-info.outputs.repo_url }} 116 | git_ref: ${{ needs.pr-info.outputs.ref }} 117 | update_pull_request_status: true 118 | tmt_context: "arch=aarch64;distro=rhel-9-6" 119 | pull_request_status_name: "edge-rhel-9.6-arm" 120 | tmt_plan_regex: edge-arm 121 | tf_scope: private 122 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 123 | variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 124 | 125 | - name: Send test results to Slack via webhook 126 | if: always() 127 | run: | 128 | if [ "${{ job.status }}" = "success" ]; then 129 | emoji=":white_check_mark:" 130 | else 131 | emoji=":x:" 132 | fi 133 | 134 | curl -X POST -H 'Content-type: application/json' --data '{ 135 | "text": "Testing Farm Results for RHEL 9.6 aarch64", 136 | "blocks": [ 137 | { 138 | "type": "section", 139 | "text": { 140 | "type": "mrkdwn", 141 | "text": "'"$emoji"' *RHEL-9.6 | aarch64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 142 | } 143 | } 144 | ] 145 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 146 | -------------------------------------------------------------------------------- /.github/workflows/rhel-9-4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on RHEL 9.4.0 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-rhel-9-4')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | - name: Get information for pull request 30 | uses: octokit/request-action@v2.x 31 | id: pr-api 32 | with: 33 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | 37 | outputs: 38 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 39 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 40 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 41 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 42 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 43 | 44 | edge-rhel-94-x86: 45 | needs: pr-info 46 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 47 | continue-on-error: true 48 | runs-on: ubuntu-latest 49 | 50 | steps: 51 | - name: Clone repository 52 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 53 | with: 54 | ref: ${{ needs.pr-info.outputs.sha }} 55 | fetch-depth: 0 56 | 57 | - name: Run the tests 58 | uses: sclorg/testing-farm-as-github-action@v3.1.2 59 | with: 60 | compose: RHEL-9.4.0-Nightly 61 | arch: x86_64 62 | api_key: ${{ secrets.TF_API_KEY }} 63 | git_url: ${{ needs.pr-info.outputs.repo_url }} 64 | git_ref: ${{ needs.pr-info.outputs.ref }} 65 | update_pull_request_status: true 66 | tmt_context: "arch=x86_64;distro=rhel-9-4" 67 | pull_request_status_name: "edge-rhel-9.4-x86" 68 | tmt_plan_regex: edge-x86 69 | tf_scope: private 70 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 71 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 72 | 73 | - name: Send test results to Slack via webhook 74 | if: always() 75 | run: | 76 | if [ "${{ job.status }}" = "success" ]; then 77 | emoji=":white_check_mark:" 78 | else 79 | emoji=":x:" 80 | fi 81 | 82 | curl -X POST -H 'Content-type: application/json' --data '{ 83 | "text": "Testing Farm Results for RHEL 9.4 x86", 84 | "blocks": [ 85 | { 86 | "type": "section", 87 | "text": { 88 | "type": "mrkdwn", 89 | "text": "'"$emoji"' *RHEL-9.4 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 90 | } 91 | } 92 | ] 93 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 94 | 95 | edge-rhel-94-arm: 96 | needs: pr-info 97 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 98 | continue-on-error: true 99 | runs-on: ubuntu-latest 100 | 101 | steps: 102 | - name: Clone repository 103 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 104 | with: 105 | ref: ${{ needs.pr-info.outputs.sha }} 106 | fetch-depth: 0 107 | 108 | - name: Run the tests 109 | uses: sclorg/testing-farm-as-github-action@v3.1.2 110 | with: 111 | compose: RHEL-9.4.0-Nightly 112 | arch: aarch64 113 | api_key: ${{ secrets.TF_API_KEY }} 114 | git_url: ${{ needs.pr-info.outputs.repo_url }} 115 | git_ref: ${{ needs.pr-info.outputs.ref }} 116 | update_pull_request_status: true 117 | tmt_context: "arch=aarch64;distro=rhel-9-4" 118 | pull_request_status_name: "edge-rhel-9.4-arm" 119 | tmt_plan_regex: edge-arm 120 | tf_scope: private 121 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 122 | variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 123 | 124 | - name: Send test results to Slack via webhook 125 | if: always() 126 | run: | 127 | if [ "${{ job.status }}" = "success" ]; then 128 | emoji=":white_check_mark:" 129 | else 130 | emoji=":x:" 131 | fi 132 | 133 | curl -X POST -H 'Content-type: application/json' --data '{ 134 | "text": "Testing Farm Results for RHEL 9.4 aarch64", 135 | "blocks": [ 136 | { 137 | "type": "section", 138 | "text": { 139 | "type": "mrkdwn", 140 | "text": "'"$emoji"' *RHEL-9.4 | aarch64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 141 | } 142 | } 143 | ] 144 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 145 | -------------------------------------------------------------------------------- /.github/workflows/centos-stream-9.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Run Edge Test on CS 9 3 | 4 | on: 5 | issue_comment: 6 | types: 7 | - created 8 | 9 | jobs: 10 | pr-info: 11 | if: ${{ github.event.issue.pull_request && 12 | (endsWith(github.event.comment.body, '/test-cs9')) }} 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Query author repository permissions 16 | uses: octokit/request-action@v2.x 17 | id: user_permission 18 | with: 19 | route: GET /repos/${{ github.repository }}/collaborators/${{ github.event.sender.login }}/permission 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | - name: Check if user does have correct permissions 24 | if: contains('admin write', fromJson(steps.user_permission.outputs.data).permission) 25 | id: check_user_perm 26 | run: | 27 | echo "User '${{ github.event.sender.login }}' has permission '${{ fromJson(steps.user_permission.outputs.data).permission }}' allowed values: 'admin', 'write'" 28 | echo "allowed_user=true" >> $GITHUB_OUTPUT 29 | 30 | - name: Get information for pull request 31 | uses: octokit/request-action@v2.x 32 | id: pr-api 33 | with: 34 | route: GET /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }} 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | 38 | outputs: 39 | allowed_user: ${{ steps.check_user_perm.outputs.allowed_user }} 40 | sha: ${{ fromJson(steps.pr-api.outputs.data).head.sha }} 41 | ref: ${{ fromJson(steps.pr-api.outputs.data).head.ref }} 42 | repo_url: ${{ fromJson(steps.pr-api.outputs.data).head.repo.html_url }} 43 | compose_id: ${{ fromJson(steps.pr-api.outputs.data).title }} 44 | 45 | edge-cs-9-x86: 46 | needs: pr-info 47 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 48 | continue-on-error: true 49 | runs-on: ubuntu-latest 50 | 51 | steps: 52 | - name: Clone repository 53 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 54 | with: 55 | ref: ${{ needs.pr-info.outputs.sha }} 56 | fetch-depth: 0 57 | 58 | - name: Run the tests 59 | uses: sclorg/testing-farm-as-github-action@v3.1.0 60 | with: 61 | compose: CentOS-Stream-9 62 | arch: x86_64 63 | api_key: ${{ secrets.TF_API_KEY }} 64 | git_url: ${{ needs.pr-info.outputs.repo_url }} 65 | git_ref: ${{ needs.pr-info.outputs.ref }} 66 | update_pull_request_status: true 67 | pull_request_status_name: "edge-cs-9-x86" 68 | tmt_context: "arch=x86_64;distro=cs-9" 69 | tmt_plan_regex: edge-x86 70 | tf_scope: private 71 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 72 | variables: "ARCH=x86_64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 73 | timeout: 180 74 | 75 | - name: Send test results to Slack via webhook 76 | if: always() 77 | run: | 78 | if [ "${{ job.status }}" = "success" ]; then 79 | emoji=":white_check_mark:" 80 | else 81 | emoji=":x:" 82 | fi 83 | 84 | curl -X POST -H 'Content-type: application/json' --data '{ 85 | "text": "Testing Farm Results for Centos-Stream 9 x86_64", 86 | "blocks": [ 87 | { 88 | "type": "section", 89 | "text": { 90 | "type": "mrkdwn", 91 | "text": "'"$emoji"' *CS-9 | x86_64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 92 | } 93 | } 94 | ] 95 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 96 | 97 | edge-cs-9-arm: 98 | needs: pr-info 99 | if: ${{ needs.pr-info.outputs.allowed_user == 'true' && github.event.issue.pull_request }} 100 | continue-on-error: true 101 | runs-on: ubuntu-latest 102 | 103 | steps: 104 | - name: Clone repository 105 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 106 | with: 107 | ref: ${{ needs.pr-info.outputs.sha }} 108 | fetch-depth: 0 109 | 110 | - name: Run the tests 111 | uses: sclorg/testing-farm-as-github-action@v3.1.0 112 | with: 113 | compose: CentOS-Stream-9 114 | arch: aarch64 115 | api_key: ${{ secrets.TF_API_KEY }} 116 | git_url: ${{ needs.pr-info.outputs.repo_url }} 117 | git_ref: ${{ needs.pr-info.outputs.ref }} 118 | update_pull_request_status: true 119 | pull_request_status_name: "edge-cs-9-arm" 120 | tmt_context: "arch=aarch64;distro=cs-9" 121 | tmt_plan_regex: edge-arm 122 | tf_scope: private 123 | secrets: "DOWNLOAD_NODE=${{ secrets.DOWNLOAD_NODE }};OCP4_TOKEN=${{ secrets.OCP4_TOKEN }};QUAY_USERNAME=${{ secrets.QUAY_USERNAME }};QUAY_PASSWORD=${{ secrets.QUAY_PASSWORD }};DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }};DOCKERHUB_PASSWORD=${{ secrets.DOCKERHUB_PASSWORD }};AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }};AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }};GOVC_URL=${{ secrets.GOVC_URL }};GOVC_USERNAME=${{ secrets.GOVC_USERNAME }};GOVC_PASSWORD=${{ secrets.GOVC_PASSWORD }}" 124 | variables: "ARCH=aarch64;AWS_DEFAULT_REGION=us-east-1;GOVC_INSECURE=1" 125 | timeout: 180 126 | 127 | - name: Send test results to Slack via webhook 128 | if: always() 129 | run: | 130 | if [ "${{ job.status }}" = "success" ]; then 131 | emoji=":white_check_mark:" 132 | else 133 | emoji=":x:" 134 | fi 135 | 136 | curl -X POST -H 'Content-type: application/json' --data '{ 137 | "text": "Testing Farm Results for Centos-Stream 9 aarch64", 138 | "blocks": [ 139 | { 140 | "type": "section", 141 | "text": { 142 | "type": "mrkdwn", 143 | "text": "'"$emoji"' *CS-9 | aarch64 | Compose-id: ${{ needs.pr-info.outputs.compose_id }} |* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Test Log>" 144 | } 145 | } 146 | ] 147 | }' ${{ secrets.SLACK_WEBHOOK_URL_RHEL_EDGE_CI }} 148 | -------------------------------------------------------------------------------- /iot-installer.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euox pipefail 3 | 4 | # Color output definitions 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | NC='\033[0m' # No Color 9 | 10 | # Logging functions 11 | log_info() { 12 | echo -e "${BLUE}[INFO]${NC} $*" 13 | } 14 | 15 | log_success() { 16 | echo -e "${GREEN}[SUCCESS]${NC} $*" 17 | } 18 | 19 | log_error() { 20 | echo -e "${RED}[ERROR]${NC} $*" >&2 21 | } 22 | 23 | # Function to cleanup on exit 24 | cleanup() { 25 | local exit_code=$? 26 | log_info "Cleaning up..." 27 | 28 | # Remove temporary directory 29 | if [[ -d "${TEMPDIR}" ]]; then 30 | rm -rf "${TEMPDIR}" 31 | fi 32 | 33 | # Stop and undefine VM if it exists 34 | if virsh list --all --name | grep -q "iot-${TEST_UUID}"; then 35 | log_info "Stopping and removing VM: iot-${TEST_UUID}" 36 | virsh destroy "iot-${TEST_UUID}" 2>/dev/null || true 37 | virsh undefine "iot-${TEST_UUID}" --nvram 2>/dev/null || true 38 | fi 39 | 40 | # Remove disk image 41 | local disk_image="/var/lib/libvirt/images/iot-${TEST_UUID}.qcow2" 42 | if [[ -f "${disk_image}" ]]; then 43 | rm -f "${disk_image}" 44 | fi 45 | 46 | exit "${exit_code}" 47 | } 48 | 49 | # Set trap to cleanup on exit 50 | trap cleanup EXIT INT TERM 51 | 52 | # Validate required environment variable 53 | if [[ -z "${COMPOSE:-}" ]]; then 54 | log_error "COMPOSE environment variable is not set" 55 | exit 1 56 | fi 57 | 58 | # Provision the software under test 59 | ./iot-setup.sh 60 | 61 | # Get OS data 62 | source /etc/os-release 63 | ARCH=$(uname -m) 64 | TEST_UUID=$(uuidgen) 65 | TEMPDIR=$(mktemp -d) 66 | GUEST_IP=192.168.100.50 67 | SSH_OPTIONS=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5) 68 | SSH_KEY="key/ostree_key" 69 | SSH_KEY_PUB=$(cat "${SSH_KEY}.pub") 70 | COMPOSE_URL="https://kojipkgs.fedoraproject.org/compose/iot/${COMPOSE}/compose/IoT/${ARCH}/iso" 71 | COMPOSE_ID=$(echo "${COMPOSE}" | cut -d- -f4) 72 | 73 | case "${ID}-${VERSION_ID}" in 74 | "fedora-43") 75 | OSTREE_REF="fedora/stable/${ARCH}/iot" 76 | OS_VARIANT="fedora-unknown" 77 | IMAGE_FILENAME="Fedora-IoT-ostree-43-${COMPOSE_ID}.${ARCH}.iso" 78 | ;; 79 | "fedora-44") 80 | OSTREE_REF="fedora/rawhide/${ARCH}/iot" 81 | OS_VARIANT="fedora-rawhide" 82 | IMAGE_FILENAME="Fedora-IoT-ostree-44-${COMPOSE_ID}.${ARCH}.iso" 83 | ;; 84 | *) 85 | log_error "Unsupported distro: ${ID}-${VERSION_ID}" 86 | exit 1 87 | ;; 88 | esac 89 | 90 | modksiso() { 91 | local isomount kspath iso newiso ksfiles ksfile ksbase newksfile oldks 92 | isomount=$(mktemp -d) 93 | kspath=$(mktemp -d) 94 | iso="$1" 95 | newiso="$2" 96 | 97 | if [[ -f "${newiso}" ]]; then 98 | log_info "Image already exists, skipping mkksiso" 99 | return 0 100 | fi 101 | 102 | log_info "Mounting ${iso} -> ${isomount}" 103 | sudo mount -v -o ro "${iso}" "${isomount}" 104 | 105 | readarray -t ksfiles < <(find "${isomount}" -maxdepth 1 -name '*.ks' -print) 106 | if [[ ${#ksfiles[@]} -eq 0 ]]; then 107 | log_error "No kickstart file found in ISO" 108 | exit 1 109 | fi 110 | ksfile="${ksfiles[0]}" 111 | log_info "Found kickstart file: ${ksfile}" 112 | 113 | ksbase=$(basename "${ksfile}") 114 | newksfile="${kspath}/${ksbase}" 115 | oldks=$(cat "${ksfile}") 116 | cat > "${newksfile}" << EOFKS 117 | text 118 | network --bootproto=dhcp --device=link --activate --onboot=on 119 | zerombr 120 | clearpart --all --initlabel --disklabel=gpt 121 | autopart --nohome --noswap --type=plain 122 | bootloader --append="console=tty0 console=ttyS0,115200n8" 123 | user --name=admin --groups=wheel --iscrypted --password=\$6\$1LgwKw9aOoAi/Zy9\$Pn3ErY1E8/yEanJ98evqKEW.DZp24HTuqXPJl6GYCm8uuobAmwxLv7rGCvTRZhxtcYdmC0.XnYRSR9Sh6de3p0 124 | sshkey --username=admin "${SSH_KEY_PUB}" 125 | ${oldks} 126 | poweroff 127 | %post --log=/var/log/anaconda/post-install.log --erroronfail 128 | echo 'admin ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers 129 | echo 'installeruser ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers 130 | %end 131 | EOFKS 132 | 133 | log_info "Writing new ISO" 134 | sudo mkksiso -c "console=ttyS0,115200" --rm-args "quiet" "${newksfile}" "${iso}" "${newiso}" 135 | 136 | log_info "==== NEW KICKSTART FILE ====" 137 | cat "${newksfile}" 138 | log_info "============================" 139 | } 140 | 141 | # Download OS image 142 | download_image() { 143 | log_info "Downloading OS image..." 144 | 145 | local image_url="${COMPOSE_URL}/${IMAGE_FILENAME}" 146 | 147 | if [[ -f "${IMAGE_FILENAME}" ]]; then 148 | log_info "Image already exists, skipping download" 149 | return 0 150 | fi 151 | 152 | if ! sudo wget --progress=bar:force "${image_url}"; then 153 | log_error "Failed to download image from ${image_url}" 154 | exit 1 155 | fi 156 | 157 | if [[ -f "${IMAGE_FILENAME}" ]]; then 158 | log_success "Download completed: ${IMAGE_FILENAME}" 159 | else 160 | log_error "Downloaded file not found: ${IMAGE_FILENAME}" 161 | exit 1 162 | fi 163 | } 164 | 165 | # Wait for SSH to be available 166 | wait_for_ssh() { 167 | local ip_address=$1 168 | local max_attempts=30 169 | local attempt=0 170 | 171 | log_info "Waiting for SSH on ${ip_address}..." 172 | 173 | while [[ ${attempt} -lt ${max_attempts} ]]; do 174 | if ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" "admin@${ip_address}" 'echo -n "READY"' 2>/dev/null | grep -q "READY"; then 175 | log_success "SSH is ready" 176 | return 0 177 | fi 178 | 179 | attempt=$((attempt + 1)) 180 | sleep 10 181 | done 182 | 183 | log_error "SSH connection timed out after $((max_attempts * 10)) seconds" 184 | return 1 185 | } 186 | 187 | # Main execution 188 | 189 | log_info "Starting fedora IoT simplified installer test" 190 | log_info "Test UUID: ${TEST_UUID}" 191 | log_info "Temporary directory: ${TEMPDIR}" 192 | 193 | download_image 194 | modksiso "${IMAGE_FILENAME}" "/var/lib/libvirt/images/${IMAGE_FILENAME}" 195 | 196 | virt-install --name="iot-${TEST_UUID}" \ 197 | --disk path="/var/lib/libvirt/images/iot-${TEST_UUID}.qcow2",size=20,format=qcow2 \ 198 | --ram 4096 \ 199 | --vcpus 2 \ 200 | --network network=integration,mac=34:49:22:B0:83:30 \ 201 | --os-variant "${OS_VARIANT}" \ 202 | --cdrom "/var/lib/libvirt/images/${IMAGE_FILENAME}" \ 203 | --boot uefi \ 204 | --nographics \ 205 | --noautoconsole \ 206 | --wait=-1 \ 207 | --noreboot 208 | 209 | log_info "Starting VM..." 210 | sudo virsh start "iot-${TEST_UUID}" 211 | 212 | # Wait for SSH 213 | if ! wait_for_ssh "${GUEST_IP}"; then 214 | exit 1 215 | fi 216 | 217 | # Create Ansible inventory 218 | log_info "Creating Ansible inventory..." 219 | tee "${TEMPDIR}/inventory" > /dev/null << EOF 220 | [ostree_guest] 221 | ${GUEST_IP} 222 | 223 | [ostree_guest:vars] 224 | ansible_python_interpreter=/usr/bin/python3 225 | ansible_user=admin 226 | ansible_private_key_file=${SSH_KEY} 227 | ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" 228 | ansible_become=yes 229 | ansible_become_method=sudo 230 | ansible_become_pass=foobar 231 | EOF 232 | 233 | # Run Ansible playbook 234 | log_info "Running Ansible playbook..." 235 | if ! ansible-playbook -v -i "${TEMPDIR}/inventory" -e fdo_credential="false" -e ostree_ref="fedora-iot:${OSTREE_REF}" check-ostree-iot.yaml; then 236 | log_error "Ansible playbook check failed" 237 | exit 1 238 | fi 239 | 240 | log_success "Test completed successfully" 241 | 242 | exit 0 243 | -------------------------------------------------------------------------------- /iot-bootc-image.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euox pipefail 3 | 4 | # Color output definitions 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | NC='\033[0m' # No Color 9 | 10 | # Logging functions 11 | log_info() { 12 | echo -e "${BLUE}[INFO]${NC} $*" 13 | } 14 | 15 | log_success() { 16 | echo -e "${GREEN}[SUCCESS]${NC} $*" 17 | } 18 | 19 | log_error() { 20 | echo -e "${RED}[ERROR]${NC} $*" >&2 21 | } 22 | 23 | # Function to cleanup on exit 24 | cleanup() { 25 | local exit_code=$? 26 | log_info "Cleaning up..." 27 | 28 | # Remove temporary directory 29 | if [[ -d "${TEMPDIR}" ]]; then 30 | rm -rf "${TEMPDIR}" 31 | fi 32 | 33 | # Stop and undefine VM if it exists 34 | if sudo virsh list --all --name | grep -q "iot-bootc-image-${TEST_UUID}"; then 35 | log_info "Stopping and removing VM: iot-bootc-image-${TEST_UUID}" 36 | sudo virsh destroy "iot-bootc-image-${TEST_UUID}" 2>/dev/null || true 37 | sudo virsh undefine "iot-bootc-image-${TEST_UUID}" --nvram 2>/dev/null || true 38 | fi 39 | 40 | # Remove disk image folder 41 | sudo rm -rf output 42 | 43 | # Remove container images 44 | sudo podman rmi -a -f 45 | 46 | exit "${exit_code}" 47 | } 48 | 49 | # Set trap to cleanup on exit 50 | trap cleanup EXIT INT TERM 51 | 52 | # Validate required environment variable 53 | if [[ -z "${COMPOSE:-}" ]]; then 54 | log_error "COMPOSE environment variable is not set" 55 | exit 1 56 | fi 57 | 58 | # Provision the software under test 59 | ./iot-setup.sh 60 | 61 | # Get OS data 62 | source /etc/os-release 63 | 64 | ARCH=$(uname -m) 65 | TEST_UUID=$(uuidgen) 66 | TEMPDIR=$(mktemp -d) 67 | GUEST_IP="192.168.100.50" 68 | SSH_OPTIONS=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5) 69 | SSH_KEY="key/ostree_key" 70 | SSH_KEY_PUB=$(cat "${SSH_KEY}.pub") 71 | EDGE_USER=core 72 | EDGE_USER_PASSWORD=foobar 73 | COMPOSE_URL="https://kojipkgs.fedoraproject.org/compose/iot/${COMPOSE}/compose/IoT/${ARCH}/images" 74 | COMPOSE_ID=$(echo "${COMPOSE}" | cut -d- -f4) 75 | 76 | CONTAINER_IMG_NAME=fedora-iot-bootc 77 | # QUAY_REPO_URL="quay.io/${QUAY_USERNAME}/${CONTAINER_IMG_NAME}" 78 | # QUAY_REPO_TAG="${QUAY_REPO_URL}:${VERSION_ID}" 79 | BOOTC_SYSTEM="true" 80 | 81 | # Set OS-specific variables 82 | case "${ID}-${VERSION_ID}" in 83 | "fedora-43") 84 | OS_VARIANT="fedora-unknown" 85 | OCI_ARCHIVE="Fedora-IoT-bootc-${ARCH}-43.${COMPOSE_ID}.ociarchive" 86 | ;; 87 | "fedora-44") 88 | OS_VARIANT="fedora-rawhide" 89 | OCI_ARCHIVE="Fedora-IoT-bootc-${ARCH}-44.${COMPOSE_ID}.ociarchive" 90 | ;; 91 | *) 92 | log_error "Unsupported distro: ${ID}-${VERSION_ID}" 93 | exit 1 94 | ;; 95 | esac 96 | 97 | # Download OS image 98 | download_image() { 99 | log_info "Downloading OS image..." 100 | 101 | local image_url="${COMPOSE_URL}/${OCI_ARCHIVE}" 102 | if [[ -f "${OCI_ARCHIVE}" ]]; then 103 | log_info "Container image already exists, skipping download" 104 | return 0 105 | fi 106 | 107 | if ! sudo wget --progress=bar:force "${image_url}"; then 108 | log_error "Failed to download image from ${image_url}" 109 | exit 1 110 | fi 111 | 112 | if [[ -f "${OCI_ARCHIVE}" ]]; then 113 | log_success "Download completed: ${OCI_ARCHIVE}" 114 | else 115 | log_error "Downloaded file not found: ${OCI_ARCHIVE}" 116 | exit 1 117 | fi 118 | } 119 | 120 | # Wait for SSH to be available 121 | wait_for_ssh() { 122 | local ip_address=$1 123 | local max_attempts=30 124 | local attempt=0 125 | 126 | log_info "Waiting for SSH on ${ip_address}..." 127 | 128 | while [[ ${attempt} -lt ${max_attempts} ]]; do 129 | if ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" "${EDGE_USER}@${ip_address}" 'echo -n "READY"' 2>/dev/null | grep -q "READY"; then 130 | log_success "SSH is ready" 131 | return 0 132 | fi 133 | 134 | attempt=$((attempt + 1)) 135 | sleep 10 136 | done 137 | 138 | log_error "SSH connection timed out after $((max_attempts * 10)) seconds" 139 | return 1 140 | } 141 | 142 | # Main execution 143 | log_info "Starting fedora IoT bootc image test" 144 | log_info "Test UUID: ${TEST_UUID}" 145 | log_info "Temporary directory: ${TEMPDIR}" 146 | 147 | # Execute steps 148 | download_image 149 | 150 | # Container image settings 151 | OCI_ARCHIVE_TAG="${VERSION_ID}" 152 | 153 | log_info "Copying container image into storage with a controlled tag" 154 | sudo skopeo copy oci-archive:"${OCI_ARCHIVE}" containers-storage:"${CONTAINER_IMG_NAME}:${OCI_ARCHIVE_TAG}" 155 | 156 | log_info "Preparing bib configuration file..." 157 | tee config.json > /dev/null << EOF 158 | { 159 | "blueprint": { 160 | "customizations": { 161 | "user": [ 162 | { 163 | "name": "${EDGE_USER}", 164 | "password": "${EDGE_USER_PASSWORD}", 165 | "key": "${SSH_KEY_PUB}", 166 | "groups": [ 167 | "wheel" 168 | ] 169 | } 170 | ] 171 | } 172 | } 173 | } 174 | EOF 175 | 176 | # Prepare output folder 177 | mkdir -pv output 178 | 179 | log_info "Generating disk image using bib..." 180 | sudo podman run \ 181 | --rm \ 182 | -it \ 183 | --privileged \ 184 | --pull=newer \ 185 | --security-opt label=type:unconfined_t \ 186 | -v "$(pwd)"/config.json:/config.json \ 187 | -v "$(pwd)"/output:/output \ 188 | -v /var/lib/containers/storage:/var/lib/containers/storage \ 189 | quay.io/centos-bootc/bootc-image-builder:latest \ 190 | --type qcow2 \ 191 | --local \ 192 | --config /config.json \ 193 | --rootfs xfs \ 194 | --use-librepo=true \ 195 | "${CONTAINER_IMG_NAME}:${OCI_ARCHIVE_TAG}" 196 | # "${QUAY_REPO_TAG}" 197 | 198 | log_info "Starting VM installation..." 199 | sudo mv ./output/qcow2/disk.qcow2 /var/lib/libvirt/images/"${TEST_UUID}"-disk.qcow2 200 | LIBVIRT_IMAGE_PATH=/var/lib/libvirt/images/${TEST_UUID}-disk.qcow2 201 | sudo restorecon -Rv /var/lib/libvirt/images/ 202 | 203 | sudo virt-install --name="iot-bootc-image-${TEST_UUID}"\ 204 | --disk path="${LIBVIRT_IMAGE_PATH}",format=qcow2 \ 205 | --ram 4096 \ 206 | --vcpus 4 \ 207 | --network network=integration,mac=34:49:22:B0:83:30 \ 208 | --os-type linux \ 209 | --os-variant ${OS_VARIANT} \ 210 | --boot "uefi" \ 211 | --nographics \ 212 | --noautoconsole \ 213 | --wait=-1 \ 214 | --import \ 215 | --noreboot 216 | 217 | log_info "Starting VM..." 218 | sudo virsh start "iot-bootc-image-${TEST_UUID}" 219 | 220 | # Wait for SSH 221 | if ! wait_for_ssh "${GUEST_IP}"; then 222 | exit 1 223 | fi 224 | 225 | # Create Ansible inventory 226 | log_info "Creating Ansible inventory..." 227 | tee "${TEMPDIR}/inventory" > /dev/null << EOF 228 | [ostree_guest] 229 | ${GUEST_IP} 230 | 231 | [ostree_guest:vars] 232 | ansible_python_interpreter=/usr/bin/python3 233 | ansible_user=${EDGE_USER} 234 | ansible_private_key_file=${SSH_KEY} 235 | ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" 236 | ansible_become=yes 237 | ansible_become_method=sudo 238 | ansible_become_pass=${EDGE_USER_PASSWORD} 239 | EOF 240 | 241 | # Run Ansible playbook 242 | log_info "Running Ansible playbook..." 243 | if ! sudo ansible-playbook -v -i "${TEMPDIR}/inventory" -e bootc_system="${BOOTC_SYSTEM}" check-ostree-iot.yaml; then 244 | log_error "Ansible playbook check failed" 245 | exit 1 246 | fi 247 | 248 | log_success "Test completed successfully" 249 | 250 | exit 0 251 | -------------------------------------------------------------------------------- /iot-raw-image.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euox pipefail 3 | 4 | # Color output definitions 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | BLUE='\033[0;34m' 8 | NC='\033[0m' # No Color 9 | 10 | # Logging functions 11 | log_info() { 12 | echo -e "${BLUE}[INFO]${NC} $*" 13 | } 14 | 15 | log_success() { 16 | echo -e "${GREEN}[SUCCESS]${NC} $*" 17 | } 18 | 19 | log_error() { 20 | echo -e "${RED}[ERROR]${NC} $*" >&2 21 | } 22 | 23 | # Function to cleanup on exit 24 | cleanup() { 25 | local exit_code=$? 26 | log_info "Cleaning up..." 27 | 28 | # Remove temporary directory 29 | if [[ -d "${TEMPDIR}" ]]; then 30 | rm -rf "${TEMPDIR}" 31 | fi 32 | 33 | # Remove ignition directory 34 | if [[ -d "/var/www/html/ignition" ]]; then 35 | sudo rm -rf "/var/www/html/ignition" 36 | fi 37 | 38 | # Stop and undefine VM if it exists 39 | if sudo virsh list --all --name | grep -q "iot-${TEST_UUID}"; then 40 | log_info "Stopping and removing VM: iot-${TEST_UUID}" 41 | sudo virsh destroy "iot-${TEST_UUID}" 2>/dev/null || true 42 | sudo virsh undefine "iot-${TEST_UUID}" --nvram 2>/dev/null || true 43 | fi 44 | 45 | # Remove raw image 46 | sudo rm -f "/var/lib/libvirt/images/iot-${TEST_UUID}.qcow2" 47 | sudo rm -f "iot-${TEST_UUID}.qcow2" 48 | sudo rm -f "${RAW_IMAGE}.qcow2" 49 | sudo rm -f "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" 50 | 51 | exit "${exit_code}" 52 | } 53 | 54 | # Set trap to cleanup on exit 55 | trap cleanup EXIT INT TERM 56 | 57 | # Validate required environment variable 58 | if [[ -z "${COMPOSE:-}" ]]; then 59 | log_error "COMPOSE environment variable is not set" 60 | exit 1 61 | fi 62 | 63 | # Provision the software under test 64 | ./iot-setup.sh 65 | 66 | # Get OS data 67 | source /etc/os-release 68 | 69 | ARCH=$(uname -m) 70 | TEST_UUID=$(uuidgen) 71 | TEMPDIR=$(mktemp -d) 72 | GUEST_IP="192.168.100.50" 73 | SSH_OPTIONS=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5) 74 | SSH_KEY="key/ostree_key" 75 | SSH_KEY_PUB=$(cat "${SSH_KEY}.pub") 76 | EDGE_USER="admin" 77 | EDGE_USER_PASSWORD="foobar" 78 | COMPOSE_URL="https://kojipkgs.fedoraproject.org/compose/iot/${COMPOSE}/compose/IoT/${ARCH}/images" 79 | COMPOSE_ID=$(echo "${COMPOSE}" | cut -d- -f4) 80 | ADD_STORAGE="+10G" 81 | 82 | # Set OS-specific variables 83 | case "${ID}-${VERSION_ID}" in 84 | "fedora-43") 85 | OSTREE_REF="fedora/stable/${ARCH}/iot" 86 | OS_VARIANT="fedora-unknown" 87 | RAW_IMAGE="Fedora-IoT-raw-43-${COMPOSE_ID}.${ARCH}.raw.xz" 88 | ;; 89 | "fedora-44") 90 | OSTREE_REF="fedora/rawhide/${ARCH}/iot" 91 | OS_VARIANT="fedora-rawhide" 92 | RAW_IMAGE="Fedora-IoT-raw-44-${COMPOSE_ID}.${ARCH}.raw.xz" 93 | ;; 94 | *) 95 | log_error "Unsupported distro: ${ID}-${VERSION_ID}" 96 | exit 1 97 | ;; 98 | esac 99 | 100 | setup_ignition() { 101 | log_info "Setting up Ignition configuration..." 102 | 103 | local ignition_dir="/var/www/html/ignition" 104 | local ignition_file="${ignition_dir}/fiot.ign" 105 | 106 | [ -d "${ignition_dir}" ] || sudo mkdir -p "${ignition_dir}" 107 | 108 | sudo tee "${ignition_file}" > /dev/null << EOF 109 | { 110 | "ignition": { 111 | "version": "3.4.0" 112 | }, 113 | "passwd": { 114 | "users": [ 115 | { 116 | "groups": [ 117 | "wheel" 118 | ], 119 | "homeDir": "/home/admin", 120 | "name": "admin", 121 | "passwordHash": "\$6\$GRmb7S0p8vsYmXzH\$o0E020S.9JQGaHkszoog4ha4AQVs3sk8q0DvLjSMxoxHBKnB2FBXGQ/OkwZQfW/76ktHd0NX5nls2LPxPuUdl.", 122 | "shell": "/bin/bash", 123 | "sshAuthorizedKeys": [ 124 | "$SSH_KEY_PUB" 125 | ] 126 | } 127 | ] 128 | } 129 | } 130 | EOF 131 | 132 | if [[ -f "${ignition_file}" ]]; then 133 | log_success "Ignition configuration created at ${ignition_file}" 134 | else 135 | log_error "Failed to create Ignition configuration" 136 | exit 1 137 | fi 138 | } 139 | 140 | # Download OS image 141 | download_image() { 142 | log_info "Downloading OS image..." 143 | 144 | local image_url="${COMPOSE_URL}/${RAW_IMAGE}" 145 | if [[ -f "${RAW_IMAGE}" ]]; then 146 | log_info "Container image already exists, skipping download" 147 | return 0 148 | fi 149 | 150 | if ! sudo wget --progress=bar:force "${image_url}"; then 151 | log_error "Failed to download image from ${image_url}" 152 | exit 1 153 | fi 154 | 155 | if [[ -f "${RAW_IMAGE}" ]]; then 156 | log_success "Download completed: ${RAW_IMAGE}" 157 | else 158 | log_error "Downloaded file not found: ${RAW_IMAGE}" 159 | exit 1 160 | fi 161 | } 162 | 163 | # Wait for SSH to be available 164 | wait_for_ssh() { 165 | local ip_address=$1 166 | local max_attempts=30 167 | local attempt=0 168 | 169 | log_info "Waiting for SSH on ${ip_address}..." 170 | 171 | while [[ ${attempt} -lt ${max_attempts} ]]; do 172 | if ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" "${EDGE_USER}@${ip_address}" 'echo -n "READY"' 2>/dev/null | grep -q "READY"; then 173 | log_success "SSH is ready" 174 | return 0 175 | fi 176 | 177 | attempt=$((attempt + 1)) 178 | sleep 10 179 | done 180 | 181 | log_error "SSH connection timed out after $((max_attempts * 10)) seconds" 182 | return 1 183 | } 184 | 185 | # Main execution 186 | log_info "Starting fedora IoT raw image test" 187 | log_info "Test UUID: ${TEST_UUID}" 188 | log_info "Temporary directory: ${TEMPDIR}" 189 | 190 | # Execute steps 191 | download_image 192 | setup_ignition 193 | sudo restorecon -Rv /var/www/html/ignition 194 | 195 | sudo xz -d "${RAW_IMAGE}" 196 | sudo qemu-img resize "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" "$ADD_STORAGE" 197 | echo ", +" | sudo sfdisk -N 3 "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" 198 | 199 | log_info "Create device-mapper entries for each partition" 200 | sudo kpartx -av "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" 201 | 202 | # Mount boot partition 203 | [ -d /tmp/boot ] || sudo mkdir /tmp/boot 204 | sudo mount /dev/mapper/loop0p2 /tmp/boot 205 | 206 | log_info "Embedding ignition configuration file into raw image..." 207 | sudo sed -i "s|systemd.condition-first-boot=true|systemd.condition-first-boot=true ignition.firstboot=1 ignition.config.url=http://192.168.100.1/ignition/fiot.ign|g" /tmp/boot/ignition.firstboot 208 | 209 | # Umount boot partition 210 | sudo umount /tmp/boot 211 | 212 | # Deleting mappings 213 | sudo kpartx -dv "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" 214 | 215 | sudo qemu-img convert -f raw "Fedora-IoT-raw-${VERSION_ID}-${COMPOSE_ID}.${ARCH}.raw" -O qcow2 "iot-${TEST_UUID}.qcow2" 216 | sudo cp "iot-${TEST_UUID}.qcow2" "/var/lib/libvirt/images/iot-${TEST_UUID}.qcow2" 217 | sudo restorecon -Rv /var/lib/libvirt/images/ 218 | 219 | sudo virt-install --name="iot-${TEST_UUID}" \ 220 | --disk path="/var/lib/libvirt/images/iot-${TEST_UUID}.qcow2",format=qcow2 \ 221 | --ram 4096 \ 222 | --vcpus 2 \ 223 | --network network=integration,mac=34:49:22:B0:83:30 \ 224 | --os-type linux \ 225 | --os-variant ${OS_VARIANT} \ 226 | --boot uefi \ 227 | --nographics \ 228 | --noautoconsole \ 229 | --wait=-1 \ 230 | --import \ 231 | --noreboot 232 | 233 | log_info "Starting VM..." 234 | sudo virsh start "iot-${TEST_UUID}" 235 | 236 | # Wait for SSH 237 | if ! wait_for_ssh "${GUEST_IP}"; then 238 | exit 1 239 | fi 240 | 241 | # Create Ansible inventory 242 | log_info "Creating Ansible inventory..." 243 | tee "${TEMPDIR}/inventory" > /dev/null << EOF 244 | [ostree_guest] 245 | ${GUEST_IP} 246 | 247 | [ostree_guest:vars] 248 | ansible_python_interpreter=/usr/bin/python3 249 | ansible_user=${EDGE_USER} 250 | ansible_private_key_file=${SSH_KEY} 251 | ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" 252 | ansible_become=yes 253 | ansible_become_method=sudo 254 | ansible_become_pass=${EDGE_USER_PASSWORD} 255 | EOF 256 | 257 | # Run Ansible playbook 258 | log_info "Running Ansible playbook..." 259 | if ! sudo ansible-playbook -v -i "${TEMPDIR}/inventory" -e ostree_ref="fedora-iot:${OSTREE_REF}" check-ostree-iot.yaml; then 260 | log_error "Ansible playbook check failed" 261 | exit 1 262 | fi 263 | 264 | log_success "Test completed successfully" 265 | 266 | exit 0 267 | 268 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RHEL-Edge 2 | 3 | RHEL-Edge help [documentation](HELP.md) 4 | 5 | ## RHEL-Edge Test Scope 6 | 7 | RHEL for Edge test from QE is more like an integration test. The test flow aligns with the customer scenario. The whole test includes three parts: 8 | 9 | 1. RHEL for Edge image building with [osbuild-composer](https://github.com/osbuild/osbuild-composer.git) 10 | 11 | - Build RHEL 8 and RHEL 9 x86_64 images at OpenStack VM 12 | - Build CentOS Stream 8, CentOS Stream 9 and Fedora x86_64 images at Google Cloud VM 13 | - Build ARM images on bare metal ARM server or ARM VM at beaker 14 | 15 | 2. RHEL for Edge image installation 16 | 17 | - `edge-commit/iot-commit`: Setup HTTP server to serve as ostree repo, and HTTP boot to install with kickstart 18 | - `edge-container/iot-container`: Setup prod ostree repo, `edge-container/iot-container` as stage repo, and install with kickstart from prod ostree repo 19 | - `edge-installer/iot-installer`: Install from `edge-installer/iot-installer` ISO 20 | - `edge-raw-image/iot-raw-image`: Boot from raw image with KVM 21 | - `edge-simplified-installer`: Install from `edge-simplified-installer` ISO 22 | - `minimal-raw`: Boot from RPM based raw image with KVM 23 | - `edge-ami`: Image for AWS ec2 instance 24 | 25 | 3. RHEL for Edge system upgrade 26 | 27 | - Upgrade with the same OSTree ref 28 | - Rebase to a new OSTree ref 29 | - Upgrade from RHEL 8 to RHEL 9 or from CentOS Stream 8 to CentOS Stream 9 30 | 31 | 3. Checkings after installation/upgrade. 32 | 33 | - Check installed ostree commit 34 | - Check mount point 35 | - Check [`greenboot`](https://github.com/fedora-iot/greenboot.git) services 36 | - Run container with `podman` (root and non-root) 37 | - Check persistent journal log 38 | - Check FDO onboarding and status (simplified-installer only) 39 | - Check LVM PV and LV, and check growfs (raw-image and simplified-installer only) 40 | - Check auto rollback with [`greenboot`](https://github.com/fedora-iot/greenboot.git) when failure is detected 41 | - Check ignition configurations (raw-image and simplified-installer only) 42 | 43 | ## RHEL-Edge CI 44 | 45 | ### Upstream CI 46 | 47 | For RHEL-Edge project, 90% of features come from [osbuild](https://github.com/osbuild/osbuild.git) and [osbuild-composer](https://github.com/osbuild/osbuild-composer.git). In this case, [osbuild](https://github.com/osbuild/osbuild.git) and [osbuild-composer](https://github.com/osbuild/osbuild-composer.git) CI will be used ad RHEL-Edge project upstream CI. 48 | 49 | The Upstream CI is triggered by each PR and it focuses on code change. 50 | 51 | Considering Upstream CI environment and test duration, the Upstream CI only covers virtualization tests, bare metal is out of Upstream CI scope. 52 | 53 | ### Downstream CI 54 | 55 | [RHEL 8/9, CentOS Stream 8/9 report dashboard](https://github.com/virt-s1/rhel-edge/projects/1) 56 | 57 | [Fedora report dashboard](https://github.com/virt-s1/rhel-edge/projects/2) 58 | 59 | [Package greenboot, fido-device-onboard, rust-coreos-installer, rpm-ostree, ostree report](https://github.com/virt-s1/rhel-edge/projects/3) 60 | 61 | [Customer case test report](https://github.com/virt-s1/rhel-edge/projects/4) 62 | 63 | ### CI for this repository 64 | 65 | CI for this repository is to test `test code`. It's triggered by PR in this repository. Any changes for `test code` has to be pass all tests of CI before they are merged into master. 66 | 67 | Test of this CI includes: 68 | 69 | 1. [commit lint](https://www.conventionalcommits.org/en/v1.0.0/) 70 | 2. [spell check](https://github.com/codespell-project/codespell) 71 | 3. [Shellcheck](https://www.shellcheck.net/): running on Github 72 | 4. [Yaml lint](https://yamllint.readthedocs.io/en/stable/): running on Github 73 | 5. [Edge tests](https://github.com/virt-s1/rhel-edge/blob/main/CI.md#rhel-for-edge-ci): running on Github 74 | 75 | RHEL-Edge CI details can be found from [CI doc](CI.md) 76 | 77 | ## RHEL-Edge Test 78 | 79 | ### Test Scenario 80 | 81 | Test suites in scenario: 82 | 83 | 1. [`ostree.sh`](ostree.sh) and [`arm-commit.sh`](arm-commit.sh): edge-commit/iot-commit(tar) image type test on RHEL 8.x, RHEL 9.x, CentOS Stream 8, CentOS Stream 9, and Fedora 84 | 2. [`ostree-ng.sh`](ostree-ng.sh) and [`arm-installer.sh`](arm-installer.sh): edge-container/iot-container and edge-installer/iot-installer(ISO) image types test on RHEL 8.x, RHEL 9.x, CentOS Stream 8, CentOS Stream 9 and Fedora 85 | 3. [`ostree-raw-image.sh`](ostree-raw-image.sh) and [`arm-raw.sh`](arm-raw.sh): edge-raw-image/iot-raw-image(raw) image types test on RHEL 8.x, RHEL 9.x, CentOS Stream 8, CentOS Stream 9, and Fedora 86 | 4. [`ostree-simplified-installer.sh`](ostree-simplified-installer.sh) and [`arm-simplified.sh`](arm-simplified.sh): edge-simplified-installer(ISO) image types test on RHEL 8.x, RHEL 9.x, CentOS Stream 8, and CentOS Stream 9 87 | 5. [`arm-rebase.sh`](arm-rebase.sh): Different ostree ref rebase test on RHEL 8.x and CentOS Stream 8 88 | 6. [`ostree-8-to-9.sh`](ostree-8-to-9.sh): RHEL 8/CentOS Stream 8 Edge system upgrade to RHEL 9/CentOS Stream 9 Edge system test 89 | 6. [`ostree-9-to-9.sh`](ostree-9-to-9.sh): RHEL 9/CentOS Stream 9 Edge system upgrade and rebase to RHEL 9/CentOS Stream 9 Edge system test 90 | 7. [`minimal-raw.sh`](minimal-raw.sh) and [`arm-minimal.sh`](arm-minimal.sh): RPM based system test (Not ostree) 91 | 8. [`ostree-ignition.sh`](ostree-ignition.sh) and [`arm-ignition.sh`](arm-ignition.sh): Ignition test for simplified installer and raw image 92 | 8. [`ostree-ami-image.sh`](ostree-ami-image.sh): AWS ec2 instance image test 93 | 94 | ### Test environment 95 | 96 | #### For x86_64 97 | 98 | You can run RHEL for Edge test on any x86_64 machine, like server, laptop, or VM, but KVM has to be enabled. Otherwise QEMU will be used and the test will take a really long time. 99 | 100 | $ls -l /dev/kvm 101 | 102 | #### for ARM 103 | 104 | To run RHEL for Edge test on ARM server, a bare metal ARM server is required. 105 | 106 | #### Supported OS 107 | 108 | RHEL 8.6/8.8/8.9 109 | RHEL 9.0/9.2/9.3 110 | CentOS Stream 8 111 | CentOS Stream 9 112 | Fedora 37 (Simplified-installer not supported) 113 | Fedora 38 (Simplified-installer not supported) 114 | Fedora rawhide (Simplified-installer not supported) 115 | 116 | ### Test Run 117 | 118 | #### For x86_64 119 | 120 | $ DOWNLOAD_NODE="hello-world.com" ./ostree.sh 121 | $ DOWNLOAD_NODE="hello-world.com" OCP4_TOKEN=abcdefg QUAY_USERNAME=rhel-edge QUAY_PASSWORD=123456 ./ostree-ng.sh 122 | $ DOWNLOAD_NODE="hello-world.com" DOCKERHUB_USERNAME=rhel-edge DOCKERHUB_PASSWORD=123456 ./ostree-raw-image.sh 123 | $ DOWNLOAD_NODE="hello-world.com" ./ostree-simplified-installer.sh 124 | $ DOWNLOAD_NODE="hello-world.com" ./ostree-8-to-9.sh 125 | $ DOWNLOAD_NODE="hello-world.com" ./ostree-9-to-9.sh 126 | $ ./minimal-raw.sh (Fedora 37 and above) 127 | $ DOWNLOAD_NODE="hello-world.com" ./ostree-ignition.sh 128 | $ DOWNLOAD_NODE="hello-world.com" ./ostree-ami-image.sh 129 | 130 | #### For ARM64 131 | 132 | $ tools/deploy_bare.sh 133 | $ DOWNLOAD_NODE="hello-world.com" ./arm-commit.sh 134 | $ DOWNLOAD_NODE="hello-world.com" QUAY_USERNAME=rhel-edge QUAY_PASSWORD=123456 ./arm-installer.sh 135 | $ DOWNLOAD_NODE="hello-world.com" DOCKERHUB_USERNAME=rhel-edge DOCKERHUB_PASSWORD=123456 ./arm-raw.sh 136 | $ DOWNLOAD_NODE="hello-world.com" ./arm-simplified.sh 137 | $ DOWNLOAD_NODE="hello-world.com" ./arm-ignition.sh 138 | $ DOWNLOAD_NODE="hello-world.com" ./arm-minimal.sh 139 | 140 | can be one of "rhel-9-3", "centos-stream-9", "fedora-38" 141 | 142 | ### Test Configuration 143 | 144 | You can set these environment variables to run test 145 | 146 | QUAY_USERNAME quay.io username 147 | Used to test pushing Edge OCI-archive image to quay.io 148 | QUAY_PASSWORD quay.io password 149 | Used to test pushing Edge OCI-archive image to quay.io 150 | DOCKERHUB_USERNAME Docker hub account username 151 | Used to test pushing Edge OCI-archive image to Docker hub 152 | DOCKERHUB_PASSWORD Docker hub account password 153 | Used to test pushing Edge OCI-archive image to Docker hub 154 | OCP4_TOKEN Edit-able SA token on PSI Openshift 4 155 | Deploy edge-container on PSI OCP4 156 | DOWNLOAD_NODE RHEL nightly compose download URL 157 | 158 | ## Contact us 159 | 160 | - RHEL for Edge discussion channel: [`Google Chat room`](https://mail.google.com/chat/u/0/#chat/space/AAAAlhJ-myk) 161 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euox pipefail 3 | 4 | # Dumps details about the instance running the CI job. 5 | CPUS=$(nproc) 6 | MEM=$(free -m | grep -oP '\d+' | head -n 1) 7 | DISK=$(df --output=size -h / | sed '1d;s/[^0-9]//g') 8 | HOSTNAME=$(uname -n) 9 | USER=$(whoami) 10 | ARCH=$(uname -m) 11 | KERNEL=$(uname -r) 12 | 13 | echo -e "\033[0;36m" 14 | cat << EOF 15 | ------------------------------------------------------------------------------ 16 | CI MACHINE SPECS 17 | ------------------------------------------------------------------------------ 18 | Hostname: ${HOSTNAME} 19 | User: ${USER} 20 | CPUs: ${CPUS} 21 | RAM: ${MEM} MB 22 | DISK: ${DISK} GB 23 | ARCH: ${ARCH} 24 | KERNEL: ${KERNEL} 25 | ------------------------------------------------------------------------------ 26 | EOF 27 | echo "CPU info" 28 | lscpu 29 | echo "" 30 | echo "Filesystem usage:" 31 | df -h /run /tmp / 2>/dev/null || df -h 32 | echo "" 33 | echo "Top space consumers in /run:" 34 | du -sh /run/* 2>/dev/null | sort -h | tail -10 || echo "No data in /run yet" 35 | echo -e "\033[0m" 36 | 37 | # Get OS data. 38 | source /etc/os-release 39 | 40 | # Colorful output. 41 | function greenprint { 42 | echo -e "\033[1;32m${1}\033[0m" 43 | } 44 | 45 | # set locale to en_US.UTF-8 46 | sudo dnf install -y glibc-langpack-en 47 | sudo localectl set-locale LANG=en_US.UTF-8 48 | 49 | # Install required packages 50 | greenprint "Install required packages" 51 | sudo dnf install -y --nogpgcheck httpd osbuild osbuild-composer composer-cli podman skopeo wget firewalld lorax xorriso curl jq expect qemu-img qemu-kvm libvirt-client libvirt-daemon-kvm libvirt-daemon virt-install rpmdevtools createrepo_c 52 | 53 | # Customize repository 54 | sudo mkdir -p /etc/osbuild-composer/repositories 55 | 56 | case "${ID}-${VERSION_ID}" in 57 | "rhel-8.10") 58 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-8-10-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-810.json > /dev/null;; 59 | "rhel-9.4") 60 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-8-10-0-sha512.json | sudo tee /etc/osbuild-composer/repositories/rhel-810.json > /dev/null 61 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-3-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-93.json > /dev/null 62 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-4-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-94.json > /dev/null;; 63 | "rhel-9.5") 64 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-8-10-0-sha512.json | sudo tee /etc/osbuild-composer/repositories/rhel-810.json > /dev/null 65 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-4-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-94.json > /dev/null 66 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-5-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-95.json > /dev/null;; 67 | "rhel-9.6") 68 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-8-10-0-sha512.json | sudo tee /etc/osbuild-composer/repositories/rhel-810.json > /dev/null 69 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-5-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-95.json > /dev/null 70 | sed "s/REPLACE_ME_HERE/${DOWNLOAD_NODE}/g" files/rhel-9-6-0.json | sudo tee /etc/osbuild-composer/repositories/rhel-96.json > /dev/null;; 71 | "centos-9") 72 | sudo cp files/centos-stream-9.json /etc/osbuild-composer/repositories/centos-9.json;; 73 | "centos-10") 74 | sudo cp files/centos-stream-10.json /etc/osbuild-composer/repositories/centos-10.json;; 75 | "fedora-41") 76 | sudo cp files/fedora-41.json /etc/osbuild-composer/repositories/fedora-41.json 77 | ;; 78 | "fedora-42") 79 | sudo cp files/fedora-42.json /etc/osbuild-composer/repositories/fedora-42.json 80 | ;; 81 | "fedora-43") 82 | sudo cp files/fedora-43.json /etc/osbuild-composer/repositories/fedora-43.json 83 | ;; 84 | *) 85 | echo "unsupported distro: ${ID}-${VERSION_ID}" 86 | exit 1;; 87 | esac 88 | 89 | # Check ostree_key permissions 90 | KEY_PERMISSION_PRE=$(stat -L -c "%a %G %U" key/ostree_key | grep -oP '\d+' | head -n 1) 91 | echo -e "${KEY_PERMISSION_PRE}" 92 | if [[ "${KEY_PERMISSION_PRE}" != "600" ]]; then 93 | greenprint "💡 File permissions too open...Changing to 600" 94 | chmod 600 ./key/ostree_key 95 | fi 96 | 97 | # Start httpd server as prod ostree repo 98 | greenprint "Start httpd service" 99 | sudo systemctl enable --now httpd.service 100 | 101 | # Start osbuild-composer.socket 102 | greenprint "Start osbuild-composer.socket" 103 | sudo systemctl enable --now osbuild-composer.socket 104 | 105 | # Start firewalld 106 | greenprint "Start firewalld" 107 | sudo systemctl enable --now firewalld 108 | 109 | # Allow anyone in the wheel group to talk to libvirt. 110 | greenprint "🚪 Allowing users in wheel group to talk to libvirt" 111 | sudo tee /etc/polkit-1/rules.d/50-libvirt.rules > /dev/null << EOF 112 | polkit.addRule(function(action, subject) { 113 | if (action.id == "org.libvirt.unix.manage" && 114 | subject.isInGroup("adm")) { 115 | return polkit.Result.YES; 116 | } 117 | }); 118 | EOF 119 | 120 | # Start libvirtd and test it. 121 | greenprint "🚀 Starting libvirt daemon" 122 | sudo systemctl start libvirtd 123 | sudo virsh list --all > /dev/null 124 | 125 | # Set a customized dnsmasq configuration for libvirt so we always get the 126 | # same address on boot-up. 127 | greenprint "💡 Setup libvirt network" 128 | sudo tee /tmp/integration.xml > /dev/null << EOF 129 | 130 | integration 131 | 1c8fe98c-b53a-4ca4-bbdb-deb0f26b3579 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | EOF 154 | if ! sudo virsh net-info integration > /dev/null 2>&1; then 155 | sudo virsh net-define /tmp/integration.xml 156 | fi 157 | if [[ $(sudo virsh net-info integration | grep 'Active' | awk '{print $2}') == 'no' ]]; then 158 | sudo virsh net-start integration 159 | fi 160 | 161 | # Basic weldr API status checking 162 | sudo composer-cli status show 163 | 164 | # Simulate a third party repo here 165 | sudo mkdir -p /var/www/html/packages 166 | sudo curl -s -o /var/www/html/packages/greenboot-failing-unit-1.0-1.el8.noarch.rpm https://kite-webhook-prod.s3.amazonaws.com/greenboot-failing-unit-1.0-1.el8.noarch.rpm 167 | 168 | # RHEL for Edge package CI test 169 | if [ -e packages/package_ci_trigger ]; then 170 | source packages/package_ci_trigger 171 | 172 | # Get package rpm download URL 173 | IFS=',' read -r -a package_rpms <<< "$PACKAGE_RPM_LIST" 174 | 175 | for i in "${package_rpms[@]}"; do 176 | if [[ ${i} != *"debug"* && ${i} != *"devel"* ]]; then 177 | sudo wget -q "http://${DOWNLOAD_NODE}/brewroot/work/${i}" -P /var/www/html/packages 178 | fi 179 | done 180 | fi 181 | 182 | # Create the simulated repo 183 | sudo createrepo_c /var/www/html/packages 184 | # Reset selinux for /var/www/html/source 185 | sudo restorecon -Rv /var/www/html/packages 186 | 187 | # Create local repo to install packages 188 | sudo tee "/etc/yum.repos.d/packages.repo" > /dev/null << EOF 189 | [packages] 190 | name = packages 191 | baseurl = file:///var/www/html/packages/ 192 | enabled = 1 193 | gpgcheck = 0 194 | priority = 5 195 | EOF 196 | 197 | # Check local repo working or not 198 | sudo dnf info \ 199 | coreos-installer-dracut \ 200 | greenboot \ 201 | ostree \ 202 | rpm-ostree \ 203 | fdo-rendezvous-server \ 204 | fdo-owner-onboarding-server \ 205 | fdo-owner-cli \ 206 | fdo-manufacturing-server \ 207 | fdo-admin-cli 208 | 209 | # Source checking 210 | sudo composer-cli sources list 211 | for SOURCE in $(sudo composer-cli sources list); do 212 | sudo composer-cli sources info "$SOURCE" 213 | done 214 | 215 | # In case port 8081 is already in use 216 | sudo dnf install -y lsof 217 | if lsof -nP -iTCP -sTCP:LISTEN|grep 8081; then 218 | sudo fuser -k 8081/tcp 219 | fi 220 | -------------------------------------------------------------------------------- /files/centos-stream-9.json: -------------------------------------------------------------------------------- 1 | { 2 | "aarch64": [ 3 | { 4 | "name": "baseos", 5 | "baseurl": "https://composes.stream.centos.org/production/latest-CentOS-Stream/compose/BaseOS/aarch64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 7 | "check_gpg": true 8 | }, 9 | { 10 | "name": "appstream", 11 | "baseurl": "https://composes.stream.centos.org/production/latest-CentOS-Stream/compose/AppStream/aarch64/os/", 12 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 13 | "check_gpg": true 14 | } 15 | ], 16 | "x86_64": [ 17 | { 18 | "name": "baseos", 19 | "baseurl": "https://composes.stream.centos.org/production/latest-CentOS-Stream/compose/BaseOS/x86_64/os/", 20 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 21 | "check_gpg": true 22 | }, 23 | { 24 | "name": "appstream", 25 | "baseurl": "https://composes.stream.centos.org/production/latest-CentOS-Stream/compose/AppStream/x86_64/os/", 26 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 27 | "check_gpg": true 28 | }, 29 | { 30 | "name": "rt", 31 | "baseurl": "https://composes.stream.centos.org/production/latest-CentOS-Stream/compose/RT/x86_64/os/", 32 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 33 | "check_gpg": true 34 | }, 35 | { 36 | "name": "packages", 37 | "baseurl": "http://192.168.100.1/packages/" 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /files/centos-stream-10.json: -------------------------------------------------------------------------------- 1 | { 2 | "aarch64": [ 3 | { 4 | "name": "baseos", 5 | "baseurl": "https://odcs.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/BaseOS/aarch64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 7 | "check_gpg": true 8 | }, 9 | { 10 | "name": "appstream", 11 | "baseurl": "https://odcs.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/AppStream/aarch64/os/", 12 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 13 | "check_gpg": true 14 | } 15 | ], 16 | "x86_64": [ 17 | { 18 | "name": "baseos", 19 | "baseurl": "https://odcs.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/BaseOS/x86_64/os/", 20 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 21 | "check_gpg": true 22 | }, 23 | { 24 | "name": "appstream", 25 | "baseurl": "https://odcs.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/AppStream/x86_64/os/", 26 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 27 | "check_gpg": true 28 | }, 29 | { 30 | "name": "rt", 31 | "baseurl": "https://odcs.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/RT/x86_64/os/", 32 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2.0.22 (GNU/Linux)\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n", 33 | "check_gpg": true 34 | }, 35 | { 36 | "name": "packages", 37 | "baseurl": "http://192.168.100.1/packages/" 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /files/rhel-8-10-0-sha512.json: -------------------------------------------------------------------------------- 1 | { 2 | "x86_64": [ 3 | { 4 | "name": "rhel89-baseos", 5 | "baseurl": "http://REPLACE_ME_HERE/rhel-8/nightly/RHEL-8/latest-RHEL-8.10.0/compose/BaseOS/x86_64/os/", 6 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" 7 | }, 8 | { 9 | "name": "rhel89-appstream", 10 | "baseurl": "http://REPLACE_ME_HERE/rhel-8/nightly/RHEL-8/latest-RHEL-8.10.0/compose/AppStream/x86_64/os/", 11 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" 12 | }, 13 | { 14 | "name": "rhel89-rt", 15 | "baseurl": "http://REPLACE_ME_HERE/rhel-8/nightly/RHEL-8/latest-RHEL-8.10.0/compose/RT/x86_64/os/", 16 | "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" 17 | } 18 | ] 19 | } 20 | --------------------------------------------------------------------------------