add validation rule to check tarball-base
We don't want to take the time to check out all of the source code for all projects during the documentation build, so add a validation step to check that the deliverable being modified has the tarball-base value set properly, if it needs to be overridden from the default. Change-Id: Id39bdd1e0a9fe771b78a053ba73803c3c095f135 Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
parent
4305adb190
commit
32e9f4d7cc
@ -37,6 +37,7 @@ from openstack_releases import defaults
|
|||||||
from openstack_releases import gitutils
|
from openstack_releases import gitutils
|
||||||
from openstack_releases import governance
|
from openstack_releases import governance
|
||||||
from openstack_releases import project_config
|
from openstack_releases import project_config
|
||||||
|
from openstack_releases import pythonutils
|
||||||
from openstack_releases import versionutils
|
from openstack_releases import versionutils
|
||||||
|
|
||||||
urllib3.disable_warnings()
|
urllib3.disable_warnings()
|
||||||
@ -62,6 +63,8 @@ _VALID_BRANCH_PREFIXES = set([
|
|||||||
'feature',
|
'feature',
|
||||||
'driverfixes',
|
'driverfixes',
|
||||||
])
|
])
|
||||||
|
_PLEASE = ('It is too expensive to determine this value during '
|
||||||
|
'the site build, please set it explicitly.')
|
||||||
|
|
||||||
|
|
||||||
def is_a_hash(val):
|
def is_a_hash(val):
|
||||||
@ -224,6 +227,31 @@ def validate_releases(deliverable_info, zuul_layout,
|
|||||||
# No point in running extra checks if the SHA just
|
# No point in running extra checks if the SHA just
|
||||||
# doesn't exist.
|
# doesn't exist.
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Ensure we have a local copy of the repository so we
|
||||||
|
# can scan for values that are more difficult to get
|
||||||
|
# remotely.
|
||||||
|
gitutils.clone_repo(workdir, project['repo'])
|
||||||
|
|
||||||
|
# Check that the sdist name and tarball-base name match.
|
||||||
|
sdist = pythonutils.get_sdist_name(workdir, project['repo'])
|
||||||
|
if sdist is not None:
|
||||||
|
expected = project.get(
|
||||||
|
'tarball-base',
|
||||||
|
os.path.basename(project['repo']),
|
||||||
|
)
|
||||||
|
if sdist != expected:
|
||||||
|
if 'tarball-base' in deliverable_info:
|
||||||
|
action = 'is set to'
|
||||||
|
else:
|
||||||
|
action = 'defaults to'
|
||||||
|
mk_error(
|
||||||
|
('tarball-base for %s %s %s %r '
|
||||||
|
'but the sdist name is actually %r. ' +
|
||||||
|
_PLEASE)
|
||||||
|
% (project['repo'], release['version'],
|
||||||
|
action, expected, sdist))
|
||||||
|
|
||||||
# Report if the version has already been
|
# Report if the version has already been
|
||||||
# tagged. We expect it to not exist, but neither
|
# tagged. We expect it to not exist, but neither
|
||||||
# case is an error because sometimes we want to
|
# case is an error because sometimes we want to
|
||||||
@ -232,7 +260,6 @@ def validate_releases(deliverable_info, zuul_layout,
|
|||||||
version_exists = gitutils.tag_exists(
|
version_exists = gitutils.tag_exists(
|
||||||
project['repo'], release['version'],
|
project['repo'], release['version'],
|
||||||
)
|
)
|
||||||
gitutils.clone_repo(workdir, project['repo'])
|
|
||||||
if version_exists:
|
if version_exists:
|
||||||
actual_sha = gitutils.sha_for_tag(
|
actual_sha = gitutils.sha_for_tag(
|
||||||
workdir,
|
workdir,
|
||||||
@ -331,6 +358,7 @@ def validate_releases(deliverable_info, zuul_layout,
|
|||||||
def validate_new_releases(deliverable_info, filename,
|
def validate_new_releases(deliverable_info, filename,
|
||||||
team_data,
|
team_data,
|
||||||
mk_warning, mk_error):
|
mk_warning, mk_error):
|
||||||
|
|
||||||
"""Apply validation rules that only apply to the current series.
|
"""Apply validation rules that only apply to the current series.
|
||||||
"""
|
"""
|
||||||
if not deliverable_info.get('releases'):
|
if not deliverable_info.get('releases'):
|
||||||
|
32
openstack_releases/pythonutils.py
Normal file
32
openstack_releases/pythonutils.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
def get_sdist_name(workdir, repo):
|
||||||
|
"Check out the code."
|
||||||
|
dest = os.path.join(workdir, repo)
|
||||||
|
if not os.path.exists(os.path.join(dest, 'setup.py')):
|
||||||
|
# Not a python project
|
||||||
|
return None
|
||||||
|
cmd = ['python', 'setup.py', '--name']
|
||||||
|
# Run it once and discard the result to ensure any setup_requires
|
||||||
|
# dependencies are installed.
|
||||||
|
subprocess.check_output(cmd, cwd=dest)
|
||||||
|
# Run it again to get a clean version of the name.
|
||||||
|
name = subprocess.check_output(cmd, cwd=dest).strip()
|
||||||
|
return name
|
@ -624,6 +624,120 @@ class TestValidateReleases(base.BaseTestCase):
|
|||||||
self.assertEqual(0, len(errors))
|
self.assertEqual(0, len(errors))
|
||||||
|
|
||||||
|
|
||||||
|
class TestValidateTarballBase(base.BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestValidateTarballBase, self).setUp()
|
||||||
|
self.tmpdir = self.useFixture(fixtures.TempDir()).path
|
||||||
|
|
||||||
|
@mock.patch('openstack_releases.pythonutils.get_sdist_name')
|
||||||
|
def test_default_ok(self, gsn):
|
||||||
|
deliverable_info = {
|
||||||
|
'artifact-link-mode': 'none',
|
||||||
|
'releases': [
|
||||||
|
{'version': '1.5.0',
|
||||||
|
'projects': [
|
||||||
|
{'repo': 'openstack/automaton',
|
||||||
|
'hash': 'be2885f544637e6ee6139df7dc7bf937925804dd'},
|
||||||
|
]}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
warnings = []
|
||||||
|
errors = []
|
||||||
|
gsn.return_value = 'automaton'
|
||||||
|
validate.validate_releases(
|
||||||
|
deliverable_info,
|
||||||
|
{'validate-projects-by-name': {}},
|
||||||
|
'ocata',
|
||||||
|
self.tmpdir,
|
||||||
|
warnings.append,
|
||||||
|
errors.append,
|
||||||
|
)
|
||||||
|
self.assertEqual(0, len(warnings))
|
||||||
|
self.assertEqual(0, len(errors))
|
||||||
|
|
||||||
|
@mock.patch('openstack_releases.pythonutils.get_sdist_name')
|
||||||
|
def test_default_invalid(self, gsn):
|
||||||
|
deliverable_info = {
|
||||||
|
'artifact-link-mode': 'none',
|
||||||
|
'releases': [
|
||||||
|
{'version': '1.5.0',
|
||||||
|
'projects': [
|
||||||
|
{'repo': 'openstack/automaton',
|
||||||
|
'hash': 'be2885f544637e6ee6139df7dc7bf937925804dd'},
|
||||||
|
]}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
warnings = []
|
||||||
|
errors = []
|
||||||
|
gsn.return_value = 'automaton1'
|
||||||
|
validate.validate_releases(
|
||||||
|
deliverable_info,
|
||||||
|
{'validate-projects-by-name': {}},
|
||||||
|
'ocata',
|
||||||
|
self.tmpdir,
|
||||||
|
warnings.append,
|
||||||
|
errors.append,
|
||||||
|
)
|
||||||
|
self.assertEqual(0, len(warnings))
|
||||||
|
self.assertEqual(1, len(errors))
|
||||||
|
|
||||||
|
@mock.patch('openstack_releases.pythonutils.get_sdist_name')
|
||||||
|
def test_explicit_ok(self, gsn):
|
||||||
|
deliverable_info = {
|
||||||
|
'artifact-link-mode': 'none',
|
||||||
|
'releases': [
|
||||||
|
{'version': '1.5.0',
|
||||||
|
'projects': [
|
||||||
|
{'repo': 'openstack/automaton',
|
||||||
|
'hash': 'be2885f544637e6ee6139df7dc7bf937925804dd',
|
||||||
|
'tarball-base': 'automaton1'},
|
||||||
|
]}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
warnings = []
|
||||||
|
errors = []
|
||||||
|
gsn.return_value = 'automaton1'
|
||||||
|
validate.validate_releases(
|
||||||
|
deliverable_info,
|
||||||
|
{'validate-projects-by-name': {}},
|
||||||
|
'ocata',
|
||||||
|
self.tmpdir,
|
||||||
|
warnings.append,
|
||||||
|
errors.append,
|
||||||
|
)
|
||||||
|
self.assertEqual(0, len(warnings))
|
||||||
|
self.assertEqual(0, len(errors))
|
||||||
|
|
||||||
|
@mock.patch('openstack_releases.pythonutils.get_sdist_name')
|
||||||
|
def test_explicit_invalid(self, gsn):
|
||||||
|
deliverable_info = {
|
||||||
|
'artifact-link-mode': 'none',
|
||||||
|
'releases': [
|
||||||
|
{'version': '1.5.0',
|
||||||
|
'projects': [
|
||||||
|
{'repo': 'openstack/automaton',
|
||||||
|
'hash': 'be2885f544637e6ee6139df7dc7bf937925804dd',
|
||||||
|
'tarball-base': 'does-not-match-sdist'},
|
||||||
|
]}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
warnings = []
|
||||||
|
errors = []
|
||||||
|
gsn.return_value = 'automaton'
|
||||||
|
validate.validate_releases(
|
||||||
|
deliverable_info,
|
||||||
|
{'validate-projects-by-name': {}},
|
||||||
|
'ocata',
|
||||||
|
self.tmpdir,
|
||||||
|
warnings.append,
|
||||||
|
errors.append,
|
||||||
|
)
|
||||||
|
print(warnings, errors)
|
||||||
|
self.assertEqual(0, len(warnings))
|
||||||
|
self.assertEqual(1, len(errors))
|
||||||
|
|
||||||
|
|
||||||
class TestValidateNewReleases(base.BaseTestCase):
|
class TestValidateNewReleases(base.BaseTestCase):
|
||||||
|
|
||||||
team_data_yaml = textwrap.dedent("""
|
team_data_yaml = textwrap.dedent("""
|
||||||
|
Loading…
Reference in New Issue
Block a user