Skip to content

Commit 1eb4fe1

Browse files
authored
Merge pull request #38 from cloudlinux/clos-3468-add-cl-mysql-support-cl8
CLOS-3468: Add support for upgrades cl8 -> cl9 with cl-mysql
2 parents c07191e + d44dd30 commit 1eb4fe1

File tree

1 file changed

+55
-30
lines changed

1 file changed

+55
-30
lines changed

repos/system_upgrade/cloudlinux/actors/clmysqlrepositorysetup/libraries/clmysqlrepositorysetup.py

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
REPOFILE_SUFFIX,
2424
)
2525
from leapp.models import RepositoryFile
26+
from leapp.libraries.common.config.version import get_source_major_version, get_target_major_version
2627

2728
CL_MARKERS = ["cl-mysql", "cl-mariadb", "cl-percona"]
2829
MARIA_MARKERS = ["MariaDB"]
2930
MYSQL_MARKERS = ["mysql-community"]
3031
OLD_CLMYSQL_VERSIONS = ["5.0", "5.1"]
31-
OLD_MYSQL_UPSTREAM_VERSIONS = ["5.7", "5.6", "5.5"]
32+
OLD_MYSQL_UPSTREAM_VERSIONS_CL7 = ["5.7", "5.6", "5.5"]
33+
OLD_MYSQL_UPSTREAM_VERSIONS_CL8 = ["5.7", "5.6"] # adjust as needed for CL8
3234

3335

3436
def build_install_list(prefix):
@@ -68,11 +70,13 @@ def construct_repomap_data(source_id, target_id):
6870
"""
6971
Construct the repository mapping data.
7072
"""
73+
source_major = get_source_major_version()
74+
target_major = get_target_major_version()
7175
return RepositoriesMapping(
7276
mapping=[RepoMapEntry(source=source_id, target=[target_id])],
7377
repositories=[
74-
make_pesid_repo(source_id, '7', source_id),
75-
make_pesid_repo(target_id, '8', target_id)
78+
make_pesid_repo(source_id, source_major, source_id),
79+
make_pesid_repo(target_id, target_major, target_id)
7680
]
7781
)
7882

@@ -108,24 +112,25 @@ def clmysql_process(self, repofile_name, repofile_data):
108112

109113
api.current_logger().debug("repoids from CloudLinux repofile {}: {}".format(repofile_name, data_to_log))
110114

111-
cl8_repofile_list = []
115+
cl_target_repofile_list = []
116+
target_major = get_target_major_version()
112117

113118
# Were any repositories enabled?
114119
for source_repo in repofile_data.data:
115120
# cl-mysql URLs look like this:
116121
# baseurl=http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/cl-mariadb-10.3/$basearch/
117122
# We don't want any duplicate repoid entries - they'd cause yum/dnf to fail.
118-
# Make everything unique by adding -8 to the repoid.
123+
# Make everything unique by adding -<target_major> to the repoid.
119124
target_repo = copy.deepcopy(source_repo)
120-
target_repo.repoid = target_repo.repoid + "-8"
125+
target_repo.repoid = "{}-{}".format(target_repo.repoid, target_major)
121126
# releasever may be something like 8.6, while only 8 is acceptable.
122-
target_repo.baseurl = target_repo.baseurl.replace("/cl$releasever/", "/cl8/")
127+
target_repo.baseurl = target_repo.baseurl.replace("/cl$releasever/", "/cl{}/".format(target_major))
123128

124-
# Old CL MySQL versions (5.0 and 5.1) won't be available in CL8.
129+
# Old CL MySQL versions (5.0 and 5.1) won't be available in CL8+.
125130
if any(ver in target_repo.baseurl for ver in OLD_CLMYSQL_VERSIONS):
126131
reporting.create_report(
127132
[
128-
reporting.Title("An old CL-MySQL version will no longer be available in EL8"),
133+
reporting.Title("An old CL-MySQL version will no longer be available in EL{}".format(target_major)),
129134
reporting.Summary(
130135
"An old CloudLinux-provided MySQL version is installed on this system. "
131136
"It will no longer be available on the target system. "
@@ -149,7 +154,7 @@ def clmysql_process(self, repofile_name, repofile_data):
149154
# mysqlclient is usually disabled when installed from CL MySQL Governor.
150155
# However, it should be enabled for the Leapp upgrade, seeing as some packages
151156
# from it won't update otherwise.
152-
if target_repo.enabled or target_repo.repoid == "mysqclient-8":
157+
if target_repo.enabled or target_repo.repoid == "mysqclient-{}".format(target_major):
153158
api.current_logger().debug("Generating custom cl-mysql repo: {}".format(target_repo.repoid))
154159
self.custom_repo_msgs.append(
155160
CustomTargetRepository(
@@ -164,13 +169,13 @@ def clmysql_process(self, repofile_name, repofile_data):
164169
)
165170
# Gather the enabled repositories for the new repofile.
166171
# They'll be used to create a new custom repofile for the target userspace.
167-
cl8_repofile_list.append(target_repo)
172+
cl_target_repofile_list.append(target_repo)
168173

169174
if any(repo.enabled for repo in repofile_data.data):
170175
self.mysql_types.add("cloudlinux")
171176
# Provide the object with the modified repository data to the target userspace.
172-
cl8_repofile_data = RepositoryFile(data=cl8_repofile_list, file=repofile_data.file)
173-
leapp_repocopy = create_leapp_repofile_copy(cl8_repofile_data, repofile_name)
177+
cl_target_repofile_data = RepositoryFile(data=cl_target_repofile_list, file=repofile_data.file)
178+
leapp_repocopy = create_leapp_repofile_copy(cl_target_repofile_data, repofile_name)
174179
api.produce(CustomTargetRepositoryFile(file=leapp_repocopy))
175180
else:
176181
api.current_logger().debug("No repos from CloudLinux repofile {} enabled, ignoring".format(repofile_name))
@@ -181,18 +186,27 @@ def mariadb_process(self, repofile_name, repofile_data):
181186
182187
Versions of MariaDB installed from https://mariadb.org/.
183188
"""
184-
cl8_repofile_list = []
189+
cl_target_repofile_list = []
190+
target_major = get_target_major_version()
191+
source_major = get_source_major_version()
185192

186193
for source_repo in repofile_data.data:
187194
# Maria URLs look like this:
188195
# baseurl = https://archive.mariadb.org/mariadb-10.3/yum/centos/7/x86_64
189196
# baseurl = https://archive.mariadb.org/mariadb-10.7/yum/centos7-ppc64/
190-
# We want to replace the 7 in OS name after /yum/
197+
# We want to replace the source_major in OS name after /yum/ with target_major
191198
target_repo = copy.deepcopy(source_repo)
192-
target_repo.repoid = target_repo.repoid + "-8"
193-
url_parts = target_repo.baseurl.split("yum")
194-
url_parts[1] = "yum" + url_parts[1].replace("7", "8")
195-
target_repo.baseurl = "".join(url_parts)
199+
target_repo.repoid = "{}-{}".format(target_repo.repoid, target_major)
200+
# Replace the first occurrence of source_major with target_major after 'yum'
201+
url_parts = target_repo.baseurl.split("yum", 1)
202+
if len(url_parts) == 2:
203+
# Replace only the first digit (source_major) after 'yum'
204+
url_parts[1] = url_parts[1].replace(str(source_major), str(target_major), 1)
205+
target_repo.baseurl = "yum".join(url_parts)
206+
else:
207+
# TODO: fix in https://cloudlinux.atlassian.net/browse/CLOS-3490
208+
api.current_logger().warning("Unsupported repository URL={}, skipping".format(target_repo.baseurl))
209+
return
196210

197211
if target_repo.enabled:
198212
api.current_logger().debug("Generating custom MariaDB repo: {}".format(target_repo.repoid))
@@ -207,14 +221,14 @@ def mariadb_process(self, repofile_name, repofile_data):
207221
self.mapping_msgs.append(
208222
construct_repomap_data(source_repo.repoid, target_repo.repoid)
209223
)
210-
cl8_repofile_list.append(target_repo)
224+
cl_target_repofile_list.append(target_repo)
211225

212226
if any(repo.enabled for repo in repofile_data.data):
213227
# Since MariaDB URLs have major versions written in, we need a new repo file
214228
# to feed to the target userspace.
215229
self.mysql_types.add("mariadb")
216-
cl8_repofile_data = RepositoryFile(data=cl8_repofile_list, file=repofile_data.file)
217-
leapp_repocopy = create_leapp_repofile_copy(cl8_repofile_data, repofile_name)
230+
cl_target_repofile_data = RepositoryFile(data=cl_target_repofile_list, file=repofile_data.file)
231+
leapp_repocopy = create_leapp_repofile_copy(cl_target_repofile_data, repofile_name)
218232
api.produce(CustomTargetRepositoryFile(file=leapp_repocopy))
219233
else:
220234
api.current_logger().debug("No repos from MariaDB repofile {} enabled, ignoring".format(repofile_name))
@@ -225,25 +239,36 @@ def mysql_process(self, repofile_name, repofile_data):
225239
226240
Versions of MySQL installed from https://mysql.com/.
227241
"""
228-
cl8_repofile_list = []
242+
cl_target_repofile_list = []
243+
target_major = get_target_major_version()
244+
source_major = get_source_major_version()
245+
246+
# Select the correct list of old MySQL versions for the source major version
247+
if str(source_major) == "7":
248+
old_mysql_versions = OLD_MYSQL_UPSTREAM_VERSIONS_CL7
249+
else:
250+
old_mysql_versions = OLD_MYSQL_UPSTREAM_VERSIONS_CL8
229251

230252
for source_repo in repofile_data.data:
231253
# URLs look like this:
232254
# baseurl = https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/
233255
# Remember that we always want to modify names, to avoid "duplicate repository" errors.
234256
target_repo = copy.deepcopy(source_repo)
235-
target_repo.repoid = target_repo.repoid + "-8"
236-
target_repo.baseurl = target_repo.baseurl.replace("/el/7/", "/el/8/")
257+
target_repo.repoid = "{}-{}".format(target_repo.repoid, target_major)
258+
# Replace /el/<source_major>/ with /el/<target_major>/
259+
target_repo.baseurl = target_repo.baseurl.replace("/el/{}/".format(source_major), "/el/{}/".format(target_major))
260+
# releasever may be something like 8.6, while only 8 is acceptable.
261+
target_repo.baseurl = target_repo.baseurl.replace("/$releasever/", "/{}/".format(target_major))
237262

238263
if target_repo.enabled:
239264
# MySQL package repos don't have these versions available for EL8 anymore.
240265
# There's only 8.0 available.
241266
# There'll be nothing to upgrade to.
242267
# CL repositories do provide them, though.
243-
if any(ver in target_repo.name for ver in OLD_MYSQL_UPSTREAM_VERSIONS):
268+
if any(ver in target_repo.name for ver in old_mysql_versions):
244269
reporting.create_report(
245270
[
246-
reporting.Title("An old MySQL version will no longer be available in EL8"),
271+
reporting.Title("An old MySQL version will no longer be available in EL{}".format(target_major)),
247272
reporting.Summary(
248273
"A yum repository for an old MySQL version is enabled on this system. "
249274
"It will no longer be available on the target system. "
@@ -275,14 +300,14 @@ def mysql_process(self, repofile_name, repofile_data):
275300
self.mapping_msgs.append(
276301
construct_repomap_data(source_repo.repoid, target_repo.repoid)
277302
)
278-
cl8_repofile_list.append(target_repo)
303+
cl_target_repofile_list.append(target_repo)
279304

280305
if any(repo.enabled for repo in repofile_data.data):
281306
# MySQL typically has multiple repo files, so we want to make sure we're
282307
# adding the type to list only once.
283308
self.mysql_types.add("mysql")
284-
cl8_repofile_data = RepositoryFile(data=cl8_repofile_list, file=repofile_data.file)
285-
leapp_repocopy = create_leapp_repofile_copy(cl8_repofile_data, repofile_name)
309+
cl_target_repofile_data = RepositoryFile(data=cl_target_repofile_list, file=repofile_data.file)
310+
leapp_repocopy = create_leapp_repofile_copy(cl_target_repofile_data, repofile_name)
286311
api.produce(CustomTargetRepositoryFile(file=leapp_repocopy))
287312
else:
288313
api.current_logger().debug("No repos from MySQL repofile {} enabled, ignoring".format(repofile_name))

0 commit comments

Comments
 (0)