Skip to content

Commit da14b8f

Browse files
committed
CLOS-3468: Add support for upgrades cl8 -> cl9 with cl-mysql
Replace hardcoded "7" and "8" in the actor code with dynamically detected get_source_major_version which makes code work both with CloudLinux 8 and CloudLinux 9 upgrades.
1 parent c07191e commit da14b8f

File tree

1 file changed

+51
-30
lines changed

1 file changed

+51
-30
lines changed

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

Lines changed: 51 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,23 @@ 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)
196206

197207
if target_repo.enabled:
198208
api.current_logger().debug("Generating custom MariaDB repo: {}".format(target_repo.repoid))
@@ -207,14 +217,14 @@ def mariadb_process(self, repofile_name, repofile_data):
207217
self.mapping_msgs.append(
208218
construct_repomap_data(source_repo.repoid, target_repo.repoid)
209219
)
210-
cl8_repofile_list.append(target_repo)
220+
cl_target_repofile_list.append(target_repo)
211221

212222
if any(repo.enabled for repo in repofile_data.data):
213223
# Since MariaDB URLs have major versions written in, we need a new repo file
214224
# to feed to the target userspace.
215225
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)
226+
cl_target_repofile_data = RepositoryFile(data=cl_target_repofile_list, file=repofile_data.file)
227+
leapp_repocopy = create_leapp_repofile_copy(cl_target_repofile_data, repofile_name)
218228
api.produce(CustomTargetRepositoryFile(file=leapp_repocopy))
219229
else:
220230
api.current_logger().debug("No repos from MariaDB repofile {} enabled, ignoring".format(repofile_name))
@@ -225,25 +235,36 @@ def mysql_process(self, repofile_name, repofile_data):
225235
226236
Versions of MySQL installed from https://mysql.com/.
227237
"""
228-
cl8_repofile_list = []
238+
cl_target_repofile_list = []
239+
target_major = get_target_major_version()
240+
source_major = get_source_major_version()
241+
242+
# Select the correct list of old MySQL versions for the source major version
243+
if str(source_major) == "7":
244+
old_mysql_versions = OLD_MYSQL_UPSTREAM_VERSIONS_CL7
245+
else:
246+
old_mysql_versions = OLD_MYSQL_UPSTREAM_VERSIONS_CL8
229247

230248
for source_repo in repofile_data.data:
231249
# URLs look like this:
232250
# baseurl = https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/
233251
# Remember that we always want to modify names, to avoid "duplicate repository" errors.
234252
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/")
253+
target_repo.repoid = "{}-{}".format(target_repo.repoid, target_major)
254+
# Replace /el/<source_major>/ with /el/<target_major>/
255+
target_repo.baseurl = target_repo.baseurl.replace("/el/{}/".format(source_major), "/el/{}/".format(target_major))
256+
# releasever may be something like 8.6, while only 8 is acceptable.
257+
target_repo.baseurl = target_repo.baseurl.replace("/$releasever/", "/{}/".format(target_major))
237258

238259
if target_repo.enabled:
239260
# MySQL package repos don't have these versions available for EL8 anymore.
240261
# There's only 8.0 available.
241262
# There'll be nothing to upgrade to.
242263
# CL repositories do provide them, though.
243-
if any(ver in target_repo.name for ver in OLD_MYSQL_UPSTREAM_VERSIONS):
264+
if any(ver in target_repo.name for ver in old_mysql_versions):
244265
reporting.create_report(
245266
[
246-
reporting.Title("An old MySQL version will no longer be available in EL8"),
267+
reporting.Title("An old MySQL version will no longer be available in EL{}".format(target_major)),
247268
reporting.Summary(
248269
"A yum repository for an old MySQL version is enabled on this system. "
249270
"It will no longer be available on the target system. "
@@ -275,14 +296,14 @@ def mysql_process(self, repofile_name, repofile_data):
275296
self.mapping_msgs.append(
276297
construct_repomap_data(source_repo.repoid, target_repo.repoid)
277298
)
278-
cl8_repofile_list.append(target_repo)
299+
cl_target_repofile_list.append(target_repo)
279300

280301
if any(repo.enabled for repo in repofile_data.data):
281302
# MySQL typically has multiple repo files, so we want to make sure we're
282303
# adding the type to list only once.
283304
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)
305+
cl_target_repofile_data = RepositoryFile(data=cl_target_repofile_list, file=repofile_data.file)
306+
leapp_repocopy = create_leapp_repofile_copy(cl_target_repofile_data, repofile_name)
286307
api.produce(CustomTargetRepositoryFile(file=leapp_repocopy))
287308
else:
288309
api.current_logger().debug("No repos from MySQL repofile {} enabled, ignoring".format(repofile_name))

0 commit comments

Comments
 (0)