def test_prepare_request_for_build_binary_image_no_arch( mock_gia, mock_gri, mock_srs): mock_gia.side_effect = [{'amd64'}] expected = 'The binary image is not available for the following arches.+' with pytest.raises(IIBError, match=expected): build._prepare_request_for_build('binary-image:latest', 1, add_arches=['s390x'])
def test_prepare_request_for_build( mock_ur, mock_gil, mock_gia, mock_gri, mock_srs, add_arches, from_index, from_index_arches, bundles, expected_bundle_mapping, ): binary_image_resolved = 'binary-image@sha256:abcdef' from_index_resolved = None expected_arches = set(add_arches) | from_index_arches expected_payload_keys = {'binary_image_resolved', 'state', 'state_reason'} if expected_bundle_mapping: expected_payload_keys.add('bundle_mapping') if from_index: from_index_name = from_index.split(':', 1)[0] from_index_resolved = f'{from_index_name}@sha256:bcdefg' mock_gri.side_effect = [binary_image_resolved, from_index_resolved] mock_gia.side_effect = [expected_arches, from_index_arches] expected_payload_keys.add('from_index_resolved') else: mock_gri.side_effect = [binary_image_resolved] mock_gia.side_effect = [expected_arches] if bundles: mock_gil.side_effect = [ bundle.rsplit('/', 1)[1].split(':', 1)[0] for bundle in bundles ] rv = build._prepare_request_for_build('binary-image:latest', 1, from_index, None, add_arches, bundles) assert rv == { 'arches': expected_arches, 'binary_image_resolved': binary_image_resolved, 'from_index_resolved': from_index_resolved, } mock_ur.assert_called_once() update_request_payload = mock_ur.call_args[0][1] if expected_bundle_mapping: assert update_request_payload[ 'bundle_mapping'] == expected_bundle_mapping else: assert 'bundle_mapping' not in update_request_payload assert update_request_payload.keys() == expected_payload_keys
def handle_merge_request( source_from_index, deprecation_list, request_id, binary_image=None, target_index=None, overwrite_target_index=False, overwrite_target_index_token=None, distribution_scope=None, binary_image_config=None, ): """ Coordinate the work needed to merge old (N) index image with new (N+1) index image. :param str source_from_index: pull specification to be used as the base for building the new index image. :param str target_index: pull specification of content stage index image for the corresponding target index image. :param list deprecation_list: list of deprecated bundles for the target index image. :param int request_id: the ID of the IIB build request. :param str binary_image: the pull specification of the container image where the opm binary gets copied from. :param bool overwrite_target_index: if True, overwrite the input ``target_index`` with the built index image. :param str overwrite_target_index_token: the token used for overwriting the input ``target_index`` image. This is required for non-privileged users to use ``overwrite_target_index``. The format of the token must be in the format "user:password". :param str distribution_scope: the scope for distribution of the index image, defaults to ``None``. :raises IIBError: if the index image merge fails. """ _cleanup() prebuild_info = _prepare_request_for_build( request_id, binary_image, overwrite_from_index_token=overwrite_target_index_token, source_from_index=source_from_index, target_index=target_index, distribution_scope=distribution_scope, binary_image_config=binary_image_config, ) _update_index_image_build_state(request_id, prebuild_info) with tempfile.TemporaryDirectory(prefix='iib-') as temp_dir: set_request_state(request_id, 'in_progress', 'Getting bundles present in the index images') log.info('Getting bundles present in the source index image') source_index_bundles = _get_present_bundles(source_from_index, temp_dir) target_index_bundles = [] if target_index: log.info('Getting bundles present in the target index image') target_index_bundles = _get_present_bundles(target_index, temp_dir) arches = list(prebuild_info['arches']) arch = 'amd64' if 'amd64' in arches else arches[0] missing_bundles = _add_bundles_missing_in_source( source_index_bundles, target_index_bundles, temp_dir, prebuild_info['binary_image'], source_from_index, request_id, arch, prebuild_info['target_ocp_version'], overwrite_target_index_token, distribution_scope=prebuild_info['distribution_scope'], ) set_request_state(request_id, 'in_progress', 'Deprecating bundles in the deprecation list') log.info('Deprecating bundles in the deprecation list') intermediate_bundles = source_index_bundles + missing_bundles deprecate_bundles = _get_bundles_from_deprecation_list( intermediate_bundles, deprecation_list) intermediate_image_name = _get_external_arch_pull_spec( request_id, arch, include_transport=False) if deprecate_bundles: _deprecate_bundles( deprecate_bundles, temp_dir, prebuild_info['binary_image'], intermediate_image_name, overwrite_target_index_token, ) for arch in sorted(prebuild_info['arches']): _build_image(temp_dir, 'index.Dockerfile', request_id, arch) _push_image(request_id, arch) output_pull_spec = _create_and_push_manifest_list(request_id, prebuild_info['arches']) _update_index_image_pull_spec( output_pull_spec, request_id, prebuild_info['arches'], target_index, overwrite_target_index, overwrite_target_index_token, prebuild_info['target_index_resolved'], ) set_request_state(request_id, 'complete', 'The index image was successfully cleaned and updated.')
def test_prepare_request_for_build_no_arches(mock_gia, mock_gri, mock_srs): mock_gia.side_effect = [{'amd64'}] with pytest.raises(IIBError, match='No arches.+'): build._prepare_request_for_build('binary-image:latest', 1)