diff --git a/stacktach/stacky_server.py b/stacktach/stacky_server.py index 6178427..fd7dd78 100644 --- a/stacktach/stacky_server.py +++ b/stacktach/stacky_server.py @@ -69,6 +69,16 @@ def model_search(request, model, filters, return query +def _add_when_filters(request, filters): + when_max = request.GET.get('when_max') + if when_max: + filters['when__lte'] = decimal.Decimal(when_max) + + when_min = request.GET.get('when_min') + if when_min: + filters['when__gte'] = decimal.Decimal(when_min) + + def get_event_names(service='nova'): return _model_factory(service).values('event').distinct() @@ -168,13 +178,16 @@ def do_uuid(request, service='nova'): return error_response(400, 'Bad Request', msg) model = _model_factory(service) result = [] - param = {} - if service == 'nova' or service == 'generic': - param = {'instance': uuid} - if service == 'glance': - param = {'uuid': uuid} + filters = {} - related = model_search(request, model, param, + if service == 'nova' or service == 'generic': + filters = {'instance': uuid} + if service == 'glance': + filters = {'uuid': uuid} + + _add_when_filters(request, filters) + + related = model_search(request, model, filters, related=True, order_by='when') for event in related: when = dt.dt_from_decimal(event.when) @@ -266,6 +279,7 @@ def do_request(request): model = models.RawData.objects filters = {'request_id': request_id} + _add_when_filters(request, filters) events = model_search(request, model, filters, order_by='when') results = [["#", "?", "When", "Deployment", "Event", "Host", "State", "State'", "Task'"]] @@ -567,11 +581,12 @@ def search(request, service): field = request.GET.get('field') value = request.GET.get('value') model = _model_factory(service) - filter_para = {field: value} + filters = {field: value} + _add_when_filters(request, filters) results = [] try: - events = model_search(request, model, filter_para) + events = model_search(request, model, filters) for event in events: when = dt.dt_from_decimal(event.when) routing_key_status = routing_key_type(event.routing_key) diff --git a/tests/unit/test_stacky_server.py b/tests/unit/test_stacky_server.py index 85d5c5f..27e1bc9 100644 --- a/tests/unit/test_stacky_server.py +++ b/tests/unit/test_stacky_server.py @@ -303,6 +303,41 @@ class StackyServerTestCase(unittest.TestCase): self.assertEqual(json_resp[1], body) self.mox.VerifyAll() + def test_do_uuid_when_filters(self): + search_result = [["#", "?", "When", "Deployment", "Event", "Host", + "State", "State'", "Task'"], [1, " ", + "2013-07-17 10:16:10.717219", "deployment", + "test.start", "example.com", "active", None, None]] + fake_request = self.mox.CreateMockAnything() + fake_request.GET = {'uuid': INSTANCE_ID_1, + 'when_min': '1.1', + 'when_max': '2.1'} + result = self.mox.CreateMockAnything() + models.RawData.objects.select_related().AndReturn(result) + result.filter(instance=INSTANCE_ID_1, + when__gte=decimal.Decimal('1.1'), + when__lte=decimal.Decimal('2.1')).AndReturn(result) + result.order_by('when').AndReturn(result) + raw = self._create_raw() + result[None:50].AndReturn(result) + result.__iter__().AndReturn([raw].__iter__()) + raw.search_results([], mox.IgnoreArg(), ' ').AndReturn(search_result) + self.mox.ReplayAll() + + resp = stacky_server.do_uuid(fake_request) + + self.assertEqual(resp.status_code, 200) + json_resp = json.loads(resp.content) + self.assertEqual(len(json_resp), 2) + header = ["#", "?", "When", "Deployment", "Event", "Host", + "State", "State'", "Task'"] + self.assertEqual(json_resp[0], header) + datetime = dt.dt_from_decimal(raw.when) + body = [1, " ", str(datetime), "deployment", "test.start", + "example.com", "active", None, None] + self.assertEqual(json_resp[1], body) + self.mox.VerifyAll() + def test_do_uuid_for_glance(self): search_result = [["#", "?", "When", "Deployment", "Event", "Host", "Status"], [1, " ", @@ -334,6 +369,41 @@ class StackyServerTestCase(unittest.TestCase): self.assertEqual(json_resp[1], body) self.mox.VerifyAll() + def test_do_uuid_for_glance_when_filters(self): + search_result = [["#", "?", "When", "Deployment", "Event", "Host", + "Status"], [1, " ", + "2013-07-17 10:16:10.717219", "deployment", + "test.start", "example.com", "state"]] + fake_request = self.mox.CreateMockAnything() + fake_request.GET = {'uuid': INSTANCE_ID_1, + 'when_min': '1.1', + 'when_max': '2.1'} + result = self.mox.CreateMockAnything() + models.GlanceRawData.objects.select_related().AndReturn(result) + result.filter(uuid=INSTANCE_ID_1, + when__gte=decimal.Decimal('1.1'), + when__lte=decimal.Decimal('2.1')).AndReturn(result) + result.order_by('when').AndReturn(result) + raw = self._create_raw() + result[None:50].AndReturn(result) + result.__iter__().AndReturn([raw].__iter__()) + raw.search_results([], mox.IgnoreArg(), ' ').AndReturn(search_result) + self.mox.ReplayAll() + + resp = stacky_server.do_uuid(fake_request,'glance') + + self.assertEqual(resp.status_code, 200) + json_resp = json.loads(resp.content) + self.assertEqual(len(json_resp), 2) + header = ["#", "?", "When", "Deployment", "Event", "Host", + "Status"] + self.assertEqual(json_resp[0], header) + datetime = dt.dt_from_decimal(raw.when) + body = [1, " ", str(datetime), "deployment", "test.start", + "example.com", "state"] + self.assertEqual(json_resp[1], body) + self.mox.VerifyAll() + def test_do_uuid_bad_uuid(self): fake_request = self.mox.CreateMockAnything() fake_request.GET = {'uuid': "obviouslybaduuid"} @@ -557,6 +627,42 @@ class StackyServerTestCase(unittest.TestCase): self.assertEqual(json_resp[1][8], None) self.mox.VerifyAll() + def test_do_request_when_filters(self): + fake_request = self.mox.CreateMockAnything() + fake_request.GET = {'request_id': REQUEST_ID_1, + 'when_min': '1.1', + 'when_max': '2.1'} + raw = self._create_raw() + results = self.mox.CreateMockAnything() + when_min = decimal.Decimal('1.1') + when_max = decimal.Decimal('2.1') + models.RawData.objects.filter(request_id=REQUEST_ID_1, + when__gte=when_min, + when__lte=when_max).AndReturn(results) + results.order_by('when').AndReturn(results) + results[None:50].AndReturn(results) + results.__iter__().AndReturn([raw].__iter__()) + self.mox.ReplayAll() + + resp = stacky_server.do_request(fake_request) + + self.assertEqual(resp.status_code, 200) + json_resp = json.loads(resp.content) + self.assertEqual(len(json_resp), 2) + self.assertEqual(json_resp[0], ["#", "?", "When", "Deployment", + "Event", "Host", "State", "State'", + "Task'"]) + self.assertEqual(json_resp[1][0], 1) + self.assertEqual(json_resp[1][1], u' ') + self.assertEqual(json_resp[1][2], str(dt.dt_from_decimal(raw.when))) + self.assertEqual(json_resp[1][3], u'deployment') + self.assertEqual(json_resp[1][4], u'test.start') + self.assertEqual(json_resp[1][5], u'example.com') + self.assertEqual(json_resp[1][6], u'active') + self.assertEqual(json_resp[1][7], None) + self.assertEqual(json_resp[1][8], None) + self.mox.VerifyAll() + def test_do_request_bad_request_id(self): fake_request = self.mox.CreateMockAnything() fake_request.GET = {'request_id': "obviouslybaduuid"} @@ -1177,6 +1283,29 @@ class StackyServerTestCase(unittest.TestCase): self._assert_on_search_nova(json_resp, raw) self.mox.VerifyAll() + def test_search_by_field_for_nova_when_filters(self): + search_result = [["#", "?", "When", "Deployment", "Event", "Host", + "State", "State'", "Task'"], [1, " ", + "2013-07-17 10:16:10.717219", "deployment", + "test.start", "example.com", "active", None, None]] + fake_request = self.mox.CreateMockAnything() + fake_request.GET = {'field': 'tenant', 'value': 'tenant', + 'when_min': '1.1', + 'when_max': '2.1'} + raw = self._create_raw() + models.RawData.objects.filter(tenant='tenant', + when__gte=decimal.Decimal('1.1'), + when__lte=decimal.Decimal('2.1')).AndReturn([raw]) + raw.search_results([], mox.IgnoreArg(), ' ').AndReturn(search_result) + self.mox.ReplayAll() + + resp = stacky_server.search(fake_request, 'nova') + + self.assertEqual(resp.status_code, 200) + json_resp = json.loads(resp.content) + self._assert_on_search_nova(json_resp, raw) + self.mox.VerifyAll() + def test_search_by_field_for_nova_with_limit(self): search_result = [["#", "?", "When", "Deployment", "Event", "Host", "State", "State'", "Task'"], [1, " ",