From 3455a731ddd08be9a3124b10f839b6fa7ef7173f Mon Sep 17 00:00:00 2001 From: Jedrzej Nowak Date: Fri, 26 Feb 2016 15:51:11 +0100 Subject: [PATCH] Improve version parsing in Repository module When wrong version is given in meta.yaml error is raised Change-Id: I10361fce51321c40d4447203f7420e7b7d82f05c Closes-bug: #1550368 --- solar/core/resource/repository.py | 7 +++++ solar/test/test_resource_repository.py | 36 +++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/solar/core/resource/repository.py b/solar/core/resource/repository.py index d1475d38..dd63872b 100644 --- a/solar/core/resource/repository.py +++ b/solar/core/resource/repository.py @@ -47,6 +47,8 @@ def read_meta(base_path): metadata = utils.yaml_load(base_meta_file) metadata.setdefault('version', '1.0.0') + # NOTE(jnowak): when `version: 0.1` then it's float + metadata['version'] = str(metadata['version']) metadata['base_path'] = os.path.abspath(base_path) actions_path = os.path.join(metadata['base_path'], 'actions') metadata['actions_path'] = actions_path @@ -200,6 +202,11 @@ class Repository(object): "meta.yaml not found: %s" % e.filename) raise version = metadata['version'] + valid = semantic_version.validate(version) + if not valid: + raise RepositoryException("Invalid version " + "%s for %s" % (version, + source)) # TODO: (jnowak) sanitize version target_path = os.path.join(self.fpath, name, version) try: diff --git a/solar/test/test_resource_repository.py b/solar/test/test_resource_repository.py index 39b14e15..4bd0c0d1 100644 --- a/solar/test/test_resource_repository.py +++ b/solar/test/test_resource_repository.py @@ -21,6 +21,7 @@ import shutil import pytest from solar.core.resource.repository import Repository +from solar.core.resource.repository import RepositoryException from solar.core.resource.repository import RES_TYPE @@ -49,24 +50,27 @@ resources: []""" _VERSIONS = ('0.0.1', '0.0.2', '1.0.0', '1.4.7', '2.0.0') -def generate_structure(target, versions='1.0.0', r_type=0): +def generate_structure(target, versions='1.0.0', r_type=0, + versions_meta=None, number=3): if isinstance(versions, basestring): versions = (versions) elif isinstance(versions, int): versions = _VERSIONS[:versions] + versions_meta = versions_meta or versions + if r_type == 0: - for name in ('first', 'second', 'third'): - for version in versions: - cnt = _META_CONTENT.format(version, name) + for name in ('first', 'second', 'third')[:number]: + for version_meta, version in zip(versions_meta, versions): + cnt = _META_CONTENT.format(version_meta, version, name) fp = os.path.join(target, name, version) os.makedirs(fp) with open(os.path.join(fp, 'meta.yaml'), 'wb') as f: f.write(cnt) else: - for name in ('first', 'second', 'third'): - for version in versions: - cnt = _VR_CONTENT.format(version) + for name in ('first', 'second', 'third')[:number]: + for version_meta, version in zip(versions_meta, versions): + cnt = _VR_CONTENT.format(version_meta) fp = os.path.join(target, name, version) os.makedirs(fp) with open(os.path.join(fp, "{}.yaml".format(name)), 'wb') as f: @@ -279,3 +283,21 @@ def test_create_from_src(mock_mkdtemp, mock_rename, _): mock_rename.assert_called_with(tmp_dir, real_path) assert repo.fpath == real_path + + +def test_detect_invalid_version_in_dir(repo_w, tmpdir): + rp = str(tmpdir) + '/r1' + generate_structure(rp, ['0.1.0', '0.1'], number=1) + repo = Repository("repo_in_dir") + with pytest.raises(RepositoryException) as ex: + repo.create(rp) + assert 'r1/first' in str(ex) + + +def test_detect_invalid_version_in_meta(repo_w, tmpdir): + rp = str(tmpdir) + '/r1' + generate_structure(rp, ['0.1.0'], versions_meta=['0.1'], number=1) + repo = Repository('repo_in_meta') + with pytest.raises(RepositoryException) as ex: + repo.create(rp) + assert 'r1/first/0.1.0' in str(ex)