X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fplugins%2FCloudWatch%2Fmetric_alarms.py;h=5d330b0a8c3f23cd2bf2f135c0eb43802299a726;hb=93699898c51364cde193d8d441f4aed45670e7bf;hp=8e5b6fe85180b7683a131f02c3e4cce6e7846fdc;hpb=e80db311a29dc8562dc84ae3336af167bac2ec5b;p=osm%2FMON.git diff --git a/osm_mon/plugins/CloudWatch/metric_alarms.py b/osm_mon/plugins/CloudWatch/metric_alarms.py index 8e5b6fe..5d330b0 100644 --- a/osm_mon/plugins/CloudWatch/metric_alarms.py +++ b/osm_mon/plugins/CloudWatch/metric_alarms.py @@ -22,7 +22,7 @@ ''' Handling of alarms requests via BOTO 2.48 ''' __author__ = "Wajeeha Hamid" -__date__ = "18-September-2017" +__date__ = "18-September-2017" import logging @@ -41,64 +41,66 @@ STATISTICS = { "AVERAGE": "Average", "MINIMUM": "Minimum", "MAXIMUM": "Maximum", - "COUNT" : "SampleCount", - "SUM" : "Sum"} + "COUNT": "SampleCount", + "SUM": "Sum"} OPERATIONS = { - "GE" : ">=", - "LE" : "<=", - "GT" : ">", - "LT" : "<", - "EQ" : "="} + "GE": ">=", + "LE": "<=", + "GT": ">", + "LT": "<", + "EQ": "="} + class MetricAlarm(): """Alarms Functionality Handler -- Carries out alarming requests and responses via BOTO.Cloudwatch """ + def __init__(self): self.alarm_resp = dict() self.del_resp = dict() - def config_alarm(self,cloudwatch_conn,create_info): + def config_alarm(self, cloudwatch_conn, create_info): """Configure or Create a new alarm""" inner_dict = dict() """ Alarm Name to ID Mapping """ alarm_info = create_info['alarm_create_request'] alarm_id = alarm_info['alarm_name'] + "_" + alarm_info['resource_uuid'] - if self.is_present(cloudwatch_conn,alarm_id)['status'] == True: + if self.is_present(cloudwatch_conn, alarm_id)['status'] == True: alarm_id = None - log.debug ("Alarm already exists, Try updating the alarm using 'update_alarm_configuration()'") - return alarm_id - else: + log.debug("Alarm already exists, Try updating the alarm using 'update_alarm_configuration()'") + return alarm_id + else: try: 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, + 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) + 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) + status = cloudwatch_conn.put_metric_alarm(alarm) - log.debug ("Alarm Configured Succesfully") + 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['alarm_uuid'] = str(alarm_id) inner_dict['status'] = status self.alarm_resp['alarm_create_response'] = inner_dict @@ -106,18 +108,17 @@ class MetricAlarm(): if status == True: return self.alarm_resp else: - return None - else: + return None + else: log.error("Operation not supported") - return None + return None else: log.error("Statistic not supported") return None except Exception as e: log.error("Alarm Configuration Failed: " + str(e)) - -#----------------------------------------------------------------------------------------------------------------------------- - def update_alarm(self,cloudwatch_conn,update_info): + + def update_alarm(self, cloudwatch_conn, update_info): """Update or reconfigure an alarm""" inner_dict = dict() @@ -125,67 +126,66 @@ class MetricAlarm(): """Alarm Name to ID Mapping""" alarm_id = alarm_info['alarm_uuid'] - status = self.is_present(cloudwatch_conn,alarm_id) + status = self.is_present(cloudwatch_conn, alarm_id) """Verifying : Alarm exists already""" - if status['status'] == False: + if status['status'] == False: alarm_id = None log.debug("Alarm not found, Try creating the alarm using 'configure_alarm()'") - return alarm_id - else: + return alarm_id + else: try: 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, + 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) + 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) + 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['alarm_uuid'] = str(alarm_id) inner_dict['status'] = status self.alarm_resp['alarm_update_response'] = inner_dict return self.alarm_resp - else: + else: log.error("Operation not supported") - return None + return None else: log.error("Statistic not supported") - return None + return None except Exception as e: - log.error ("Error in Updating Alarm " + str(e)) - -#----------------------------------------------------------------------------------------------------------------------------- - def delete_Alarm(self,cloudwatch_conn,del_info_all): + log.error("Error in Updating Alarm " + str(e)) + + def delete_Alarm(self, cloudwatch_conn, del_info_all): """Deletes an Alarm with specified alarm_id""" inner_dict = dict() del_info = del_info_all['alarm_delete_request'] - status = self.is_present(cloudwatch_conn,del_info['alarm_uuid']) + status = self.is_present(cloudwatch_conn, del_info['alarm_uuid']) try: - if status['status'] == True: - del_status=cloudwatch_conn.delete_alarms(status['info'].name) + if status['status'] == True: + del_status = cloudwatch_conn.delete_alarms(status['info'].name) self.del_resp['schema_version'] = str(del_info_all['schema_version']) self.del_resp['schema_type'] = 'delete_alarm_response' inner_dict['correlation_id'] = str(del_info['correlation_id']) @@ -193,90 +193,98 @@ class MetricAlarm(): inner_dict['status'] = del_status self.del_resp['alarm_deletion_response'] = inner_dict return self.del_resp - return None + return None except Exception as e: - log.error("Alarm Not Deleted: " + str(e)) -#----------------------------------------------------------------------------------------------------------------------------- - def alarms_list(self,cloudwatch_conn,list_info): + log.error("Alarm Not Deleted: " + str(e)) + + def alarms_list(self, cloudwatch_conn, list_info): """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 + 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] - #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)) + # 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 - #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)) + # 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 = 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)) + # 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 - #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)) + # 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 - #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)) + # 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 - #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)) + # 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 - #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)) + # 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['schema_type'] = 'list_alarm_response' alarm_info['list_alarm_response'] = alarm_list - return alarm_info + return alarm_info except Exception as e: - log.error("Error in Getting List : %s",str(e)) -#----------------------------------------------------------------------------------------------------------------------------- - def alarm_details(self,cloudwatch_conn,ack_info): + log.error("Error in Getting List : %s", str(e)) + + def alarm_details(self, cloudwatch_conn, ack_info): """Get an individual alarm details specified by alarm_name""" try: - alarms_details=cloudwatch_conn.describe_alarm_history() - alarm_details_all = dict() + alarms_details = cloudwatch_conn.describe_alarm_history() + alarm_details_all = dict() alarm_details_dict = dict() ack_info_all = ack_info - if 'ack_details' in ack_info: ack_info = ack_info['ack_details'] elif 'alarm_list_request' in ack_info: - ack_info = ack_info['alarm_list_request'] - - is_present = self.is_present(cloudwatch_conn,ack_info['alarm_uuid']) + ack_info = ack_info['alarm_list_request'] - for itr in range (len(alarms_details)): - if alarms_details[itr].name == is_present['info'].name :#name, timestamp, summary + is_present = self.is_present(cloudwatch_conn, ack_info['alarm_uuid']) + + for itr in range(len(alarms_details)): + if alarms_details[itr].name == is_present['info'].name: # name, timestamp, summary if 'created' in alarms_details[itr].summary: alarm_details_dict['status'] = "New" elif 'updated' in alarms_details[itr].summary: alarm_details_dict['status'] = "Update" - elif 'deleted' in alarms_details[itr].summary: + elif 'deleted' in alarms_details[itr].summary: alarm_details_dict['status'] = "Canceled" - status = alarms_details[itr].summary.split() + status = alarms_details[itr].summary.split() alarms = cloudwatch_conn.describe_alarms() for alarm in alarms: if str(alarm.description).split(';')[1] == ack_info['alarm_uuid']: @@ -284,9 +292,9 @@ class MetricAlarm(): alarm_details_dict['resource_uuid'] = str(alarm.dimensions['InstanceId']).split("'")[1] alarm_details_dict['description'] = str(alarm.description).split(';')[1] alarm_details_dict['severity'] = str(alarm.description).split(';')[0] - alarm_details_dict['start_date_time'] = str(alarms_details[itr].timestamp) + alarm_details_dict['start_date_time'] = str(alarms_details[itr].timestamp) alarm_details_dict['vim_type'] = str(ack_info_all['vim_type']) - #TODO : tenant id + # TODO : tenant id if 'ack_details' in ack_info_all: alarm_details_all['schema_version'] = str(ack_info_all['schema_version']) alarm_details_all['schema_type'] = 'notify_alarm' @@ -294,12 +302,12 @@ class MetricAlarm(): return alarm_details_all elif 'alarm_list_request' in ack_info_all: - return alarm_details_dict - + return alarm_details_dict + except Exception as e: - log.error("Error getting alarm details: %s",str(e)) -#----------------------------------------------------------------------------------------------------------------------------- - def is_present(self,cloudwatch_conn,alarm_id): + log.error("Error getting alarm details: %s", str(e)) + + def is_present(self, cloudwatch_conn, alarm_id): """Finding alarm from already configured alarms""" alarm_info = dict() try: @@ -309,9 +317,7 @@ class MetricAlarm(): alarm_info['status'] = True alarm_info['info'] = alarm return alarm_info - alarm_info['status'] = False + alarm_info['status'] = False return alarm_info except Exception as e: - log.error("Error Finding Alarm",str(e)) -#----------------------------------------------------------------------------------------------------------------------------- - \ No newline at end of file + log.error("Error Finding Alarm", str(e))