From 05b4cb38dd3d46434ab4eda447720d969f628aa3 Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Fri, 1 Feb 2013 11:07:13 -0500 Subject: [PATCH] Finishing unordered-deletes, modifying db queries for low resolution timestamps from Nova --- stacktach/db.py | 30 +++++++++++++++++++++++++++++- stacktach/models.py | 3 +-- stacktach/views.py | 13 +++++++++---- tests/unit/test_stacktach.py | 14 ++++++++++++-- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/stacktach/db.py b/stacktach/db.py index f548b9d..a55b4df 100644 --- a/stacktach/db.py +++ b/stacktach/db.py @@ -1,43 +1,71 @@ import models + def get_or_create_deployment(name): return models.Deployment.objects.get_or_create(name=name) + def create_rawdata(**kwargs): return models.RawData(**kwargs) + def create_lifecycle(**kwargs): return models.Lifecycle(**kwargs) + def find_lifecycles(**kwargs): return models.Lifecycle.objects.select_related().filter(**kwargs) + def create_timing(**kwargs): return models.Timing(**kwargs) + def find_timings(**kwargs): return models.Timing.objects.select_related().filter(**kwargs) + def create_request_tracker(**kwargs): return models.RequestTracker(**kwargs) + def find_request_trackers(**kwargs): return models.RequestTracker.objects.filter(**kwargs) + def create_instance_usage(**kwargs): return models.InstanceUsage(**kwargs) + def get_or_create_instance_usage(**kwargs): return models.InstanceUsage.objects.get_or_create(**kwargs) + def get_instance_usage(**kwargs): - return models.InstanceUsage.objects.get(**kwargs) + usage = None + try: + usage = models.InstanceUsage.objects.get(**kwargs) + except models.InstanceUsage.DoesNotExist: + pass + return usage + def create_instance_delete(**kwargs): return models.InstanceDeletes(**kwargs) + +def get_instance_delete(**kwargs): + delete = None + try: + delete = models.InstanceDeletes.objects.get(**kwargs) + except models.InstanceDeletes.DoesNotExist: + pass + return delete + + def create_instance_exists(**kwargs): return models.InstanceExists(**kwargs) + def save(obj): obj.save() \ No newline at end of file diff --git a/stacktach/models.py b/stacktach/models.py index 11d56f0..e51efb5 100644 --- a/stacktach/models.py +++ b/stacktach/models.py @@ -103,10 +103,8 @@ class InstanceExists(models.Model): ] instance = models.CharField(max_length=50, null=True, blank=True, db_index=True) - #launched_at = models.IntegerField(null=True, db_index=True) launched_at = models.DecimalField(null=True, max_digits=20, decimal_places=6) - #deleted_at = models.IntegerField(null=True, db_index=True) deleted_at = models.DecimalField(null=True, max_digits=20, decimal_places=6) message_id = models.CharField(max_length=50, null=True, @@ -120,6 +118,7 @@ class InstanceExists(models.Model): default=PENDING) raw = models.ForeignKey(RawData, related_name='+', null=True) usage = models.ForeignKey(InstanceUsage, related_name='+', null=True) + delete = models.ForeignKey(InstanceDeletes, related_name='+', null=True) class Timing(models.Model): diff --git a/stacktach/views.py b/stacktach/views.py index eb67e38..6ef6571 100644 --- a/stacktach/views.py +++ b/stacktach/views.py @@ -270,16 +270,21 @@ def _process_exists(raw): notif = json.loads(raw.json) payload = notif[1]['payload'] instance_id = payload['instance_id'] - launched_at = payload['launched_at'] - launched_at = str_time_to_unix(launched_at) + launched_at = str_time_to_unix(payload['launched_at']) + launched_range = (launched_at, launched_at+1) usage = STACKDB.get_instance_usage(instance=instance_id, - launched_at=launched_at) + launched_at__range=launched_range) + delete = STACKDB.get_instance_delete(instance=instance_id, + launched_at__range=launched_range) values = {} values['message_id'] = notif[1]['message_id'] values['instance'] = instance_id values['launched_at'] = launched_at values['instance_type_id'] = payload['instance_type_id'] - values['usage'] = usage + if usage: + values['usage'] = usage + if delete: + values['delete'] = delete values['raw'] = raw deleted_at = payload.get('deleted_at') diff --git a/tests/unit/test_stacktach.py b/tests/unit/test_stacktach.py index 9fa9e52..34293ab 100644 --- a/tests/unit/test_stacktach.py +++ b/tests/unit/test_stacktach.py @@ -537,9 +537,13 @@ class StacktackUsageParsingTestCase(unittest.TestCase): raw = utils.create_raw(self.mox, current_decimal, event=event, json_str=json_str) usage = self.mox.CreateMockAnything() + launched_range = (launch_decimal, launch_decimal+1) views.STACKDB.get_instance_usage(instance=INSTANCE_ID_1, - launched_at=launch_decimal)\ + launched_at__range=launched_range)\ .AndReturn(usage) + views.STACKDB.get_instance_delete(instance=INSTANCE_ID_1, + launched_at__range=launched_range)\ + .AndReturn(None) exists_values = { 'message_id': MESSAGE_ID_1, 'instance': INSTANCE_ID_1, @@ -569,9 +573,14 @@ class StacktackUsageParsingTestCase(unittest.TestCase): raw = utils.create_raw(self.mox, current_decimal, event=event, json_str=json_str) usage = self.mox.CreateMockAnything() + launched_range = (launch_decimal, launch_decimal+1) views.STACKDB.get_instance_usage(instance=INSTANCE_ID_1, - launched_at=launch_decimal)\ + launched_at__range=launched_range)\ .AndReturn(usage) + delete = self.mox.CreateMockAnything() + views.STACKDB.get_instance_delete(instance=INSTANCE_ID_1, + launched_at__range=launched_range)\ + .AndReturn(delete) exists_values = { 'message_id': MESSAGE_ID_1, 'instance': INSTANCE_ID_1, @@ -579,6 +588,7 @@ class StacktackUsageParsingTestCase(unittest.TestCase): 'deleted_at': deleted_decimal, 'instance_type_id': '1', 'usage': usage, + 'delete': delete, 'raw': raw, } exists = self.mox.CreateMockAnything()