app/services/katello/pulp3/erratum.rb
module Katello
module Pulp3
class Erratum < PulpContentUnit
include LazyAccessor
PULPCORE_CONTENT_TYPE = "rpm.advisory".freeze
def self.content_api
PulpRpmClient::ContentAdvisoriesApi.new(Katello::Pulp3::Api::Yum.new(SmartProxy.pulp_primary!).api_client)
end
def self.unit_identifier
"id"
end
def self.backend_unit_identifier
"pulp_href"
end
def self.supports_id_fetch?
false
end
def self.ids_for_repository(repo_id)
repo = Katello::Pulp3::Repository::Yum.new(Katello::Repository.find(repo_id), SmartProxy.pulp_primary)
repo_content_list = repo.content_list
repo_content_list.map { |content| content.try(:pulp_href) }
end
def self.generate_model_row(unit)
keys = %w(title id severity issued_date type description reboot_suggested solution updated_date summary)
custom_json = unit.slice(*keys)
custom_json.inject(HashWithIndifferentAccess.new({})) { |h, (k, v)| h.merge({ k => v.respond_to?(:strip) ? v.strip : v }) }
custom_json['pulp_id'] = custom_json['id']
custom_json["issued"] = custom_json.delete("issued_date")
custom_json["updated"] = custom_json.delete("updated_date")
custom_json['title'] = custom_json['title']&.truncate(255)
# handle SUSE epoch dates
custom_json["issued"] = convert_date_if_epoch(custom_json["issued"])
custom_json["updated"] = convert_date_if_epoch(custom_json["updated"]) unless custom_json["updated"].blank?
custom_json['errata_id'] = custom_json.delete('id')
custom_json['errata_type'] = custom_json.delete('type')
custom_json['issued'] = custom_json['issued'].to_datetime.strftime('%Y-%m-%d').to_datetime
custom_json['updated'] = custom_json['updated'].blank? ? custom_json['issued'] : custom_json['updated'].to_datetime.strftime('%Y-%m-%d').to_datetime
custom_json
end
def self.insert_child_associations(units, pulp_id_to_id)
bugzillas = []
cves = []
packages = []
modules = []
units.each do |unit|
katello_id = pulp_id_to_id[unit['id']]
bugzillas += build_bugzillas(katello_id, unit['references'])
cves += build_cves(katello_id, unit['references'])
packages += build_packages(katello_id, unit['pkglist'])
end
Katello::ErratumBugzilla.insert_all(bugzillas, unique_by: [:erratum_id, :bug_id, :href]) if bugzillas.any?
Katello::ErratumCve.insert_all(cves, unique_by: [:erratum_id, :cve_id, :href]) if cves.any?
Katello::ErratumPackage.insert_all(packages, unique_by: [:erratum_id, :nvrea, :name, :filename]) if packages.any?
units.each do |unit|
katello_id = pulp_id_to_id[unit['id']]
modules += build_modules(katello_id, unit['pkglist'])
end
ModuleStreamErratumPackage.insert_all(modules, unique_by: [:module_stream_id, :erratum_package_id]) if modules.any?
nil
end
def self.build_bugzillas(katello_id, ref_list)
ref_list.select { |r| r[:type] == "bugzilla" }.map do |bugzilla|
{
bug_id: bugzilla[:id],
href: bugzilla[:href],
erratum_id: katello_id
}
end
end
def self.build_cves(katello_id, ref_list)
ref_list.select { |r| r[:type] == "cve" }.map do |cve|
{
cve_id: cve[:id],
href: cve[:href],
erratum_id: katello_id
}
end
end
def self.build_packages(katello_id, pkg_list)
list = pkg_list.map do |json|
package_hashes = json[:packages]
package_hashes.map do |hash|
nvrea = Util::Package.build_nvra(hash)
{'name' => hash[:name], 'nvrea' => nvrea, 'filename' => hash[:filename], :erratum_id => katello_id}
end
end
list.flatten
end
def self.build_modules(katello_id, module_stream_list)
module_stream_attributes = []
module_stream_list.each do |package_item|
if package_item[:module]
module_stream = ::Katello::ModuleStream.where(package_item[:module]).first
next if module_stream.blank?
nvreas = package_item[:packages].map { |hash| Util::Package.build_nvra(hash) }
package_ids = Katello::ErratumPackage.where(:erratum_id => katello_id, :nvrea => nvreas).pluck(:id)
module_stream_attributes += package_ids.map do |pkg_id|
{ :module_stream_id => module_stream.id,
:erratum_package_id => pkg_id }
end
end
end
module_stream_attributes.uniq
end
def self.convert_date_if_epoch(date)
date.to_i.to_s == date ? epoch_to_date(date) : date
end
def self.epoch_to_date(epoch)
Time.at(epoch.to_i).to_s
end
end
end
end