diff --git a/data/series_status.yaml b/data/series_status.yaml index 316a537321..2e777a6e87 100644 --- a/data/series_status.yaml +++ b/data/series_status.yaml @@ -1,5 +1,6 @@ --- - name: antelope + release-id: 2023.1 status: development slurp: yes initial-release: 2023-03-22 diff --git a/doc/source/_exts/deliverables.py b/doc/source/_exts/deliverables.py index 9e1b844d9e..53c214ff1f 100644 --- a/doc/source/_exts/deliverables.py +++ b/doc/source/_exts/deliverables.py @@ -515,6 +515,7 @@ def build_finished(app, exception): if series.status == 'future'] params = dict( redirections=generate_constraints_redirections(_deliverables, + _series_status_data, future_releases) ) diff --git a/openstack_releases/_redirections.py b/openstack_releases/_redirections.py index fcdd813d91..ae6a8d7615 100644 --- a/openstack_releases/_redirections.py +++ b/openstack_releases/_redirections.py @@ -18,7 +18,8 @@ from sphinx.util import logging LOG = logging.getLogger(__name__) -def generate_constraints_redirections(_deliverables, future_releases=[]): +def generate_constraints_redirections(_deliverables, _series_status_data, + future_releases=[]): redirections = [] # Loop through all the releases for requirements for deliv in _deliverables.get_deliverable_history('requirements'): @@ -26,9 +27,12 @@ def generate_constraints_redirections(_deliverables, future_releases=[]): target = 'master' ref_type = 'branch' + release_id = _series_status_data[deliv.series].release_id + if not release_id: + release_id = deliv.series # Unless there is a specific stable branch for branch in deliv.branches: - if branch.name == 'stable/%s' % (deliv.series): + if branch.name == 'stable/%s' % (release_id): target = branch.name break @@ -42,7 +46,7 @@ def generate_constraints_redirections(_deliverables, future_releases=[]): # Insert into the beginning of the list so that redirections are # master -> juno status = 302 if target == 'master' else 301 - redirections.insert(0, dict(code=status, src=deliv.series, + redirections.insert(0, dict(code=status, src=release_id, ref_type=ref_type, dst=target)) for series in future_releases: diff --git a/openstack_releases/series_status.py b/openstack_releases/series_status.py index 523734c250..34edc58c5f 100644 --- a/openstack_releases/series_status.py +++ b/openstack_releases/series_status.py @@ -43,6 +43,10 @@ class Series(object): except KeyError: return None + @property + def release_id(self): + return self._data.get('release-id', None) + @property def eol_date(self): return self._data.get('eol-date', None) diff --git a/openstack_releases/series_status_schema.yaml b/openstack_releases/series_status_schema.yaml index 1f2b5e3857..d1bd2a2b49 100644 --- a/openstack_releases/series_status_schema.yaml +++ b/openstack_releases/series_status_schema.yaml @@ -16,6 +16,8 @@ items: properties: name: type: "string" + release-id: + type: "number" status: type: "string" enum: diff --git a/openstack_releases/tests/test_redirections.py b/openstack_releases/tests/test_redirections.py index 4bd904148f..b3574a9499 100644 --- a/openstack_releases/tests/test_redirections.py +++ b/openstack_releases/tests/test_redirections.py @@ -18,6 +18,7 @@ from oslotest import base from openstack_releases._redirections import generate_constraints_redirections from openstack_releases import deliverable +from openstack_releases import series_status from openstack_releases import yamlutils @@ -115,6 +116,49 @@ class TestRedirections(base.BaseTestCase): ''')) ) + # Series status data + SERIES_STATUS_DATA = series_status.SeriesStatus( + yamlutils.loads(textwrap.dedent(''' + - name: stein + status: future + initial-release: 2019-04-11 + - name: rocky + status: development + initial-release: 2018-08-30 + - name: mitaka + status: maintained + initial-release: 2018-02-28 + ''')) + ) + + # Deliverable that looks like an open stable series with branch name + # matching the new stable branch naming + OPEN_STABLE_WITH_RELEASE_ID = deliverable.Deliverable( + team='requirements', + series='rocky', + name='requirements', + data=yamlutils.loads(textwrap.dedent(''' + branches: + - name: stable/2018.2 + location: + openstack/requirements: not_used + ''')) + ) + + # Series status data with 'release-id' + SERIES_STATUS_DATA_WITH_RELEASE_ID = series_status.SeriesStatus( + yamlutils.loads(textwrap.dedent(''' + - name: stein + release-id: 2019.1 + status: development + initial-release: 2019-04-11 + - name: rocky + release-id: 2018.2 + status: maintained + initial-release: 2018-08-30 + ''')) + ) + def setUp(self): super().setUp() @@ -124,7 +168,8 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=302, src='stein', ref_type='branch', dst='master')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_development_release(self): deliverables = FakeDeliverables([ @@ -132,7 +177,8 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=302, src='stein', ref_type='branch', dst='master')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_open_stable(self): deliverables = FakeDeliverables([ @@ -140,7 +186,8 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=301, src='rocky', ref_type='branch', dst='stable/rocky')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_open_unstable(self): deliverables = FakeDeliverables([ @@ -148,7 +195,8 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=301, src='rocky', ref_type='branch', dst='stable/rocky')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_stable_release(self): deliverables = FakeDeliverables([ @@ -156,7 +204,26 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=301, src='rocky', ref_type='branch', dst='stable/rocky')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) + + def test_release_id_master(self): + deliverables = FakeDeliverables([ + self.OPEN_DEVELOPMENT, + ]) + self.assertEqual([dict(code=302, src=2019.1, ref_type='branch', + dst='master')], + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA_WITH_RELEASE_ID)) + + def test_release_id_stable(self): + deliverables = FakeDeliverables([ + self.OPEN_STABLE_WITH_RELEASE_ID, + ]) + self.assertEqual([dict(code=301, src=2018.2, ref_type='branch', + dst='stable/2018.2')], + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA_WITH_RELEASE_ID)) def test_stable_eol(self): deliverables = FakeDeliverables([ @@ -164,7 +231,8 @@ class TestRedirections(base.BaseTestCase): ]) self.assertEqual([dict(code=301, src='mitaka', ref_type='tag', dst='mitaka-eol')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_all(self): deliverables = FakeDeliverables([ @@ -178,9 +246,11 @@ class TestRedirections(base.BaseTestCase): dst='stable/rocky'), dict(code=301, src='mitaka', ref_type='tag', dst='mitaka-eol')], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA)) def test_empty(self): deliverables = FakeDeliverables([]) self.assertEqual([], - generate_constraints_redirections(deliverables)) + generate_constraints_redirections( + deliverables, self.SERIES_STATUS_DATA))