diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/compliance_policy_parser.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/compliance_policy_parser.rb new file mode 100644 index 0000000000..453284b2ed --- /dev/null +++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/compliance_policy_parser.rb @@ -0,0 +1,45 @@ +require_relative 'component_parser' + +module ManageIQ::Providers::Lenovo + module Parsers + class CompliancePolicyParser < ComponentParser + COMPLIANCE_NAME = 'No policy assigned'.freeze + COMPLIANCE_STATUS = { + 'no' => 'Non-compliant', + 'yes' => 'Compliant', + '' => 'None' + }.freeze + + class << self + + def parse_compliance_policy(compliance_policies) + parse_to_hash(compliance_policies) + end + + private + + def map_by_uuid(collection) + collection.collect do |result| + policy_name = result['policyName'] + data = { + :policy_name => policy_name.empty? ? COMPLIANCE_NAME : policy_name, + :status => "#{COMPLIANCE_STATUS[result['endpointCompliant']]} #{result['message'].join(', ')}", + } + # Return a tuple [key, value] for each result + [result['uuid'], data] + end.to_h + end + + def parse_to_hash(persisted_results) + persisted_results.collect do |persisted_result| + if persisted_result.xITEs.present? + map_by_uuid(persisted_result.xITEs) + elsif persisted_result.racklist.present? + map_by_uuid(persisted_result.racklist) + end + end.compact.reduce({}, :merge) + end + end + end + end +end diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/physical_server_parser.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/physical_server_parser.rb index 4bc51b80ec..8238dec410 100644 --- a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/physical_server_parser.rb +++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/components/physical_server_parser.rb @@ -13,12 +13,14 @@ class << self # # @return [Hash] containing the physical server information # - def parse_physical_server(node, rack = nil) + def parse_physical_server(node, compliance, rack = nil) result = parse(node, ParserDictionaryConstants::PHYSICAL_SERVER) # Keep track of the rack where this server is in, if it is in any rack result[:physical_rack] = rack if rack + result[:ems_compliance_name] = compliance[:policy_name] + result[:ems_compliance_status] = compliance[:status] result[:vendor] = "lenovo" result[:type] = ParserDictionaryConstants::MIQ_TYPES["physical_server"] result[:power_state] = ParserDictionaryConstants::POWER_STATE_MAP[node.powerStatus] diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parser.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parser.rb index dc6c1661c6..97cb67b311 100644 --- a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parser.rb +++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parser.rb @@ -32,12 +32,16 @@ def parse_physical_rack(node) Parsers::PhysicalRackParser.parse_physical_rack(node) end - def parse_physical_server(node, rack = nil) - Parsers::PhysicalServerParser.parse_physical_server(node, rack) + def parse_physical_server(node, compliance, rack = nil) + Parsers::PhysicalServerParser.parse_physical_server(node, compliance, rack) end def parse_config_pattern(config_pattern) Parsers::ConfigPatternParser.parse_config_pattern(config_pattern) end + + def parse_compliance_policy(compliance_policies) + Parsers::CompliancePolicyParser.parse_compliance_policy(compliance_policies) + end end end diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parsers.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parsers.rb index 5ecd173943..a5c8aeb1ba 100644 --- a/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parsers.rb +++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/parsers/parsers.rb @@ -10,3 +10,4 @@ module Parsers require_relative 'components/physical_server_parser' require_relative 'components/config_pattern_parser' require_relative 'components/physical_rack_parser' +require_relative 'components/compliance_policy_parser' diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/refresh_parser.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/refresh_parser.rb index cac862ae81..5a74281b60 100644 --- a/app/models/manageiq/providers/lenovo/physical_infra_manager/refresh_parser.rb +++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/refresh_parser.rb @@ -67,7 +67,7 @@ def get_all_physical_infra rack_uid, rack = @parser.parse_physical_rack(cab) get_physical_servers(cab) do |node| - _, parsed = @parser.parse_physical_server(node, rack) + _, parsed = @parser.parse_physical_server(node, find_compliance(node), rack) physical_servers << parsed end @@ -76,7 +76,7 @@ def get_all_physical_infra nodes = get_physical_servers(standalone) process_collection(nodes, :physical_servers) do |node| - @parser.parse_physical_server(node) + @parser.parse_physical_server(node, find_compliance(node)) end @data[:physical_servers].concat(physical_servers) @@ -114,6 +114,19 @@ def get_physical_servers(cabinet) end end + def find_compliance(node) + compliance_policies ||= @connection.fetch_compliance_policies + compliance_policies_parsed ||= @parser.parse_compliance_policy(compliance_policies) + compliance_policies_parsed[node.uuid] || create_default_compliance + end + + def create_default_compliance + { + :policy_name => Parsers::CompliancePolicyParser::COMPLIANCE_NAME, + :status => Parsers::CompliancePolicyParser::COMPLIANCE_STATUS[''], + } + end + def get_config_patterns config_patterns = @connection.discover_config_pattern process_collection(config_patterns, :customization_scripts) { |config_pattern| @parser.parse_config_pattern(config_pattern) }