-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreservation_gap.py
66 lines (46 loc) · 1.94 KB
/
reservation_gap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from collections import Counter
from boto.ec2 import connect_to_region
REGION = 'us-east-1'
COUNTER_KEY_FMT = '{availability_zone},{instance_type}'
ec2 = connect_to_region(REGION)
running_instance_counter = Counter()
current_reservations_counter = Counter()
def get_instances(ec2):
reservations = ec2.get_all_instances(filters={
'instance-state-name': 'running',
})
instances = []
for reservation in reservations:
instances.extend(reservation.instances)
return instances
instances = get_instances(ec2)
for instance in instances:
counter_key = COUNTER_KEY_FMT.format(
availability_zone=instance.placement,
instance_type=instance.instance_type,
)
running_instance_counter[counter_key] += 1
for reservation in ec2.get_all_reserved_instances(filters={'state': 'active'}):
counter_key = COUNTER_KEY_FMT.format(
availability_zone=reservation.availability_zone,
instance_type=reservation.instance_type,
)
current_reservations_counter[counter_key] += reservation.instance_count
running_non_reserved_instances = (
running_instance_counter - current_reservations_counter
)
reservations_not_in_use = (
current_reservations_counter - running_instance_counter
)
print 'Reservation Gaps'
print 'availability_zone, instance_type, count'
for counter_key, count in sorted(running_non_reserved_instances.items(), key=lambda x: x[1], reverse=True):
availability_zone, instance_type = counter_key.split(',')
print ','.join([availability_zone, instance_type, str(count)])
print '-------------------------------------------'
print 'Unused Reservations'
print 'availability_zone, instance_type, count'
for counter_key, count in sorted(reservations_not_in_use.items(), key=lambda x: x[1], reverse=True):
availability_zone, instance_type = counter_key.split(',')
print ','.join([availability_zone, instance_type, str(count)])
print '-------------------------------------------'