diff --git a/iib/workers/tasks/fbc_utils.py b/iib/workers/tasks/fbc_utils.py index 75dc7246..bbe99eeb 100644 --- a/iib/workers/tasks/fbc_utils.py +++ b/iib/workers/tasks/fbc_utils.py @@ -8,6 +8,7 @@ import ruamel.yaml from typing import Tuple + from iib.exceptions import IIBError from iib.workers.config import get_worker_config from iib.common.tracing import instrument_tracing @@ -85,12 +86,15 @@ def merge_catalogs_dirs(src_config: str, dest_config: str): :param str src_config: source config directory :param str dest_config: destination config directory """ + from iib.workers.tasks.opm_operations import opm_validate + for conf_dir in (src_config, dest_config): if not os.path.isdir(conf_dir): msg = f"config directory does not exist: {conf_dir}" log.error(msg) raise IIBError(msg) enforce_json_config_dir(conf_dir) + opm_validate(conf_dir) log.info("Merging config folders: %s to %s", src_config, dest_config) shutil.copytree(src_config, dest_config, dirs_exist_ok=True) diff --git a/iib/workers/tasks/opm_operations.py b/iib/workers/tasks/opm_operations.py index b0eb234a..fcb91e5b 100644 --- a/iib/workers/tasks/opm_operations.py +++ b/iib/workers/tasks/opm_operations.py @@ -1144,3 +1144,17 @@ def set_opm_version(cls, from_index: Optional[str] = None): if index_version in opm_versions_config: Opm.opm_version = opm_versions_config.get(index_version) log.info("OPM version set to %s", Opm.opm_version) + + +def opm_validate(config_dir: str) -> None: + """ + Validate the declarative config files in a given directory. + + :param str config_dir: directory containing the declarative config files. + :raises IIBError: if the validation fails + """ + from iib.workers.tasks.utils import run_cmd + + log.debug("Validating JSON files under %s", config_dir) + cmd = ['opm', 'validate', config_dir] + run_cmd(cmd, exc_msg=f'Failed to validate the content from config_dir {config_dir}') diff --git a/tests/test_workers/test_tasks/test_fbc_utils.py b/tests/test_workers/test_tasks/test_fbc_utils.py index cab419b8..dc838448 100644 --- a/tests/test_workers/test_tasks/test_fbc_utils.py +++ b/tests/test_workers/test_tasks/test_fbc_utils.py @@ -102,8 +102,9 @@ def test_is_image_fbc(mock_si, skopeo_output, is_fbc): assert is_image_fbc(image) is is_fbc +@mock.patch('iib.workers.tasks.utils.run_cmd') @mock.patch("iib.workers.tasks.fbc_utils.enforce_json_config_dir") -def test_merge_catalogs_dirs(mock_enforce_json, tmpdir): +def test_merge_catalogs_dirs(mock_enforce_json, mock_rc, tmpdir): source_dir = os.path.join(tmpdir, 'src') destination_dir = os.path.join(tmpdir, 'dst') os.makedirs(destination_dir, exist_ok=True) @@ -121,6 +122,18 @@ def test_merge_catalogs_dirs(mock_enforce_json, tmpdir): mock.call(destination_dir), ] ) + mock_rc.assert_has_calls( + [ + mock.call( + ['opm', 'validate', source_dir], + exc_msg=f'Failed to validate the content from config_dir {source_dir}', + ), + mock.call( + ['opm', 'validate', destination_dir], + exc_msg=f'Failed to validate the content from config_dir {destination_dir}', + ), + ] + ) for r, d, f in os.walk(source_dir):