1
0
forked from rpms/leapp

Compare commits

...

No commits in common. "c8s-elevate" and "c8" have entirely different histories.

26 changed files with 1268 additions and 1565 deletions

View File

@ -1 +0,0 @@
1

5
.gitignore vendored
View File

@ -1,4 +1 @@
/leapp-0.18.0.tar.gz
/leapp-0.19.0.tar.gz
/leapp-0.20.0.tar.gz
/leapp-0.21.0.tar.gz
SOURCES/leapp-0.19.0.tar.gz

1
.leapp.metadata Normal file
View File

@ -0,0 +1 @@
03632cf33458ec52b7fea2b8c7a5da68d953d4eb SOURCES/leapp-0.19.0.tar.gz

View File

@ -1,194 +0,0 @@
From d67332c2234e437113493bfdce37594c1e2ae417 Mon Sep 17 00:00:00 2001
From: Petr Stodulka <pstodulk@redhat.com>
Date: Wed, 3 Dec 2025 08:48:08 +0100
Subject: [PATCH 01/10] introduce the format_list function
The construction of report messages involving lists (e.g., package
names, file paths) lacked a consistent formatting which led to
inconsistencies and redefinitions when creating reports.
This patch introduces the format_list function to provide a consistent
formatting option across all reports. The function is available from both
leapp.libraries.stdlib and leapp.reporting. It supports custom sorting,
item limits, and configurable separator.
Jira-ref: RHEL-126447
---
docs/source/best-practices.md | 17 +++++++++++
leapp/libraries/stdlib/__init__.py | 36 +++++++++++++++++++++--
leapp/reporting/__init__.py | 5 +++-
packaging/leapp.spec | 2 +-
tests/scripts/test_format_list.py | 47 ++++++++++++++++++++++++++++++
5 files changed, 103 insertions(+), 4 deletions(-)
create mode 100644 tests/scripts/test_format_list.py
diff --git a/docs/source/best-practices.md b/docs/source/best-practices.md
index 11f861a..913dcbd 100644
--- a/docs/source/best-practices.md
+++ b/docs/source/best-practices.md
@@ -155,6 +155,23 @@ In case of [StopActorExecutionError](leapp.exceptions.StopActorExecutionError) t
You can also use the [StopActorExecution](leapp.exceptions.StopActorExecution) and [StopActorExecutionError](leapp.exceptions.StopActorExecutionError) exceptions inside a private or shared library.
+## Consistent list formatting in reports
+
+When constructing report messages that include lists of items (e.g. package names, file paths), use the `format_list` function to ensure consistent formatting across all reports. The function is available from both `leapp.libraries.stdlib` and `leapp.reporting`. It supports custom sorting, item limits, and configurable separators.
+
+```python
+from leapp.reporting import format_list
+
+pkgs = ['kernel', 'bash', 'glibc']
+msg = 'The following packages will be removed:{}'.format(format_list(pkgs))
+
+# Output:
+#The following packages will be removed:
+# - bash
+# - glibc
+# - kernel
+```
+
## Use the LEAPP and LEAPP\_DEVEL prefixes for new envars
In case you need to change a behaviour of actor(s) for testing or development purposes - e.g. be able to skip a functionality in your actor - use environment variables. Such environment variables should start with prefix *LEAPP\_DEVEL*. Such variables are not possible to use on production systems without special *LEAPP\_UNSUPPORTED* variable. This prevents users to break their systems by a mistake.
diff --git a/leapp/libraries/stdlib/__init__.py b/leapp/libraries/stdlib/__init__.py
index 89e59b2..efe2029 100644
--- a/leapp/libraries/stdlib/__init__.py
+++ b/leapp/libraries/stdlib/__init__.py
@@ -8,12 +8,15 @@ import logging
import os
import sys
import uuid
+from itertools import islice
from leapp.exceptions import LeappError
-from leapp.utils.audit import create_audit_entry
from leapp.libraries.stdlib import api
-from leapp.libraries.stdlib.call import _call, STDOUT
+from leapp.libraries.stdlib.call import STDOUT, _call
from leapp.libraries.stdlib.config import is_debug
+from leapp.utils.audit import create_audit_entry
+
+FMT_LIST_SEPARATOR = '\n - '
class CalledProcessError(LeappError):
@@ -214,3 +217,32 @@ def run(args, split=False, callback_raw=_console_logging_handler, callback_lineb
)
api.current_logger().debug('External command has finished: {0}'.format(str(args)))
return result
+
+
+def format_list(data, sep=FMT_LIST_SEPARATOR, callback_sort=sorted, limit=0):
+ """
+ Format an iterable into a string using a specified separator that is prepended to every item.
+
+ This function can be used to consistently format lists in reports, logs, and error messages.
+
+ :param data: Iterable of items to format.
+ :type data: Iterable
+ :param sep: Separator prepended to each item. Defaults to FMT_LIST_SEPARATOR.
+ :type sep: str
+ :param callback_sort: Callable returning a new list, called before the limit is applied.
+ Set to None to preserve original order. Defaults to sorted.
+ :type callback_sort: Callable or None
+ :param limit: Maximum number of items to include. Defaults to 0 (no limit).
+ :type limit: int
+ :returns: A string with each item prefixed by the specified separator.
+ :rtype: str
+ """
+ items = data
+ if callback_sort is not None:
+ items = callback_sort(data)
+
+ if limit > 0:
+ items = islice(items, limit)
+
+ res = ['{}{}'.format(sep, item) for item in items]
+ return ''.join(res)
diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py
index 7a0e223..34af17a 100644
--- a/leapp/reporting/__init__.py
+++ b/leapp/reporting/__init__.py
@@ -6,9 +6,12 @@ import os
import six
from leapp.compat import string_types
+# NOTE(pstodulk): the format_list is imported to provide the function
+# also in this library. Its use is not planned here however.
+from leapp.libraries.stdlib import format_list
+from leapp.libraries.stdlib.api import produce
from leapp.models import fields, Model, ErrorModel
from leapp.topics import ReportTopic
-from leapp.libraries.stdlib.api import produce
from leapp.utils.deprecation import deprecated
diff --git a/packaging/leapp.spec b/packaging/leapp.spec
index 1e32cf6..a06b141 100644
--- a/packaging/leapp.spec
+++ b/packaging/leapp.spec
@@ -13,7 +13,7 @@
# This is kind of help for more flexible development of leapp repository,
# so people do not have to wait for new official release of leapp to ensure
# it is installed/used the compatible one.
-%global framework_version 6.2
+%global framework_version 6.3
# IMPORTANT: everytime the requirements are changed, increment number by one
# - same for Provides in deps subpackage
diff --git a/tests/scripts/test_format_list.py b/tests/scripts/test_format_list.py
new file mode 100644
index 0000000..1b0ca24
--- /dev/null
+++ b/tests/scripts/test_format_list.py
@@ -0,0 +1,47 @@
+import pytest
+
+from leapp.libraries.stdlib import FMT_LIST_SEPARATOR, format_list
+
+SEP = ', '
+
+
+@pytest.mark.parametrize('data, kwargs, expected', [
+ # Basic usage
+ ([], {}, ''),
+ (['c', 'a', 'b'], {}, '{0}a{0}b{0}c'.format(FMT_LIST_SEPARATOR)),
+ (['c', 'a', 'b'], {'sep': SEP}, ', a, b, c'),
+ (['a'], {'sep': SEP}, ', a'),
+ # Sorting
+ (['c', 'a', 'b'], {'sep': SEP, 'callback_sort': None}, ', c, a, b'),
+ (['c', 'a', 'b'], {'sep': SEP, 'callback_sort': lambda d: sorted(d, reverse=True)}, ', c, b, a'),
+ # Limit
+ (['c', 'a', 'b'], {'sep': SEP, 'limit': 2}, ', a, b'),
+ (['c', 'a', 'b'], {'sep': SEP, 'limit': 0}, ', a, b, c'),
+ (['b', 'a'], {'sep': SEP, 'limit': 10}, ', a, b'),
+ (['c', 'a', 'b'], {'sep': SEP, 'limit': -1}, ', a, b, c'),
+ # Non-list iterables
+ ({'a', 'b', 'c'}, {'sep': SEP, 'limit': 2}, ', a, b'),
+ (('a', 'b'), {'sep': SEP}, ', a, b'),
+ ({'b': 1, 'a': 2}, {'sep': SEP}, ', a, b'),
+ # Generators
+ ((x for x in ['c', 'a', 'b']), {'sep': SEP}, ', a, b, c'),
+ ((x for x in ['c', 'a', 'b']), {'sep': SEP, 'callback_sort': None, 'limit': 2}, ', c, a'),
+], ids=[
+ 'empty_data',
+ 'single_item',
+ 'default_separator',
+ 'custom_separator',
+ 'no_sort',
+ 'reverse_sort',
+ 'limit',
+ 'limit_zero',
+ 'limit_larger_than_data',
+ 'negative_limit_ignored',
+ 'set_input',
+ 'tuple_input',
+ 'dict_keys_input',
+ 'generator_sorted',
+ 'generator_unsorted_with_limit',
+])
+def test_format_list(data, kwargs, expected):
+ assert format_list(data, **kwargs) == expected
--
2.53.0

View File

@ -1,61 +0,0 @@
From 2f210e763a8b851f1804f518fb02466db9cb55fa Mon Sep 17 00:00:00 2001
From: Peter Mocary <pmocary@redhat.com>
Date: Tue, 3 Mar 2026 16:30:31 +0100
Subject: [PATCH 02/10] packit: remove unsupported upgrade path from tests
---
.packit.yaml | 31 -------------------------------
1 file changed, 31 deletions(-)
diff --git a/.packit.yaml b/.packit.yaml
index 0566801..254b24b 100644
--- a/.packit.yaml
+++ b/.packit.yaml
@@ -326,15 +326,6 @@ jobs:
provisioning:
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
- - &tmt-env-settings-centos9torhel101
- tmt:
- context: &tmt-context-centos9torhel101
- distro: "centos-9"
- distro_target: "rhel-10.1"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- &tmt-env-settings-98to102
tmt:
context: &tmt-context-98to102
@@ -521,28 +512,6 @@ jobs:
# ###################### CentOS Stream > RHEL ########################## #
# ###################################################################### #
-# ###################################################################### #
-# ############################ 9 > 10.1 ################################ #
-# ###################################################################### #
-
-- &sanity-centos9torhel101
- <<: *sanity-abstract-9to10
- trigger: pull_request
- identifier: sanity-CentOS9toRHEL10.1
- targets:
- epel-9-x86_64:
- distros: [CentOS-Stream-9]
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm'
- environments:
- - artifacts: *artifacts-for-rhel9
- - *tmt-env-settings-centos9torhel101
- env: &env-centos9to101
- SOURCE_RELEASE: "9"
- TARGET_RELEASE: "10.1"
-
# ###################################################################### #
# ############################ 9 > 10.2 ################################ #
# ###################################################################### #
--
2.53.0

View File

@ -1,300 +0,0 @@
From 80c700223948b7a11af1b71c1ed81145662786ae Mon Sep 17 00:00:00 2001
From: Peter Mocary <pmocary@redhat.com>
Date: Fri, 6 Mar 2026 17:56:10 +0100
Subject: [PATCH 03/10] packit: add new upgrade paths to tests
Adds the 8.10 -> 9.9 -> 10.3 upgrade paths to CI tests.
---
.packit.yaml | 187 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 179 insertions(+), 8 deletions(-)
diff --git a/.packit.yaml b/.packit.yaml
index 254b24b..cd45f27 100644
--- a/.packit.yaml
+++ b/.packit.yaml
@@ -23,6 +23,7 @@ jobs:
get-current-version:
# get version from spec file instead from git tag
- bash -c "grep -m1 '^Version:' packaging/leapp.spec | grep -om1 '[0-9].[0-9.]**'"
+
- job: copr_build
trigger: commit
metadata:
@@ -107,6 +108,15 @@ jobs:
provisioning:
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
+ - &tmt-env-settings-810to99
+ tmt:
+ context: &tmt-context-810to99
+ distro: "rhel-8.10"
+ distro_target: "rhel-9.9"
+ settings:
+ provisioning:
+ tags:
+ BusinessUnit: sst_upgrades@leapp_upstream_test
- &sanity-abstract-8to9-aws
<<: *sanity-abstract-8to9
@@ -188,7 +198,7 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm'
+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm'
environments:
- artifacts: *artifacts-for-rhel8
- *tmt-env-settings-810to96
@@ -217,7 +227,6 @@ jobs:
env:
<<: *env-810to96
-
# ###################################################################### #
# ############################# 8.10 > 9.8 ############################# #
# ###################################################################### #
@@ -268,13 +277,70 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
environments:
- artifacts: *artifacts-for-rhel8
- *tmt-env-settings-810to98
env:
<<: *env-810to98
+# ###################################################################### #
+# ############################# 8.10 > 9.9 ############################# #
+# ###################################################################### #
+
+- &sanity-810to99
+ <<: *sanity-abstract-8to9
+ trigger: pull_request
+ identifier: sanity-8.10to9.9
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:8to9 & tag:tier0 & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to99
+ env: &env-810to99
+ SOURCE_RELEASE: "8.10"
+ TARGET_RELEASE: "9.9"
+
+# On-demand minimal beaker tests
+- &beaker-minimal-810to99
+ <<: *beaker-minimal-8to9-abstract-ondemand
+ trigger: pull_request
+ labels:
+ - beaker-minimal
+ - beaker-minimal-8.10to9.9
+ - 8.10to9.9
+ identifier: sanity-8.10to9.9-beaker-minimal-ondemand
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:8to9 & tag:partitioning & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to99
+ env:
+ <<: *env-810to99
+
+# On-demand kernel-rt tests
+- &kernel-rt-810to99
+ <<: *kernel-rt-abstract-8to9-ondemand
+ trigger: pull_request
+ labels:
+ - kernel-rt
+ - kernel-rt-8.10to9.9
+ - 8.10to9.9
+ identifier: sanity-8.10to9.9-kernel-rt-ondemand
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to99
+ env:
+ <<: *env-810to99
+
# ###################################################################### #
# ############################## 9 TO 10 ################################ #
# ###################################################################### #
@@ -344,6 +410,24 @@ jobs:
provisioning:
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
+ - &tmt-env-settings-99to103
+ tmt:
+ context: &tmt-context-99to103
+ distro: "rhel-9.9"
+ distro_target: "rhel-10.3"
+ settings:
+ provisioning:
+ tags:
+ BusinessUnit: sst_upgrades@leapp_upstream_test
+ - &tmt-env-settings-centos9torhel103
+ tmt:
+ context: &tmt-context-centos9torhel103
+ distro: "centos-9"
+ distro_target: "rhel-10.3"
+ settings:
+ provisioning:
+ tags:
+ BusinessUnit: sst_upgrades@leapp_upstream_test
- &sanity-abstract-9to10-aws
<<: *sanity-abstract-9to10
@@ -412,7 +496,7 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:partitioning & enabled:true & tag:-rhsm'
+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true & tag:-rhsm'
environments:
- artifacts: *artifacts-for-rhel9
- *tmt-env-settings-96to100
@@ -431,7 +515,7 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm'
+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true & tag:-rhsm'
environments:
- artifacts: *artifacts-for-rhel9
- *tmt-env-settings-96to100
@@ -475,7 +559,7 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:partitioning & enabled:true & tag:-rhsm'
+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true & tag:-rhsm'
environments:
- artifacts: *artifacts-for-rhel9
- *tmt-env-settings-98to102
@@ -497,13 +581,79 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm'
+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true & tag:-rhsm'
environments:
- artifacts: *artifacts-for-rhel9
- *tmt-env-settings-98to102
env:
<<: *env-98to102
+# ###################################################################### #
+# ############################# 9.9 > 10.3 ############################# #
+# ###################################################################### #
+
+- &sanity-99to103
+ <<: *sanity-abstract-9to10
+ trigger: pull_request
+ identifier: sanity-9.9to10.3
+ targets:
+ epel-9-x86_64:
+ distros: [RHEL-9.9.0-Nightly]
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:9to10 & tag:tier0 & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel9
+ - *tmt-env-settings-99to103
+ env: &env-99to103
+ SOURCE_RELEASE: "9.9"
+ TARGET_RELEASE: "10.3"
+
+# On-demand minimal beaker tests
+- &beaker-minimal-99to103
+ <<: *beaker-minimal-9to10-abstract-ondemand
+ trigger: pull_request
+ labels:
+ - beaker-minimal
+ - beaker-minimal-9.9to10.3
+ - 9.9to10.3
+ identifier: sanity-9.9to10.3-beaker-minimal-ondemand
+ targets:
+ epel-9-x86_64:
+ distros: [RHEL-9.9-Nightly]
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel9
+ - *tmt-env-settings-99to103
+ env:
+ <<: *env-99to103
+
+# On-demand kernel-rt tests
+- &kernel-rt-99to103
+ <<: *kernel-rt-abstract-9to10-ondemand
+ trigger: pull_request
+ labels:
+ - kernel-rt
+ - kernel-rt-9.9to10.3
+ - 9.9to10.3
+ identifier: sanity-9.9to10.3-kernel-rt-ondemand
+ targets:
+ epel-9-x86_64:
+ distros: [RHEL-9.9-Nightly]
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel9
+ - *tmt-env-settings-99to103
+ env:
+ <<: *env-99to103
+
# ###################################################################### #
# ########################## CentOS Stream ############################# #
# ###################################################################### #
@@ -527,7 +677,6 @@ jobs:
test:
tmt:
plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm'
- name:
environments:
- artifacts: *artifacts-for-rhel9
- *tmt-env-settings-centos9torhel102
@@ -535,6 +684,28 @@ jobs:
SOURCE_RELEASE: "9"
TARGET_RELEASE: "10.2"
+# ###################################################################### #
+# ############################ 9 > 10.3 ################################ #
+# ###################################################################### #
+
+- &sanity-centos9torhel103
+ <<: *sanity-abstract-9to10
+ trigger: pull_request
+ identifier: sanity-CentOS9toRHEL10.3
+ targets:
+ epel-9-x86_64:
+ distros: [CentOS-Stream-9]
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm'
+ environments:
+ - artifacts: *artifacts-for-rhel9
+ - *tmt-env-settings-centos9torhel103
+ env: &env-centos9torhel103
+ SOURCE_RELEASE: "9"
+ TARGET_RELEASE: "10.3"
+
# ###################################################################### #
# ################## CentOS Stream > CentOS Stream ##################### #
# ###################################################################### #
--
2.53.0

View File

@ -1,48 +0,0 @@
From 136ed3baac103bfb0945d74703c7b7a05f40d8bd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 5 Mar 2026 09:51:22 +0000
Subject: [PATCH 04/10] chore(deps): update actions/checkout action to v6
---
.github/workflows/reuse-copr-build.yml | 4 ++--
.github/workflows/unit-tests.yml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml
index c2fb51c..5e33fe3 100644
--- a/.github/workflows/reuse-copr-build.yml
+++ b/.github/workflows/reuse-copr-build.yml
@@ -49,7 +49,7 @@ jobs:
# TODO: The correct way to checkout would be to use simmilar approach as in get_commit_by_timestamp function of
# the github gluetool module (i.e. do not use HEAD but the last commit before comment).
id: checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
ref: "refs/pull/${{ steps.pr_nr.outputs.pr_nr }}/head"
@@ -121,7 +121,7 @@ jobs:
- name: Checkout leapp-repository
id: checkout_leapp_repository
if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }}
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
repository: "oamg/leapp-repository"
ref: "refs/pull/${{ steps.leapp_repository_pr.outputs.leapp_repository_pr }}/head"
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index 70d624d..906a45d 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: '0'
- name: Set main to origin/main
--
2.53.0

View File

@ -1,34 +0,0 @@
From dc9e1c60e5cc84abf1b5df0972072f7795bc860c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 5 Mar 2026 09:51:26 +0000
Subject: [PATCH 05/10] chore(deps): update actions/github-script action to v8
---
.github/workflows/reuse-copr-build.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml
index 5e33fe3..0f6b823 100644
--- a/.github/workflows/reuse-copr-build.yml
+++ b/.github/workflows/reuse-copr-build.yml
@@ -102,7 +102,7 @@ jobs:
- name: Add comment with copr build url
# TODO: Create comment when copr build fails.
id: link_copr
- uses: actions/github-script@v7
+ uses: actions/github-script@v8
with:
script: |
github.issues.createComment({
@@ -160,7 +160,7 @@ jobs:
# TODO: Create comment when copr build fails.
id: link_copr_leapp_repository
if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }}
- uses: actions/github-script@v7
+ uses: actions/github-script@v8
with:
script: |
github.issues.createComment({
--
2.53.0

View File

@ -1,26 +0,0 @@
From a2cbc6e98539926dc25862172b89a5585562009b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 5 Mar 2026 09:51:28 +0000
Subject: [PATCH 06/10] chore(deps): update
peter-evans/create-or-update-comment action to v5
---
.github/workflows/pr-welcome-msg.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pr-welcome-msg.yml b/.github/workflows/pr-welcome-msg.yml
index 66d001e..5d9fc3e 100644
--- a/.github/workflows/pr-welcome-msg.yml
+++ b/.github/workflows/pr-welcome-msg.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Create comment
- uses: peter-evans/create-or-update-comment@v4
+ uses: peter-evans/create-or-update-comment@v5
with:
issue-number: ${{ github.event.pull_request.number }}
body: |
--
2.53.0

View File

@ -1,157 +0,0 @@
From 9fbd48b20f556cb613f3ca7999f4fc9d74e24024 Mon Sep 17 00:00:00 2001
From: Peter Mocary <pmocary@redhat.com>
Date: Tue, 17 Mar 2026 12:22:35 +0100
Subject: [PATCH 07/10] reporting: fix incorrect converting of list based
commands
The reporting module handled conversion between shell command
representations for the text and json reports incorrectly. The list of
strings representation was converted without preserving the argument
separation correctly which results in malformed commands in the text
report.
This patch utilizes the built-in shlex Python library for the conversion
which preserves the argument separation by wrapping arguments in quotes
when necessary.
Jira: RHEL-156521
---
leapp/reporting/__init__.py | 9 +++--
packaging/leapp.spec | 2 +-
tests/scripts/test_reporting.py | 61 +++++++++++++++++++++++++++++++--
3 files changed, 66 insertions(+), 6 deletions(-)
diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py
index 34af17a..ca2b80b 100644
--- a/leapp/reporting/__init__.py
+++ b/leapp/reporting/__init__.py
@@ -1,8 +1,9 @@
import datetime
-import json
import hashlib
+import json
import logging
import os
+import shlex
import six
from leapp.compat import string_types
@@ -10,7 +11,7 @@ from leapp.compat import string_types
# also in this library. Its use is not planned here however.
from leapp.libraries.stdlib import format_list
from leapp.libraries.stdlib.api import produce
-from leapp.models import fields, Model, ErrorModel
+from leapp.models import ErrorModel, Model, fields
from leapp.topics import ReportTopic
from leapp.utils.deprecation import deprecated
@@ -281,8 +282,10 @@ class RemediationCommand(BaseRemediation):
def __repr__(self):
# NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly.
# As per python practices repr has to return an encoded string
+ # Note(pmocary) Using shlex.join is not possible here due to it being available from Python 3.8,
+ # thus we use the shlex.quote on each argument instead which is the same as shlex.join implementation.
return "[{}] {}".format(self._value['type'],
- ' '.join([_guarantee_encoded_str(c) for c in self._value['context']]))
+ ' '.join([shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']]))
class RemediationHint(BaseRemediation):
diff --git a/packaging/leapp.spec b/packaging/leapp.spec
index a06b141..ba906cf 100644
--- a/packaging/leapp.spec
+++ b/packaging/leapp.spec
@@ -13,7 +13,7 @@
# This is kind of help for more flexible development of leapp repository,
# so people do not have to wait for new official release of leapp to ensure
# it is installed/used the compatible one.
-%global framework_version 6.3
+%global framework_version 6.4
# IMPORTANT: everytime the requirements are changed, increment number by one
# - same for Provides in deps subpackage
diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py
index 2b0f245..8c284cb 100644
--- a/tests/scripts/test_reporting.py
+++ b/tests/scripts/test_reporting.py
@@ -14,11 +14,10 @@ from leapp.reporting import (
create_report_from_deprecation,
create_report_from_error,
_create_report_object,
- Audience, Flags, Groups, Key, RelatedResource, Remediation, Summary, Severity, Tags, Title
+ Audience, Flags, Groups, Key, RelatedResource, Remediation, RemediationCommand, Summary, Severity, Tags, Title
)
from leapp.utils.report import generate_report_file
-
ReportPrimitive = namedtuple('ReportPrimitive', ['data', 'path', 'value', 'is_leaf_list'])
leaf_is_dict = ReportPrimitive({}, ('summary',), 'We better fix this!', False)
@@ -103,6 +102,64 @@ def test_report_tags_and_flags():
assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"]
+@pytest.mark.parametrize('command, expected_command_form', [
+ (['cmd'], "cmd"),
+ (['cmd', ''], "cmd ''"),
+ (['cmd', 'not_quoted'], "cmd not_quoted"),
+ (['ls', '-la', '/home/user'], "ls -la /home/user"),
+
+ # Quoting ' '
+ (['cmd', 'is quoted'], "cmd 'is quoted'"),
+ (['mv', '/home/user/test file', '/home/user/test_file'], "mv '/home/user/test file' /home/user/test_file"),
+
+ # Quoting '$'
+ # Note: Execution of the first command would fail, but it is the correct conversion.
+ # The second test case should be used to utilize the shell expansion.
+ (['chsh', '-s', '$(which zsh)', '$USER'], "chsh -s '$(which zsh)' '$USER'"),
+ (['bash', '-c', 'chsh -s $(which zsh) $USER'], "bash -c 'chsh -s $(which zsh) $USER'"),
+
+ # Quoting '\'
+ (['echo', '\\'], "echo '\\'"),
+ (['sed', '-i', 's/\\t/ /g', 'file.txt'], "sed -i 's/\\t/ /g' file.txt"),
+
+ # Quoting '"'
+ (['echo', '"'], "echo '\"'"),
+ (['grep', 'key="value"', 'file.txt'], "grep 'key=\"value\"' file.txt"),
+
+ # Quoting '`'
+ (['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"),
+])
+def test_remediation_command_repr_quoting(command, expected_command_form):
+ """Test that RemediationCommand.__repr__ properly quotes arguments with special characters."""
+ remediation_command = RemediationCommand(value=command)
+ assert repr(remediation_command) == f'[command] {expected_command_form}'
+
+
+@pytest.mark.parametrize("report_suffix", ('.json', '.txt'))
+def test_remediation_command_in_report(report_suffix):
+ """Test that commands with spaces in arguments are preserved correctly in reports."""
+ remediation_command_as_list = ["mv", "file with spaces.txt", "file_without_spaces.txt"]
+ remediation_command_as_string = "mv 'file with spaces.txt' file_without_spaces.txt"
+
+ report_entries = [Title('Test title'), Summary('Test summary'), Audience('sysadmin')]
+ remediation = Remediation(commands=[remediation_command_as_list])
+ report_entries.append(remediation)
+
+ report_message = _create_report_object(report_entries).report
+
+ with tempfile.NamedTemporaryFile(suffix=report_suffix) as reportfile:
+ generate_report_file([report_message], 'leapp-run-id', reportfile.name)
+ with open(reportfile.name) as f:
+ content = f.read()
+ if report_suffix == '.txt':
+ assert remediation_command_as_string in content
+ else:
+ report_data = json.loads(content)
+ remediations = report_data['entries'][0]['detail']['remediations']
+ cmd_entry = [r for r in remediations if r['type'] == 'command'][0]
+ assert cmd_entry['context'] == remediation_command_as_list
+
+
@pytest.mark.parametrize("report_suffix", ('.json', '.txt'))
def test_remediation_with_non_ascii_value(report_suffix):
report_entries = [Title('Some report title'), Summary('Some summary not used for dynamical key generation'),
--
2.53.0

View File

@ -1,171 +0,0 @@
From ad50bb2bdcc8a4b734c82f9d190dfe8c1611903a Mon Sep 17 00:00:00 2001
From: Peter Mocary <pmocary@redhat.com>
Date: Wed, 25 Mar 2026 19:20:22 +0100
Subject: [PATCH 08/10] fixup! reporting: fix incorrect converting of list
based commands
---
leapp/reporting/__init__.py | 34 ++++++++++++++++---
tests/scripts/test_reporting.py | 60 ++++++++++++++++++++++++++++++---
2 files changed, 86 insertions(+), 8 deletions(-)
diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py
index ca2b80b..6bd0b49 100644
--- a/leapp/reporting/__init__.py
+++ b/leapp/reporting/__init__.py
@@ -4,9 +4,11 @@ import json
import logging
import os
import shlex
+
import six
from leapp.compat import string_types
+
# NOTE(pstodulk): the format_list is imported to provide the function
# also in this library. Its use is not planned here however.
from leapp.libraries.stdlib import format_list
@@ -273,6 +275,32 @@ def _guarantee_decoded_str(text, encoding='utf-8'):
return text
+def _quote_for_shell(s):
+ """
+ Quote a string for shell usage as a literal.
+
+ This function quotes the given string in single-quotes using the
+ shlex.quote. However, when the single-quote is present in the string it
+ instead uses double-quotes, resulting in cleaner output (e.g. "don't"
+ instead of 'don'"'"'t' that would be produced by shlex.quote).
+
+ :param str s: String to quote for shell usage
+ :return str: Quoted string safe for shell usage
+ """
+
+ if "'" not in s:
+ return shlex.quote(s)
+
+ # The string contains a single-quote, use double-quote style instead.
+ # Escape following characters to make it literal: \ " $ ` !
+ escaped = (s.replace('\\', '\\\\')
+ .replace('"', '\\"')
+ .replace('$', '\\$')
+ .replace('`', '\\`')
+ .replace('!', '\\!'))
+ return '"{}"'.format(escaped)
+
+
class RemediationCommand(BaseRemediation):
def __init__(self, value=None):
if not isinstance(value, list):
@@ -282,10 +310,8 @@ class RemediationCommand(BaseRemediation):
def __repr__(self):
# NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly.
# As per python practices repr has to return an encoded string
- # Note(pmocary) Using shlex.join is not possible here due to it being available from Python 3.8,
- # thus we use the shlex.quote on each argument instead which is the same as shlex.join implementation.
- return "[{}] {}".format(self._value['type'],
- ' '.join([shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']]))
+ quoted_command_args = [_quote_for_shell(_guarantee_encoded_str(c)) for c in self._value['context']]
+ return "[{}] {}".format(self._value['type'], ' '.join(quoted_command_args))
class RemediationHint(BaseRemediation):
diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py
index 8c284cb..2a4e724 100644
--- a/tests/scripts/test_reporting.py
+++ b/tests/scripts/test_reporting.py
@@ -1,20 +1,31 @@
# -*- coding: utf-8 -*-
-from collections import namedtuple
import datetime
import json
import os
import tempfile
+from collections import namedtuple
import jsonschema
import pytest
from leapp.reporting import (
- _add_to_dict,
_DEPRECATION_SEVERITY_THRESHOLD,
+ Audience,
+ Flags,
+ Groups,
+ Key,
+ RelatedResource,
+ Remediation,
+ RemediationCommand,
+ Severity,
+ Summary,
+ Tags,
+ Title,
+ _add_to_dict,
+ _create_report_object,
+ _quote_for_shell,
create_report_from_deprecation,
create_report_from_error,
- _create_report_object,
- Audience, Flags, Groups, Key, RelatedResource, Remediation, RemediationCommand, Summary, Severity, Tags, Title
)
from leapp.utils.report import generate_report_file
@@ -102,6 +113,40 @@ def test_report_tags_and_flags():
assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"]
+@pytest.mark.parametrize('string, expected_quoted', [
+ # No quoting needed
+ ('path/to_the/file-name.txt', 'path/to_the/file-name.txt'),
+ ('user@host', 'user@host'),
+ ('value=123', 'value=123'),
+ ('a:b:c', 'a:b:c'),
+ ('99%', '99%'),
+ ('a+b', 'a+b'),
+
+ # Single-quote style (no single quote in string)
+ ('', "''"),
+ ('file with spaces.txt', "'file with spaces.txt'"),
+ ('$(whoami)', "'$(whoami)'"),
+ ('$USER', "'$USER'"),
+ ('back`tick', "'back`tick'"),
+ ('double"quote', "'double\"quote'"),
+ ('exclaim!', "'exclaim!'"),
+ ('back\\slash', "'back\\slash'"),
+ ('new\nline', "'new\nline'"),
+ ('key="value"', "'key=\"value\"'"),
+
+ # Double-quote style (a single quote in string)
+ ("It's fine", "\"It's fine\""),
+ ("It's `whoami`", "\"It's \\`whoami\\`\""),
+ ("User's home: $HOME", "\"User's home: \\$HOME\""),
+ ("Don't panic!", "\"Don't panic\\!\""),
+ ("s/'/\"/g", "\"s/'/\\\"/g\""),
+ ("sed -i 's/'/\"/g' file.txt", "\"sed -i 's/'/\\\"/g' file.txt\""),
+])
+def test_quote_for_shell(string, expected_quoted):
+ """Test that _quote_for_shell properly quotes strings for shell usage."""
+ assert _quote_for_shell(string) == expected_quoted
+
+
@pytest.mark.parametrize('command, expected_command_form', [
(['cmd'], "cmd"),
(['cmd', ''], "cmd ''"),
@@ -128,6 +173,13 @@ def test_report_tags_and_flags():
# Quoting '`'
(['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"),
+
+ # Double-quote style when single quote is present
+ (['echo', "It's fine"], "echo \"It's fine\""),
+ (['mv', "user's file.txt", 'newfile.txt'], "mv \"user's file.txt\" newfile.txt"),
+ (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i \"s/'/\\\"/g\" file.txt"),
+ (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c \"echo \\\"user's home: \\$HOME\\\"\""),
+ (['grep', "can't find", '/var/log/some report.log'], "grep \"can't find\" '/var/log/some report.log'"),
])
def test_remediation_command_repr_quoting(command, expected_command_form):
"""Test that RemediationCommand.__repr__ properly quotes arguments with special characters."""
--
2.53.0

View File

@ -1,37 +0,0 @@
From bf931901cdc18275aed2023e5c37da0e246ae8a7 Mon Sep 17 00:00:00 2001
From: Petr Stodulka <pstodulk@redhat.com>
Date: Tue, 14 Apr 2026 14:21:39 +0200
Subject: [PATCH 09/10] python test deps: update pytest requirements
Originally we required pytest v6.2.5 for any python. This is
pretty old requirement coming from time of python ~ 3.8 and recently
a CVE-2025-71176 occuared, which is fix in pytest v9.0.3.
So let's update ranges to actually allow use of newer pytest on newer
systems:
+----------------+---------------+
| pytest version | python range |
+----------------+---------------+
| 6.2.5 | 3.7- |
| 7.4.4 | 3.8.x - 3.9.x |
| 9.0.3 | 3.10+ |
+----------------+---------------+
---
requirements-tests.txt | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/requirements-tests.txt b/requirements-tests.txt
index d4501f2..5859a2a 100644
--- a/requirements-tests.txt
+++ b/requirements-tests.txt
@@ -7,4 +7,6 @@ jsonschema==3.2.0
mock
pylint
pytest-cov
-pytest==6.2.5
+pytest==6.2.5; python_version < '3.8'
+pytest==7.4.4; python_version >= '3.8' and python_version < '3.10'
+pytest==9.0.3; python_version >= '3.10'
--
2.53.0

View File

@ -1,173 +0,0 @@
From eaf4af1a549b3cb675f49f03d46d9d5de362753f Mon Sep 17 00:00:00 2001
From: Peter Mocary <pmocary@redhat.com>
Date: Fri, 10 Apr 2026 21:51:42 +0200
Subject: [PATCH 10/10] fix(reporting): use single quoting when converting
remediation commands
The remediation commands are provided as a list of arguments that is
used in leapp-report.json. The same command is also converted to a
string that is used in leapp-report.txt and can be copy-pasted by the
user into shell.
Originally, the command conversion tried to make the resulting commands
prettier by enabling double quoting whenever there was a single quote in
an argument, while still trying to make the double quoted argument a
literal. This proved to be problematic approach due to multiple cases
that resulted with incorrect commands. Namely, when the command called
`bash -c` with a subcommand that would be evaluated by another
non-interactive shell, or when there was an exclamation mark that would
have different meaning in non-interactive and interactive shell and its
escaping was not possible unless single-quotes are used.
This patch makes the command conversion produce pretty commands in the
most cases, moreover, it makes sure the command is always correct (if
the list version is correct to begin with). This approach leaves
possibility to encounter unintuitive escaping in the resulting converted
command, although this can be prevented by carefully crafting the
command when creating the report.
Note that if there is a subcommand called in the converted command, the
report creator is responsible for its form and for the best resulting
command it should favor the double quoting of its arguments when
possible.
---
leapp/reporting/__init__.py | 28 +------------------
packaging/leapp.spec | 2 +-
tests/scripts/test_reporting.py | 48 +++++----------------------------
3 files changed, 9 insertions(+), 69 deletions(-)
diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py
index 6bd0b49..43aa17d 100644
--- a/leapp/reporting/__init__.py
+++ b/leapp/reporting/__init__.py
@@ -275,32 +275,6 @@ def _guarantee_decoded_str(text, encoding='utf-8'):
return text
-def _quote_for_shell(s):
- """
- Quote a string for shell usage as a literal.
-
- This function quotes the given string in single-quotes using the
- shlex.quote. However, when the single-quote is present in the string it
- instead uses double-quotes, resulting in cleaner output (e.g. "don't"
- instead of 'don'"'"'t' that would be produced by shlex.quote).
-
- :param str s: String to quote for shell usage
- :return str: Quoted string safe for shell usage
- """
-
- if "'" not in s:
- return shlex.quote(s)
-
- # The string contains a single-quote, use double-quote style instead.
- # Escape following characters to make it literal: \ " $ ` !
- escaped = (s.replace('\\', '\\\\')
- .replace('"', '\\"')
- .replace('$', '\\$')
- .replace('`', '\\`')
- .replace('!', '\\!'))
- return '"{}"'.format(escaped)
-
-
class RemediationCommand(BaseRemediation):
def __init__(self, value=None):
if not isinstance(value, list):
@@ -310,7 +284,7 @@ class RemediationCommand(BaseRemediation):
def __repr__(self):
# NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly.
# As per python practices repr has to return an encoded string
- quoted_command_args = [_quote_for_shell(_guarantee_encoded_str(c)) for c in self._value['context']]
+ quoted_command_args = [shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']]
return "[{}] {}".format(self._value['type'], ' '.join(quoted_command_args))
diff --git a/packaging/leapp.spec b/packaging/leapp.spec
index ba906cf..0fde883 100644
--- a/packaging/leapp.spec
+++ b/packaging/leapp.spec
@@ -13,7 +13,7 @@
# This is kind of help for more flexible development of leapp repository,
# so people do not have to wait for new official release of leapp to ensure
# it is installed/used the compatible one.
-%global framework_version 6.4
+%global framework_version 6.5
# IMPORTANT: everytime the requirements are changed, increment number by one
# - same for Provides in deps subpackage
diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py
index 2a4e724..2010d29 100644
--- a/tests/scripts/test_reporting.py
+++ b/tests/scripts/test_reporting.py
@@ -23,7 +23,6 @@ from leapp.reporting import (
Title,
_add_to_dict,
_create_report_object,
- _quote_for_shell,
create_report_from_deprecation,
create_report_from_error,
)
@@ -113,40 +112,6 @@ def test_report_tags_and_flags():
assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"]
-@pytest.mark.parametrize('string, expected_quoted', [
- # No quoting needed
- ('path/to_the/file-name.txt', 'path/to_the/file-name.txt'),
- ('user@host', 'user@host'),
- ('value=123', 'value=123'),
- ('a:b:c', 'a:b:c'),
- ('99%', '99%'),
- ('a+b', 'a+b'),
-
- # Single-quote style (no single quote in string)
- ('', "''"),
- ('file with spaces.txt', "'file with spaces.txt'"),
- ('$(whoami)', "'$(whoami)'"),
- ('$USER', "'$USER'"),
- ('back`tick', "'back`tick'"),
- ('double"quote', "'double\"quote'"),
- ('exclaim!', "'exclaim!'"),
- ('back\\slash', "'back\\slash'"),
- ('new\nline', "'new\nline'"),
- ('key="value"', "'key=\"value\"'"),
-
- # Double-quote style (a single quote in string)
- ("It's fine", "\"It's fine\""),
- ("It's `whoami`", "\"It's \\`whoami\\`\""),
- ("User's home: $HOME", "\"User's home: \\$HOME\""),
- ("Don't panic!", "\"Don't panic\\!\""),
- ("s/'/\"/g", "\"s/'/\\\"/g\""),
- ("sed -i 's/'/\"/g' file.txt", "\"sed -i 's/'/\\\"/g' file.txt\""),
-])
-def test_quote_for_shell(string, expected_quoted):
- """Test that _quote_for_shell properly quotes strings for shell usage."""
- assert _quote_for_shell(string) == expected_quoted
-
-
@pytest.mark.parametrize('command, expected_command_form', [
(['cmd'], "cmd"),
(['cmd', ''], "cmd ''"),
@@ -174,12 +139,13 @@ def test_quote_for_shell(string, expected_quoted):
# Quoting '`'
(['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"),
- # Double-quote style when single quote is present
- (['echo', "It's fine"], "echo \"It's fine\""),
- (['mv', "user's file.txt", 'newfile.txt'], "mv \"user's file.txt\" newfile.txt"),
- (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i \"s/'/\\\"/g\" file.txt"),
- (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c \"echo \\\"user's home: \\$HOME\\\"\""),
- (['grep', "can't find", '/var/log/some report.log'], "grep \"can't find\" '/var/log/some report.log'"),
+ # Single quote in argument — shlex.quote uses the '"'"' pattern
+ (['echo', "It's fine"], "echo 'It'\"'\"'s fine'"),
+ (['mv', "user's file.txt", 'newfile.txt'], "mv 'user'\"'\"'s file.txt' newfile.txt"),
+ (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i 's/'\"'\"'/\"/g' file.txt"),
+ (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c 'echo \"user'\"'\"'s home: $HOME\"'"),
+ (['grep', "can't find", '/var/log/some report.log'], "grep 'can'\"'\"'t find' '/var/log/some report.log'"),
+ (['echo', "Don't panic!"], "echo 'Don'\"'\"'t panic!'"),
])
def test_remediation_command_repr_quoting(command, expected_command_form):
"""Test that RemediationCommand.__repr__ properly quotes arguments with special characters."""
--
2.53.0

View File

@ -1,228 +0,0 @@
From 66883ef34b1e241838b9812a8920bf6f6fb380e0 Mon Sep 17 00:00:00 2001
From: Matej Matuska <mmatuska@redhat.com>
Date: Wed, 20 May 2026 12:32:48 +0200
Subject: [PATCH] Fix exception in normalize_schemas for conflicting actor
config schemas
The normalize_schemas function incorrectly raises an exception when a
config schema (subclass of Config) is contained more than once in it's
input, regardless of whether it's a conflicting (same section and name,
but a difference in other members) or the same (same section and name).
Traceback:
Traceback (most recent call last):
File "/usr/bin/leapp", line 33, in <module>
sys.exit(load_entry_point('leapp==0.21.0', 'console_scripts', 'leapp')())
File "/usr/lib/python3.9/site-packages/leapp/cli/__init__.py", line 51, in main
cli.command.execute('leapp version {}'.format(VERSION))
File "/usr/lib/python3.9/site-packages/leapp/utils/clicmd.py", line 111, in execute
args.func(args)
File "/usr/lib/python3.9/site-packages/leapp/utils/clicmd.py", line 133, in called
self.target(args)
File "/usr/lib/python3.9/site-packages/leapp/cli/commands/upgrade/breadcrumbs.py", line 169, in wrapper
return f(*args, breadcrumbs=breadcrumbs, **kwargs)
File "/usr/lib/python3.9/site-packages/leapp/cli/commands/preupgrade/__init__.py", line 86, in preupgrade
command_utils.load_actor_configs_and_store_it_in_db(context, repositories, cfg)
File "/usr/lib/python3.9/site-packages/leapp/cli/commands/command_utils.py", line 291, in load_actor_configs_and_store_it_in_db
actor_config_schemas = actor_config.normalize_schemas(actor_config_schemas)
File "/usr/lib/python3.9/site-packages/leapp/actors/config.py", line 180, in normalize_schemas
if unique_name in added_fields and added_fields[unique_name] != field:
TypeError: 'set' object is not subscriptable
The added_fields variable is a set. The condition for checking conflicts
attempts to do indexing on the set, which is not possible in Python sets
and results in a TypeError.
This patch removes the set altogether since it doesn't bring any
advantage over just using the normalized_schemas dict.
Also add unit tests for the function.
---
leapp/actors/config.py | 44 ++++++-----
tests/scripts/test_actor_config.py | 114 +++++++++++++++++++++++++++++
2 files changed, 138 insertions(+), 20 deletions(-)
create mode 100644 tests/scripts/test_actor_config.py
diff --git a/leapp/actors/config.py b/leapp/actors/config.py
index 55775d5..d952bb6 100644
--- a/leapp/actors/config.py
+++ b/leapp/actors/config.py
@@ -169,31 +169,35 @@ def _get_config(config_dir='/etc/leapp/actor_conf.d'):
def normalize_schemas(schemas):
"""
Merge all schemas into a single dictionary and validate them for errors we can detect.
+
+ :param schemas: List of schemas to normalize
+ :type schemas: Iterable[Iterable[Type[Config]]]
+ :return A dictionary with structure: section -> name -> Config
+ :rtype: DefaultDict[str, Dict[str, Type[Config]]]
"""
- added_fields = set()
normalized_schema = defaultdict(dict)
for schema in schemas:
for field in schema:
- unique_name = (field.section, field.name)
-
+ # section and name are the unique key for a config
+ existing_field = normalized_schema[field.section].get(field.name, None)
# Error if the field has been added by another schema
- if unique_name in added_fields and added_fields[unique_name] != field:
- # TODO: Also include information on what Actor contains the
- # conflicting fields but that information isn't passed into
- # this function right now.
- message = ('Two actors added incompatible configuration items'
- ' with the same name for Section: {section},'
- ' Field: {field}'.format(section=field.section,
- field=field.name))
- log.error(message)
- raise SchemaError(message)
-
- # TODO: More validation here.
-
- # Store the fields from the schema in a way that we can easily look
- # up while validating
- added_fields.add(unique_name)
- normalized_schema[field.section][field.name] = field
+ if existing_field:
+ if existing_field != field:
+ # TODO: Also include information on what Actor contains the
+ # conflicting fields but that information isn't passed into
+ # this function right now.
+ message = (
+ 'Two actors added incompatible configuration items with'
+ ' the same name for Section: {section}, Field: {field}'
+ ).format(section=field.section, field=field.name)
+
+ log.error(message)
+ raise SchemaError(message)
+
+ # TODO: More validation here.
+
+ else:
+ normalized_schema[field.section][field.name] = field
return normalized_schema
diff --git a/tests/scripts/test_actor_config.py b/tests/scripts/test_actor_config.py
new file mode 100644
index 0000000..b8c02cd
--- /dev/null
+++ b/tests/scripts/test_actor_config.py
@@ -0,0 +1,114 @@
+from collections import defaultdict
+import pytest
+
+from leapp.actors.config import Config, SchemaError, normalize_schemas
+from leapp.models import fields
+
+
+class _TestConfigA(Config):
+ section = "test"
+ name = "a_setting"
+ type_ = fields.String()
+ description = 'Description here'
+ default = "default value"
+
+
+class _TestConfigB(Config):
+ section = "other_section"
+ name = "other_setting"
+ type_ = fields.String()
+ description = 'Description here'
+ default = "some default value"
+
+
+# conflicts in default
+class _TestConfigConflictsInDefault(Config):
+ section = "test"
+ name = "a_setting"
+ type_ = fields.String()
+ description = 'Description here'
+ default = "different than in A"
+
+
+# conflicts in type_
+class _TestConfigConflictsInType(Config):
+ section = "test"
+ name = "a_setting"
+ type_ = fields.Integer()
+ description = 'Description here'
+ default = "default value"
+
+
+@pytest.mark.parametrize(
+ "schemas",
+ [
+ # test configs from single actors are merged
+ [(_TestConfigA, _TestConfigB)],
+ # test configs from multiple actors are merged
+ [(_TestConfigA,), (_TestConfigB,)],
+ # test "deduplication"
+ [(_TestConfigA, _TestConfigA, _TestConfigB)],
+ [(_TestConfigA,), (_TestConfigA, _TestConfigB,)]
+ ],
+)
+def test_normalize_schemas_ok(schemas):
+ """
+ Test that valid schemas are detected and if required deduplicated
+ """
+ expect = defaultdict(dict)
+ expect["test"] = {"a_setting": _TestConfigA}
+ expect["other_section"] = {"other_setting": _TestConfigB}
+ ret = normalize_schemas(schemas)
+ assert ret == expect
+
+
+def test_normalize_schemas_identical():
+ """
+ Test that identical Config class objects are deduplicated
+ """
+ expect = defaultdict(dict)
+ expect["test"] = {"a_setting": _TestConfigA}
+
+ config = _TestConfigA
+
+ schemas = [(config, config)]
+ ret = normalize_schemas(schemas)
+ assert ret == expect
+
+ schemas = [(config,), (config,)]
+ ret = normalize_schemas(schemas)
+ assert ret == expect
+
+
+@pytest.mark.parametrize(
+ "schemas",
+ [
+ [(_TestConfigA, _TestConfigConflictsInDefault)],
+ [(_TestConfigA, _TestConfigConflictsInType)],
+ ]
+)
+def test_normalize_schemas_intra_conflict(schemas):
+ """
+ Test that conflicts within a single Actor config schema are detected
+ """
+ with pytest.raises(SchemaError):
+ normalize_schemas(schemas)
+
+
+@pytest.mark.parametrize(
+ "schemas",
+ [
+ [(_TestConfigA,), (_TestConfigConflictsInDefault,)],
+ [(_TestConfigA,), (_TestConfigConflictsInType,)],
+ ]
+)
+def test_normalize_schemas_inter_conflict(schemas):
+ """
+ Test that conflicts between multiple Actor config schemas are detected
+ """
+ with pytest.raises(SchemaError):
+ normalize_schemas(schemas)
+
+
+def test_normalize_schemas_empty():
+ assert normalize_schemas([]) == defaultdict(dict)
--
2.54.0

View File

@ -1,28 +0,0 @@
From 0a5b9b7bb44fbe71c97b10673be71e343abcf58c Mon Sep 17 00:00:00 2001
From: Matej Matuska <mmatuska@redhat.com>
Date: Wed, 20 May 2026 12:45:21 +0200
Subject: [PATCH] Makefile: add test_no_lint
The test rules always lints, add a variant which just tests.
---
Makefile | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Makefile b/Makefile
index a68b8fe..dd2d8b9 100644
--- a/Makefile
+++ b/Makefile
@@ -202,6 +202,10 @@ test: lint
@ $(ENTER_VENV) \
pytest -vv --cov-report term-missing --cov=leapp tests/scripts
+test_no_lint:
+ @ $(ENTER_VENV) \
+ pytest -vv --cov-report term-missing --cov=leapp tests/scripts
+
# TODO(pstodulk): create ticket to add rhel10 for testing.... py: 3.12
test_container:
@case $(_TEST_CONTAINER) in \
--
2.54.0

View File

@ -0,0 +1,872 @@
From bc7fce7288ed8f642be561947aa9d7c7f3047097 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michal=20He=C4=8Dko?= <michal.sk.com@gmail.com>
Date: Mon, 3 Mar 2025 12:32:42 +0100
Subject: [PATCH 1/7] CI:packit: update e2e tests to reflect current IPU paths
The current source version used in e2e tests is 8.6 and the target version is 9.0, which are unsupported. This patch bumps the source/target versions used in the CI to source=8.10 and target=9.4. There is also a job with target=9.6, which is expected to be failing until 9.6 is released.
Also rhel 7 & python2 is not supported anymore. Dropping these obsoleted tests.
---
.github/workflows/tmt-tests.yml | 27 +-
.packit.yaml | 649 ++++----------------------------
2 files changed, 94 insertions(+), 582 deletions(-)
diff --git a/.github/workflows/tmt-tests.yml b/.github/workflows/tmt-tests.yml
index d994f31..d047cb3 100644
--- a/.github/workflows/tmt-tests.yml
+++ b/.github/workflows/tmt-tests.yml
@@ -69,62 +69,61 @@ jobs:
&& ! startsWith(github.event.comment.body, '/rerun-sst')
&& contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
- call_workflow_tests_86to90_integration:
+ call_workflow_tests_810to94_integration:
needs: call_workflow_copr_build
uses: ./.github/workflows/reuse-tests-8to9.yml
secrets: inherit
with:
copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*7to8)(?!.*max_sst)"
- variables: 'SOURCE_RELEASE=8.6;TARGET_RELEASE=9.0;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;LEAPPDATA_BRANCH=upstream'
- pull_request_status_name: "8.6to9.0"
+ variables: 'SOURCE_RELEASE=8.10;TARGET_RELEASE=9.4;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;LEAPPDATA_BRANCH=upstream'
+ pull_request_status_name: "8.10to9.4"
if: |
github.event.issue.pull_request
&& ! startsWith(github.event.comment.body, '/rerun-sst')
&& contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
- call_workflow_tests_88to92_integration:
+ call_workflow_tests_810to96_integration:
needs: call_workflow_copr_build
uses: ./.github/workflows/reuse-tests-8to9.yml
secrets: inherit
with:
copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*7to8)(?!.*max_sst)"
- variables: 'SOURCE_RELEASE=8.8;TARGET_RELEASE=9.2;LEAPP_DEVEL_TARGET_RELEASE=9.2;RHSM_REPOS=rhel-8-for-x86_64-appstream-beta-rpms,rhel-8-for-x86_64-baseos-beta-rpms;LEAPPDATA_BRANCH=upstream'
- compose: "RHEL-8.8.0-Nightly"
- pull_request_status_name: "8.8to9.2"
- tmt_context: "distro=rhel-8.8"
+ variables: 'SOURCE_RELEASE=8.10;TARGET_RELEASE=9.6;LEAPP_DEVEL_TARGET_RELEASE=9.6;RHSM_REPOS=rhel-8-for-x86_64-appstream-beta-rpms,rhel-8-for-x86_64-baseos-beta-rpms;LEAPPDATA_BRANCH=upstream'
+ pull_request_status_name: "8.8to9.6"
+ tmt_context: "distro=rhel-8.10"
if: |
github.event.issue.pull_request
&& ! startsWith(github.event.comment.body, '/rerun-sst')
&& contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
- call_workflow_tests_86to90_sst:
+ call_workflow_tests_810to94_sst:
needs: call_workflow_copr_build
uses: ./.github/workflows/reuse-tests-8to9.yml
secrets: inherit
with:
copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
tmt_plan_regex: "^(?!.*tier[2-3].*)(.*max_sst.*)"
- variables: 'SOURCE_RELEASE=8.6;TARGET_RELEASE=9.0;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;LEAPPDATA_BRANCH=upstream'
- pull_request_status_name: "8.6to9.0-sst"
+ variables: 'SOURCE_RELEASE=8.10;TARGET_RELEASE=9.4;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;LEAPPDATA_BRANCH=upstream'
+ pull_request_status_name: "8.10to9.4-sst"
update_pull_request_status: 'false'
if: |
github.event.issue.pull_request
&& startsWith(github.event.comment.body, '/rerun-sst')
&& contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
- call_workflow_tests_86to90_aws:
+ call_workflow_tests_810to94_aws:
needs: call_workflow_copr_build
uses: ./.github/workflows/reuse-tests-8to9.yml
secrets: inherit
with:
copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*7to8)(.*e2e)"
- compose: "RHEL-8.6-rhui"
+ compose: "RHEL-8.10-rhui"
environment_settings: '{"provisioning": {"post_install_script": "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"}}'
pull_request_status_name: "8to9-aws-e2e"
- variables: 'SOURCE_RELEASE=8.6;TARGET_RELEASE=9.0;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;RHUI=aws;LEAPPDATA_BRANCH=upstream'
+ variables: 'SOURCE_RELEASE=8.10;TARGET_RELEASE=9.4;RHSM_REPOS=rhel-8-for-x86_64-appstream-eus-rpms,rhel-8-for-x86_64-baseos-eus-rpms;RHUI=aws;LEAPPDATA_BRANCH=upstream'
if: |
github.event.issue.pull_request
&& ! startsWith(github.event.comment.body, '/rerun-sst')
diff --git a/.packit.yaml b/.packit.yaml
index 36a6e16..6f41db1 100644
--- a/.packit.yaml
+++ b/.packit.yaml
@@ -12,7 +12,6 @@ jobs:
owner: "@oamg"
project: leapp
targets:
- - epel-7-x86_64
- epel-8-x86_64
- epel-9-x86_64
- fedora-all-aarch64
@@ -31,7 +30,6 @@ jobs:
owner: "@oamg"
project: leapp
targets:
- - epel-7-x86_64
- epel-8-x86_64
- epel-9-x86_64
- fedora-all-aarch64
@@ -51,341 +49,64 @@ jobs:
# >7tox path https://gitlab.cee.redhat.com/oamg/leapp-tests/-/blob/main/config.yaml
# Available only to RH Employees.
+
# ###################################################################### #
-# ############################### 7 TO 8 ############################### #
+# ############################## 8 TO 9 ################################ #
# ###################################################################### #
# ###################################################################### #
# ### Abstract job definitions to make individual tests/jobs smaller ### #
# ###################################################################### #
-- &sanity-abstract-7to8
+
+#NOTE(pstodulk) putting default values in abstract jobs as from 8.10, as this
+# is the last RHEL 8 release and all new future tests will start from this
+# one release.
+
+# This job is never triggered - we define abstract anchor that are reused in jobs that 'inherit'
+# and have actionable triggers
+- &sanity-abstract-8to9
job: tests
trigger: ignore
fmf_url: "https://gitlab.cee.redhat.com/oamg/leapp-tests"
- fmf_ref: "rhel7"
+ fmf_ref: "main"
use_internal_tf: True
labels:
- sanity
targets:
- epel-7-x86_64:
- distros: [RHEL-7.9-ZStream]
- identifier: sanity-abstract-7to8
- tmt_plan: ""
-
-- &sanity-abstract-7to8-aws
- <<: *sanity-abstract-7to8
- labels:
- - sanity
- - aws
- targets:
- epel-7-x86_64:
- distros: [RHEL-7.9-rhui]
- identifier: sanity-abstract-7to8-aws
-
-# On-demand minimal beaker tests
-- &beaker-minimal-7to8-abstract-ondemand
- <<: *sanity-abstract-7to8
- manual_trigger: True
- labels:
- - beaker-minimal
- identifier: beaker-minimal-7to8-abstract-ondemand
-
-# On-demand kernel-rt tests
-- &kernel-rt-abstract-7to8-ondemand
- <<: *beaker-minimal-7to8-abstract-ondemand
- labels:
- - kernel-rt
- identifier: sanity-7to8-kernel-rt-abstract-ondemand
-
-# ###################################################################### #
-# ######################### Individual tests ########################### #
-# ###################################################################### #
-
-# Tests: 7.9 -> 8.8
-- &sanity-79to88-aws
- <<: *sanity-abstract-7to8-aws
- trigger: pull_request
- identifier: sanity-7.9to8.8-aws
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:upgrade_happy_path & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.8"
- settings:
- provisioning:
- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.8"
- RHUI: "aws"
- LEAPPDATA_BRANCH: "upstream"
- LEAPP_NO_RHSM: "1"
- USE_CUSTOM_REPOS: rhui
-
-- &sanity-79to88
- <<: *sanity-abstract-7to8
- trigger: pull_request
- identifier: sanity-7.9to8.8
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:sanity & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.8"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.8"
-
-- &beaker-minimal-79to88
- <<: *beaker-minimal-7to8-abstract-ondemand
- trigger: pull_request
- labels:
- - beaker-minimal
- - beaker-minimal-7.9to8.8
- - 7.9to8.8
- identifier: sanity-7.9to8.8-beaker-minimal-ondemand
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:partitioning & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.8"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.8"
-
-- &kernel-rt-79to88
- <<: *kernel-rt-abstract-7to8-ondemand
- trigger: pull_request
- labels:
- - kernel-rt
- - kernel-rt-7.9to8.8
- - 7.9to8.8
- identifier: sanity-7.9to8.8-kernel-rt-ondemand
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:kernel-rt & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.8"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.8"
-
-# Tests: 7.9 -> 8.10
-- &sanity-79to810
- <<: *sanity-abstract-7to8
- trigger: pull_request
- identifier: sanity-7.9to8.10
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:sanity & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.10"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.10"
-
-- &sanity-79to810-aws
- <<: *sanity-abstract-7to8-aws
- trigger: pull_request
- identifier: sanity-7.9to8.10-aws
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:upgrade_happy_path & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.10"
- settings:
- provisioning:
- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.10"
- RHUI: "aws"
- LEAPPDATA_BRANCH: "upstream"
- LEAPP_NO_RHSM: "1"
- USE_CUSTOM_REPOS: rhui
-
-- &beaker-minimal-79to810
- <<: *beaker-minimal-7to8-abstract-ondemand
- trigger: pull_request
- labels:
- - beaker-minimal
- - beaker-minimal-7.9to8.10
- - 7.9to8.10
- identifier: sanity-7.9to8.10-beaker-minimal-ondemand
+ epel-8-x86_64:
+ distros: [RHEL-8.10.0-Nightly]
+ identifier: sanity-abstract-8to9
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:7to8 & tag:partitioning & enabled:true'
+ plan_filter: 'tag:8to9'
environments:
- - artifacts:
+ - artifacts: &artifacts-for-rhel8
- type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
+ id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
packages:
- leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
+ - python3-leapp
+ - leapp-upgrade-el8toel9-deps
order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.10"
+ - &tmt-env-settings-810to94
+ tmt:
+ context: &tmt-context-810to94
+ distro: "rhel-8.10"
+ distro_target: "rhel-9.4"
settings:
provisioning:
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.10"
-
-- &kernel-rt-79to810
- <<: *kernel-rt-abstract-7to8-ondemand
- trigger: pull_request
- labels:
- - kernel-rt
- - kernel-rt-7.9to8.10
- - 7.9to8.10
- identifier: sanity-7.9to8.10-kernel-rt-ondemand
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:7to8 & tag:kernel-rt & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-7-x86_64/"
- packages:
- - leapp-repository
- - python2-leapp
- - leapp-upgrade-el7toel8-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-7.9"
- distro_target: "rhel-8.10"
+ - &tmt-env-settings-810to96
+ tmt:
+ context: &tmt-context-810to96
+ distro: "rhel-8.10"
+ distro_target: "rhel-9.6"
settings:
provisioning:
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "7.9"
- TARGET_RELEASE: "8.10"
-
-
-# ###################################################################### #
-# ############################## 8 TO 9 ################################ #
-# ###################################################################### #
-
-# ###################################################################### #
-# ### Abstract job definitions to make individual tests/jobs smaller ### #
-# ###################################################################### #
-
-#NOTE(pstodulk) putting default values in abstract jobs as from 8.10, as this
-# is the last RHEL 8 release and all new future tests will start from this
-# one release.
-
-- &sanity-abstract-8to9
- job: tests
- trigger: ignore
- fmf_url: "https://gitlab.cee.redhat.com/oamg/leapp-tests"
- fmf_ref: "main"
- use_internal_tf: True
- labels:
- - sanity
- targets:
- epel-8-x86_64:
- distros: [RHEL-8.10.0-Nightly]
- identifier: sanity-abstract-8to9
- &sanity-abstract-8to9-aws
<<: *sanity-abstract-8to9
@@ -414,154 +135,9 @@ jobs:
identifier: sanity-8to9-kernel-rt-abstract-ondemand
# ###################################################################### #
-# ######################### Individual tests ########################### #
+# ############################# 8.10 > 9.4 ############################# #
# ###################################################################### #
-# Tests: 8.8 -> 9.2
-- &sanity-88to92
- <<: *sanity-abstract-8to9
- trigger: pull_request
- targets:
- epel-8-x86_64:
- distros: [RHEL-8.8.0-Nightly]
- identifier: sanity-8.8to9.2
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:8to9 & tag:tier0 & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- tmt:
- context:
- distro: "rhel-8.8"
- distro_target: "rhel-9.2"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "8.8"
- TARGET_RELEASE: "9.2"
- RHSM_REPOS_EUS: "eus"
-
-- &sanity-88to92-aws
- <<: *sanity-abstract-8to9-aws
- trigger: pull_request
- targets:
- epel-8-x86_64:
- distros: [RHEL-8.8-rhui]
- identifier: sanity-8.8to9.2-aws
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:8to9 & tag:rhui-tier[0] & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- tmt:
- context:
- distro: "rhel-8.8"
- distro_target: "rhel-9.2"
- settings:
- provisioning:
- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "8.8"
- TARGET_RELEASE: "9.2"
- RHUI_HYPERSCALER: aws
-
-- &beaker-minimal-88to92
- <<: *beaker-minimal-8to9-abstract-ondemand
- trigger: pull_request
- labels:
- - beaker-minimal
- - beaker-minimal-8.8to9.2
- - 8.8to9.2
- targets:
- epel-8-x86_64:
- distros: [RHEL-8.8.0-Nightly]
- identifier: sanity-8.8to9.2-beaker-minimal-ondemand
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:8to9 &tag:partitioning & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- tmt:
- context:
- distro: "rhel-8.8"
- distro_target: "rhel-9.2"
- settings:
- provisioning:
- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "8.8"
- TARGET_RELEASE: "9.2"
- RHSM_REPOS_EUS: "eus"
-
-- &kernel-rt-88to92
- <<: *kernel-rt-abstract-8to9-ondemand
- trigger: pull_request
- labels:
- - kernel-rt
- - kernel-rt-8.8to9.2
- - 8.8to9.2
- identifier: sanity-8.8to9.2-kernel-rt-ondemand
- targets:
- epel-8-x86_64:
- distros: [RHEL-8.8.0-Nightly]
- tf_extra_params:
- test:
- tmt:
- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
- environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- tmt:
- context:
- distro: "rhel-8.8"
- distro_target: "rhel-9.2"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
- SOURCE_RELEASE: "8.8"
- TARGET_RELEASE: "9.2"
- RHSM_REPOS_EUS: "eus"
-
-
-# Tests: 8.10 -> 9.4
- &sanity-810to94
<<: *sanity-abstract-8to9
trigger: pull_request
@@ -571,27 +147,12 @@ jobs:
tmt:
plan_filter: 'tag:8to9 & tag:tier0 & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.4"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to94
+ env: &env-810to94
SOURCE_RELEASE: "8.10"
TARGET_RELEASE: "9.4"
-# On-demand minimal beaker tests
- &beaker-minimal-810to94
<<: *beaker-minimal-8to9-abstract-ondemand
trigger: pull_request
@@ -605,27 +166,11 @@ jobs:
tmt:
plan_filter: 'tag:8to9 & tag:partitioning & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.4"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to94
env:
- SOURCE_RELEASE: "8.10"
- TARGET_RELEASE: "9.4"
+ <<: *env-810to94
-# On-demand kernel-rt tests
- &kernel-rt-810to94
<<: *kernel-rt-abstract-8to9-ondemand
trigger: pull_request
@@ -639,56 +184,54 @@ jobs:
tmt:
plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to94
+ env:
+ <<: *env-810to94
+
+- &sanity-810to94-aws
+ <<: *sanity-abstract-8to9-aws
+ trigger: pull_request
+ targets:
+ epel-8-x86_64:
+ distros: [RHEL-8.10-rhui]
+ identifier: sanity-8.10to9.4-aws
+ tf_extra_params:
+ test:
+ tmt:
+ plan_filter: 'tag:8to9 & tag:rhui-tier[0] & enabled:true'
+ environments:
+ - artifacts: *artifacts-for-rhel8
- tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.4"
+ context: *tmt-context-810to94
settings:
provisioning:
+ post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"
tags:
BusinessUnit: sst_upgrades@leapp_upstream_test
env:
- SOURCE_RELEASE: "8.10"
- TARGET_RELEASE: "9.4"
+ <<: *env-810to94
+ RHUI_HYPERSCALER: aws
-# Tests: 8.10 -> 9.5
-- &sanity-810to95
+# ###################################################################### #
+# ############################# 8.10 > 9.6 ############################# #
+# ###################################################################### #
+
+- &sanity-810to96
<<: *sanity-abstract-8to9
trigger: pull_request
- identifier: sanity-8.10to9.5
+ identifier: sanity-8.10to9.6
tf_extra_params:
test:
tmt:
plan_filter: 'tag:8to9 & tag:tier0 & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.5"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
- env:
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to96
+ env: &env-810to96
SOURCE_RELEASE: "8.10"
- TARGET_RELEASE: "9.5"
+ TARGET_RELEASE: "9.6"
# On-demand minimal beaker tests
- &beaker-minimal-810to95
@@ -696,64 +239,34 @@ jobs:
trigger: pull_request
labels:
- beaker-minimal
- - beaker-minimal-8.10to9.5
- - 8.10to9.5
- identifier: sanity-8.10to9.5-beaker-minimal-ondemand
+ - beaker-minimal-8.10to9.6
+ - 8.10to9.6
+ identifier: sanity-8.10to9.6-beaker-minimal-ondemand
tf_extra_params:
test:
tmt:
plan_filter: 'tag:8to9 & tag:partitioning & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.5"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to96
env:
- SOURCE_RELEASE: "8.10"
- TARGET_RELEASE: "9.5"
+ <<: *env-810to96
# On-demand kernel-rt tests
-- &kernel-rt-810to95
+- &kernel-rt-810to96
<<: *kernel-rt-abstract-8to9-ondemand
trigger: pull_request
labels:
- kernel-rt
- - kernel-rt-8.10to9.5
- - 8.10to9.5
- identifier: sanity-8.10to9.5-kernel-rt-ondemand
+ - kernel-rt-8.10to9.6
+ - 8.10to9.6
+ identifier: sanity-8.10to9.6-kernel-rt-ondemand
tf_extra_params:
test:
tmt:
plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true'
environments:
- - artifacts:
- - type: "repository"
- id: "https://download.copr.fedorainfracloud.org/results/@oamg/leapp/epel-8-x86_64/"
- packages:
- - leapp-repository
- - python3-leapp
- - leapp-upgrade-el8toel9-deps
- order: 40
- - tmt:
- context:
- distro: "rhel-8.10"
- distro_target: "rhel-9.5"
- settings:
- provisioning:
- tags:
- BusinessUnit: sst_upgrades@leapp_upstream_test
+ - artifacts: *artifacts-for-rhel8
+ - *tmt-env-settings-810to96
env:
- SOURCE_RELEASE: "8.10"
- TARGET_RELEASE: "9.5"
+ <<: *env-810to96
--
2.49.0

View File

@ -0,0 +1,30 @@
From 4ddbae04c8d012ef48e9cef198050e96fad8c402 Mon Sep 17 00:00:00 2001
From: MichalHe <michal.sk.com@gmail.com>
Date: Tue, 18 Mar 2025 10:33:11 +0100
Subject: [PATCH 2/7] configs: recognize only the .yaml file extension
Leapp recognized two file extensions for its configuration files:
.yaml and .yml. This patch removes the recognition of .yml to
avoid user confusion, e.g., creating configuration files with
the same name but different extensions. This patch also enforces
our documentation to use only one extension.
---
leapp/actors/config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/leapp/actors/config.py b/leapp/actors/config.py
index 160c159..55775d5 100644
--- a/leapp/actors/config.py
+++ b/leapp/actors/config.py
@@ -146,7 +146,7 @@ def _get_config(config_dir='/etc/leapp/actor_conf.d'):
# We do not do a recursive walk to maintain Python2 compatibility, but we do
# not expect rich config hierarchies, so no harm done.
config_files = glob.glob(os.path.join(config_dir, '*'))
- config_files = [f for f in config_files if f.endswith('.yml') or f.endswith('.yaml')]
+ config_files = [f for f in config_files if f.endswith('.yaml')]
config_files.sort()
configuration = {}
--
2.49.0

View File

@ -0,0 +1,30 @@
From 4c805dd449c39c1ff00cea4563cc8227ff23a5ec Mon Sep 17 00:00:00 2001
From: karolinku <kkula@redhat.com>
Date: Tue, 1 Apr 2025 16:01:08 +0200
Subject: [PATCH 3/7] Handle case when db directory is missing
When directory is missing, this change will introduce creation of
missing path and allow proceeding with execution.
JIRA: RHEL-54382
---
leapp/utils/audit/__init__.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/leapp/utils/audit/__init__.py b/leapp/utils/audit/__init__.py
index 8511179..d5ebb73 100644
--- a/leapp/utils/audit/__init__.py
+++ b/leapp/utils/audit/__init__.py
@@ -57,6 +57,9 @@ def create_connection(path):
:param path: Path to the database
:return: Connection object
"""
+ db_dir_path = os.path.dirname(path)
+ if not os.path.exists(db_dir_path):
+ os.mkdir(db_dir_path, mode=0o700)
with _umask(0o177):
return _initialize_database(sqlite3.connect(path))
--
2.49.0

View File

@ -0,0 +1,66 @@
From 372ac6894d206eb9adab704dd12a901d824f4b39 Mon Sep 17 00:00:00 2001
From: Petr Stodulka <pstodulk@redhat.com>
Date: Sun, 6 Apr 2025 20:06:03 +0200
Subject: [PATCH 4/7] Fix CLI: allow to set falsy values as default
When specifying an option for a leapp CLI command using @add_option
decorator, it has not been possible to specify a "falsy" value
(or let's say empty) as `default` e.g. empty string, empty list, etc.
Start to check NoneType for the `default` parameter properly to
allow it to set this.
Bump leapp-framework to 6.1.
Note:
The similar problem is for `choices` and `metavar` parameters.
In case of `metavar` it's however ok to ignore empty string.
In case of empty `choices` it would lead to the same evaluation as
in case of NoneType (any input is ok). So I that the `default` is the
only parameter that needs to be checked properly.
JIRA: RHEL-86206
---
leapp/utils/clicmd.py | 6 +++---
packaging/leapp.spec | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/leapp/utils/clicmd.py b/leapp/utils/clicmd.py
index eef6834..89d3e27 100644
--- a/leapp/utils/clicmd.py
+++ b/leapp/utils/clicmd.py
@@ -228,8 +228,8 @@ class Command(object):
:type metavar: str
:param choices: range of values that the argument is allowed to take
:type choices: list
- :param choices: default value of the argument if nothing is specified
- :type choices: str
+ :param default: default value of the argument if nothing is specified
+ :type default: any
:return: self
"""
name = name.lstrip('-')
@@ -250,7 +250,7 @@ class Command(object):
kwargs['metavar'] = metavar
if choices:
kwargs['choices'] = choices
- if default:
+ if default is not None:
kwargs['default'] = default
self._add_opt(*names, help=help, # noqa; pylint: disable=redefined-builtin
action=action, internal={'wrapped': wrapped, 'inherit': inherit}, **kwargs)
diff --git a/packaging/leapp.spec b/packaging/leapp.spec
index b942112..19d49e1 100644
--- a/packaging/leapp.spec
+++ b/packaging/leapp.spec
@@ -13,7 +13,7 @@
# This is kind of help for more flexible development of leapp repository,
# so people do not have to wait for new official release of leapp to ensure
# it is installed/used the compatible one.
-%global framework_version 6.0
+%global framework_version 6.1
# IMPORTANT: everytime the requirements are changed, increment number by one
# - same for Provides in deps subpackage
--
2.49.0

View File

@ -0,0 +1,40 @@
From 53f22282347011801fa709ba6b558f87fec26bc1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 7 Apr 2025 13:01:51 +0000
Subject: [PATCH 5/7] chore(deps): update sclorg/testing-farm-as-github-action
action to v4
---
.github/workflows/reuse-tests-7to8.yml | 2 +-
.github/workflows/reuse-tests-8to9.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/reuse-tests-7to8.yml b/.github/workflows/reuse-tests-7to8.yml
index 65621b5..7f7ce35 100644
--- a/.github/workflows/reuse-tests-7to8.yml
+++ b/.github/workflows/reuse-tests-7to8.yml
@@ -46,7 +46,7 @@ jobs:
steps:
- name: Schedule regression testing for 7to8
id: run_test_7to8
- uses: sclorg/testing-farm-as-github-action@v3.1.2
+ uses: sclorg/testing-farm-as-github-action@v4.0.0
with:
# required
api_url: ${{ secrets.TF_ENDPOINT }}
diff --git a/.github/workflows/reuse-tests-8to9.yml b/.github/workflows/reuse-tests-8to9.yml
index 12e69c7..811fd8e 100644
--- a/.github/workflows/reuse-tests-8to9.yml
+++ b/.github/workflows/reuse-tests-8to9.yml
@@ -47,7 +47,7 @@ jobs:
steps:
- name: Schedule regression testing for 8to9
id: run_test_8to9
- uses: sclorg/testing-farm-as-github-action@v3.1.2
+ uses: sclorg/testing-farm-as-github-action@v4.0.0
with:
# required
api_url: ${{ secrets.TF_ENDPOINT }}
--
2.49.0

View File

@ -0,0 +1,180 @@
From cfdce5f3fc6fce6d9e253c153ec94aad9ceb0609 Mon Sep 17 00:00:00 2001
From: Tomas Fratrik <tomasfratrik8@gmail.com>
Date: Wed, 23 Apr 2025 13:11:32 +0200
Subject: [PATCH 6/7] Remove 7to8 CI tests
Removing 7to8 CI tests because the upgrade path from RHEL-7 to RHEL-8 is no longer supported.
Jira: RHELMISC-11004
---
.github/workflows/reuse-tests-7to8.yml | 69 --------------------------
.github/workflows/tmt-tests.yml | 59 ----------------------
.github/workflows/unit-tests.yml | 6 ---
3 files changed, 134 deletions(-)
delete mode 100644 .github/workflows/reuse-tests-7to8.yml
diff --git a/.github/workflows/reuse-tests-7to8.yml b/.github/workflows/reuse-tests-7to8.yml
deleted file mode 100644
index 7f7ce35..0000000
--- a/.github/workflows/reuse-tests-7to8.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: reuse-tests-7to8@TF
-
-on:
- workflow_call:
- secrets:
- TF_ENDPOINT:
- required: True
- TF_API_KEY:
- required: True
- inputs:
- copr_artifacts:
- required: True
- type: string
- tmt_plan_regex:
- type: string
- default: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*8to9)"
- environment_settings:
- type: string
- default: '{"provisioning": {"post_install_script": "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys"}}'
- arch:
- type: string
- default: 'x86_64'
- pull_request_status_name:
- type: string
- default: '7to8'
- copr:
- type: string
- default: 'epel-7-x86_64'
- tmt_context:
- type: string
- default: 'distro=rhel-7.9'
- compose:
- type: string
- default: 'RHEL-7.9-ZStream'
- variables:
- type: string
- default: ''
- update_pull_request_status:
- type: string
- default: 'true'
-
-jobs:
- reusable_workflow_job:
- name: Schedule regression tests on Testing Farm
- runs-on: ubuntu-24.04
- steps:
- - name: Schedule regression testing for 7to8
- id: run_test_7to8
- uses: sclorg/testing-farm-as-github-action@v4.0.0
- with:
- # required
- api_url: ${{ secrets.TF_ENDPOINT }}
- api_key: ${{ secrets.TF_API_KEY }}
- git_url: 'https://gitlab.cee.redhat.com/oamg/tmt-plans'
- github_token: ${{ secrets.GITHUB_TOKEN }}
- # optional
- tf_scope: 'private'
- create_issue_comment: 'true'
- update_pull_request_status: ${{ inputs.update_pull_request_status }}
- tmt_plan_regex: ${{ inputs.tmt_plan_regex }}
- compose: ${{ inputs.compose }}
- arch: ${{ inputs.arch }}
- copr: ${{ inputs.copr }}
- copr_artifacts: ${{ inputs.copr_artifacts }}
- debug: ${{ secrets.ACTIONS_STEP_DEBUG }}
- tmt_context: ${{ inputs.tmt_context }}
- pull_request_status_name: ${{ inputs.pull_request_status_name }}
- environment_settings: ${{ inputs.environment_settings }}
- variables: ${{ inputs.variables }}
diff --git a/.github/workflows/tmt-tests.yml b/.github/workflows/tmt-tests.yml
index d047cb3..d4671c4 100644
--- a/.github/workflows/tmt-tests.yml
+++ b/.github/workflows/tmt-tests.yml
@@ -10,65 +10,6 @@ jobs:
uses: ./.github/workflows/reuse-copr-build.yml
secrets: inherit
- call_workflow_tests_79to88_integration:
- needs: call_workflow_copr_build
- uses: ./.github/workflows/reuse-tests-7to8.yml
- secrets: inherit
- with:
- copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
- tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*8to9)(?!.*max_sst)"
- pull_request_status_name: "7.9to8.8"
- variables: 'SOURCE_RELEASE=7.9;TARGET_RELEASE=8.8;LEAPPDATA_BRANCH=upstream'
- if: |
- github.event.issue.pull_request
- && ! startsWith(github.event.comment.body, '/rerun-sst')
- && contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
-
- call_workflow_tests_79to86_integration:
- needs: call_workflow_copr_build
- uses: ./.github/workflows/reuse-tests-7to8.yml
- secrets: inherit
- with:
- copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
- tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*8to9)(?!.*max_sst)"
- variables: 'SOURCE_RELEASE=7.9;TARGET_RELEASE=8.6;LEAPPDATA_BRANCH=upstream'
- pull_request_status_name: "7.9to8.6"
- if: |
- github.event.issue.pull_request
- && ! startsWith(github.event.comment.body, '/rerun-sst')
- && contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
-
- call_workflow_tests_79to88_sst:
- needs: call_workflow_copr_build
- uses: ./.github/workflows/reuse-tests-7to8.yml
- secrets: inherit
- with:
- copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
- tmt_plan_regex: "^(?!.*tier[2-3].*)(.*max_sst.*)"
- pull_request_status_name: "7.9to8.8-sst"
- update_pull_request_status: 'false'
- variables: 'SOURCE_RELEASE=7.9;TARGET_RELEASE=8.8;LEAPPDATA_BRANCH=upstream'
- if: |
- github.event.issue.pull_request
- && startsWith(github.event.comment.body, '/rerun-sst')
- && contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
-
- call_workflow_tests_7to8_aws:
- needs: call_workflow_copr_build
- uses: ./.github/workflows/reuse-tests-7to8.yml
- secrets: inherit
- with:
- copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }}
- tmt_plan_regex: "^(?!.*upgrade_plugin)(?!.*tier[2-3].*)(?!.*rhsm)(?!.*c2r)(?!.*sap)(?!.*8to9)(.*e2e)"
- compose: "RHEL-7.9-rhui"
- environment_settings: '{"provisioning": {"post_install_script": "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys; echo 42; yum-config-manager --enable rhel-7-server-rhui-optional-rpms"}}'
- pull_request_status_name: "7to8-aws-e2e"
- variables: 'SOURCE_RELEASE=7.9;TARGET_RELEASE=8.6;RHUI=aws;LEAPPDATA_BRANCH=upstream'
- if: |
- github.event.issue.pull_request
- && ! startsWith(github.event.comment.body, '/rerun-sst')
- && contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
-
call_workflow_tests_810to94_integration:
needs: call_workflow_copr_build
uses: ./.github/workflows/reuse-tests-8to9.yml
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index d994b27..2702e93 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -33,12 +33,6 @@ jobs:
- name: Run python linters with python 3.6 on el8
python: python3.6
container: ubi8-lint
- - name: Run unit tests with python2.7 on el7
- python: python2.7
- container: ubi7
- - name: Run python linters with python2.7 on el7
- python: python2.7
- container: ubi7-lint
steps:
- name: Checkout code
--
2.49.0

View File

@ -0,0 +1,35 @@
From 3981f12bd9c8d71539f2ccd8b1877d203a292efd Mon Sep 17 00:00:00 2001
From: Michal Macura <mmacura@redhat.com>
Date: Tue, 6 May 2025 17:26:30 +0200
Subject: [PATCH 7/7] Update .packit.yaml to fix failing rhui job
This commit updates the tag and env for the sanity-810to94-aws job to
make it run correctly.
---
.packit.yaml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/.packit.yaml b/.packit.yaml
index 6f41db1..67e0b28 100644
--- a/.packit.yaml
+++ b/.packit.yaml
@@ -199,7 +199,7 @@ jobs:
tf_extra_params:
test:
tmt:
- plan_filter: 'tag:8to9 & tag:rhui-tier[0] & enabled:true'
+ plan_filter: 'tag:8to9 & tag:rhui-aws-tier0 & enabled:true'
environments:
- artifacts: *artifacts-for-rhel8
- tmt:
@@ -211,7 +211,6 @@ jobs:
BusinessUnit: sst_upgrades@leapp_upstream_test
env:
<<: *env-810to94
- RHUI_HYPERSCALER: aws
# ###################################################################### #
--
2.49.0

View File

@ -7,7 +7,7 @@
# it. In case of upstream, dependencies are set differently, but YUM is not
# capable enough to deal with them correctly all the time; we continue to use
# simplified deps in RHEL to ensure that YUM can deal with it.
%global framework_version 6.6
%global framework_version 6.1
# IMPORTANT: everytime the requirements are changed, increment number by one
# - same for Provides in deps subpackage
@ -36,8 +36,8 @@
%endif
Name: leapp
Version: 0.21.0
Release: 2%{?dist}.elevate.1
Version: 0.19.0
Release: 3%{?dist}
Summary: OS & Application modernization framework
License: ASL 2.0
@ -65,19 +65,14 @@ Requires: leapp-repository
# PATCHES HERE
# Patch0001: filename.patch
Patch0001: 0001-introduce-the-format_list-function.patch
Patch0002: 0002-packit-remove-unsupported-upgrade-path-from-tests.patch
Patch0003: 0003-packit-add-new-upgrade-paths-to-tests.patch
Patch0004: 0004-chore-deps-update-actions-checkout-action-to-v6.patch
Patch0005: 0005-chore-deps-update-actions-github-script-action-to-v8.patch
Patch0006: 0006-chore-deps-update-peter-evans-create-or-update-comme.patch
Patch0007: 0007-reporting-fix-incorrect-converting-of-list-based-com.patch
Patch0008: 0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch
Patch0009: 0009-python-test-deps-update-pytest-requirements.patch
Patch0010: 0010-fix-reporting-use-single-quoting-when-converting-rem.patch
Patch0011: 0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch
Patch0012: 0012-Makefile-add-test_no_lint.patch
Patch0001: 0001-CI-packit-update-e2e-tests-to-reflect-current-IPU-pa.patch
Patch0002: 0002-configs-recognize-only-the-.yaml-file-extension.patch
Patch0003: 0003-Handle-case-when-db-directory-is-missing.patch
Patch0004: 0004-Fix-CLI-allow-to-set-falsy-values-as-default.patch
Patch0005: 0005-chore-deps-update-sclorg-testing-farm-as-github-acti.patch
Patch0006: 0006-Remove-7to8-CI-tests.patch
Patch0007: 0007-Update-.packit.yaml-to-fix-failing-rhui-job.patch
%description
Leapp utility provides the possibility to use the Leapp framework via CLI.
@ -174,6 +169,7 @@ Requires: findutils
# APPLY REGISTERED PATCHES HERE
# %%patch -P 0001 -p1
%patch -P 0001 -p1
%patch -P 0002 -p1
%patch -P 0003 -p1
@ -181,11 +177,8 @@ Requires: findutils
%patch -P 0005 -p1
%patch -P 0006 -p1
%patch -P 0007 -p1
%patch -P 0008 -p1
%patch -P 0009 -p1
%patch -P 0010 -p1
%patch -P 0011 -p1
%patch -P 0012 -p1
##################################################
# Build
##################################################
@ -269,28 +262,6 @@ install -m 0644 -p man/leapp.1 %{buildroot}%{_mandir}/man1/
# no files here
%changelog
* Tue Jun 30 2026 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-1.elevate.1
- Bump leapp-framework to 6.6
* Fri Apr 17 2026 Matej Matuska <mmatuska@redhat.com> - 0.21.0-1
- Bump leapp-framework to 6.5
- Change how commands are converted for text based report from the list representation
- Introduce the format_list function for unified presentation of lists in reports and logs
- Resolves: RHEL-169278
* Tue Feb 10 2026 Matej Matuska <mmatuska@redhat.com> - 0.21.0
- Rebase to version 0.21.0
- Resolves: RHEL-128270
* Thu Nov 13 2025 Karolina Kula <kkula@redhat.com> - 0.20.0-2
- Bump leapp-framework to 6.2
- Add possibility to specify aliases for CLI option
- Resolves: RHEL-128270
* Thu Aug 14 2025 Karolina Kula <kkula@redhat.com> - 0.20.0-1
- Rebase to new upstream 0.20.0
- Resolves: RHEL-67625
* Wed May 14 2025 Petr Stodulka <pstodulk@redhat.com> - 0.19.0-3
- Rebuild

View File

@ -1,7 +0,0 @@
--- !Policy
product_versions:
- rhel-8
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

View File

@ -1,53 +0,0 @@
# These test plans were created manually based on information taken from
# https://gitlab.cee.redhat.com/oamg/leapp-tests/-/blob/main/config.yaml. The tmt definitions can be simplified, once
# https://github.com/teemtee/tmt/issues/1770 is implemented.
summary: Internal Tier0 tests
environment:
SOURCE_RELEASE: '8.10'
TARGET_RELEASE: '9.9'
context:
distro: rhel-8.10
distro_target: rhel-9.9
adjust:
- enabled: false
when: distro == centos-stream-8
- environment+:
INSTALL_LEAPP_FROM_COMPOSE: yes
/destructive:
/TestBasic:
plan:
import:
url: https://gitlab.cee.redhat.com/oamg/leapp-tests
name: /plans/newstyle/upgrades/tests/destructive/test_basic.py::TestBasic$
ref: next
/TestSubsequentRebootAfterFailedUpgrade:
plan:
import:
url: https://gitlab.cee.redhat.com/oamg/leapp-tests
name: /plans/newstyle/upgrades/tests/destructive/test_subsequent_reboot_after_failed_upgrade.py::TestSubsequentRebootAfterFailedUpgrade
ref: next
/TestDevtmpfsInFstab:
plan:
import:
url: https://gitlab.cee.redhat.com/oamg/leapp-tests
name: /plans/newstyle/upgrades/tests/destructive/test_devtmpfs_in_fstab.py::TestDevtmpfsInFstab
ref: next
/TestBasicRhsm:
plan:
import:
url: https://gitlab.cee.redhat.com/oamg/leapp-tests
name: /plans/newstyle/upgrades/tests/destructive/test_basic.py::TestBasicRhsm$
ref: next
/nondestructive:
/tier0only:
plan:
import:
url: https://gitlab.cee.redhat.com/oamg/leapp-tests
name: /plans/newstyle/nondestructive/tier0only
ref: next

View File

@ -1 +0,0 @@
SHA512 (leapp-0.21.0.tar.gz) = fd880d8a57d99f2fb44871ffe4c77a6105cf6c8e0dea9fe41887c03cf4ae5b000ba55d0b111c07447d88646d03615c081f3e9054deb308538a866d1cdabd9e12