leapp-repository/0068-device-driver-deprecation-data-print-nice-error-msg-.patch

130 lines
5.7 KiB
Diff
Raw Normal View History

From 98a1057bb40a53a2200b0cfba9e4ad75b1d8f796 Mon Sep 17 00:00:00 2001
From: Petr Stodulka <pstodulk@redhat.com>
Date: Mon, 22 Jan 2024 18:40:07 +0100
Subject: [PATCH 68/69] device driver deprecation data: print nice error msg on
malformed data
In case of malformed device_driver_deprecation_data.json user could
originally see raw traceback without having too much information
what it actually means or how to fix it. That usually happens only
when the file is manually modified on the machine. So in this case
we inform user what file is problematic and how to restore the original
file installed by our package.
In case of upstream development, this msg could be seen also when
new data is provided if:
* data file is malformed
* data file has a new format of data (still json expected)
* etc.
These issues however will be discovered prior the merge as the
running tests will fail, so such a problematic file should never
get part of the upstream. From that point, we will be expect that
user has malformed / customized data file. So no need to handle
all possible errors differently in this case.
Jira: OAMG-7549
Co-authored-by: Toshio Kuratomi <a.badger@gmail.com>
---
.../deviceanddriverdeprecationdataload.py | 36 ++++++++++++++-----
.../tests/test_ddddload.py | 28 +++++++++++++++
2 files changed, 56 insertions(+), 8 deletions(-)
diff --git a/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/libraries/deviceanddriverdeprecationdataload.py b/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/libraries/deviceanddriverdeprecationdataload.py
index f422c2c3..b12e77c9 100644
--- a/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/libraries/deviceanddriverdeprecationdataload.py
+++ b/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/libraries/deviceanddriverdeprecationdataload.py
@@ -1,6 +1,9 @@
+from leapp.exceptions import StopActorExecutionError
from leapp.libraries.common import fetch
+from leapp.libraries.common.rpms import get_leapp_packages, LeappComponents
from leapp.libraries.stdlib import api
from leapp.models import DeviceDriverDeprecationData, DeviceDriverDeprecationEntry
+from leapp.models.fields import ModelViolationError
def process():
@@ -22,12 +25,29 @@ def process():
docs_url='',
docs_title='')
- api.produce(
- DeviceDriverDeprecationData(
- entries=[
- DeviceDriverDeprecationEntry(**entry)
- for entry in deprecation_data['data']
- if entry.get('device_type') in supported_device_types
- ]
+ try:
+ api.produce(
+ DeviceDriverDeprecationData(
+ entries=[
+ DeviceDriverDeprecationEntry(**entry)
+ for entry in deprecation_data['data']
+ if entry.get('device_type') in supported_device_types
+ ]
+ )
)
- )
+ except (ModelViolationError, ValueError, KeyError, AttributeError, TypeError) as err:
+ # For the listed errors, we expect this to happen only when data is malformed
+ # or manually updated. Corrupted data in the upstream is discovered
+ # prior the merge thanks to testing. So just suggest the restoration
+ # of the file.
+ msg = 'Invalid device and driver deprecation data: {}'.format(err)
+ hint = (
+ 'This issue is usually caused by manual update of the {lp} file.'
+ ' The data inside is either incorrect or old. To restore the original'
+ ' {lp} file, remove it and reinstall the following packages: {rpms}'
+ .format(
+ lp='/etc/leapp/file/device_driver_deprecation_data.json',
+ rpms=', '.join(get_leapp_packages(component=LeappComponents.REPOSITORY))
+ )
+ )
+ raise StopActorExecutionError(msg, details={'hint': hint})
diff --git a/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/tests/test_ddddload.py b/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/tests/test_ddddload.py
index 69bcd09c..c3386745 100644
--- a/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/tests/test_ddddload.py
+++ b/repos/system_upgrade/common/actors/loaddevicedriverdeprecationdata/tests/test_ddddload.py
@@ -1,5 +1,9 @@
+import pytest
+
+from leapp.exceptions import StopActorExecutionError
from leapp.libraries.actor import deviceanddriverdeprecationdataload as ddddload
from leapp.libraries.common import fetch
+from leapp.libraries.common.testutils import CurrentActorMocked
TEST_DATA = {
'data': [
@@ -57,3 +61,27 @@ def test_filtered_load(monkeypatch):
assert produced
assert len(produced[0].entries) == 3
assert not any([e.device_type == 'unsupported' for e in produced[0].entries])
+
+
+@pytest.mark.parametrize('data', (
+ {},
+ {'foo': 'bar'},
+ {'data': 1, 'foo': 'bar'},
+ {'data': 'string', 'foo': 'bar'},
+ {'data': {'foo': 1}, 'bar': 2},
+ {'data': {'foo': 1, 'device_type': None}},
+ {'data': {'foo': 1, 'device_type': 'cpu'}},
+ {'data': {'driver_name': ['foo'], 'device_type': 'cpu'}},
+))
+def test_invalid_dddd_data(monkeypatch, data):
+ produced = []
+
+ def load_data_asset_mock(*args, **kwargs):
+ return data
+
+ monkeypatch.setattr(fetch, 'load_data_asset', load_data_asset_mock)
+ monkeypatch.setattr(ddddload.api, 'current_actor', CurrentActorMocked())
+ monkeypatch.setattr(ddddload.api, 'produce', lambda *v: produced.extend(v))
+ with pytest.raises(StopActorExecutionError):
+ ddddload.process()
+ assert not produced
--
2.42.0