You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
6.8 KiB

9 months ago
from collections import namedtuple
import pytest
import leapp.models
from leapp.libraries.common import dnfplugin
from leapp.libraries.common.config.version import get_major_version
from leapp.libraries.common.testutils import CurrentActorMocked
from leapp.libraries.stdlib import api
from leapp.models.fields import Boolean
from leapp.topics import Topic
class DATADnfPluginDataTopic(Topic):
name = 'data_dnf_plugin_data'
fields = leapp.models.fields
TaskData = namedtuple('TaskData', 'expected initdata')
TEST_INSTALL_PACKAGES = TaskData(
expected=('install1', 'install2'),
initdata=('install1', 'install2')
)
TEST_REMOVE_PACKAGES = TaskData(
expected=('remove1', 'remove2'),
initdata=('remove1', 'remove2'),
)
TEST_UPGRADE_PACKAGES = TaskData(
expected=('upgrade1', 'upgrade2'),
initdata=('upgrade1', 'upgrade2'),
)
TEST_ENABLE_MODULES = TaskData(
expected=('enable1:stream1', 'enable2:stream2'),
initdata=(
leapp.models.Module(name='enable1', stream='stream1'),
leapp.models.Module(name='enable2', stream='stream2'),
)
)
class DATADnfPluginDataPkgsInfo(leapp.models.Model):
topic = DATADnfPluginDataTopic
local_rpms = fields.List(fields.String())
to_install = fields.List(fields.StringEnum(choices=TEST_INSTALL_PACKAGES.expected))
to_remove = fields.List(fields.StringEnum(choices=TEST_REMOVE_PACKAGES.expected))
to_upgrade = fields.List(fields.StringEnum(choices=TEST_UPGRADE_PACKAGES.expected))
modules_to_enable = fields.List(fields.StringEnum(choices=TEST_ENABLE_MODULES.expected))
TEST_ENABLE_REPOS_CHOICES = ('enabled_repo', 'BASEOS', 'APPSTREAM')
class BooleanEnum(fields.EnumMixin, Boolean):
pass
class DATADnfPluginDataDnfConf(leapp.models.Model):
topic = DATADnfPluginDataTopic
allow_erasing = BooleanEnum(choices=[True])
best = BooleanEnum(choices=[True])
debugsolver = fields.Boolean()
disable_repos = BooleanEnum(choices=[True])
enable_repos = fields.List(fields.StringEnum(choices=TEST_ENABLE_REPOS_CHOICES))
gpgcheck = fields.Boolean()
platform_id = fields.StringEnum(choices=['platform:el8', 'platform:el9'])
releasever = fields.String()
installroot = fields.StringEnum(choices=['/installroot'])
test_flag = fields.Boolean()
class DATADnfPluginDataRHUIAWS(leapp.models.Model):
topic = DATADnfPluginDataTopic
on_aws = fields.Boolean()
region = fields.Nullable(fields.String())
class DATADnfPluginDataRHUI(leapp.models.Model):
topic = DATADnfPluginDataTopic
aws = fields.Model(DATADnfPluginDataRHUIAWS)
class DATADnfPluginData(leapp.models.Model):
topic = DATADnfPluginDataTopic
pkgs_info = fields.Model(DATADnfPluginDataPkgsInfo)
dnf_conf = fields.Model(DATADnfPluginDataDnfConf)
rhui = fields.Model(DATADnfPluginDataRHUI)
# Delete those models from leapp.models to 'unpolute' the module
del leapp.models.DATADnfPluginDataPkgsInfo
del leapp.models.DATADnfPluginDataDnfConf
del leapp.models.DATADnfPluginDataRHUI
del leapp.models.DATADnfPluginDataRHUIAWS
del leapp.models.DATADnfPluginData
_CONFIG_BUILD_TEST_DEFINITION = (
# Parameter, Input Data, Expected Fields with data
('debug', False, ('dnf_conf', 'debugsolver'), False),
('debug', True, ('dnf_conf', 'debugsolver'), True),
('target_repoids', TEST_ENABLE_REPOS_CHOICES, ('dnf_conf', 'enable_repos'), list(TEST_ENABLE_REPOS_CHOICES)),
('target_repoids', TEST_ENABLE_REPOS_CHOICES[0:1],
('dnf_conf', 'enable_repos'), list(TEST_ENABLE_REPOS_CHOICES[0:1])),
('target_repoids', TEST_ENABLE_REPOS_CHOICES[1:],
('dnf_conf', 'enable_repos'), list(TEST_ENABLE_REPOS_CHOICES[1:])),
('target_repoids', TEST_ENABLE_REPOS_CHOICES[2:],
('dnf_conf', 'enable_repos'), list(TEST_ENABLE_REPOS_CHOICES[2:])),
('test', False, ('dnf_conf', 'test_flag'), False),
('test', True, ('dnf_conf', 'test_flag'), True),
)
@pytest.mark.parametrize('used_target_version', ['8.4', '8.5', '9.0', '9.1'])
@pytest.mark.parametrize('parameter,input_value,test_path,expected_value', _CONFIG_BUILD_TEST_DEFINITION)
def test_build_plugin_data_variations(
monkeypatch,
used_target_version,
parameter,
input_value,
test_path,
expected_value,
):
used_target_major_version = get_major_version(used_target_version)
monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver=used_target_version))
inputs = {
'target_repoids': ['BASEOS', 'APPSTREAM'],
'debug': True,
'test': True,
'on_aws': False,
'tasks': leapp.models.FilteredRpmTransactionTasks(
to_install=TEST_INSTALL_PACKAGES.initdata,
to_remove=TEST_REMOVE_PACKAGES.initdata,
to_upgrade=TEST_UPGRADE_PACKAGES.initdata,
modules_to_enable=TEST_ENABLE_MODULES.initdata
)
}
inputs[parameter] = input_value
created = DATADnfPluginData.create(
dnfplugin.build_plugin_data(
**inputs
)
)
assert created.dnf_conf.platform_id == 'platform:el{}'.format(used_target_major_version)
assert created.dnf_conf.releasever == used_target_version
value = created
for path in test_path:
value = getattr(value, path)
assert value == expected_value
def test_build_plugin_data(monkeypatch):
monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.4'))
# Use leapp to validate format and data
created = DATADnfPluginData.create(
dnfplugin.build_plugin_data(
target_repoids=['BASEOS', 'APPSTREAM'],
debug=True,
test=True,
on_aws=False,
tasks=leapp.models.FilteredRpmTransactionTasks(
to_install=TEST_INSTALL_PACKAGES.initdata,
to_remove=TEST_REMOVE_PACKAGES.initdata,
to_upgrade=TEST_UPGRADE_PACKAGES.initdata,
modules_to_enable=TEST_ENABLE_MODULES.initdata
)
)
)
assert created.dnf_conf.debugsolver is True
assert created.dnf_conf.test_flag is True
assert created.rhui.aws.on_aws is False
with pytest.raises(fields.ModelViolationError):
DATADnfPluginData.create(
dnfplugin.build_plugin_data(
target_repoids=['BASEOS', 'APPSTREAM'],
debug=True,
test=True,
on_aws=False,
tasks=leapp.models.FilteredRpmTransactionTasks(
to_install=TEST_INSTALL_PACKAGES.initdata,
to_remove=TEST_REMOVE_PACKAGES.initdata,
to_upgrade=TEST_UPGRADE_PACKAGES.initdata,
# Enforcing the failure
modules_to_enable=(
leapp.models.Module(
name='broken', stream=None
),
),
)
)
)