From 559f35af4bc1b4b65f7200e0c9df96349acf3fe4 Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Tue, 4 Jun 2013 11:40:47 -0400 Subject: [PATCH 1/3] Terminated_at instead of deleted_at. --- util/usage_seed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/usage_seed.py b/util/usage_seed.py index eaa7971..81b3ed9 100644 --- a/util/usage_seed.py +++ b/util/usage_seed.py @@ -106,7 +106,7 @@ def _usage_for_instance(instance, task=None): def _delete_for_instance(instance): delete = { 'instance': instance['uuid'], - 'deleted_at': dt.dt_to_decimal(instance.get('deleted_at')), + 'deleted_at': dt.dt_to_decimal(instance.get('terminated_at')), } launched_at = instance.get('launched_at') From 5da3a740af25f7cb4f7101013464bed8d5c51bc1 Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Tue, 4 Jun 2013 11:52:09 -0400 Subject: [PATCH 2/3] Accept POST on usage confirm dbapi call. --- stacktach/dbapi.py | 2 +- tests/unit/test_dbapi.py | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/stacktach/dbapi.py b/stacktach/dbapi.py index 85734d5..1a548ea 100644 --- a/stacktach/dbapi.py +++ b/stacktach/dbapi.py @@ -148,7 +148,7 @@ def get_usage_exist(request, exist_id): @api_call def exists_send_status(request, message_id): - if request.method != 'PUT': + if request.method not in ['PUT', 'POST']: raise BadRequestException(message="Invalid method") if request.body is None or request.body == '': diff --git a/tests/unit/test_dbapi.py b/tests/unit/test_dbapi.py index 8af5d01..fdc9c44 100644 --- a/tests/unit/test_dbapi.py +++ b/tests/unit/test_dbapi.py @@ -404,6 +404,24 @@ class DBAPITestCase(unittest.TestCase): self.assertEqual(exists.send_status, 200) self.mox.VerifyAll() + def test_send_status_accepts_post(self): + fake_request = self.mox.CreateMockAnything() + fake_request.method = 'POST' + body_dict = {'send_status': 200} + body = json.dumps(body_dict) + fake_request.body = body + exists = self.mox.CreateMockAnything() + result = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(result) + result.get(message_id=MESSAGE_ID_1).AndReturn(exists) + exists.save() + self.mox.ReplayAll() + + dbapi.exists_send_status(fake_request, MESSAGE_ID_1) + + self.assertEqual(exists.send_status, 200) + self.mox.VerifyAll() + def test_send_status_not_found(self): fake_request = self.mox.CreateMockAnything() fake_request.method = 'PUT' @@ -517,6 +535,33 @@ class DBAPITestCase(unittest.TestCase): trans_obj.__exit__(None, None, None) self.mox.ReplayAll() + def test_send_status_batch_accepts_post(self): + fake_request = self.mox.CreateMockAnything() + fake_request.method = 'POST' + messages = { + MESSAGE_ID_1: 200, + MESSAGE_ID_2: 400 + } + body_dict = {'messages': messages} + body = json.dumps(body_dict) + fake_request.body = body + self.mox.StubOutWithMock(transaction, 'commit_on_success') + trans_obj = self.mox.CreateMockAnything() + transaction.commit_on_success().AndReturn(trans_obj) + trans_obj.__enter__() + results1 = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(results1) + exists1 = self.mox.CreateMockAnything() + results1.get(message_id=MESSAGE_ID_2).AndReturn(exists1) + exists1.save() + results2 = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(results2) + exists2 = self.mox.CreateMockAnything() + results2.get(message_id=MESSAGE_ID_1).AndReturn(exists2) + exists2.save() + trans_obj.__exit__(None, None, None) + self.mox.ReplayAll() + resp = dbapi.exists_send_status(fake_request, 'batch') self.assertEqual(resp.status_code, 200) exists1.send_status = 200 From 173e96ada83d780732ec9f6cd5883f8f4481aa65 Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Tue, 4 Jun 2013 12:05:02 -0400 Subject: [PATCH 3/3] Only seed from active computes. Active computes are non-deleted compute services which have checked in today. --- util/usage_seed.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/util/usage_seed.py b/util/usage_seed.py index 81b3ed9..e80ebd6 100644 --- a/util/usage_seed.py +++ b/util/usage_seed.py @@ -121,15 +121,18 @@ def get_active_instances(period_length): session = api.get_session() computes = novadb.service_get_all_by_topic(context, 'compute') active_instances = [] + yesterday = datetime.datetime.utcnow() - datetime.timedelta(days=1) for compute in computes: - query = session.query(novamodels.Instance) + if compute.updated_at > yesterday: + query = session.query(novamodels.Instance) - query = query.filter(api.or_(novamodels.Instance.terminated_at == None, - novamodels.Instance.terminated_at > start)) - query = query.filter_by(host=compute.host) + active_filter = api.or_(novamodels.Instance.terminated_at == None, + novamodels.Instance.terminated_at > start) + query = query.filter(active_filter) + query = query.filter_by(host=compute.host) - for instance in query.all(): - active_instances.append(instance) + for instance in query.all(): + active_instances.append(instance) return active_instances