X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fplugins%2FCloudWatch%2Fplugin_alarm.py;h=c125bab36e5a5fc7a7953a003250dce3d0470024;hb=93699898c51364cde193d8d441f4aed45670e7bf;hp=40e7fe55de062f9bd32f12d0f586779d071e7100;hpb=e80db311a29dc8562dc84ae3336af167bac2ec5b;p=osm%2FMON.git diff --git a/osm_mon/plugins/CloudWatch/plugin_alarm.py b/osm_mon/plugins/CloudWatch/plugin_alarm.py index 40e7fe5..c125bab 100644 --- a/osm_mon/plugins/CloudWatch/plugin_alarm.py +++ b/osm_mon/plugins/CloudWatch/plugin_alarm.py @@ -19,180 +19,160 @@ # contact with: wajeeha.hamid@xflowresearch.com ## -''' +""" AWS-Plugin implements all the methods of MON to interact with AWS using the BOTO client -''' -from io import open -from osm_mon.core.message_bus.producer import KafkaProducer +""" +from io import UnsupportedOperation + +from osm_mon.core.settings import Config from osm_mon.plugins.CloudWatch.metric_alarms import MetricAlarm from osm_mon.plugins.CloudWatch.metrics import Metrics __author__ = "Wajeeha Hamid" -__date__ = "18-September-2017" +__date__ = "18-September-2017" -import json import logging log = logging.getLogger(__name__) -class plugin_alarms(): + +class plugin_alarms: """Receives Alarm info from MetricAlarm and connects with the consumer/producer""" - def __init__ (self): + + def __init__(self): + self._cfg = Config.instance() self.metricAlarm = MetricAlarm() self.metric = Metrics() - self.producer = KafkaProducer('') -#--------------------------------------------------------------------------------------------------------------------------- - def configure_alarm(self,alarm_info): - alarm_id = self.metricAlarm.config_alarm(self.cloudwatch_conn,alarm_info) + + def configure_alarm(self, alarm_info): + alarm_id = self.metricAlarm.config_alarm(self.cloudwatch_conn, alarm_info) return alarm_id -#--------------------------------------------------------------------------------------------------------------------------- - def update_alarm_configuration(self,test): - alarm_id = self.metricAlarm.update_alarm(self.cloudwatch_conn,test) + + def update_alarm_configuration(self, test): + alarm_id = self.metricAlarm.update_alarm(self.cloudwatch_conn, test) return alarm_id -#--------------------------------------------------------------------------------------------------------------------------- - def delete_alarm(self,alarm_id): - return self.metricAlarm.delete_Alarm(self.cloudwatch_conn,alarm_id) -#--------------------------------------------------------------------------------------------------------------------------- - def get_alarms_list(self,instance_id): - return self.metricAlarm.alarms_list(self.cloudwatch_conn,instance_id) -#--------------------------------------------------------------------------------------------------------------------------- - def get_ack_details(self,ack_info): - return self.metricAlarm.alarm_details(self.cloudwatch_conn,ack_info) -#--------------------------------------------------------------------------------------------------------------------------- - def get_metrics_data(self,metric_name,period,instance_id): - return self.metric.metricsData(self.cloudwatch_conn,metric_name,period,instance_id) -#--------------------------------------------------------------------------------------------------------------------------- - - def alarm_calls(self,message,aws_conn): + + def delete_alarm(self, alarm_id): + return self.metricAlarm.delete_Alarm(self.cloudwatch_conn, alarm_id) + + def get_alarms_list(self, instance_id): + return self.metricAlarm.alarms_list(self.cloudwatch_conn, instance_id) + + def get_ack_details(self, ack_info): + return self.metricAlarm.alarm_details(self.cloudwatch_conn, ack_info) + + def get_metrics_data(self, metric_name, period, instance_id): + # TODO: Investigate and fix this call + return self.metric.metricsData(self.cloudwatch_conn, metric_name, period, instance_id) + + def alarm_calls(self, key: str, alarm_info: dict, aws_conn: dict): """Gets the message from the common consumer""" try: self.cloudwatch_conn = aws_conn['cloudwatch_connection'] - self.ec2_conn = aws_conn['ec2_connection'] - - log.info("Action required against: %s" % (message.topic)) - alarm_info = json.loads(message.value) + self.ec2_conn = aws_conn['ec2_connection'] - if message.key == "create_alarm_request": + if key == "create_alarm_request": alarm_inner_dict = alarm_info['alarm_create_request'] - 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") - + metric_status = self.check_metric(alarm_inner_dict['metric_name']) + + if self.check_resource(alarm_inner_dict['resource_uuid']) and metric_status['status']: + log.debug("Resource and Metrics exists") + alarm_info['alarm_create_request']['metric_name'] = metric_status['metric_name'] - #Generate a valid response message, send via producer - config_resp = self.configure_alarm(alarm_info) #alarm_info = message.value - - if config_resp == None: + # Generate a valid response message, send via producer + config_resp = self.configure_alarm(alarm_info) # alarm_info = message.value + + if config_resp is None: log.debug("Alarm Already exists") - payload = json.dumps(config_resp) - file = open('../../core/models/create_alarm_resp.json','wb').write((payload)) - self.producer.publish_alarm_response(key='create_alarm_response',message=payload) - - else: - payload = json.dumps(config_resp) - file = open('../../core/models/create_alarm_resp.json','wb').write((payload)) - self.producer.publish_alarm_response(key='create_alarm_response',message=payload) - log.info("New alarm created with alarm info: %s", config_resp) - + # TODO: This should return a response with status False + return config_resp + + else: + log.info("New alarm created with alarm info: %s", config_resp) + return config_resp + else: - log.error("Resource ID doesn't exists") - - elif message.key == "acknowledge_alarm": + log.error("Resource ID doesn't exists") + + elif key == "acknowledge_alarm": alarm_inner_dict = alarm_info['ack_details'] - - if self.check_resource(alarm_inner_dict['resource_uuid']) == True: - alarm_info = json.loads(message.value) - #Generate a valid response message, send via producer + + if self.check_resource(alarm_inner_dict['resource_uuid']): 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.notify_alarm(key='notify_alarm',message=payload) log.info("Acknowledge sent: %s", ack_details) + return ack_details else: - log.error("Resource ID is Incorrect") - + log.error("Resource ID is Incorrect") - elif message.key == "update_alarm_request": + elif key == "update_alarm_request": alarm_inner_dict = alarm_info['alarm_update_request'] metric_status = self.check_metric(alarm_inner_dict['metric_name']) - - if metric_status['status'] == True: - log.debug ("Resource and Metrics exists") + + if metric_status['status']: + log.debug("Resource and Metrics exists") alarm_info['alarm_update_request']['metric_name'] = metric_status['metric_name'] - #Generate a valid response message, send via producer + # Generate a valid response message, send via producer update_resp = self.update_alarm_configuration(alarm_info) - if update_resp == None: - payload = json.dumps(update_resp) - file = open('../../core/models/update_alarm_resp.json','wb').write((payload)) - self.producer.update_alarm_response(key='update_alarm_response',message=payload) + if update_resp is None: + # TODO: This should return a response with status False log.debug("Alarm Already exists") + return update_resp - else: - payload = json.dumps(update_resp) - file = open('../../core/models/update_alarm_resp.json','wb').write((payload)) - self.producer.update_alarm_response(key='update_alarm_response',message=payload) - log.info("Alarm Updated with alarm info: %s", update_resp) + else: + log.info("Alarm Updated with alarm info: %s", update_resp) + return update_resp else: - log.info ("Metric Not Supported") - - - elif message.key == "delete_alarm_request": - del_info = json.loads(message.value) - #Generate a valid response message, send via producer - 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.delete_alarm_response(key='delete_alarm_response',message=payload) + log.info("Metric Not Supported") + + elif key == "delete_alarm_request": + # Generate a valid response message, send via producer + del_resp = self.delete_alarm(alarm_info) log.info("Alarm Deleted with alarm info: %s", del_resp) + return del_resp - - elif message.key == "alarm_list_request": + elif key == "alarm_list_request": alarm_inner_dict = alarm_info['alarm_list_request'] - - 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.list_alarm_response(key='list_alarm_response',message=payload) + if self.check_resource(alarm_inner_dict['resource_uuid']) or alarm_inner_dict['resource_uuid'] == "": + # Generate a valid response message, send via producer + list_resp = self.get_alarms_list(alarm_info) # ['alarm_names'] + return list_resp else: - log.error("Resource ID is Incorrect") + log.error("Resource ID is Incorrect") else: - log.debug("Unknown key, no action will be performed") + raise UnsupportedOperation("Unknown key, no action will be performed") except Exception as e: - log.error("Message retrieval exception: %s", str(e)) -#--------------------------------------------------------------------------------------------------------------------------- - def check_resource(self,resource_uuid): - '''Finding Resource with the resource_uuid''' + log.error("Message retrieval exception: %s", str(e)) + + def check_resource(self, resource_uuid): + """Finding Resource with the resource_uuid""" try: check_resp = dict() instances = self.ec2_conn.get_all_instance_status() - #resource_id + # resource_id for instance_id in instances: instance_id = str(instance_id).split(':')[1] if instance_id == resource_uuid: check_resp['resource_uuid'] = resource_uuid - return True + return True return False - except Exception as e: - log.error("Error in Plugin Inputs %s",str(e)) -#--------------------------------------------------------------------------------------------------------------------------- - def check_metric(self,metric_name): - ''' Checking whether the metric is supported by AWS ''' + except Exception as e: + log.error("Error in Plugin Inputs %s", str(e)) + + def check_metric(self, metric_name): + """ Checking whether the metric is supported by AWS """ try: check_resp = dict() - - #metric_name + + # metric_name if metric_name == 'CPU_UTILIZATION': metric_name = 'CPUUtilization' metric_status = True @@ -225,12 +205,11 @@ class plugin_alarms(): metric_name = None metric_status = False check_resp['metric_name'] = metric_name - #status + # status - if metric_status == True: + if metric_status: check_resp['status'] = True - return check_resp + return check_resp - except Exception as e: - log.error("Error in Plugin Inputs %s",str(e)) -#--------------------------------------------------------------------------------------------------------------------------- + except Exception as e: + log.error("Error in Plugin Inputs %s", str(e))