import cp_aws_bin.utils.app_util as util import time import splunk.search as search from .base_task import BaseTask from . import recommendation_consts as constants logger = util.get_logger() SPL = ''' search %s sourcetype="aws:metadata" source="*_load_balancers" earliest=-1d | eval AccountId=if(isnum(AccountId),AccountId, user_id) , aws_account_id = AccountId, account_id = AccountId | eval name=if(isnull(name), LoadBalancerName, name) | dedup AccountId, region, name | eval instances=if(isnotnull('instances{}.State'), mvzip('instances{}.InstanceId', 'instances{}.State'), mvzip('TargetGroups{}.TargetHealthDescriptions{}.Target.Id','TargetGroups{}.TargetHealthDescriptions{}.TargetHealth.State')), healthy_instance_state = mvfilter(match(instances,"\w+,InService$") OR match(instances, "\w+,healthy$")) , healthy_instance_count=if(isnull(healthy_instance_state),0, mvcount(healthy_instance_state)) | where healthy_instance_count = 0 | fields name, region, AccountId, LoadBalancerArn | join region [|inputlookup regions] | eval resourceId=if(isnotnull('LoadBalancerArn'), LoadBalancerArn, name+" ("+AccountId+", "+location+")") | table resourceId ''' # TODO: May introduce more ELB recommendations, like not-best-practise, not-autoscaling, etc. So name it "ElbUsageTask". class ElbUsageTask(BaseTask): def pre_execute(self): # delete former recommendation results of Unused ELBs self.recommendation_kao.delete_items_by_condition({'ml_dimension': constants.UNUSED_ELB_DIMENSION}) return def execute(self): index_option_value = util.get_option_from_conf(self.session_key, 'macros', 'aws-metadata-index', 'definition') results = search.searchAll(SPL % (index_option_value), sessionKey = self.session_key) recommendations = [] for result in results: temp_arr = str(result).split('=') if len(temp_arr) == 2 and temp_arr[0] == 'resourceId': recommendations.append({ 'resource_id': temp_arr[1], 'resource_type': 'elb', 'ml_dimension': constants.UNUSED_ELB_DIMENSION, 'ml_action': constants.DELETE_ACTION, 'ml_priority': 1, 'feature': [], 'timestamp': int(time.time()) }) if len(recommendations) > 0: self.recommendation_kao.batch_insert_items(recommendations) output_message = 'Insert %d unused elbs into kvstore.' % len(recommendations) logger.info(output_message) return output_message