diff --git a/deliverables/folsom/python-cliff.yaml b/deliverables/folsom/python-cliff.yaml index 12376123aa..28502b3eed 100644 --- a/deliverables/folsom/python-cliff.yaml +++ b/deliverables/folsom/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: "0.1" projects: diff --git a/deliverables/grizzly/python-cliff.yaml b/deliverables/grizzly/python-cliff.yaml index b429082ffe..59a8ffdf8c 100644 --- a/deliverables/grizzly/python-cliff.yaml +++ b/deliverables/grizzly/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: "1.3" projects: diff --git a/deliverables/havana/python-cliff.yaml b/deliverables/havana/python-cliff.yaml index b8400f741b..9d42cbb34b 100644 --- a/deliverables/havana/python-cliff.yaml +++ b/deliverables/havana/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: 1.3.3 projects: diff --git a/deliverables/icehouse/python-cliff.yaml b/deliverables/icehouse/python-cliff.yaml index 08d9b3e9e3..957acf7138 100644 --- a/deliverables/icehouse/python-cliff.yaml +++ b/deliverables/icehouse/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: 1.5.0 projects: diff --git a/deliverables/juno/python-cliff.yaml b/deliverables/juno/python-cliff.yaml index 08f3192cdb..b96eb8b8e0 100644 --- a/deliverables/juno/python-cliff.yaml +++ b/deliverables/juno/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: 1.7.0 projects: diff --git a/deliverables/juno/python-stevedore.yaml b/deliverables/juno/python-stevedore.yaml index fbf271ab2e..2381da551b 100644 --- a/deliverables/juno/python-stevedore.yaml +++ b/deliverables/juno/python-stevedore.yaml @@ -1,6 +1,7 @@ --- launchpad: python-stevedore team: oslo +type: library releases: - version: 1.0.0 projects: diff --git a/deliverables/kilo/django-openstack-auth.yaml b/deliverables/kilo/django-openstack-auth.yaml index 5e0a2fe425..4e146535bd 100644 --- a/deliverables/kilo/django-openstack-auth.yaml +++ b/deliverables/kilo/django-openstack-auth.yaml @@ -1,6 +1,7 @@ --- launchpad: django-openstack-auth team: horizon +type: library releases: - version: 1.2.0 projects: diff --git a/deliverables/kilo/python-cliff.yaml b/deliverables/kilo/python-cliff.yaml index 998f5b8f71..10916a4af1 100644 --- a/deliverables/kilo/python-cliff.yaml +++ b/deliverables/kilo/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: 1.8.0 projects: diff --git a/deliverables/kilo/python-stevedore.yaml b/deliverables/kilo/python-stevedore.yaml index 46687c1397..4c24ec0ca1 100644 --- a/deliverables/kilo/python-stevedore.yaml +++ b/deliverables/kilo/python-stevedore.yaml @@ -1,6 +1,7 @@ --- launchpad: python-stevedore team: oslo +type: library releases: - version: 1.1.0 projects: diff --git a/deliverables/kilo/python-tooz.yaml b/deliverables/kilo/python-tooz.yaml index 3714640ada..229d075e00 100644 --- a/deliverables/kilo/python-tooz.yaml +++ b/deliverables/kilo/python-tooz.yaml @@ -1,6 +1,7 @@ --- launchpad: python-tooz team: oslo +type: library releases: - version: "0.10" projects: diff --git a/deliverables/liberty/django-openstack-auth.yaml b/deliverables/liberty/django-openstack-auth.yaml index e936fc0b32..b737164fa5 100644 --- a/deliverables/liberty/django-openstack-auth.yaml +++ b/deliverables/liberty/django-openstack-auth.yaml @@ -1,6 +1,7 @@ --- launchpad: django-openstack-auth team: horizon +type: library releases: - version: 1.3.0 projects: diff --git a/deliverables/liberty/python-cliff.yaml b/deliverables/liberty/python-cliff.yaml index c0e6ac53ea..4f1f093d6e 100644 --- a/deliverables/liberty/python-cliff.yaml +++ b/deliverables/liberty/python-cliff.yaml @@ -1,6 +1,7 @@ --- launchpad: python-cliff team: OpenStackClient +type: library releases: - version: 1.13.0 projects: diff --git a/deliverables/liberty/python-mox3.yaml b/deliverables/liberty/python-mox3.yaml index 4526e228fc..011044774b 100644 --- a/deliverables/liberty/python-mox3.yaml +++ b/deliverables/liberty/python-mox3.yaml @@ -1,6 +1,7 @@ --- launchpad: python-mox3 team: oslo +type: library releases: - version: 0.8.0 projects: diff --git a/deliverables/liberty/python-stevedore.yaml b/deliverables/liberty/python-stevedore.yaml index 0a532ad9d6..061c530d73 100644 --- a/deliverables/liberty/python-stevedore.yaml +++ b/deliverables/liberty/python-stevedore.yaml @@ -1,6 +1,7 @@ --- launchpad: python-stevedore team: oslo +type: library releases: - version: 1.4.0 projects: diff --git a/deliverables/liberty/python-tooz.yaml b/deliverables/liberty/python-tooz.yaml index 052b14b231..0f2d1505bd 100644 --- a/deliverables/liberty/python-tooz.yaml +++ b/deliverables/liberty/python-tooz.yaml @@ -1,6 +1,7 @@ --- launchpad: python-tooz team: oslo +type: library releases: - version: 0.14.0 projects: diff --git a/deliverables/liberty/vmware-nsx.yaml b/deliverables/liberty/vmware-nsx.yaml index 9b4bdc824c..4ec4fd06c7 100644 --- a/deliverables/liberty/vmware-nsx.yaml +++ b/deliverables/liberty/vmware-nsx.yaml @@ -1,6 +1,7 @@ --- launchpad: vmware-nsx team: neutron +type: library releases: - version: 1.0.0 projects: diff --git a/openstack_releases/cmds/validate.py b/openstack_releases/cmds/validate.py index 1ab4411035..580f19f5c3 100644 --- a/openstack_releases/cmds/validate.py +++ b/openstack_releases/cmds/validate.py @@ -252,14 +252,24 @@ def validate_team(deliv, team_data, messages): LOG.debug('owned by team {}'.format(deliv.team)) -def validate_release_notes(deliverable_info, messages): +def validate_release_notes(deliv, messages): "Make sure the release notes page exists, if it is specified." header('Validate Release Notes') - if 'release-notes' not in deliverable_info: + notes_link = deliv.release_notes + if not notes_link: print('no release-notes given') return - notes_link = deliverable_info['release-notes'] if isinstance(notes_link, dict): + # Dictionary mapping repositories to links. We don't want any + # repositories that are not known, so check that as well as + # the actual links. + for repo_name in sorted(notes_link.keys()): + if repo_name not in deliv.known_repo_names: + messages.error( + 'linking to release notes for unknown ' + 'repository {}'.format( + repo_name) + ) links = list(notes_link.values()) else: links = [notes_link] @@ -268,22 +278,8 @@ def validate_release_notes(deliverable_info, messages): if (rn_resp.status_code // 100) != 2: messages.error('Could not fetch release notes page %s: %s' % (link, rn_resp.status_code)) - - -def validate_type(deliverable_info, messages): - "Determine the deliverable type. Require an explicit value." - header('Validate Type') - deliverable_type = deliverable_info.get('type') - if not deliverable_type: - messages.error( - 'No deliverable type, must be one of %r' % - sorted(list(_VALID_TYPES)) - ) - elif deliverable_type not in _VALID_TYPES: - messages.error( - 'Invalid deliverable type %r, must be one of %r' % - (deliverable_type, sorted(list(_VALID_TYPES))) - ) + else: + LOG.debug('{} OK'.format(link)) def get_model(deliverable_info, series_name): @@ -1327,11 +1323,11 @@ def main(): name=deliverable_name, data=deliverable_info, ) + clone_deliverable(deliv, workdir, messages) validate_bugtracker(deliv, messages) validate_team(deliv, team_data, messages) - validate_release_notes(deliverable_info, messages) - validate_type(deliverable_info, messages) + validate_release_notes(deliv, messages) validate_model(deliverable_info, series_name, messages) validate_release_type( deliverable_info, diff --git a/openstack_releases/deliverable.py b/openstack_releases/deliverable.py index a8432d82f8..9e611eaab6 100644 --- a/openstack_releases/deliverable.py +++ b/openstack_releases/deliverable.py @@ -257,6 +257,10 @@ class Deliverable(object): for name, repo in sorted(self._repos.items()): yield repo + @property + def known_repo_names(self): + return set(self._repos.keys()) + def get_repo(self, name): return self._repos[name] diff --git a/openstack_releases/schema.yaml b/openstack_releases/schema.yaml index e63fd0d837..782a27d99a 100644 --- a/openstack_releases/schema.yaml +++ b/openstack_releases/schema.yaml @@ -8,6 +8,7 @@ additionalProperties: false required: - team + - type properties: team: diff --git a/openstack_releases/tests/test_validate.py b/openstack_releases/tests/test_validate.py index 77e56ed47d..e7713ad345 100644 --- a/openstack_releases/tests/test_validate.py +++ b/openstack_releases/tests/test_validate.py @@ -202,7 +202,12 @@ class TestValidateReleaseNotes(base.BaseTestCase): def test_no_link(self): validate.validate_release_notes( - {}, + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={}, + ), self.msg, ) self.assertEqual(0, len(self.msg.warnings)) @@ -210,7 +215,14 @@ class TestValidateReleaseNotes(base.BaseTestCase): def test_invalid_link(self): validate.validate_release_notes( - {'release-notes': 'https://docs.openstack.org/no-such-page'}, + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={ + 'release-notes': 'https://docs.openstack.org/no-such-page', + }, + ), self.msg, ) self.assertEqual(0, len(self.msg.warnings)) @@ -218,8 +230,13 @@ class TestValidateReleaseNotes(base.BaseTestCase): def test_valid_link(self): validate.validate_release_notes( - {'release-notes': - 'https://docs.openstack.org/releasenotes/oslo.config'}, + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={'release-notes': + 'https://docs.openstack.org/releasenotes/oslo.config'}, + ), self.msg, ) self.assertEqual(0, len(self.msg.warnings)) @@ -227,11 +244,41 @@ class TestValidateReleaseNotes(base.BaseTestCase): def test_invalid_link_multi(self): validate.validate_release_notes( - { - 'release-notes': { - 'openstack/releases': 'https://docs.openstack.org/no-such-page', - } - }, + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={ + 'repository-settings': { + 'openstack/releases': {}, + }, + 'release-notes': { + 'openstack/releases': + 'https://docs.openstack.org/no-such-page', + } + }, + ), + self.msg, + ) + self.assertEqual(0, len(self.msg.warnings)) + self.assertEqual(1, len(self.msg.errors)) + + def test_unknown_repo(self): + validate.validate_release_notes( + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={ + 'repository-settings': { + 'openstack/release-test': {}, + }, + 'release-notes': { + 'openstack/oslo.config': + 'https://docs.openstack.org/releasenotes/oslo.config', + } + }, + ), self.msg, ) self.assertEqual(0, len(self.msg.warnings)) @@ -239,42 +286,20 @@ class TestValidateReleaseNotes(base.BaseTestCase): def test_valid_link_multi(self): validate.validate_release_notes( - { - 'release-notes': { - 'openstack/releases': 'https://docs.openstack.org/releasenotes/oslo.config', - } - }, - self.msg, - ) - self.assertEqual(0, len(self.msg.warnings)) - self.assertEqual(0, len(self.msg.errors)) - - -class TestValidateDeliverableType(base.BaseTestCase): - - def setUp(self): - super().setUp() - self.msg = validate.MessageCollector() - - def test_no_type(self): - validate.validate_type( - {}, - self.msg, - ) - self.assertEqual(0, len(self.msg.warnings)) - self.assertEqual(1, len(self.msg.errors)) - - def test_invalid_type(self): - validate.validate_type( - {'type': 'not-valid'}, - self.msg, - ) - self.assertEqual(0, len(self.msg.warnings)) - self.assertEqual(1, len(self.msg.errors)) - - def test_valid_type(self): - validate.validate_type( - {'type': 'library'}, + deliverable.Deliverable( + team='team', + series='series', + name='name', + data={ + 'repository-settings': { + 'openstack/releases': {}, + }, + 'release-notes': { + 'openstack/releases': + 'https://docs.openstack.org/releasenotes/oslo.config', + }, + }, + ), self.msg, ) self.assertEqual(0, len(self.msg.warnings))