Allowing for delete events before launches

This commit is contained in:
Andrew Melton
2013-01-31 13:46:04 -05:00
parent f8b939fbcd
commit 57c696d627
5 changed files with 45 additions and 37 deletions

View File

@@ -33,6 +33,9 @@ def get_or_create_instance_usage(**kwargs):
def get_instance_usage(**kwargs): def get_instance_usage(**kwargs):
return models.InstanceUsage.objects.get(**kwargs) return models.InstanceUsage.objects.get(**kwargs)
def create_instance_delete(**kwargs):
return models.InstanceDeletes(**kwargs)
def create_instance_exists(**kwargs): def create_instance_exists(**kwargs):
return models.InstanceExists(**kwargs) return models.InstanceExists(**kwargs)

View File

@@ -72,18 +72,26 @@ class Lifecycle(models.Model):
class InstanceUsage(models.Model): class InstanceUsage(models.Model):
instance = models.CharField(max_length=50, null=True, instance = models.CharField(max_length=50, null=True,
blank=True, db_index=True) blank=True, db_index=True)
#launched_at = models.IntegerField(null=True, db_index=True)
launched_at = models.DecimalField(null=True, max_digits=20, launched_at = models.DecimalField(null=True, max_digits=20,
decimal_places=6) decimal_places=6)
#deleted_at = models.IntegerField(null=True, db_index=True)
deleted_at = models.DecimalField(null=True, max_digits=20,
decimal_places=6)
request_id = models.CharField(max_length=50, null=True, request_id = models.CharField(max_length=50, null=True,
blank=True, db_index=True) blank=True, db_index=True)
instance_type_id = models.CharField(max_length=50, instance_type_id = models.CharField(max_length=50,
null=True, null=True,
blank=True, blank=True,
db_index=True) db_index=True)
class InstanceDeletes(models.Model):
instance = models.CharField(max_length=50, null=True,
blank=True, db_index=True)
launched_at = models.DecimalField(null=True, max_digits=20,
decimal_places=6)
deleted_at = models.DecimalField(null=True, max_digits=20,
decimal_places=6)
raw = models.ForeignKey(RawData, null=True)
class InstanceExists(models.Model): class InstanceExists(models.Model):
PENDING = 'pending' PENDING = 'pending'
VERIFIED = 'verified' VERIFIED = 'verified'

View File

@@ -492,14 +492,6 @@ class ViewsUsageTestCase(unittest.TestCase):
def test_process_delete(self): def test_process_delete(self):
launched_str = '2012-12-21 06:34:50.123' launched_str = '2012-12-21 06:34:50.123'
launched = views.str_time_to_unix(launched_str) launched = views.str_time_to_unix(launched_str)
values = {
'instance': INSTANCE_ID_1,
'request_id': REQUEST_ID_1,
'instance_type_id': '1',
'launched_at': launched,
}
InstanceUsage(**values).save()
deleted_str = '2012-12-21 12:34:50.123' deleted_str = '2012-12-21 12:34:50.123'
deleted = views.str_time_to_unix(deleted_str) deleted = views.str_time_to_unix(deleted_str)
json = test_utils.make_delete_end_json(launched_str, deleted_str) json = test_utils.make_delete_end_json(launched_str, deleted_str)
@@ -508,10 +500,13 @@ class ViewsUsageTestCase(unittest.TestCase):
views._process_delete(raw) views._process_delete(raw)
usages = InstanceUsage.objects.all() delete = InstanceDeletes.objects.all()
self.assertEqual(len(usages), 1) self.assertEqual(len(delete), 1)
usage = usages[0] delete = delete[0]
self.assertEqual(usage.deleted_at, deleted) self.assertEqual(delete.instance, INSTANCE_ID_1)
self.assertEqual(delete.launched_at, launched)
self.assertEqual(delete.deleted_at, deleted)
self.assertEqual(delete.raw.id, raw.id)
def test_process_exists(self): def test_process_exists(self):
launched_str = '2012-12-21 06:34:50.123' launched_str = '2012-12-21 06:34:50.123'
@@ -556,7 +551,6 @@ class ViewsUsageTestCase(unittest.TestCase):
'request_id': REQUEST_ID_1, 'request_id': REQUEST_ID_1,
'instance_type_id': '1', 'instance_type_id': '1',
'launched_at': launched, 'launched_at': launched,
'deleted_at': deleted,
} }
InstanceUsage(**values).save() InstanceUsage(**values).save()

View File

@@ -254,12 +254,16 @@ def _process_delete(raw):
notif = json.loads(raw.json) notif = json.loads(raw.json)
payload = notif[1]['payload'] payload = notif[1]['payload']
instance_id = payload['instance_id'] instance_id = payload['instance_id']
launched_at = payload['launched_at'] launched_at = str_time_to_unix(payload['launched_at'])
launched_at = str_time_to_unix(launched_at) deleted_at = str_time_to_unix(payload['deleted_at'])
instance = STACKDB.get_instance_usage(instance=instance_id, values = {
launched_at=launched_at) 'instance': instance_id,
instance.deleted_at = str_time_to_unix(payload['deleted_at']) 'launched_at': launched_at,
STACKDB.save(instance) 'deleted_at': deleted_at,
'raw': raw
}
delete = STACKDB.create_instance_delete(**values)
STACKDB.save(delete)
def _process_exists(raw): def _process_exists(raw):

View File

@@ -508,23 +508,22 @@ class StacktackUsageParsingTestCase(unittest.TestCase):
event = 'compute.instance.delete.end' event = 'compute.instance.delete.end'
raw = utils.create_raw(self.mox, delete_decimal, event=event, raw = utils.create_raw(self.mox, delete_decimal, event=event,
json_str=json_str) json_str=json_str)
usage = self.mox.CreateMockAnything() delete = self.mox.CreateMockAnything()
usage.instance = INSTANCE_ID_1 delete.instance = INSTANCE_ID_1
usage.request_id = REQUEST_ID_1 delete.launched_at = launch_decimal
usage.instance_type_id = '1' delete.deleted_at = delete_decimal
usage.launched_at = launch_decimal views.STACKDB.create_instance_delete(instance=INSTANCE_ID_1,
views.STACKDB.get_instance_usage(instance=INSTANCE_ID_1, launched_at=launch_decimal,
launched_at=launch_decimal)\ deleted_at=delete_decimal,
.AndReturn(usage) raw=raw)\
views.STACKDB.save(usage) .AndReturn(delete)
views.STACKDB.save(delete)
self.mox.ReplayAll() self.mox.ReplayAll()
views._process_delete(raw) views._process_delete(raw)
self.assertEqual(usage.instance, INSTANCE_ID_1) self.assertEqual(delete.instance, INSTANCE_ID_1)
self.assertEqual(usage.request_id, REQUEST_ID_1) self.assertEqual(delete.launched_at, launch_decimal)
self.assertEqual(usage.instance_type_id, '1') self.assertEqual(delete.deleted_at, delete_decimal)
self.assertEqual(usage.launched_at, launch_decimal)
self.assertEqual(usage.deleted_at, delete_decimal)
self.mox.VerifyAll() self.mox.VerifyAll()
def test_process_exists(self): def test_process_exists(self):