From 9a49ded73f2d2b626393235c5db70212efd649d4 Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Mon, 23 Oct 2017 09:54:35 -0400 Subject: [PATCH] make release job validation based on project type Require puppet repositories to have the puppet jobs and node repositories to have the node jobs. Update the allowed values for release-type to include "puppet" and "nodejs" for folks who want to be explicit, but also use the module type-detection code to default properly. Report any jobs that are valid release jobs but for the wrong release type as errors instead of warnings. Change-Id: I9330cc62834f42ae0cd4d1cc48ed963846d72944 Signed-off-by: Doug Hellmann --- README.rst | 10 +++++ openstack_releases/cmds/validate.py | 41 ++++++++++++------- openstack_releases/project_config.py | 28 ++++++++++++- openstack_releases/schema.yaml | 2 +- .../tests/test_project_config.py | 4 +- openstack_releases/tests/test_validate.py | 2 +- openstack_releases/versionutils.py | 2 + 7 files changed, 68 insertions(+), 21 deletions(-) diff --git a/README.rst b/README.rst index 9dee4533bf..da9ce1fafb 100644 --- a/README.rst +++ b/README.rst @@ -409,6 +409,16 @@ The top level of a deliverable file is a mapping with keys: ``fuel`` The Fuel project manages its own packages. + ``puppet`` + All puppet modules should use this. If no release-type is + specified and the validation job can determine that a module is a + puppet module, it assumes a release-type of ``puppet``. + + ``nodejs`` + All nodejs modules should use this. If no release-type is + specified and the validation job can determine that a module is a + nodejs module, it assumes a release-type of ``nodejs``. + ``releases`` A list of the releases for the deliverable. diff --git a/openstack_releases/cmds/validate.py b/openstack_releases/cmds/validate.py index 34ed29f6be..bf5cf16d57 100644 --- a/openstack_releases/cmds/validate.py +++ b/openstack_releases/cmds/validate.py @@ -363,7 +363,6 @@ def validate_releases(deliverable_info, zuul_projects, # appear at the end of the file. new_releases = {} - release_type = deliverable_info.get('release-type', 'std') link_mode = deliverable_info.get('artifact-link-mode', 'tarball') if release_model == 'untagged' and 'releases' in deliverable_info: @@ -378,13 +377,6 @@ def validate_releases(deliverable_info, zuul_projects, for project in release['projects']: - # Check for release jobs (if we ship a tarball) - if link_mode != 'none': - project_config.require_release_jobs_for_repo( - deliverable_info, zuul_projects, project['repo'], - release_type, mk_warning, mk_error, - ) - # Check the SHA specified for the tag. print('%s SHA %s ' % (project['repo'], project['hash'])) @@ -489,19 +481,17 @@ def validate_releases(deliverable_info, zuul_projects, (prev_version, ', '.join(sorted(prev_projects)))) else: - for e in versionutils.validate_version( - release['version'], - release_type=release_type, - pre_ok=(release_model in _USES_PREVER)): - msg = ('could not validate version %r: %s' % - (release['version'], e)) - mk_error(msg) + # We change this default to be more + # language-specific before testing the release + # jobs. + default_release_type = 'std' # If this is a puppet module, ensure # that the tag and metadata file # match. if puppetutils.looks_like_a_module(workdir, project['repo']): + default_release_type = 'puppet' puppet_ver = puppetutils.get_version( workdir, project['repo']) if puppet_ver != release['version']: @@ -519,6 +509,7 @@ def validate_releases(deliverable_info, zuul_projects, # match. if npmutils.looks_like_a_module(workdir, project['repo']): + default_release_type = 'nodejs' npm_ver = npmutils.get_version( workdir, project['repo']) if npm_ver != release['version']: @@ -531,6 +522,26 @@ def validate_releases(deliverable_info, zuul_projects, ) ) + # Check for release jobs (if we ship a tarball) + release_type = deliverable_info.get( + 'release-type', + default_release_type, + ) + if link_mode != 'none': + project_config.require_release_jobs_for_repo( + deliverable_info, zuul_projects, + project['repo'], + release_type, mk_warning, mk_error, + ) + + for e in versionutils.validate_version( + release['version'], + release_type=release_type, + pre_ok=(release_model in _USES_PREVER)): + msg = ('could not validate version %r: %s' % + (release['version'], e)) + mk_error(msg) + if is_independent: mk_warning('skipping descendant test for ' 'independent project, verify ' diff --git a/openstack_releases/project_config.py b/openstack_releases/project_config.py index 8c2566c589..5b7178db86 100644 --- a/openstack_releases/project_config.py +++ b/openstack_releases/project_config.py @@ -82,10 +82,14 @@ def get_zuul_project_data(url=ZUUL_PROJECTS_URL): # Which jobs are needed for which release types. _RELEASE_JOBS_FOR_TYPE = { 'std': [ - 'nodejs4-publish-to-npm', - 'nodejs6-publish-to-npm', 'openstack-server-release-jobs', 'publish-to-pypi', + ], + 'nodejs': [ + 'nodejs4-publish-to-npm', + 'nodejs6-publish-to-npm', + ], + 'puppet': [ 'puppet-tarball-jobs', 'puppet-release-jobs', ], @@ -162,4 +166,24 @@ def require_release_jobs_for_repo(deliverable_info, zuul_projects, repo, found=found_jobs, ), ) + # Check to see if we found jobs we did not expect to find. + for wrong_type, wrong_jobs in _RELEASE_JOBS_FOR_TYPE.items(): + if wrong_type == release_type: + continue + bad_jobs = [ + j for j in wrong_jobs + if j in templates + ] + if bad_jobs: + mk_error( + '{filename} has unexpected release jobs ' + '{bad_jobs!r} for release-type {wrong_type} ' + 'but {repo} uses release-type {release_type}'.format( + filename=ZUUL_PROJECTS_FILENAME, + repo=repo, + bad_jobs=bad_jobs, + wrong_type=wrong_type, + release_type=release_type, + ) + ) return diff --git a/openstack_releases/schema.yaml b/openstack_releases/schema.yaml index 888c3e149d..50d5b7a66e 100644 --- a/openstack_releases/schema.yaml +++ b/openstack_releases/schema.yaml @@ -35,7 +35,7 @@ properties: type: "object" release-type: type: "string" - enum: [ "std", "xstatic", "fuel" ] + enum: [ "std", "xstatic", "fuel", "nodejs", "puppet" ] stable-branch-type: type: "string" enum: [ "std", "tagless", "upstream" ] diff --git a/openstack_releases/tests/test_project_config.py b/openstack_releases/tests/test_project_config.py index cff817ab0a..e768da5830 100644 --- a/openstack_releases/tests/test_project_config.py +++ b/openstack_releases/tests/test_project_config.py @@ -132,5 +132,5 @@ class TestReleaseJobsStandard(base.BaseTestCase): warnings.append, errors.append, ) - self.assertEqual(1, len(warnings)) - self.assertEqual(0, len(errors)) + self.assertEqual(0, len(warnings)) + self.assertEqual(1, len(errors)) diff --git a/openstack_releases/tests/test_validate.py b/openstack_releases/tests/test_validate.py index e6b98242c8..abd15586a1 100644 --- a/openstack_releases/tests/test_validate.py +++ b/openstack_releases/tests/test_validate.py @@ -422,7 +422,7 @@ class TestValidateReleases(base.BaseTestCase): def test_check_release_jobs(self, check_jobs): deliverable_info = { 'releases': [ - {'version': '1.5.0', + {'version': '99.5.0', 'projects': [ {'repo': 'openstack/automaton', 'hash': 'be2885f544637e6ee6139df7dc7bf937925804dd'}, diff --git a/openstack_releases/versionutils.py b/openstack_releases/versionutils.py index b88ed692a0..f9e0b2bbca 100644 --- a/openstack_releases/versionutils.py +++ b/openstack_releases/versionutils.py @@ -35,6 +35,8 @@ _VALIDATORS = {'std': (pbr.version.SemanticVersion.from_pip_string, } _VALIDATORS['fuel'] = _VALIDATORS['std'] _VALIDATORS['openstack-manuals'] = _VALIDATORS['std'] +_VALIDATORS['puppet'] = _VALIDATORS['std'] +_VALIDATORS['nodejs'] = _VALIDATORS['std'] def validate_version(versionstr, release_type='std', pre_ok=True):