ManageIQ/manageiq-providers-amazon

View on GitHub
app/models/manageiq/providers/amazon/inventory/collector.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
91%
class ManageIQ::Providers::Amazon::Inventory::Collector < ManageIQ::Providers::Inventory::Collector
  attr_reader :instances
  attr_reader :flavors
  attr_reader :availability_zones
  attr_reader :key_pairs
  attr_reader :private_images
  attr_reader :shared_images
  attr_reader :public_images
  attr_reader :cloud_networks
  attr_reader :cloud_subnets
  attr_reader :security_groups
  attr_reader :floating_ips
  attr_reader :network_ports
  attr_reader :network_routers
  attr_reader :load_balancers
  attr_reader :stacks
  attr_reader :cloud_databases
  attr_reader :cloud_database_flavors
  attr_reader :cloud_volumes
  attr_reader :cloud_volume_snapshots
  attr_reader :cloud_objects_store_containers
  attr_reader :cloud_objects_store_objects

  def initialize(_manager, _target)
    super

    initialize_inventory_sources
  end

  def initialize_inventory_sources
    @instances                   = []
    @flavors                     = []
    @availability_zones          = []
    @key_pairs                   = []
    @private_images              = []
    @shared_images               = []
    @public_images               = []
    @cloud_networks              = []
    @cloud_subnets               = []
    @security_groups             = []
    @floating_ips                = []
    @network_ports               = []
    @network_routers             = []
    @load_balancers              = []
    @stacks                      = []
    @cloud_databases             = []
    @cloud_database_flavors      = []
    @cloud_volumes               = []
    @cloud_volume_snapshots      = []
    # Nested resources
    @stack_resources             = {}
    @stack_resources_refs        = {}
    @stack_template              = {}
    @stack_template_refs         = {}
    @health_check_members        = {}
    @health_check_members_refs   = {}
  end

  def hash_collection
    ::ManageIQ::Providers::Amazon::Inventory::HashCollection
  end

  def aws_ec2
    @aws_ec2 ||= manager.connect
  end

  def aws_cloud_formation
    @aws_cloud_formation ||= manager.connect(:service => :CloudFormation)
  end

  def aws_service_catalog
    @aws_service_catalog ||= manager.connect(:service => :ServiceCatalog)
  end

  def aws_elb
    @aws_elb ||= manager.connect(:service => :ElasticLoadBalancing)
  end

  def aws_s3
    @aws_s3 ||= manager.connect(:service => :S3)
  end

  def aws_rds
    @aws_rds ||= manager.connect(:service => :RDS)
  end

  def flavors_by_name
    @flavors_by_name ||= flavors.index_by { |flavor| flavor[:name] }
  end

  def stack_resources(stack_name)
    @stack_resources.try(:[], stack_name) || []
  end

  def stack_resources_refs(stack_name)
    @stack_resources_refs.try(:[], stack_name) || []
  end

  def stack_template(stack_name)
    @stack_template.try(:[], stack_name) || []
  end

  def stack_template_refs(stack_name)
    @stack_template_refs.try(:[], stack_name) || []
  end

  def health_check_members(load_balancer_name)
    @health_check_members.try(:[], load_balancer_name) || []
  end

  def health_check_members_refs(load_balancer_name)
    @health_check_members_refs.try(:[], load_balancer_name) || []
  end

  def max_filter_size
    200
  end

  def multi_query(all_uuids)
    # AWS supports filtering only limited amount of items, so we need to send several queries
    all_uuids.each_slice(max_filter_size).map { |uuids_batch| yield(uuids_batch) }.flatten
  end

  def service_parameters_sets(product_id)
    # TODO(lsmola) too many API calls, we need to do it in multiple threads

    # Taking provisioning_artifacts of described product returns only active artifacts, doing list_provisioning_artifacts
    # we are not able to recognize the active ones. Same with describe_product_as_admin, status is missing. Status is
    # in the describe_provisioning_artifact, but it is wrong (always ACTIVE)
    artifacts    = aws_service_catalog.client.describe_product(:id => product_id).flat_map(&:provisioning_artifacts)
    launch_paths = aws_service_catalog.client.list_launch_paths(:product_id => product_id).flat_map(&:launch_path_summaries)
    parameters_sets = []

    launch_paths.each do |launch_path|
      artifacts.each do |artifact|
        parameter_set                           = {:artifact => artifact, :launch_path => launch_path}
        parameter_set[:provisioning_parameters] = aws_service_catalog.client.describe_provisioning_parameters(
          :product_id               => product_id,
          :provisioning_artifact_id => artifact.id,
          :path_id                  => launch_path.id
        )
        parameters_sets << parameter_set
      end
    end
    parameters_sets
  rescue => e
    _log.warn("Couldn't fetch 'describe_provisioning_parameters' of service catalog, message: #{e.message}")
    []
  end

  def describe_record(record_id)
    aws_service_catalog.client.describe_record(:id => record_id)
  rescue => e
    _log.warn("Couldn't fetch 'describe_record' of service catalog, message: #{e.message}")
    nil
  end
end