diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..153d2f3 --- /dev/null +++ b/.gitreview @@ -0,0 +1,5 @@ +[gerrit] +host=review.openstack.org +port=29418 +project=stackforge/stacktach-winchester.git + diff --git a/winchester/db/interface.py b/winchester/db/interface.py index 59e2080..bfa028b 100644 --- a/winchester/db/interface.py +++ b/winchester/db/interface.py @@ -234,6 +234,34 @@ class DBInterface(object): return self.set_stream_state(stream, models.StreamState.retry_expire) return stream + @sessioned + def find_streams(self, stream_id=None, state=None, older_than=None, younger_than=None, + name=None, distinguishing_traits=None, + session=None, include_events=False): + q = session.query(models.Stream) + if stream_id is not None: + q = q.filter(models.Stream.id == stream_id) + if state is not None: + q = q.filter(models.Stream.state == int(state)) + if older_than is not None: + q = q.filter(models.Stream.first_event < older_than) + if younger_than is not None: + q = q.filter(models.Stream.last_event > younger_than) + if name is not None: + q = q.filter(models.Stream.name == name) + if distinguishing_traits is not None: + for name, val in distinguishing_traits.items(): + q = q.filter(models.Stream.distinguished_by.any(and_( + models.DistinguishingTrait.name == name, + models.DistinguishingTrait.value == val))) + stream_info = [] + for stream in q.all(): + info = stream.as_dict + if include_events: + info['events'] = self.get_stream_events(stream, session=session) + stream_info.append(info) + return stream_info + @sessioned def purge_stream(self, stream, session=None): if stream not in session: diff --git a/winchester/models.py b/winchester/models.py index 8feed8d..cf802ee 100644 --- a/winchester/models.py +++ b/winchester/models.py @@ -354,6 +354,19 @@ class Stream(ProxiedDictMixin, Base): def distinguished_by_dict(self): return dict(self._proxied) + @property + def as_dict(self): + return {'name': self.name, + 'id': self.id, + 'state': StreamState(self.state).name, + 'first_event': self.first_event, + 'last_event': self.last_event, + 'fire_timestamp': self.fire_timestamp, + 'expire_timestamp': self.expire_timestamp, + 'distinguishing_traits': self.distinguished_by_dict} + + + def __init__(self, name, first_event, last_event=None, expire_timestamp=None, fire_timestamp=None, state=None, state_serial_no=None): self.name = name