From 5b5f88a791b2a34985b4069339064a01d5362d7e Mon Sep 17 00:00:00 2001 From: Anand Shanmugam Date: Wed, 28 Oct 2015 14:44:48 -0700 Subject: [PATCH] Code Changes for querying failed cases and tests run in last x hours Change-Id: I9f279581eae1bd7227e931ee672835c08a7ba7ad --- cloudpulse/api/controllers/v1/cpulse.py | 22 +++++++++++----------- cloudpulse/conductor/api.py | 6 ++++-- cloudpulse/db/api.py | 3 ++- cloudpulse/db/sqlalchemy/api.py | 17 +++++++++++++++-- cloudpulse/objects/cpulse.py | 13 ++++++------- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/cloudpulse/api/controllers/v1/cpulse.py b/cloudpulse/api/controllers/v1/cpulse.py index 49f3b73..8bbf212 100644 --- a/cloudpulse/api/controllers/v1/cpulse.py +++ b/cloudpulse/api/controllers/v1/cpulse.py @@ -128,10 +128,9 @@ class cpulseController(rest.RestController): _custom_actions = {'detail': ['GET']} - def _get_tests_collection(self, marker, limit, - sort_key, sort_dir, expand=False, - resource_url=None): - + def _get_tests_collection(self, marker, limit, sort_key, sort_dir, + expand=False, resource_url=None, failed=None, + period=None): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) @@ -142,7 +141,8 @@ class cpulseController(rest.RestController): tests = pecan.request.rpcapi.test_list(pecan.request.context, limit, marker_obj, sort_key=sort_key, - sort_dir=sort_dir) + sort_dir=sort_dir, + failed=failed, period=period) return CpulseCollection.convert_with_links(tests, limit, url=resource_url, @@ -150,10 +150,10 @@ class cpulseController(rest.RestController): sort_key=sort_key, sort_dir=sort_dir) - @wsme_pecan.wsexpose(CpulseCollection, types.uuid, - types.uuid, int, wtypes.text, wtypes.text) - def get_all(self, test_uuid=None, marker=None, limit=None, - sort_key='id', sort_dir='asc'): + @wsme_pecan.wsexpose(CpulseCollection, types.uuid, types.uuid, int, + wtypes.text, wtypes.text, wtypes.text, int) + def get_all(self, test_uuid=None, marker=None, limit=None, sort_key='id', + sort_dir='asc', failed=None, period=None): """Retrieve a list of tests. :param marker: pagination marker for large data sets. @@ -161,8 +161,8 @@ class cpulseController(rest.RestController): :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ - return self._get_tests_collection(marker, limit, sort_key, - sort_dir) + return self._get_tests_collection(marker, limit, sort_key, sort_dir, + failed=failed, period=period) @wsme_pecan.wsexpose(Cpulse, types.uuid_or_name) def get_one(self, test_ident): diff --git a/cloudpulse/conductor/api.py b/cloudpulse/conductor/api.py index af15936..b30f482 100644 --- a/cloudpulse/conductor/api.py +++ b/cloudpulse/conductor/api.py @@ -36,8 +36,10 @@ class API(rpc_service.API): test.create(cpulse_create_timeout) return test - def test_list(self, context, limit, marker, sort_key, sort_dir): - return objects.Cpulse.list(context, limit, marker, sort_key, sort_dir) + def test_list(self, context, limit, marker, sort_key, sort_dir, + failed=None, period=None): + return objects.Cpulse.list(context, limit, marker, sort_key, sort_dir, + failed=failed, period=period) def test_delete(self, context, uuid): # return self._call('cpulse_delete', uuid=uuid) diff --git a/cloudpulse/db/api.py b/cloudpulse/db/api.py index d4206d4..fe2cd4d 100644 --- a/cloudpulse/db/api.py +++ b/cloudpulse/db/api.py @@ -42,7 +42,8 @@ class Connection(object): @abc.abstractmethod def get_test_list(self, context, columns=None, filters=None, limit=None, - marker=None, sort_key=None, sort_dir=None): + marker=None, sort_key=None, sort_dir=None, + failed=None, period=None): """Get specific columns for matching tests. Return a list of the specified columns for all tess that match the diff --git a/cloudpulse/db/sqlalchemy/api.py b/cloudpulse/db/sqlalchemy/api.py index cba7618..3de41f4 100644 --- a/cloudpulse/db/sqlalchemy/api.py +++ b/cloudpulse/db/sqlalchemy/api.py @@ -22,6 +22,7 @@ from cloudpulse.db.sqlalchemy import models from cloudpulse.openstack.common._i18n import _ from cloudpulse.openstack.common import log from cloudpulse.scenario import base +from datetime import timedelta from oslo_config import cfg from oslo_db import exception as db_exc from oslo_db.sqlalchemy import session as db_session @@ -125,11 +126,23 @@ class Connection(api.Connection): return query + def _add_test_failed_filter(self, query, failed): + if failed and failed == 'True': + query = query.filter_by(state='failed') + return query + + def _add_test_period_filter(self, query, period): + if period: + query_time = timeutils.utcnow() - timedelta(minutes=period) + query = query.filter(models.cpulse.created_at >= query_time) + return query + def get_test_list(self, context, filters=None, limit=None, marker=None, - sort_key=None, sort_dir=None): - # query = model_query(models.cpulse) + sort_key=None, sort_dir=None, failed=None, period=None): query = model_query(models.cpulse) query = self._add_tests_filters(query, filters) + query = self._add_test_period_filter(query, period) + query = self._add_test_failed_filter(query, failed) return _paginate_query(models.cpulse, limit, marker, sort_key, sort_dir, query) diff --git a/cloudpulse/objects/cpulse.py b/cloudpulse/objects/cpulse.py index 87a64c8..a8cbf72 100644 --- a/cloudpulse/objects/cpulse.py +++ b/cloudpulse/objects/cpulse.py @@ -117,8 +117,8 @@ class Cpulse(base.CloudpulsePersistentObject, base.CloudpulseObject, return test @base.remotable_classmethod - def list(cls, context, limit=None, marker=None, - sort_key=None, sort_dir=None, filters=None): + def list(cls, context, limit=None, marker=None, sort_key=None, + sort_dir=None, filters=None, failed=None, period=None): """Return a list of Cpulse objects. :param context: Security context. @@ -129,11 +129,10 @@ class Cpulse(base.CloudpulsePersistentObject, base.CloudpulseObject, :returns: a list of :class:`Cpulse` object. """ - db = cls.dbapi.get_test_list(context, limit=limit, - marker=marker, - sort_key=sort_key, - sort_dir=sort_dir, - filters=filters) + db = cls.dbapi.get_test_list(context, limit=limit, marker=marker, + sort_key=sort_key, sort_dir=sort_dir, + filters=filters, failed=failed, + period=period) return Cpulse._from_db_object_list(db, cls, context) @base.remotable