compare release objects by their version
Change-Id: I6432ae7acd0090e0d1109239d2860019166544c1 Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user