diff --git a/app/models/manageiq/providers/kubernetes/container_manager/service_offering.rb b/app/models/manageiq/providers/kubernetes/container_manager/service_offering.rb new file mode 100644 index 0000000000..ef8e50f896 --- /dev/null +++ b/app/models/manageiq/providers/kubernetes/container_manager/service_offering.rb @@ -0,0 +1,2 @@ +class ManageIQ::Providers::Kubernetes::ContainerManager::ServiceOffering < ::ServiceOffering +end diff --git a/app/models/manageiq/providers/kubernetes/container_manager/service_parameters_set.rb b/app/models/manageiq/providers/kubernetes/container_manager/service_parameters_set.rb new file mode 100644 index 0000000000..63efb7d67a --- /dev/null +++ b/app/models/manageiq/providers/kubernetes/container_manager/service_parameters_set.rb @@ -0,0 +1,2 @@ +class ManageIQ::Providers::Kubernetes::ContainerManager::ServiceParametersSet < ::ServiceParametersSet +end diff --git a/app/models/manageiq/providers/kubernetes/container_manager_mixin.rb b/app/models/manageiq/providers/kubernetes/container_manager_mixin.rb index b0af8223d8..398d326b6d 100644 --- a/app/models/manageiq/providers/kubernetes/container_manager_mixin.rb +++ b/app/models/manageiq/providers/kubernetes/container_manager_mixin.rb @@ -68,6 +68,15 @@ def kubernetes_auth_options(options) def kubernetes_version 'v1' end + + def kubernetes_service_catalog_connect(hostname, port, options) + options = {:path => '/apis/servicecatalog.k8s.io', :version => service_catalog_api_version}.merge(options) + kubernetes_connect(hostname, port, options) + end + + def service_catalog_api_version + 'v1beta1' + end end PERF_ROLLUP_CHILDREN = :container_nodes diff --git a/app/models/manageiq/providers/kubernetes/inventory/collector/container_manager.rb b/app/models/manageiq/providers/kubernetes/inventory/collector/container_manager.rb index de8e8ad3ef..0d52b057fd 100644 --- a/app/models/manageiq/providers/kubernetes/inventory/collector/container_manager.rb +++ b/app/models/manageiq/providers/kubernetes/inventory/collector/container_manager.rb @@ -1,4 +1,14 @@ class ManageIQ::Providers::Kubernetes::Inventory::Collector::ContainerManager < ManageIQ::Providers::Kubernetes::Inventory::Collector + # TODO(lsmola) we need to return iterator for each collection, so we avoid fetching too many items to memory at + # once. + # Hints from cben: + # A slightly open question in kubeclient iterator interface was how it should expose whole-collection resource_version + # (and other metadata). Should iterator yield it with every item, or return it at the end? + # With streaming parse (abonas/kubeclient#254), this depends on order of json. k8s puts items last, so version is + # known by time we start yielding; this is unlikely to change but I feel weird hardcoding this assumption... + # For chunking (abonas/kubeclient#283), we'll have metadata in each chunk, so either API works. Chunking also brings + # risk of getting 410 Gone if we wait too long, not sure how to handle that. + def namespaces @namespaces ||= connection.get_namespaces end @@ -7,9 +17,21 @@ def pods @pods ||= connection.get_pods end + def cluster_service_offerings + @cluster_service_offerings ||= service_catalog_connection.get_cluster_service_classes + end + + def cluster_service_parameters_sets + @cluster_service_parameters_sets ||= service_catalog_connection.get_cluster_service_plans + end + private def connection @connection ||= manager.connect(:service => "kubernetes") end + + def service_catalog_connection + @service_catalog_connection ||= manager.connect(:service => "kubernetes_service_catalog") + end end diff --git a/app/models/manageiq/providers/kubernetes/inventory/parser/container_manager.rb b/app/models/manageiq/providers/kubernetes/inventory/parser/container_manager.rb index 10c12b9783..3d0e64b36c 100644 --- a/app/models/manageiq/providers/kubernetes/inventory/parser/container_manager.rb +++ b/app/models/manageiq/providers/kubernetes/inventory/parser/container_manager.rb @@ -2,6 +2,10 @@ class ManageIQ::Providers::Kubernetes::Inventory::Parser::ContainerManager < Man def parse parse_namespaces(collector.namespaces) parse_pods(collector.pods) + + # Service catalog entities + parse_service_offerings(collector.cluster_service_offerings) + parse_service_parameters_sets(collector.cluster_service_parameters_sets) end private @@ -34,6 +38,45 @@ def parse_pod(pod) ) end + def parse_service_offerings(service_offeringes) + service_offeringes.each do |service_offering| + parse_service_offering(service_offering) + end + end + + def parse_service_offering(service_offering) + persister.service_offerings.build( + :name => service_offering.spec.externalName, + :ems_ref => service_offering.spec.externalID, + :description => service_offering.spec.description, + :extra => { + :metadata => service_offering.metadata, + :spec => service_offering.spec, + :status => service_offering.status + } + ) + end + + def parse_service_parameters_sets(service_parameters_sets) + service_parameters_sets.each do |service_parameters_set| + parse_service_parameters_set(service_parameters_set) + end + end + + def parse_service_parameters_set(service_parameters_set) + persister.service_parameters_sets.build( + :name => service_parameters_set.spec.externalName, + :ems_ref => service_parameters_set.spec.externalID, + :description => service_parameters_set.spec.description, + :service_offering => persister.service_offerings.lazy_find(service_parameters_set.spec.clusterServiceClassRef.name), + :extra => { + :metadata => service_parameters_set.metadata, + :spec => service_parameters_set.spec, + :status => service_parameters_set.status + } + ) + end + def parse_base_item(item) { :ems_ref => item.metadata.uid, diff --git a/app/models/manageiq/providers/kubernetes/inventory/persister/definitions/container_collections.rb b/app/models/manageiq/providers/kubernetes/inventory/persister/definitions/container_collections.rb index d897439ee2..8d9f7f7c8a 100644 --- a/app/models/manageiq/providers/kubernetes/inventory/persister/definitions/container_collections.rb +++ b/app/models/manageiq/providers/kubernetes/inventory/persister/definitions/container_collections.rb @@ -29,7 +29,9 @@ def initialize_container_inventory_collections computer_system_operating_systems persistent_volumes persistent_volume_claims - security_contexts).each do |name| + security_contexts + service_offerings + service_parameters_sets).each do |name| add_collection(container, name) end