Skip to content

Commit

Permalink
Merge pull request #483 from Ladas/collect_service_catalog_items
Browse files Browse the repository at this point in the history
Collect AWS service catalog items
  • Loading branch information
agrare authored Sep 17, 2018
2 parents cdb25ab + 5bafdb4 commit 0389007
Show file tree
Hide file tree
Showing 19 changed files with 65,058 additions and 29,637 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Amazon::CloudManager::ServiceInstance < ::ServiceInstance
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Amazon::CloudManager::ServiceOffering < ::ServiceOffering
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Amazon::CloudManager::ServiceParametersSet < ::ServiceParametersSet
end
4 changes: 4 additions & 0 deletions app/models/manageiq/providers/amazon/inventory/collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,56 @@ def stack_template(stack_name)
aws_cloud_formation.client.get_template(:stack_name => stack_name).template_body
end

def service_offerings
aws_service_catalog.client.search_products_as_admin.product_view_details
rescue => _e
# TODO(lsmola) do not pollute log for now, since ServiceCatalog is not officially supported
# _log.warn("Couldn't fetch 'search_products_as_admin' of service catalog, message: #{e.message}")
[]
end

def service_instances
aws_service_catalog.client.scan_provisioned_products.provisioned_products
rescue => _e
# TODO(lsmola) do not pollute log for now, since ServiceCatalog is not officially supported
# _log.warn("Couldn't fetch 'provisioned_products' of service catalog, message: #{e.message}")
[]
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).provisioning_artifacts
launch_paths = aws_service_catalog.client.list_launch_paths(:product_id => product_id).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

private

def extra_image_references
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,16 @@ def stack_template(stack_name)
""
end

def service_offerings
# TODO(lsmola) targeted refresh for service catalog items
[]
end

def service_instances
# TODO(lsmola) targeted refresh for service catalog items
[]
end

private

def parse_targets!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ def parse
public_images if collector.options.get_public_images
referenced_images
instances
service_offerings
service_instances

$aws_log.info("#{log_header}...Complete")
end
Expand Down Expand Up @@ -342,4 +344,72 @@ def key_pairs
)
end
end

def service_offerings
collector.service_offerings.each do |service_offering|
persister_service_offering = persister.service_offerings.build(
:name => service_offering.product_view_summary.name,
:ems_ref => service_offering.product_view_summary.product_id,
:extra => {
:product_view_summary => service_offering.product_view_summary,
:status => service_offering.status,
:product_arn => service_offering.product_arn,
:created_time => service_offering.created_time,
}
)

service_parameters_sets(persister_service_offering)
end
end

def service_parameters_sets(persister_service_offering)
collector.service_parameters_sets(persister_service_offering.ems_ref).each do |service_parameters_set|
launch_path = service_parameters_set[:launch_path]
artifact = service_parameters_set[:artifact]
ems_ref = "#{persister_service_offering.ems_ref}__#{artifact.id}__#{launch_path.id}"

persister.service_parameters_sets.build(
:name => "#{persister_service_offering.name} #{artifact.name} #{launch_path.name}",
:ems_ref => ems_ref,
:service_offering => persister_service_offering,
:extra => {
:artifact => artifact,
:launch_path => launch_path,
:provisioning_artifact_parameters => service_parameters_set[:provisioning_parameters].provisioning_artifact_parameters,
:constraint_summaries => service_parameters_set[:provisioning_parameters].constraint_summaries,
:usage_instructions => service_parameters_set[:provisioning_parameters].usage_instructions,
}
)
end
end

def service_instances
# TODO(lsmola) a link to orchestration stack is in last_record_outputs

collector.service_instances.each do |service_instance|
described_record = collector.describe_record(service_instance.last_record_id)
described_record_detail = described_record&.record_detail
described_record_outputs = described_record&.record_outputs
service_parameters_sets_uuid = "#{described_record_detail.product_id}__#{described_record_detail.provisioning_artifact_id}"\
"__#{described_record_detail.path_id}"

persister.service_instances.build(
:name => service_instance.name,
:ems_ref => service_instance.id,
:service_offering => persister.service_offerings.lazy_find(described_record_detail&.product_id),
:service_parameters_set => persister.service_parameters_sets.lazy_find(service_parameters_sets_uuid),
:extra => {
:arn => service_instance.arn,
:type => service_instance.type,
:status => service_instance.status,
:status_message => service_instance.status_message,
:created_time => service_instance.created_time,
:idempotency_token => service_instance.idempotency_token,
:last_record_id => service_instance.last_record_id,
:last_record_detail => described_record_detail,
:last_record_outputs => described_record_outputs,
}
)
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ def initialize_cloud_inventory_collections
operating_systems
vm_and_template_labels
vm_and_template_taggings
vms).each do |name|
vms
service_instances
service_offerings
service_parameters_sets).each do |name|

add_collection(cloud, name)
end
Expand Down
Loading

0 comments on commit 0389007

Please sign in to comment.