@@ -23,6 +23,18 @@ def get_monthly_cost(config, aws_profile_name):
23
23
forecast = resp ['Budgets' ][0 ]['CalculatedSpend' ]['ForecastedSpend' ]['Amount' ]
24
24
return (float (cost ), float (forecast ))
25
25
26
+ def get_server_stats (config , aws_profile_name ):
27
+ # TODO Define AWSUsage() class to factor out the boilarplate.
28
+ session = boto3 .Session (profile_name = aws_profile_name )
29
+ client = session .client ("ec2" )
30
+ resp = client .describe_instances ()
31
+ nserver = 0
32
+ for resv in resp ["Reservations" ]:
33
+ for inst in resv ['Instances' ]:
34
+ if inst ['State' ]['Name' ] != 'terminated' :
35
+ nserver += 1
36
+ return nserver
37
+
26
38
def send_message (config , message ):
27
39
client = zulip .Client (site = config ['zulip' ]['site' ],
28
40
email = config ['zulip' ]['email' ],
@@ -35,16 +47,17 @@ def send_message(config, message):
35
47
'content' : message
36
48
})
37
49
38
- def format_message (config , cost , forecast ):
50
+ def format_message (config , cost , forecast , nserver ):
39
51
today = datetime .date .today ()
40
52
template = config ['zulip' ]['message' ]
41
53
return template .format (year = today .year , month = today .month , day = today .day ,
42
- cost = cost , forecast = forecast )
54
+ cost = cost , forecast = forecast , nserver = nserver )
43
55
44
56
def main (aws_profile_name = "default" , dryrun = False ):
45
57
config = load_config ()
46
58
cost , forecast = get_monthly_cost (config , aws_profile_name )
47
- message = format_message (config , cost , forecast )
59
+ nserver = get_server_stats (config , aws_profile_name )
60
+ message = format_message (config , cost , forecast , nserver )
48
61
if dryrun :
49
62
print (message )
50
63
else :
0 commit comments