use deliverable object model to validate the release-model setting

Rely on the schema to detect invalid release models.

Change-Id: I4999a7981479888b17e673a3c280439724a4d9c9
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann
2018-02-20 16:45:00 -05:00
parent 9583477190
commit de90ecc482
3 changed files with 69 additions and 46 deletions

View File

@@ -65,13 +65,6 @@ _CLOSED_SERIES = set([
'kilo',
'liberty',
])
_VALID_MODELS = set([
'cycle-with-milestones',
'cycle-with-intermediary',
'cycle-trailing',
'independent',
'untagged',
])
_USES_PREVER = set([
'cycle-with-milestones',
'cycle-trailing',
@@ -297,35 +290,38 @@ def get_model(deliverable_info, series_name):
return release_model
def validate_model(deliverable_info, series_name, messages):
def validate_model(deliv, series_name, messages):
"Require a valid release model"
header('Validate Model')
release_model = get_model(deliverable_info, series_name)
if release_model not in _VALID_MODELS:
if not deliv.is_independent and not deliv.model:
# If the deliverable is not independent it must declare a
# release model.
messages.error(
'Unknown release model %r, must be one of %r' %
(release_model, sorted(list(_VALID_MODELS)))
'no release-model specified',
)
# If the project is release:independent, make sure
# that's where the deliverable file is.
if release_model == 'independent' and series_name != '_independent':
if deliv.model == 'independent' and deliv.series != 'independent':
# If the project is release:independent, make sure
# that's where the deliverable file is.
messages.error(
'uses the independent release model '
'and should be in the _independent '
'directory'
)
# If the project is declaring some other release model, make sure
# it is not in h the _independent directory.
if series_name == '_independent':
model_value = deliverable_info.get('release-model',
'independent')
if model_value != 'independent':
messages.error(
'deliverables in the _independent directory '
'should all use the independent release model'
)
# If the project is declaring some other release model, make
# sure it is not in the _independent directory. We have to
# bypass the model property because that always returns
# 'independent' for deliverables in that series.
model_value = deliv.data.get('release-model', 'independent')
if deliv.series == 'independent' and model_value != 'independent':
messages.error(
'deliverables in the _independent directory '
'should all use the independent release model'
)
LOG.debug('release model {}'.format(deliv.model))
def clone_deliverable(deliv, workdir, messages):
@@ -575,6 +571,7 @@ 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')
@@ -1328,7 +1325,7 @@ def main():
validate_bugtracker(deliv, messages)
validate_team(deliv, team_data, messages)
validate_release_notes(deliv, messages)
validate_model(deliverable_info, series_name, messages)
validate_model(deliv, series_name, messages)
validate_release_type(
deliverable_info,
zuul_projects,

View File

@@ -266,9 +266,13 @@ class Deliverable(object):
@property
def model(self):
if self.series == '_independent':
if self.is_independent:
return 'independent'
return self._data.get('release-model', '').lstrip('_')
return self._data.get('release-model', '')
@property
def is_independent(self):
return self.series == 'independent'
@property
def is_releasable(self):

View File

@@ -345,17 +345,28 @@ class TestValidateModel(base.BaseTestCase):
def test_no_model_series(self):
validate.validate_model(
{},
deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={},
),
'ocata',
self.msg,
)
self.msg.show_summary()
self.assertEqual(0, len(self.msg.warnings))
self.assertEqual(1, len(self.msg.errors))
def test_no_model_independent(self):
validate.validate_model(
{},
'_independent',
deliverable.Deliverable(
team='team',
series='independent',
name='name',
data={},
),
'independent',
self.msg,
)
self.assertEqual(0, len(self.msg.warnings))
@@ -363,8 +374,13 @@ class TestValidateModel(base.BaseTestCase):
def test_with_model_independent_match(self):
validate.validate_model(
{'release-model': 'independent'},
'_independent',
deliverable.Deliverable(
team='team',
series='independent',
name='name',
data={'release-model': 'independent'},
),
'independent',
self.msg,
)
self.assertEqual(0, len(self.msg.warnings))
@@ -372,8 +388,13 @@ class TestValidateModel(base.BaseTestCase):
def test_with_model_independent_nomatch(self):
validate.validate_model(
{'release-model': 'cycle-with-intermediary'},
'_independent',
deliverable.Deliverable(
team='team',
series='independent',
name='name',
data={'release-model': 'cycle-with-intermediary'},
),
'independent',
self.msg,
)
self.assertEqual(0, len(self.msg.warnings))
@@ -381,7 +402,12 @@ class TestValidateModel(base.BaseTestCase):
def test_with_independent_and_model(self):
validate.validate_model(
{'release-model': 'independent'},
deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={'release-model': 'independent'},
),
'ocata',
self.msg,
)
@@ -390,22 +416,18 @@ class TestValidateModel(base.BaseTestCase):
def test_with_model_series(self):
validate.validate_model(
{'release-model': 'cycle-with-intermediary'},
deliverable.Deliverable(
team='team',
series='ocata',
name='name',
data={'release-model': 'cycle-with-intermediary'},
),
'ocata',
self.msg,
)
self.assertEqual(0, len(self.msg.warnings))
self.assertEqual(0, len(self.msg.errors))
def test_with_unknown_model_series(self):
validate.validate_model(
{'release-model': 'not-a-model'},
'ocata',
self.msg,
)
self.assertEqual(0, len(self.msg.warnings))
self.assertEqual(1, len(self.msg.errors))
class TestValidateReleases(base.BaseTestCase):