From 8d9eb1da5dc333d7a93d68857aa72dbdf120ac98 Mon Sep 17 00:00:00 2001 From: Masayuki Igawa Date: Tue, 31 May 2016 17:53:57 +0900 Subject: [PATCH] Fix RSS feed unavailable when no failure This commit fixes RSS feed unavailable error to return zero length entry list when there is specified run_metadata_key and value with no failure. Closes-Bug: #1573630 Change-Id: I48659140314a2d8737611dd0a86097f10c1f3ac8 --- openstack_health/api.py | 9 ++++++--- openstack_health/tests/test_api.py | 30 ++++++++++++++++++++++++++++++ requirements.txt | 2 +- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/openstack_health/api.py b/openstack_health/api.py index 79bbbe98..401d8588 100644 --- a/openstack_health/api.py +++ b/openstack_health/api.py @@ -457,9 +457,12 @@ def get_recent_failed_runs_rss(run_metadata_key, value): return feeds[run_metadata_key][value].rss_str() feeds["last runs"][run_metadata_key][value] = last_run else: - msg = 'No Failed Runs for run metadata %s: %s' % ( - run_metadata_key, value) - return abort(make_response(msg, 400)) + count = api.get_runs_counts_by_run_metadata( + run_metadata_key, value, session=session) + if count == 0: + msg = 'No Failed Runs for run metadata %s: %s' % ( + run_metadata_key, value) + return abort(make_response(msg, 400)) for run in failed_runs: meta = api.get_run_metadata(run.uuid, session=session) uuid = [x.value for x in meta if x.key == 'build_uuid'][0] diff --git a/openstack_health/tests/test_api.py b/openstack_health/tests/test_api.py index 7bc6aedc..0b09e39c 100644 --- a/openstack_health/tests/test_api.py +++ b/openstack_health/tests/test_api.py @@ -1029,3 +1029,33 @@ class TestRestAPI(base.TestCase): self.assertEqual(timestamp_b, date_parser.parse(out.entries[0].published).replace( tzinfo=None)) + + @mock.patch('subunit2sql.db.api.get_recent_failed_runs_by_run_metadata', + return_value=[]) + @mock.patch('subunit2sql.db.api.get_runs_counts_by_run_metadata', + return_value=1) + def test_get_recent_failed_runs_rss_no_failure_valid_meta(self, count_mock, + db_mock): + api.rss_opts['data_dir'] = tempfile.gettempdir() + api.rss_opts['frontend_url'] = 'http://status.openstack.org' + build_uuid = str(uuid.uuid4()) + meta_mock = mock.patch( + 'subunit2sql.db.api.get_run_metadata', + return_value=[ + models.RunMetadata(key='build_name', value='job'), + models.RunMetadata(key='build_uuid', value=build_uuid)]) + meta_mock.start() + self.addCleanup(meta_mock.stop) + res = self.app.get('/runs/key/b_key/b_value/recent/rss') + self.assertEqual(200, res.status_code) + db_mock.assert_called_once_with('b_key', 'b_value', + start_date=None, session=api.Session()) + count_mock.assert_called_once_with('b_key', 'b_value', + session=api.Session()) + db_mock.reset_mock() + count_mock.reset_mock() + out = feedparser.parse(res.data.decode('utf-8')) + title = 'Failures for %s: %s' % ('b_key', 'b_value') + self.assertEqual(title, out['feed']['title']) + self.assertEqual('en', out['feed']['language']) + self.assertEqual(0, len(out.entries)) diff --git a/requirements.txt b/requirements.txt index cd869238..667862f6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ pbr>=1.6 # Apache-2.0 Flask<1.0,>=0.11 # BSD pymemcache >= 1.3.5 # Apache-2.0 dogpile.cache>=0.6.0 # BSD -subunit2sql>=1.6.0 # Apache-2.0 +subunit2sql>=1.7.0 # Apache-2.0 SQLAlchemy<1.1.0,>=1.0.10 # MIT flask-jsonpify>=1.5.0 # MIT PyMySQL>=0.6.2 # MIT License