new_release: work from a release history object

The calculation of the last release was working from release
information from targeted series, and used specific code to
retrieve the data from the previous series if that failed.

In preparation for landing code to look further backwards in
history, refactor that code to retrieve and work from a
release history object containing list of releases for each
considered series.

To preserve current behavior, for the moment, we only retrieve
history for the targeted series and the series before that.

This allows to get rid of mocks in get_last_release() tests and
simplify testing from a history of releases.

Change-Id: I48ff9c46c1e9250fbdfc5dd5344f18c7e046735a
This commit is contained in:
Thierry Carrez 2018-07-04 16:24:36 +02:00
parent 30c6258ab4
commit e7ac6d6ab8
2 changed files with 89 additions and 108 deletions

View File

@ -98,21 +98,38 @@ def get_last_series_info(series, deliverable):
'Could not determine previous version: %s' % (e,))
def get_last_release(deliverable_info, series, deliverable, release_type):
try:
last_release = deliverable_info['releases'][-1]
except (KeyError, IndexError):
print('No releases for %s in %s, yet.' % (
deliverable, series))
if release_type == 'bugfix':
def get_release_history(series, deliverable):
"""Retrieve the history of releases for a given deliverable.
Returns an array of arrays containing the releases for each series,
in reverse chronological order starting from specified series.
"""
all_series = sorted(os.listdir('deliverables'), reverse=True)
series_index = all_series.index(series)
release_history = []
# Only consider current & previous series, to preserve current behavior
for current_series in all_series[series_index:series_index + 1]:
try:
deliv_info = get_deliverable_data(current_series, deliverable)
releases = deliv_info['releases']
except (IOError, OSError, KeyError):
print('No releases for %s in %s, yet.' % (
deliverable, series))
releases = []
release_history.append(releases)
return release_history
def get_last_release(release_history, deliverable, release_type):
for releases in release_history:
if releases:
return releases[-1]
elif release_type == 'bugfix':
raise RuntimeError(
'The first release for a series must '
'be at least a feature release to allow '
'for stable releases from the previous series.')
# Look for the version of the previous series.
prev_info = get_last_series_info(series, deliverable)
last_release = prev_info['releases'][-1]
return last_release
raise RuntimeError('No previous version could be found')
def main():
@ -181,9 +198,9 @@ def main():
parser.error(e)
try:
release_history = get_release_history(series, args.deliverable)
last_release = get_last_release(
deliverable_info,
series,
release_history,
args.deliverable,
args.release_type,
)

View File

@ -18,8 +18,6 @@ from oslotest import base
from openstack_releases.cmds import new_release
import fixtures
class TestIncrementVersion(base.BaseTestCase):
@ -120,128 +118,94 @@ class TestIncrementMilestoneVersion(base.BaseTestCase):
class TestGetLastRelease(base.BaseTestCase):
def test_existing_releases(self):
deliverable_info = {
'releases': [
release_history = [
[
{'version': '1.0.0'},
],
}
]
self.assertEqual(
{'version': '1.0.0'},
new_release.get_last_release(
deliverable_info,
'anyseries',
release_history,
'anydeliverable',
'bugfix',
)
)
def test_existing_releases2(self):
deliverable_info = {
'releases': [
release_history = [
[
{'version': '1.0.0'},
{'version': '1.0.1'},
],
}
]
self.assertEqual(
{'version': '1.0.1'},
new_release.get_last_release(
deliverable_info,
'anyseries',
release_history,
'anydeliverable',
'bugfix',
)
)
def test_first_bugfix_is_error(self):
deliverable_info = {
'releases': [],
}
self.assertRaises(
RuntimeError,
new_release.get_last_release,
deliverable_info,
'anyseries',
'anydeliverable',
'bugfix',
)
class TestGetLastReleaseFirstInSeries(base.BaseTestCase):
def setUp(self):
super(TestGetLastReleaseFirstInSeries, self).setUp()
# Avoid scanning the filesystem to find the release series.
listdir = self.useFixture(fixtures.MockPatch('os.listdir')).mock
listdir.return_value = [
'olderseries',
'anyseries',
'newerseries',
]
# When we look for the previous series data, return a valid
# set of info.
gdd = self.useFixture(
fixtures.MockPatchObject(new_release, 'get_deliverable_data')
).mock
gdd.return_value = {
'releases': [
release_history = [
[],
[
{'version': '1.0.0'},
{'version': '1.0.1'},
],
}
def test_empty_release_list(self):
deliverable_info = {
'releases': [],
}
self.assertEqual(
{'version': '1.0.1'},
new_release.get_last_release(
deliverable_info,
'anyseries',
'anydeliverable',
'feature',
)
)
def test_first_in_series_keyerror(self):
deliverable_info = {
}
self.assertEqual(
{'version': '1.0.1'},
new_release.get_last_release(
deliverable_info,
'anyseries',
'anydeliverable',
'feature',
)
)
class TestGetLastReleaseFirstEver(base.BaseTestCase):
def setUp(self):
super(TestGetLastReleaseFirstEver, self).setUp()
# Avoid scanning the filesystem to find the release series.
listdir = self.useFixture(fixtures.MockPatch('os.listdir')).mock
listdir.return_value = [
'olderseries',
'anyseries',
'newerseries',
]
# When we look for the previous series data, return no
# information.
gdd = self.useFixture(
fixtures.MockPatchObject(new_release, 'get_deliverable_data')
).mock
gdd.side_effect = IOError('test error')
def test_no_previous_release(self):
deliverable_info = {
}
self.assertRaises(
RuntimeError,
new_release.get_last_release,
deliverable_info,
'anyseries',
release_history,
'anydeliverable',
'bugfix',
)
def test_empty_release_list(self):
release_history = [
[],
[
{'version': '1.0.0'},
{'version': '1.0.1'},
],
]
self.assertEqual(
{'version': '1.0.1'},
new_release.get_last_release(
release_history,
'anydeliverable',
'feature',
)
)
def test_no_previous_release(self):
release_history = [
[],
[],
]
self.assertRaises(
RuntimeError,
new_release.get_last_release,
release_history,
'anydeliverable',
'bugfix',
)
def test_last_release_in_older_series(self):
release_history = [
[],
[],
[
{'version': '1.0.0'},
],
]
self.assertRaises(
RuntimeError,
new_release.get_last_release,
release_history,
'anydeliverable',
'bugfix',
)