Skip to content

Commit a2c2e17

Browse files
author
Ashwini Kumar
committed
CLOUDDST-24254 : Merge index image failing with FBC operator present in source
This commit fix this bug by ignoring deprecation operators which are not available in database.
1 parent 5b1cf2f commit a2c2e17

File tree

4 files changed

+109
-1
lines changed

4 files changed

+109
-1
lines changed

iib/workers/tasks/build_merge_index_image.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from iib.workers.tasks.utils import (
4040
add_max_ocp_version_property,
4141
chmod_recursively,
42+
filter_operators_present_in_db,
4243
get_bundles_from_deprecation_list,
4344
request_logger,
4445
set_registry_token,
@@ -326,6 +327,15 @@ def handle_merge_request(
326327
bundle['bundlePath'] for bundle in invalid_version_bundles
327328
]
328329

330+
index_db_file = os.path.join(temp_dir, get_worker_config()['temp_index_db_path'])
331+
332+
# Operator passed in deprecation list should be available in operator database,
333+
# filter_operators_present_in_db removes operaors which are passed in
334+
# deprecation list and does not exists in database.
335+
deprecation_bundles = filter_operators_present_in_db(
336+
deprecation_bundles, index_db_file, temp_dir
337+
)
338+
329339
if deprecation_bundles:
330340
intermediate_image_name = _get_external_arch_pull_spec(
331341
request_id, arch, include_transport=False

iib/workers/tasks/utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,3 +1265,29 @@ def get_bundle_metadata(
12651265
for pullspec in operator_csv.get_pullspecs():
12661266
bundle_metadata['found_pullspecs'].add(pullspec)
12671267
return bundle_metadata
1268+
1269+
1270+
def filter_operators_present_in_db(
1271+
deprecation_bundles: List[str],
1272+
index_db_file: str,
1273+
temp_dir: str,
1274+
) -> List[str]:
1275+
"""
1276+
Check if operator marked for deprecation is available, if not drop them.
1277+
1278+
:param List[str] deprecation_bundles: List of bundles to be depricated
1279+
:param str index_db_file: Path of operator database
1280+
:param str temp_dir: temp directory where opm will be executed
1281+
1282+
:return:rtype: list(str) A List of operator bundle to be deprecated
1283+
"""
1284+
bundles_list = get_list_bundles(index_db_file, temp_dir)
1285+
1286+
deprecation_bundles = [
1287+
bundle["bundlePath"]
1288+
for bundle in bundles_list
1289+
if bundle["bundlePath"] in deprecation_bundles
1290+
]
1291+
1292+
log.info("Deprecation bundle after filter is : %s", deprecation_bundles)
1293+
return deprecation_bundles

tests/test_workers/test_tasks/test_build_merge_index_image.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
@mock.patch('iib.workers.tasks.build_merge_index_image._push_image')
3030
@mock.patch('iib.workers.tasks.build_merge_index_image._build_image')
3131
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles_fbc')
32+
@mock.patch('iib.workers.tasks.build_merge_index_image.filter_operators_present_in_db')
3233
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles')
3334
@mock.patch('iib.workers.tasks.build_merge_index_image._get_external_arch_pull_spec')
3435
@mock.patch('iib.workers.tasks.build_merge_index_image.get_bundles_from_deprecation_list')
@@ -63,6 +64,7 @@ def test_handle_merge_request(
6364
mock_gbfdl,
6465
mock_geaps,
6566
mock_dep_b,
67+
mock_f_dep_b,
6668
mock_dep_b_fbc,
6769
mock_bi,
6870
mock_pi,
@@ -118,6 +120,7 @@ def side_effect(*args, base_dir, **kwargs):
118120

119121
mock_dep_b.side_effect = side_effect
120122
mock_dep_b_fbc.side_effect = side_effect
123+
mock_f_dep_b.return_value = mock_dep_b
121124

122125
mock_gidp.return_value = '/tmp'
123126
mock_run_cmd.return_value = json.dumps(
@@ -203,6 +206,7 @@ def side_effect(*args, base_dir, **kwargs):
203206
return_value=[[{'bundlePath': 'some_bundle'}], []],
204207
)
205208
@mock.patch('iib.workers.tasks.utils.set_request_state')
209+
@mock.patch('iib.workers.tasks.utils.get_list_bundles')
206210
@mock.patch('iib.workers.tasks.build_merge_index_image.set_request_state')
207211
@mock.patch('iib.workers.tasks.build_merge_index_image._update_index_image_build_state')
208212
@mock.patch('iib.workers.tasks.build_merge_index_image.prepare_request_for_build')
@@ -218,6 +222,7 @@ def test_handle_merge_request_no_deprecate(
218222
mock_prfb,
219223
mock_uiibs,
220224
mock_srs,
225+
mock_get_bundles,
221226
mock_srs2,
222227
mock_gpb,
223228
mock_abmis,
@@ -261,7 +266,14 @@ def test_handle_merge_request_no_deprecate(
261266
mock_abmis.return_value = ([], invalid_bundles)
262267
mock_gid.return_value = 'database/index.db'
263268
mock_om.return_value = 'catalog', 'cache'
264-
269+
mock_get_bundles.return_value = [
270+
{
271+
'bundlePath': 'invalid_bundle:1.0',
272+
'csvName': 'invalid_bundle:1.0',
273+
'packageName': 'invalid_bundle',
274+
'version': '1.0',
275+
},
276+
]
265277
mock_run_cmd.return_value = json.dumps(
266278
{
267279
"schema": "olm.bundle",
@@ -309,6 +321,7 @@ def test_handle_merge_request_no_deprecate(
309321
binary_image='binary-image:1.0',
310322
from_index=mock.ANY,
311323
)
324+
mock_get_bundles.assert_called_once()
312325
assert mock_bi.call_count == 2
313326
assert mock_pi.call_count == 2
314327
else:

tests/test_workers/test_tasks/test_utils.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: GPL-3.0-or-later
22
import logging
33
import os
4+
45
import stat
56
import textwrap
67
from unittest import mock
@@ -1264,3 +1265,61 @@ def test_add_max_ocp_version_property_empty_index(mock_apti, mock_glb, mock_gbj,
12641265

12651266
mock_gbj.assert_not_called()
12661267
mock_apti.assert_not_called()
1268+
1269+
1270+
@mock.patch('iib.workers.tasks.utils.get_list_bundles')
1271+
def filter_operators_present_in_db(mock_bundle_list):
1272+
1273+
mock_bundle_list.return_value = [
1274+
{
1275+
'bundlePath': 'op1@sha',
1276+
'csvName': 'op1.v0.1.489-1',
1277+
'packageName': 'op1',
1278+
'version': '0.1.489-1',
1279+
},
1280+
{
1281+
'bundlePath': 'op2@sha',
1282+
'csvName': 'op2.v0.1.501-1',
1283+
'packageName': 'op2',
1284+
'version': '0.1.501-1',
1285+
},
1286+
]
1287+
1288+
deprecation_bundles = [
1289+
"op1@sha",
1290+
]
1291+
1292+
operator_after_deprication = utils.filter_operators_present_in_db(
1293+
deprecation_bundles, "index/db/file", "temp_dir"
1294+
)
1295+
1296+
assert operator_after_deprication == ["op1@sha"]
1297+
1298+
1299+
@mock.patch('iib.workers.tasks.utils.get_list_bundles')
1300+
def test_no_matching_filter_operators_present_in_db(mock_bundle_list):
1301+
1302+
mock_bundle_list.return_value = [
1303+
{
1304+
'bundlePath': 'op1@sha',
1305+
'csvName': 'op1.v0.1.489-1',
1306+
'packageName': 'op1',
1307+
'version': '0.1.489-1',
1308+
},
1309+
{
1310+
'bundlePath': 'op2@sha',
1311+
'csvName': 'op2.v0.1.501-1',
1312+
'packageName': 'op2',
1313+
'version': '0.1.501-1',
1314+
},
1315+
]
1316+
1317+
deprecation_bundles = [
1318+
"op3@sha",
1319+
]
1320+
1321+
operator_after_deprication = utils.filter_operators_present_in_db(
1322+
deprecation_bundles, "index/db/file", "temp_dir"
1323+
)
1324+
1325+
assert operator_after_deprication == []

0 commit comments

Comments
 (0)