class AwsCloudwatchLogMetricFilter

def fetch_from_api

def fetch_from_api
  # get a backend
  backend = BackendFactory.create(inspec_runner)
  # Perform query with remote filtering
  aws_search_criteria = {}
  aws_search_criteria[:filter_name] = filter_name if filter_name
  aws_search_criteria[:log_group_name] = log_group_name if log_group_name
  begin
    aws_results = backend.describe_metric_filters(aws_search_criteria)
  rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException
    @exists = false
    return
  end
  # Then perform local filtering
  if pattern
    aws_results.select! { |lmf| lmf.filter_pattern == pattern }
  end
  # Check result count.  We're a singular resource and can tolerate
  # 0 or 1 results, not multiple.
  if aws_results.count > 1
    raise 'More than one result was returned, but aws_cloudwatch_log_metric_filter '\
          'can only handle a single AWS resource.  Consider passing more resource '\
          'parameters to narrow down the search.'
  elsif aws_results.empty?
    @exists = false
  else
    @exists = true
    # Unpack the funny-shaped object we got back from AWS into our instance vars
    lmf = aws_results.first
    @filter_name = lmf.filter_name
    @log_group_name = lmf.log_group_name
    @pattern = lmf.filter_pattern # Note inconsistent name
    # AWS SDK returns an array of metric transformations
    # but only allows one (mandatory) entry, let's flatten that
    @metric_name = lmf.metric_transformations.first.metric_name
    @metric_namespace = lmf.metric_transformations.first.metric_namespace
  end
end

def validate_params(raw_params)

def validate_params(raw_params)
  validated_params = check_resource_param_names(
    raw_params: raw_params,
    allowed_params: [:filter_name, :log_group_name, :pattern],
  )
  if validated_params.empty?
    raise ArgumentError, 'You must provide either filter_name, log_group, or pattern to aws_cloudwatch_log_metric_filter.'
  end
  validated_params
end