except:
exit("Boto not avialable. Try activating your virtualenv OR `pip install boto`")
+STATISTICS = {
+ "AVERAGE": "Average",
+ "MINIMUM": "Minimum",
+ "MAXIMUM": "Maximum",
+ "COUNT" : "SampleCount",
+ "SUM" : "Sum"}
+
+OPERATIONS = {
+ "GE" : ">=",
+ "LE" : "<=",
+ "GT" : ">",
+ "LT" : "<",
+ "EQ" : "="}
class MetricAlarm():
"""Alarms Functionality Handler -- Carries out alarming requests and responses via BOTO.Cloudwatch """
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_uuid'],
- metric = alarm_info['metric_name'],
- namespace = "AWS/EC2",
- statistic = alarm_info['statistic'],
- comparison = alarm_info['operation'],
- threshold = alarm_info['threshold_value'],
- period = 60,
- evaluation_periods = 1,
- unit=alarm_info['unit'],
- description = alarm_info['severity'] + ";" + alarm_id + ";" + alarm_info['description'],
- dimensions = {'InstanceId':alarm_info['resource_uuid']},
- 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']"""
-
- status=cloudwatch_conn.put_metric_alarm(alarm)
-
- log.debug ("Alarm Configured Succesfully")
- self.alarm_resp['schema_version'] = str(create_info['schema_version'])
- self.alarm_resp['schema_type'] = 'create_alarm_response'
-
- inner_dict['correlation_id'] = str(alarm_info['correlation_id'])
- inner_dict['alarm_uuid'] = str(alarm_id)
- inner_dict['status'] = status
-
- self.alarm_resp['alarm_create_response'] = inner_dict
- if status == True:
- return self.alarm_resp
- else:
- return None
+ if alarm_info['statistic'] in STATISTICS:
+ if alarm_info['operation'] in OPERATIONS:
+ alarm = boto.ec2.cloudwatch.alarm.MetricAlarm(
+ connection = cloudwatch_conn,
+ name = alarm_info['alarm_name'] + "_" + alarm_info['resource_uuid'],
+ metric = alarm_info['metric_name'],
+ namespace = "AWS/EC2",
+ statistic = STATISTICS[alarm_info['statistic']],
+ comparison = OPERATIONS[alarm_info['operation']],
+ threshold = alarm_info['threshold_value'],
+ period = 60,
+ evaluation_periods = 1,
+ unit=alarm_info['unit'],
+ description = alarm_info['severity'] + ";" + alarm_id + ";" + alarm_info['description'],
+ dimensions = {'InstanceId':alarm_info['resource_uuid']},
+ 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']"""
+
+ status=cloudwatch_conn.put_metric_alarm(alarm)
+ log.debug ("Alarm Configured Succesfully")
+ self.alarm_resp['schema_version'] = str(create_info['schema_version'])
+ self.alarm_resp['schema_type'] = 'create_alarm_response'
+
+ inner_dict['correlation_id'] = str(alarm_info['correlation_id'])
+ inner_dict['alarm_uuid'] = str(alarm_id)
+ inner_dict['status'] = status
+
+ self.alarm_resp['alarm_create_response'] = inner_dict
+
+ if status == True:
+ return self.alarm_resp
+ else:
+ return None
+ else:
+ log.error("Operation not supported")
+ return None
+ else:
+ log.error("Statistic not supported")
+ return None
except Exception as e:
log.error("Alarm Configuration Failed: " + str(e))
return alarm_id
else:
try:
- alarm = boto.ec2.cloudwatch.alarm.MetricAlarm(
- connection = cloudwatch_conn,
- name = status['info'].name ,
- metric = alarm_info['metric_name'],
- namespace = "AWS/EC2",
- statistic = alarm_info['statistic'],
- comparison = alarm_info['operation'],
- threshold = alarm_info['threshold_value'],
- period = 60,
- evaluation_periods = 1,
- unit=alarm_info['unit'],
- description = alarm_info['severity'] + ";" + alarm_id + ";" + alarm_info['description'],
- dimensions = {'InstanceId':str(status['info'].dimensions['InstanceId']).split("'")[1]},
- 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']"""
-
- status=cloudwatch_conn.put_metric_alarm(alarm)
- log.debug("Alarm %s Updated ",alarm.name)
- self.alarm_resp['schema_version'] = str(update_info['schema_version'])
- self.alarm_resp['schema_type'] = 'update_alarm_response'
-
- inner_dict['correlation_id'] = str(alarm_info['correlation_id'])
- inner_dict['alarm_uuid'] = str(alarm_id)
- inner_dict['status'] = status
-
- self.alarm_resp['alarm_update_response'] = inner_dict
- return self.alarm_resp
+ if alarm_info['statistic'] in STATISTICS:
+ if alarm_info['operation'] in OPERATIONS:
+ alarm = boto.ec2.cloudwatch.alarm.MetricAlarm(
+ connection = cloudwatch_conn,
+ name = status['info'].name ,
+ metric = alarm_info['metric_name'],
+ namespace = "AWS/EC2",
+ statistic = STATISTICS[alarm_info['statistic']],
+ comparison = OPERATIONS[alarm_info['operation']],
+ threshold = alarm_info['threshold_value'],
+ period = 60,
+ evaluation_periods = 1,
+ unit=alarm_info['unit'],
+ description = alarm_info['severity'] + ";" + alarm_id + ";" + alarm_info['description'],
+ dimensions = {'InstanceId':str(status['info'].dimensions['InstanceId']).split("'")[1]},
+ 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']"""
+
+ status=cloudwatch_conn.put_metric_alarm(alarm)
+ log.debug("Alarm %s Updated ",alarm.name)
+ self.alarm_resp['schema_version'] = str(update_info['schema_version'])
+ self.alarm_resp['schema_type'] = 'update_alarm_response'
+
+ inner_dict['correlation_id'] = str(alarm_info['correlation_id'])
+ inner_dict['alarm_uuid'] = str(alarm_id)
+ inner_dict['status'] = status
+
+ self.alarm_resp['alarm_update_response'] = inner_dict
+ return self.alarm_resp
+ else:
+ log.error("Operation not supported")
+ return None
+ else:
+ log.error("Statistic not supported")
+ return None
except Exception as e:
log.error ("Error in Updating Alarm " + str(e))
"""Get a list of alarms that are present on a particular VIM type"""
alarm_list = []
alarm_info = dict()
+ inner_dict = list_info['alarm_list_request']
try: #id vim
alarms = cloudwatch_conn.describe_alarms()
itr = 0
for alarm in alarms:
list_info['alarm_list_request']['alarm_uuid'] = str(alarm.description).split(';')[1]
- alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
- itr += 1
-
+
+ #Severity = alarm_name = resource_uuid = ""
+ if inner_dict['severity'] == "" and inner_dict['alarm_name'] == "" and inner_dict['resource_uuid'] == "":
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #alarm_name = resource_uuid = ""
+ if inner_dict['severity'] == str(alarm.description).split(';')[0] and inner_dict['alarm_name'] == "" and inner_dict['resource_uuid'] == "":
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #severity = resource_uuid = ""
+ if inner_dict['severity'] == "" and inner_dict['alarm_name'] in alarm.name and inner_dict['resource_uuid'] == "":
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #severity = alarm_name = ""
+ if inner_dict['severity'] == "" and inner_dict['alarm_name'] == "" and inner_dict['resource_uuid'] == str(alarm.dimensions['InstanceId']).split("'")[1]:
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #resource_uuid = ""
+ if inner_dict['severity'] == str(alarm.description).split(';')[0] and inner_dict['alarm_name'] in alarm.name and inner_dict['resource_uuid'] == "":
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #alarm_name = ""
+ if inner_dict['severity'] == str(alarm.description).split(';')[0] and inner_dict['alarm_name'] == "" and inner_dict['resource_uuid'] == str(alarm.dimensions['InstanceId']).split("'")[1]:
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #severity = ""
+ if inner_dict['severity'] == "" and inner_dict['alarm_name'] in alarm.name and inner_dict['resource_uuid'] == str(alarm.dimensions['InstanceId']).split("'")[1]:
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+ #Everything provided
+ if inner_dict['severity'] == str(alarm.description).split(';')[0] and inner_dict['alarm_name'] in alarm.name and inner_dict['resource_uuid'] == str(alarm.dimensions['InstanceId']).split("'")[1]:
+ alarm_list.insert(itr,self.alarm_details(cloudwatch_conn,list_info))
+ itr += 1
+
alarm_info['schema_version'] = str(list_info['schema_version'])
alarm_info['schema_type'] = 'list_alarm_response'
- alarm_info['list_alarm_resp'] = json.dumps(alarm_list)
+ alarm_info['list_alarm_resp'] = alarm_list
return alarm_info
except Exception as e:
self.conn = Connection()
self.metricAlarm = MetricAlarm()
self.metric = Metrics()
-
server = {'server': 'localhost:9092', 'topic': 'alarm_request'}
-
self._consumer = KafkaConsumer(server['topic'], bootstrap_servers=server['server'])
self._consumer.subscribe(['alarm_request'])
-
- #self.producer = KafkaProducer('create_alarm_request')
- self.producer = KafkaProducer('')
-
-
+ self.producer = KafkaProducer('')
#---------------------------------------------------------------------------------------------------------------------------
def connection(self):
"""Connecting instances with CloudWatch"""
if message.key == "create_alarm_request":
if alarm_info['vim_type'] == 'AWS':
alarm_inner_dict = alarm_info['alarm_create_request']
- metric_status = self.check_metric(alarm_inner_dict['metric_name'])
-
+ metric_status = self.check_metric(alarm_inner_dict['metric_name'])
if self.check_resource(alarm_inner_dict['resource_uuid']) == True and metric_status['status'] == True:
log.debug ("Resource and Metrics exists")
ack_details = self.get_ack_details(alarm_info)
payload = json.dumps(ack_details)
file = open('../../core/models/notify_alarm.json','wb').write((payload))
- self.producer.update_alarm_response(key='notify_alarm',message=payload,topic = 'alarm_response')
+ self.producer.notify_alarm(key='notify_alarm',message=payload,topic = 'alarm_response')
log.info("Acknowledge sent: %s", ack_details)
else:
log.error("Resource ID is Incorrect")
del_resp = self.delete_alarm(del_info)
payload = json.dumps(del_resp)
file = open('../../core/models/delete_alarm_resp.json','wb').write((payload))
- self.producer.update_alarm_response(key='delete_alarm_response',message=payload,topic = 'alarm_response')
+ self.producer.delete_alarm_response(key='delete_alarm_response',message=payload,topic = 'alarm_response')
log.info("Alarm Deleted with alarm info: %s", del_resp)
else:
log.error(" VIM type Incorrect ")
elif message.key == "alarm_list_request":
alarm_inner_dict = alarm_info['alarm_list_request']
if alarm_info['vim_type'] == 'AWS':
- if self.check_resource(alarm_inner_dict['resource_uuid']) == True:
+ if self.check_resource(alarm_inner_dict['resource_uuid']) == True or alarm_inner_dict['resource_uuid'] == "":
#Generate a valid response message, send via producer
list_resp = self.get_alarms_list(alarm_info)#['alarm_names']
payload = json.dumps(list_resp)
file = open('../../core/models/list_alarm_resp.json','wb').write((payload))
- self.producer.update_alarm_response(key='list_alarm_response',message=payload,topic = 'alarm_response')
+ self.producer.list_alarm_response(key='list_alarm_response',message=payload,topic = 'alarm_response')
else:
log.error("Resource ID is Incorrect")
else: