Skip to content

Commit 173aefc

Browse files
authored
Merge pull request #60 from prilr/CLOS-2882-cl-elevate-failing-on-governor-mariadb-1
CLOS-2882: add regression tests for cl-mysql repository setup in target environment
2 parents 1f68198 + df64b2c commit 173aefc

3 files changed

Lines changed: 218 additions & 0 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"""Shared fixtures for clmysqlrepositorysetup actor tests.
2+
3+
Leapp injects the actor context during pytest collection, so the actor's
4+
private modules (leapp.libraries.common.clmysql, ...) are not importable at
5+
conftest import time. Imports therefore live inside the fixture bodies.
6+
"""
7+
8+
import pytest
9+
10+
11+
_MARIADB106_META_BASEURL = "http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/cl-mariadb-10.6/x86_64/"
12+
_MYSQLCLIENT_BASEURL = "http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/mysqlclient/x86_64/"
13+
14+
15+
@pytest.fixture
16+
def patch_env(monkeypatch):
17+
"""
18+
Return a callable that patches clmysql_cloudlinux dependencies.
19+
20+
Defaults to a healthy mariadb106 OK detection targeting CL9. Pass
21+
``clmysql_result`` to exercise a different status (e.g. MISMATCH), or
22+
override ``clmysql_type`` / ``target_major`` / ``source_major`` to vary the
23+
scenario.
24+
"""
25+
from leapp import reporting
26+
from leapp.libraries.common.clmysql import ClMysqlTypeResult, ClMysqlTypeStatus
27+
from leapp.libraries.common.testutils import (
28+
create_report_mocked,
29+
logger_mocked,
30+
produce_mocked,
31+
)
32+
from leapp.libraries.stdlib import api
33+
34+
def _apply(clmysql_result=None, clmysql_type="mariadb106", target_major="9", source_major="8"):
35+
if clmysql_result is None:
36+
clmysql_result = ClMysqlTypeResult(
37+
status=ClMysqlTypeStatus.OK,
38+
governor_type=clmysql_type,
39+
pkg_type=clmysql_type,
40+
)
41+
monkeypatch.setattr(
42+
"leapp.libraries.actor.clmysql_cloudlinux.get_clmysql_type",
43+
lambda: clmysql_result,
44+
)
45+
monkeypatch.setattr(
46+
"leapp.libraries.actor.clmysql_cloudlinux.get_target_major_version",
47+
lambda: target_major,
48+
)
49+
monkeypatch.setattr(
50+
"leapp.libraries.common.clmysql.get_target_major_version",
51+
lambda: target_major,
52+
)
53+
monkeypatch.setattr(
54+
"leapp.libraries.common.clmysql.get_source_major_version",
55+
lambda: source_major,
56+
)
57+
monkeypatch.setattr(
58+
"leapp.libraries.actor.clmysql_cloudlinux.create_leapp_repofile_copy",
59+
lambda *a, **kw: "/tmp/cl-mysql-leapp.repo",
60+
)
61+
monkeypatch.setattr(api, "produce", produce_mocked())
62+
monkeypatch.setattr(api, "current_logger", logger_mocked())
63+
monkeypatch.setattr(reporting, "create_report", create_report_mocked())
64+
65+
return _apply
66+
67+
68+
@pytest.fixture
69+
def make_cl_mysql_repofile():
70+
"""Return a factory that builds a Governor-style cl-mysql.repo RepositoryFile."""
71+
from leapp.models import RepositoryData, RepositoryFile
72+
73+
def _make(cl_mysql_meta_enabled=True, mysqlclient_enabled=False):
74+
return RepositoryFile(
75+
file="cl-mysql.repo",
76+
data=[
77+
RepositoryData(
78+
repoid="cl-mysql-meta",
79+
name="cl-mysql",
80+
baseurl=_MARIADB106_META_BASEURL,
81+
enabled=cl_mysql_meta_enabled,
82+
),
83+
RepositoryData(
84+
repoid="mysqclient",
85+
name="mysqlclient",
86+
baseurl=_MYSQLCLIENT_BASEURL,
87+
enabled=mysqlclient_enabled,
88+
),
89+
],
90+
)
91+
92+
return _make
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
"""
2+
Regression tests for clmysql_cloudlinux.py - Governor-managed DB handler.
3+
4+
Key scenario (CLOS-2882): Governor writes cl-mysql.repo with both repos
5+
disabled (enabled=0). The handler must still force-enable cl-mysql-meta-N
6+
and mysqclient-N for the target userspace so DNF can resolve the
7+
mariadb:cl-MariaDB106 (or equivalent) module stream and upgrade the packages.
8+
9+
Without the fix the module metadata is absent from the target userspace DNF
10+
cache, which causes:
11+
Error: Problems in request: missing groups or modules: mariadb:cl-MariaDB106
12+
"""
13+
14+
from leapp.libraries.actor.clmysql_cloudlinux import clmysql_process
15+
from leapp.libraries.actor.clmysqlrepositorysetup import MySqlRepositorySetupLibrary
16+
17+
18+
class TestDisabledReposForceEnabled:
19+
"""
20+
CLOS-2882 regression: disabled cl-mysql repos must appear in the
21+
target userspace for the module stream to be resolvable.
22+
"""
23+
24+
def test_both_repos_disabled_still_in_target(self, patch_env, make_cl_mysql_repofile):
25+
"""Disabled cl-mysql-meta and mysqclient repos must both be force-enabled."""
26+
patch_env()
27+
28+
lib = MySqlRepositorySetupLibrary()
29+
clmysql_process(
30+
lib,
31+
"cl-mysql",
32+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
33+
)
34+
35+
repoids = {msg.repoid for msg in lib.custom_repo_msgs}
36+
assert "cl-mysql-meta-9" in repoids
37+
assert "mysqclient-9" in repoids
38+
39+
def test_target_repos_enabled_true(self, patch_env, make_cl_mysql_repofile):
40+
"""Target repo messages must have enabled=True regardless of source state."""
41+
patch_env()
42+
43+
lib = MySqlRepositorySetupLibrary()
44+
clmysql_process(
45+
lib,
46+
"cl-mysql",
47+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
48+
)
49+
50+
for msg in lib.custom_repo_msgs:
51+
assert msg.enabled, "target repo {} must be enabled=True".format(msg.repoid)
52+
53+
def test_cloudlinux_type_always_registered(self, patch_env, make_cl_mysql_repofile):
54+
"""'cloudlinux' must be added to mysql_types even when all repos are disabled."""
55+
patch_env()
56+
57+
lib = MySqlRepositorySetupLibrary()
58+
clmysql_process(
59+
lib,
60+
"cl-mysql",
61+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
62+
)
63+
64+
assert "cloudlinux" in lib.mysql_types
65+
66+
def test_releasever_substituted_in_target_baseurl(self, patch_env, make_cl_mysql_repofile):
67+
"""Target repo baseurls must have $releasever replaced with the target major version."""
68+
patch_env(target_major="9")
69+
70+
lib = MySqlRepositorySetupLibrary()
71+
clmysql_process(
72+
lib,
73+
"cl-mysql",
74+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
75+
)
76+
77+
for msg in lib.custom_repo_msgs:
78+
assert "$releasever" not in msg.baseurl
79+
assert "/cl9/" in msg.baseurl
80+
81+
def test_enabled_repos_also_pass_through(self, patch_env, make_cl_mysql_repofile):
82+
"""Normal case: enabled cl-mysql-meta still appears in target repos."""
83+
patch_env()
84+
85+
lib = MySqlRepositorySetupLibrary()
86+
clmysql_process(
87+
lib,
88+
"cl-mysql",
89+
make_cl_mysql_repofile(cl_mysql_meta_enabled=True, mysqlclient_enabled=False),
90+
)
91+
92+
repoids = {msg.repoid for msg in lib.custom_repo_msgs}
93+
assert "cl-mysql-meta-9" in repoids
94+
assert "cloudlinux" in lib.mysql_types
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Tests for the Governor/RPM mismatch inhibitor in clmysql_cloudlinux.
3+
4+
When MySQL Governor's recorded type does not match the installed mysqld
5+
binary, the handler must inhibit the upgrade and not register any target
6+
repos (a wrong module stream would otherwise be enabled).
7+
"""
8+
9+
from leapp import reporting
10+
from leapp.libraries.actor.clmysql_cloudlinux import clmysql_process
11+
from leapp.libraries.actor.clmysqlrepositorysetup import MySqlRepositorySetupLibrary
12+
from leapp.libraries.common.clmysql import ClMysqlTypeResult, ClMysqlTypeStatus
13+
14+
15+
class TestMismatchInhibitor:
16+
"""Governor/RPM type mismatch must create an inhibitor and skip repo setup."""
17+
18+
def test_mismatch_inhibits_and_adds_no_repos(self, patch_env, make_cl_mysql_repofile):
19+
patch_env(
20+
clmysql_result=ClMysqlTypeResult(
21+
status=ClMysqlTypeStatus.MISMATCH,
22+
governor_type="mariadb106",
23+
pkg_type="mysql80",
24+
)
25+
)
26+
27+
lib = MySqlRepositorySetupLibrary()
28+
clmysql_process(lib, "cl-mysql", make_cl_mysql_repofile())
29+
30+
assert "cloudlinux" not in lib.mysql_types
31+
assert lib.custom_repo_msgs == []
32+
assert reporting.create_report.called == 1

0 commit comments

Comments
 (0)