compare release objects by their version

Change-Id: I6432ae7acd0090e0d1109239d2860019166544c1
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann
2018-02-21 15:49:00 -05:00
parent 1a637ce2f3
commit b160a2bf91
3 changed files with 338 additions and 333 deletions

View File

@@ -276,21 +276,6 @@ def validate_release_notes(deliv, messages):
LOG.debug('{} OK'.format(link))
def get_model(deliverable_info, series_name):
"Return the release model from the deliverable info."
# Determine the release model. Don't require independent
# projects to redundantly specify that they are independent by
# including the value in their deliverablefile, but everyone
# else must provide a valid value.
is_independent = (series_name == '_independent')
if is_independent:
release_model = 'independent'
else:
release_model = deliverable_info.get('release-model',
'UNSPECIFIED')
return release_model
def validate_model(deliv, series_name, messages):
"Require a valid release model"
header('Validate Model')
@@ -393,31 +378,6 @@ _TYPE_TO_RELEASE_TYPE = {
_PYTHON_RELEASE_TYPES = ['python-service', 'python-pypi', 'neutron', 'horizon']
def legacy_get_release_type(deliverable_info, repo, workdir):
"""Return tuple with release type and boolean indicating whether it
was explicitly set.
"""
# TODO(dhellmann): Delete this function after validate_releases is updated.
if 'release-type' in deliverable_info:
return (deliverable_info['release-type'], True)
from_type = _TYPE_TO_RELEASE_TYPE.get(deliverable_info.get('type'))
if from_type is not None:
return (from_type, False)
if deliverable_info.get('include-pypi-link', False):
return ('python-pypi', False)
if puppetutils.looks_like_a_module(workdir, repo):
return ('puppet', False)
if npmutils.looks_like_a_module(workdir, repo):
return ('nodejs', False)
return ('python-service', False)
def get_release_type(deliv, repo, workdir):
"""Return tuple with release type and boolean indicating whether it
was explicitly set.
@@ -607,7 +567,7 @@ def validate_pypi_permissions(deliv, zuul_projects, workdir,
sorted(uploaders), pypi_name))
def validate_releases(deliverable_info, zuul_projects,
def validate_releases(deliv, zuul_projects,
series_name,
workdir,
messages):
@@ -615,15 +575,11 @@ def validate_releases(deliverable_info, zuul_projects,
"""
header('Validate Releases')
# TODO(dhellmann): delete get_model
release_model = get_model(deliverable_info, series_name)
is_independent = (release_model == 'independent')
# Remember which entries are new so we can verify that they
# appear at the end of the file.
new_releases = {}
if release_model == 'untagged' and 'releases' in deliverable_info:
if deliv.model == 'untagged' and deliv.is_released:
messages.error(
'untagged deliverables should not have a "releases" section'
)
@@ -631,27 +587,27 @@ def validate_releases(deliverable_info, zuul_projects,
prev_version = None
prev_projects = set()
for release in deliverable_info.get('releases', []):
for release in deliv.releases:
print('\nchecking %s' % release['version'])
LOG.info('checking {}'.format(release.version))
for project in release['projects']:
for project in release.projects:
# Check the SHA specified for the tag.
print('%s SHA %s ' % (project['repo'], project['hash']))
LOG.info('{} SHA {}'.format(project.repo.name, project.hash))
if not is_a_hash(project['hash']):
if not is_a_hash(project.hash):
messages.error(
('%(repo)s version %(version)s release from '
'%(hash)r, which is not a hash') % {
'repo': project['repo'],
'hash': project['hash'],
'version': release['version']}
'repo': project.repo.name,
'hash': project.hash,
'version': release.version}
)
else:
if not gitutils.safe_clone_repo(workdir, project['repo'],
project['hash'], messages):
if not gitutils.safe_clone_repo(workdir, project.repo.name,
project.hash, messages):
continue
# Report if the version has already been
@@ -660,69 +616,70 @@ def validate_releases(deliverable_info, zuul_projects,
# import history and sometimes we want to make new
# releases.
version_exists = gitutils.commit_exists(
workdir, project['repo'], release['version'],
workdir, project.repo.name, release.version,
)
if version_exists:
actual_sha = gitutils.sha_for_tag(
workdir,
project['repo'],
release['version'],
project.repo.name,
release.version,
)
if actual_sha != project['hash']:
if actual_sha != project.hash:
messages.error(
('Version %s in %s is on '
'commit %s instead of %s') %
(release['version'],
project['repo'],
(release.version,
project.repo.name,
actual_sha,
project['hash']))
project.hash))
print('tag exists, skipping further validation')
continue
# Report if the SHA exists or not (an error if it
# does not).
sha_exists = gitutils.commit_exists(
workdir, project['repo'], project['hash'],
workdir, project.repo.name, project.hash,
)
if not sha_exists:
messages.error('No commit %(hash)r in %(repo)r'
% project)
% {'hash': project.hash,
'repo': project.repo.name})
# No point in running extra checks if the SHA just
# doesn't exist.
continue
print('Found new version {} for {}'.format(
release['version'], project['repo']))
new_releases[release['version']] = release
if prev_projects and project['repo'] not in prev_projects:
print('not included in previous release for %s: %s' %
(prev_version, ', '.join(sorted(prev_projects))))
LOG.info('Found new version {} for {}'.format(
release.version, project.repo))
new_releases[release.version] = release
if prev_projects and project.repo.name not in prev_projects:
LOG.debug('not included in previous release for %s: %s' %
(prev_version, ', '.join(sorted(prev_projects))))
else:
release_type, was_explicit = legacy_get_release_type(
deliverable_info, project['repo'], workdir,
release_type, was_explicit = get_release_type(
deliv, project.repo, workdir,
)
if was_explicit:
print('found explicit release-type {!r}'.format(
LOG.debug('found explicit release-type {!r}'.format(
release_type))
else:
print('release-type not given, '
'guessing {!r}'.format(release_type))
LOG.debug('release-type not given, '
'guessing {!r}'.format(release_type))
# If this is a puppet module, ensure
# that the tag and metadata file
# match.
if release_type == 'puppet':
print('applying puppet version rules')
LOG.info('applying puppet version rules')
puppet_ver = puppetutils.get_version(
workdir, project['repo'])
if puppet_ver != release['version']:
workdir, project.repo.name)
if puppet_ver != release.version:
messages.error(
'%s metadata contains "%s" '
'but is being tagged "%s"' % (
project['repo'],
project.repo.name,
puppet_ver,
release['version'],
release.version,
)
)
@@ -730,16 +687,16 @@ def validate_releases(deliverable_info, zuul_projects,
# that the tag and metadata file
# match.
if release_type == 'nodejs':
print('applying nodejs version rules')
LOG.info('applying nodejs version rules')
npm_ver = npmutils.get_version(
workdir, project['repo'])
if npm_ver != release['version']:
workdir, project.repo.name)
if npm_ver != release.version:
messages.error(
'%s package.json contains "%s" '
'but is being tagged "%s"' % (
project['repo'],
project.repo.name,
npm_ver,
release['version'],
release.version,
)
)
@@ -758,20 +715,20 @@ def validate_releases(deliverable_info, zuul_projects,
else:
report = messages.warning
requirements.find_bad_lower_bound_increases(
workdir, project['repo'],
prev_version, release['version'], project['hash'],
workdir, project.repo.name,
prev_version, release.version, project.hash,
report,
)
for e in versionutils.validate_version(
release['version'],
release.version,
release_type=release_type,
pre_ok=(release_model in _USES_PREVER)):
pre_ok=(deliv.model in _USES_PREVER)):
msg = ('could not validate version %r: %s' %
(release['version'], e))
(release.version, e))
messages.error(msg)
if is_independent:
if deliv.is_independent:
messages.warning('skipping descendant test for '
'independent project, verify '
'branch manually')
@@ -781,12 +738,12 @@ def validate_releases(deliverable_info, zuul_projects,
# check that the commit is actually on the
# targeted branch.
if not gitutils.check_branch_sha(workdir,
project['repo'],
project.repo.name,
series_name,
project['hash']):
project.hash):
msg = '%s %s not present in %s branch' % (
project['repo'],
project['hash'],
project.repo.name,
project.hash,
series_name,
)
messages.error(msg)
@@ -796,13 +753,13 @@ def validate_releases(deliverable_info, zuul_projects,
# commit with a new version.
old_sha = gitutils.sha_for_tag(
workdir,
project['repo'],
project.repo.name,
prev_version,
)
if old_sha == project['hash']:
if old_sha == project.hash:
# FIXME(dhellmann): This needs a test.
print('Retagging the SHA with '
'a new version')
LOG.info('Retagging the SHA with '
'a new version')
else:
# Check to see if the commit for the new
# version is in the ancestors of the
@@ -810,29 +767,30 @@ def validate_releases(deliverable_info, zuul_projects,
# merged into the branch.
is_ancestor = gitutils.check_ancestry(
workdir,
project['repo'],
project.repo.name,
prev_version,
project['hash'],
project.hash,
)
if not is_ancestor:
messages.error(
'%s %s receiving %s '
'is not a descendant of %s' % (
project['repo'],
project['hash'],
release['version'],
project.repo.name,
project.hash,
release.version,
prev_version,
)
)
prev_version = release['version']
prev_projects = set(p['repo'] for p in release['projects'])
prev_version = release.version
prev_projects = set(p.repo.name for p in release.projects)
# Make sure that new entries have been appended to the file.
for v, nr in new_releases.items():
if nr != deliverable_info['releases'][-1]:
print('comparing {!r} to {!r}'.format(nr, deliv.releases[-1]))
if nr != deliv.releases[-1]:
msg = ('new release %s must be listed last, '
'with one new release per patch' % nr['version'])
'with one new release per patch' % nr.version)
messages.error(msg)
@@ -1376,7 +1334,7 @@ def main():
)
validate_gitreview(deliv, workdir, messages)
validate_releases(
deliverable_info,
deliv,
zuul_projects,
series_name,
workdir,

View File

@@ -269,6 +269,9 @@ class Release(object):
def projects(self):
return sorted(self._projects.values())
def __eq__(self, other):
return self.version == other.version
@functools.total_ordering
class Deliverable(object):

View File

@@ -306,37 +306,6 @@ class TestValidateReleaseNotes(base.BaseTestCase):
self.assertEqual(0, len(self.msg.errors))
class TestGetModel(base.BaseTestCase):
def setUp(self):
super().setUp()
self.msg = validate.MessageCollector()
def test_no_model_series(self):
self.assertEqual(
'UNSPECIFIED',
validate.get_model({}, 'ocata'),
)
def test_no_model_independent(self):
self.assertEqual(
'independent',
validate.get_model({}, '_independent'),
)
def test_with_model_independent(self):
self.assertEqual(
'independent',
validate.get_model({'release-model': 'set'}, '_independent'),
)
def test_with_model_series(self):
self.assertEqual(
'set',
validate.get_model({'release-model': 'set'}, 'ocata'),
)
class TestValidateModel(base.BaseTestCase):
def setUp(self):
@@ -438,19 +407,24 @@ class TestValidateReleases(base.BaseTestCase):
self.msg = validate.MessageCollector()
def test_invalid_hash(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.1',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'this-is-not-a-hash',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.1',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'this-is-not-a-hash',
'tarball-base': 'openstack-release-test'},
]}
],
},
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -461,19 +435,24 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_valid_existing(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]}
],
},
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -484,19 +463,24 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(0, len(self.msg.errors))
def test_no_such_hash(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '99.0.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'de2885f544637e6ee6139df7dc7bf937925804dd',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '99.0.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'de2885f544637e6ee6139df7dc7bf937925804dd',
'tarball-base': 'openstack-release-test'},
]}
],
},
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -507,19 +491,24 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_mismatch_existing(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
# hash from the previous release
'hash': '88af0f601895d54fb0a45b796cdd045a2b3636a3'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
# hash from the previous release
'hash': '88af0f601895d54fb0a45b796cdd045a2b3636a3'},
]}
],
},
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'newton',
self.tmpdir,
@@ -530,20 +519,25 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_hash_from_master_used_in_stable_release(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
# hash from master
'hash': '218c9c82f168f1db681b27842b5a829428c6b5e1',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
# hash from master
'hash': '218c9c82f168f1db681b27842b5a829428c6b5e1',
'tarball-base': 'openstack-release-test'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'newton',
self.tmpdir,
@@ -554,26 +548,31 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_hash_from_master_used_in_stable_release2(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
# hash from master
'hash': '218c9c82f168f1db681b27842b5a829428c6b5e1',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
# hash from master
'hash': '218c9c82f168f1db681b27842b5a829428c6b5e1',
'tarball-base': 'openstack-release-test'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'newton',
self.tmpdir,
@@ -584,20 +583,25 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_hash_from_stable_used_in_master_release(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
# hash from stable/newton
'hash': 'a8185a9a6c934567f2f8b7543136274dda78ddd3',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
# hash from stable/newton
'hash': 'a8185a9a6c934567f2f8b7543136274dda78ddd3',
'tarball-base': 'openstack-release-test'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
defaults.RELEASE,
self.tmpdir,
@@ -608,18 +612,23 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(1, len(self.msg.errors))
def test_hash_from_master_used_after_default_branch_should_exist_but_does_not(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '1.0.0',
'projects': [
{'repo': 'openstack/releases',
'hash': '8eea82428995b8f3354c0a75351fe95bbbb1135a'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '1.0.0',
'projects': [
{'repo': 'openstack/releases',
'hash': '8eea82428995b8f3354c0a75351fe95bbbb1135a'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'austin',
self.tmpdir,
@@ -630,27 +639,32 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(0, len(self.msg.errors))
def test_not_descendent(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
# hash from stable/meiji
{'version': '0.0.2',
'projects': [
{'repo': 'openstack/release-test',
'hash': '9f48cae13a7388a6f6d1361634d320d73baef0d3',
'tarball-base': 'openstack-release-test'},
]},
# hash from stable/newton
{'version': '0.0.9', # 0.0.3 already exists
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a8185a9a6c934567f2f8b7543136274dda78ddd3',
'tarball-base': 'openstack-release-test'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
# hash from stable/meiji
{'version': '0.0.2',
'projects': [
{'repo': 'openstack/release-test',
'hash': '9f48cae13a7388a6f6d1361634d320d73baef0d3',
'tarball-base': 'openstack-release-test'},
]},
# hash from stable/newton
{'version': '0.0.9', # 0.0.3 already exists
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a8185a9a6c934567f2f8b7543136274dda78ddd3',
'tarball-base': 'openstack-release-test'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'meiji',
self.tmpdir,
@@ -661,25 +675,30 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(2, len(self.msg.errors))
def test_new_not_at_end(self):
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
{'version': '0.7.2',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '0.8.1',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
{'version': '0.7.2',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5',
'tarball-base': 'openstack-release-test'},
]},
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -697,18 +716,23 @@ class TestValidateReleases(base.BaseTestCase):
validate_version.configure_mock(
return_value=['an error goes here'],
)
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -721,12 +745,17 @@ class TestValidateReleases(base.BaseTestCase):
def test_no_releases(self):
# When we initialize a new series, we won't have any release
# data. That's OK.
deliverable_info = {
'artifact-link-mode': 'none',
'releases': []
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'artifact-link-mode': 'none',
'releases': []
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -737,19 +766,24 @@ class TestValidateReleases(base.BaseTestCase):
self.assertEqual(0, len(self.msg.errors))
def test_untagged_with_releases(self):
deliverable_info = {
'release-model': 'untagged',
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5'},
]},
]
}
deliv = deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={
'release-model': 'untagged',
'artifact-link-mode': 'none',
'releases': [
{'version': '99.5.0',
'projects': [
{'repo': 'openstack/release-test',
'hash': 'a26e6a2e8a5e321b2e3517dbb01a7b9a56a8bfd5'},
]},
]
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -979,18 +1013,23 @@ class TestPuppetUtils(base.BaseTestCase):
llam.return_value = True
get_version.return_value = '99.1.0'
cbs.return_value = True
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '99.1.0',
'projects': [
{'repo': 'openstack/puppet-watcher',
'hash': '1e7baef27139f69a83e1fe28686bb72ee7e1d6fa'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='series',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '99.1.0',
'projects': [
{'repo': 'openstack/puppet-watcher',
'hash': '1e7baef27139f69a83e1fe28686bb72ee7e1d6fa'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,
@@ -1007,18 +1046,23 @@ class TestPuppetUtils(base.BaseTestCase):
llam.return_value = True
get_version.return_value = '99.1.0'
cbs.return_value = True
deliverable_info = {
'artifact-link-mode': 'none',
'releases': [
{'version': '99.2.0',
'projects': [
{'repo': 'openstack/puppet-watcher',
'hash': '1e7baef27139f69a83e1fe28686bb72ee7e1d6fa'},
]}
],
}
deliv = deliverable.Deliverable(
team='team',
series='series',
name='name',
data={
'artifact-link-mode': 'none',
'releases': [
{'version': '99.2.0',
'projects': [
{'repo': 'openstack/puppet-watcher',
'hash': '1e7baef27139f69a83e1fe28686bb72ee7e1d6fa'},
]}
],
}
)
validate.validate_releases(
deliverable_info,
deliv,
{'validate-projects-by-name': {}},
'ocata',
self.tmpdir,