Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLOUDDST-24254 : Merge index image failing with FBC operator present … #808

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions iib/workers/tasks/build_merge_index_image.py
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
deprecate_bundles_fbc,
opm_index_add,
deprecate_bundles,
verify_operators_exists,
Opm,
)
from packaging.version import Version
@@ -325,23 +326,43 @@ def handle_merge_request(
if missing_bundle_paths:
add_max_ocp_version_property(missing_bundle_paths, temp_dir)
set_request_state(request_id, 'in_progress', 'Deprecating bundles in the deprecation list')

log.info('Deprecating bundles in the deprecation list')
intermediate_bundles = missing_bundle_paths + source_index_bundles_pull_spec
deprecation_bundles = get_bundles_from_deprecation_list(
intermediate_bundles, deprecation_list
)

# We do not need to pass the invalid_version_bundles through the
# get_bundles_from_deprecation_list function because we already know
# they are present in the newly created index.
deprecation_bundles = deprecation_bundles + [
bundle['bundlePath'] for bundle in invalid_version_bundles

invalid_version_bundles_names = [
bundle["packageName"] for bundle in invalid_version_bundles
]

if deprecation_bundles:
intermediate_image_name = _get_external_arch_pull_spec(
request_id, arch, include_transport=False
intermediate_image_name = _get_external_arch_pull_spec(
request_id, arch, include_transport=False
)
if invalid_version_bundles_names:
filtered_invalid_version_bundles_names, _ = verify_operators_exists(
from_index=intermediate_image_name,
base_dir=temp_dir,
operator_packages=invalid_version_bundles_names,
overwrite_from_index_token=None,
)

# Operator passed in deprecation list should be available in operator database,
invalid_version_bundles = [
bundle
for bundle in invalid_version_bundles
if bundle["packageName"] in list(filtered_invalid_version_bundles_names)
]
deprecation_bundles = deprecation_bundles + [
bundle['bundlePath'] for bundle in invalid_version_bundles
]

if deprecation_bundles:
# we can check if source index is FBC or not because intermediate_image
# will be always the same type because it is built
# from source index image in _add_bundles_missing_in_source()
67 changes: 44 additions & 23 deletions tests/test_workers/test_tasks/test_build_merge_index_image.py
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@
@mock.patch('iib.workers.tasks.build_merge_index_image._push_image')
@mock.patch('iib.workers.tasks.build_merge_index_image._build_image')
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles_fbc')
@mock.patch('iib.workers.tasks.build_merge_index_image.verify_operators_exists')
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles')
@mock.patch('iib.workers.tasks.build_merge_index_image._get_external_arch_pull_spec')
@mock.patch('iib.workers.tasks.build_merge_index_image.get_bundles_from_deprecation_list')
@@ -63,6 +64,7 @@ def test_handle_merge_request(
mock_gbfdl,
mock_geaps,
mock_dep_b,
mock_verify_operator_exits,
mock_dep_b_fbc,
mock_bi,
mock_pi,
@@ -118,6 +120,7 @@ def side_effect(*args, base_dir, **kwargs):

mock_dep_b.side_effect = side_effect
mock_dep_b_fbc.side_effect = side_effect
mock_verify_operator_exits.return_value = (mock_dep_b, "")

mock_gidp.return_value = '/tmp'
mock_run_cmd.return_value = json.dumps(
@@ -182,7 +185,17 @@ def side_effect(*args, base_dir, **kwargs):


@pytest.mark.parametrize('source_fbc, target_fbc', [(False, False), (False, True), (True, True)])
@pytest.mark.parametrize('invalid_bundles', ([], [{'bundlePath': 'invalid_bundle:1.0'}]))
@pytest.mark.parametrize(
'invalid_bundles, filtered_invalid_version_bundles_names',
[
([], {}),
(
[{'bundlePath': 'invalid_bundle:1.0', "packageName": "invalid_bundle"}],
{'invalid_bundle'},
),
([{'bundlePath': 'invalid_bundle:1.0', "packageName": "invalid_bundle"}], {}),
],
)
@mock.patch('iib.workers.tasks.opm_operations._get_input_data_path')
@mock.patch('iib.workers.tasks.utils.run_cmd')
@mock.patch('iib.workers.tasks.build_merge_index_image._update_index_image_pull_spec')
@@ -194,6 +207,7 @@ def side_effect(*args, base_dir, **kwargs):
@mock.patch('iib.workers.tasks.build_merge_index_image._push_image')
@mock.patch('iib.workers.tasks.build_merge_index_image._build_image')
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles_fbc')
@mock.patch('iib.workers.tasks.build_merge_index_image.verify_operators_exists')
@mock.patch('iib.workers.tasks.build_merge_index_image.deprecate_bundles')
@mock.patch('iib.workers.tasks.build_merge_index_image._get_external_arch_pull_spec')
@mock.patch('iib.workers.tasks.build_merge_index_image.get_bundles_from_deprecation_list')
@@ -210,7 +224,9 @@ def side_effect(*args, base_dir, **kwargs):
@mock.patch('iib.workers.tasks.build_merge_index_image._add_label_to_index')
@mock.patch('iib.workers.tasks.build_merge_index_image.is_image_fbc')
@mock.patch('iib.workers.tasks.opm_operations.Opm.set_opm_version')
@mock.patch('iib.workers.tasks.opm_operations.get_hidden_index_database')
def test_handle_merge_request_no_deprecate(
mock_get_hidden_db,
mock_sov,
mock_iifbc,
mock_add_label_to_index,
@@ -224,6 +240,7 @@ def test_handle_merge_request_no_deprecate(
mock_gbfdl,
mock_geaps,
mock_dep_b,
mock_verify_operators_exists,
mock_dep_b_fbc,
mock_bi,
mock_pi,
@@ -236,6 +253,7 @@ def test_handle_merge_request_no_deprecate(
mock_run_cmd,
mock_gidp,
invalid_bundles,
filtered_invalid_version_bundles_names,
source_fbc,
target_fbc,
):
@@ -261,7 +279,6 @@ def test_handle_merge_request_no_deprecate(
mock_abmis.return_value = ([], invalid_bundles)
mock_gid.return_value = 'database/index.db'
mock_om.return_value = 'catalog', 'cache'

mock_run_cmd.return_value = json.dumps(
{
"schema": "olm.bundle",
@@ -272,7 +289,7 @@ def test_handle_merge_request_no_deprecate(
"properties": [{"type": "olm.package", "value": {"version": "0.1.0"}}],
}
)

mock_verify_operators_exists.return_value = (filtered_invalid_version_bundles_names, "db_path")
build_merge_index_image.handle_merge_request(
'source-from-index:1.0',
['some-bundle:1.0'],
@@ -301,29 +318,33 @@ def test_handle_merge_request_no_deprecate(
assert mock_gpb.call_count == 2
mock_abmis.assert_called_once()
mock_gbfdl.assert_called_once()
mock_geaps.assert_called_once()
if invalid_bundles:
if source_fbc:
mock_dep_b_fbc.assert_called_once_with(
bundles=['invalid_bundle:1.0'],
base_dir=mock.ANY,
binary_image='binary-image:1.0',
from_index=mock.ANY,
)
assert mock_bi.call_count == 2
assert mock_pi.call_count == 2
if filtered_invalid_version_bundles_names:
mock_verify_operators_exists.assert_called_once()

if source_fbc:
mock_dep_b_fbc.assert_called_once_with(
bundles=['invalid_bundle:1.0'],
base_dir=mock.ANY,
binary_image='binary-image:1.0',
from_index=mock.ANY,
)
assert mock_bi.call_count == 2
assert mock_pi.call_count == 2
else:
mock_dep_b.assert_called_once_with(
bundles=['invalid_bundle:1.0'],
base_dir=mock.ANY,
binary_image='binary-image:1.0',
from_index=mock.ANY,
overwrite_target_index_token=None,
)
assert mock_bi.call_count == 3
assert mock_pi.call_count == 3
else:
mock_dep_b.assert_called_once_with(
bundles=['invalid_bundle:1.0'],
base_dir=mock.ANY,
binary_image='binary-image:1.0',
from_index=mock.ANY,
overwrite_target_index_token=None,
)
assert mock_bi.call_count == 3
assert mock_pi.call_count == 3
mock_geaps.assert_called_once()
mock_dep_b_fbc.assert_not_called()
else:
mock_geaps.assert_not_called()
mock_dep_b.assert_not_called()
mock_dep_b_fbc.assert_not_called()
assert mock_bi.call_count == 2