+import sys
+import os
+import re
+import datetime
+import random
+import logging as log
+from random import randint
+from operator import itemgetter
+from connection import Connection
+
+try:
+ import boto
+ import boto.ec2
+ import boto.vpc
+ import boto.ec2.cloudwatch
+ import boto.ec2.connection
+except:
+ exit("Boto not avialable. Try activating your virtualenv OR `pip install boto`")
+
+
+class MetricAlarm():
+ """Alarms Functionality Handler -- Cloudwatch """
+
+ def config_alarm(self,cloudwatch_conn,alarm_info):
+ """Configure or Create a new alarm"""
+
+ """ Alarm Name to ID Mapping """
+ alarm_id = alarm_info['alarm_name'] + "_" + alarm_info['resource_id']
+ if self.is_present(cloudwatch_conn,alarm_id) == True:
+ alarm_id = None
+ log.debug ("Alarm already exists, Try updating the alarm using 'update_alarm_configuration()'")
+ else:
+ try:
+ alarm = boto.ec2.cloudwatch.alarm.MetricAlarm(
+ connection = cloudwatch_conn,
+ name = alarm_info['alarm_name'] + "_" + alarm_info['resource_id'],
+ metric = alarm_info['alarm_metric'],
+ namespace = alarm_info['instance_type'],
+ statistic = alarm_info['alarm_statistics'],
+ comparison = alarm_info['alarm_comparison'],
+ threshold = alarm_info['alarm_threshold'],
+ period = alarm_info['alarm_period'],
+ evaluation_periods = alarm_info['alarm_evaluation_period'],
+ unit=alarm_info['alarm_unit'],
+ description = alarm_info['alarm_severity'] + ";" + alarm_info['alarm_description'],
+ dimensions = {'InstanceId':alarm_info['resource_id']},
+ alarm_actions = None,
+ ok_actions = None,
+ insufficient_data_actions = None)
+
+ """Setting Alarm Actions :
+ alarm_actions = ['arn:aws:swf:us-west-2:465479087178:action/actions/AWS_EC2.InstanceId.Stop/1.0']"""
+
+ cloudwatch_conn.put_metric_alarm(alarm)
+ log.debug ("Alarm Configured Succesfully")
+ print "created"
+ print "\n"
+ except Exception as e:
+ log.error("Alarm Configuration Failed: " + str(e))
+ return alarm_id
+#-----------------------------------------------------------------------------------------------------------------------------
+ def update_alarm(self,cloudwatch_conn,alarm_info):
+
+ """Update or reconfigure an alarm"""
+
+ """Alarm Name to ID Mapping"""
+ alarm_id = alarm_info['alarm_name'] + "_" + alarm_info['resource_id']
+
+ """Verifying : Alarm exists already"""
+ if self.is_present(cloudwatch_conn,alarm_id) == False:
+ alarm_id = None
+ log.debug("Alarm not found, Try creating the alarm using 'configure_alarm()'")
+ else:
+ try:
+ alarm = boto.ec2.cloudwatch.alarm.MetricAlarm(
+ connection = cloudwatch_conn,
+ name = alarm_info['alarm_name'] + "_" + alarm_info['resource_id'],
+ metric = alarm_info['alarm_metric'],
+ namespace = alarm_info['instance_type'],
+ statistic = alarm_info['alarm_statistics'],
+ comparison = alarm_info['alarm_comparison'],
+ threshold = alarm_info['alarm_threshold'],
+ period = alarm_info['alarm_period'],
+ evaluation_periods = alarm_info['alarm_evaluation_period'],
+ unit=alarm_info['alarm_unit'],
+ description = alarm_info['alarm_severity'] + ";" + alarm_info['alarm_description'],
+ dimensions = {'InstanceId':alarm_info['resource_id']},
+ alarm_actions = None,
+ ok_actions = None,
+ insufficient_data_actions = None)
+ cloudwatch_conn.put_metric_alarm(alarm)
+ log.debug("Alarm %s Updated ",alarm.name)
+ print "updated"
+ except Exception as e:
+ log.error ("Error in Updating Alarm " + str(e))
+ return alarm_id
+#-----------------------------------------------------------------------------------------------------------------------------
+ def delete_Alarm(self,cloudwatch_conn,alarm_id):
+ """Deletes an Alarm with specified alarm_id"""
+ try:
+ if self.is_present(cloudwatch_conn,alarm_id) == True:
+ deleted_alarm=cloudwatch_conn.delete_alarms(alarm_id)
+ return alarm_id
+ return None
+ except Exception as e:
+ log.error("Alarm Not Deleted: " + str(e))
+#-----------------------------------------------------------------------------------------------------------------------------
+ def alarms_list(self,cloudwatch_conn,instance_id):
+
+ """Get a list of alarms that are present on a particular VM instance"""
+ try:
+ log.debug("Getting Alarm list for %s",instance_id)
+ alarm_dict = dict()
+ alarm_list = []
+ alarms = cloudwatch_conn.describe_alarms()
+ itr = 0
+ for alarm in alarms:
+ if str(alarm.dimensions['InstanceId']).split("'")[1] == instance_id:
+ alarm_list.insert(itr,str(alarm.name))
+ itr += 1
+ alarm_dict['alarm_names'] = alarm_list
+ alarm_dict['resource_id'] = instance_id
+ return alarm_dict
+ except Exception as e:
+ log.error("Error in Getting List : %s",str(e))
+#-----------------------------------------------------------------------------------------------------------------------------
+ def alarm_details(self,cloudwatch_conn,alarm_name):
+
+ """Get an individual alarm details specified by alarm_name"""
+ try:
+ alarms_details=cloudwatch_conn.describe_alarm_history()
+ alarm_details_dict = dict()
+
+ for itr in range (len(alarms_details)):
+ if alarms_details[itr].name == alarm_name and 'created' in alarms_details[itr].summary :#name, timestamp, summary
+ status = alarms_details[itr].summary.split()
+ alarms = cloudwatch_conn.describe_alarms()
+ for alarm in alarms:
+ if alarm.name == alarm_name:
+ alarm_details_dict['alarm_id'] = alarm_name
+ alarm_details_dict['resource_id'] = str(alarm.dimensions['InstanceId']).split("'")[1]
+ alarm_details_dict['severity'] = str(alarm.description)
+ alarm_details_dict['start_date_time'] = str(alarms_details[x].timestamp)
+
+ return alarm_details_dict
+
+ except Exception as e:
+ log.error("Error getting alarm details: %s",str(e))
+#-----------------------------------------------------------------------------------------------------------------------------
+ def metrics_data(self,cloudwatch_conn,metric_name,instance_id,period,metric_unit):
+
+ """Getting Metrics Stats for an Hour. Time interval can be modified using Timedelta value"""
+ metric_data= dict()
+ metric_stats=cloudwatch_conn.get_metric_statistics(period, datetime.datetime.utcnow() - datetime.timedelta(seconds=3600),
+ datetime.datetime.utcnow(),metric_name,'AWS/EC2', 'Maximum',
+ dimensions={'InstanceId':instance_id}, unit=metric_unit)
+
+ for itr in range (len(metric_stats)):
+ metric_data['metric_name'] = metric_name
+ metric_data['Resource_id'] = instance_id
+ metric_data['Unit'] = metric_stats[itr]['Unit']
+ metric_data['Timestamp'] = metric_stats[itr]['Timestamp']
+ return metric_data
+
+#-----------------------------------------------------------------------------------------------------------------------------
+ def is_present(self,cloudwatch_conn,alarm_name):
+ """Finding Alarm exists or not"""
+ try:
+ alarms = cloudwatch_conn.describe_alarms()
+ for alarm in alarms:
+ if alarm.name == alarm_name:
+ return True
+ return False
+ except Exception as e:
+ log.error("Error Finding Alarm",str(e))
+#-----------------------------------------------------------------------------------------------------------------------------