Skip to content

Commit

Permalink
Foreman RH Cloud API Bindings to upload hits
Browse files Browse the repository at this point in the history
Co-authored-by: Evgeni Golov <[email protected]>
Co-authored-by: Jeremy Lenz <[email protected]>
  • Loading branch information
3 people committed Jan 17, 2025
1 parent dc80828 commit ff0ba10
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 2 deletions.
72 changes: 72 additions & 0 deletions app/controllers/api/v2/advisor_engine/advisor_engine_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ module V2
module AdvisorEngine
class AdvisorEngineController < ::Api::V2::BaseController
include ::Api::Version2
include Foreman::Controller::SmartProxyAuth
include ::Foreman::Controller::FilterParameters

filter_parameters :payload
add_smart_proxy_filters [:host_details, :upload_hits]

api :GET, "/advisor_engine/host_details", N_('Fetch Insights-related host details')
param :host_uuids, Array, required: true, desc: N_('List of host UUIDs')
Expand All @@ -17,6 +22,73 @@ def host_details
end
end
end

api :PATCH, "/advisor_engine/upload_hits", N_("Upload hits from iop-advisor-engine")
param :host_name, String, required: true
param :host_uuid, String

param :payload, Hash, :desc => N_("iop payload including resolutions, rules, hits") do
param :resolutions, Array, :desc => N_("upload resolutions related to the hits") do
param :rule_id, String, :desc => N_("rule id"), :required => true
param :description, String, :desc => N_("resolution description")
param :needs_reboot, :bool, :desc => N_("Whether the resolution requires reboot")
param :resolution_risk, String, :desc => N_("resolution risk")
param :resolution_type, String, :desc => N_("type")
end

param :rules, Array, :desc => N_("Upload rules related to the hits") do
param :rule_id, String, :desc => N_("rule id"), :required => true
param :description, String, :desc => N_("rule description")
param :category_name, String, :desc => N_("category name")
param :impact_name, String, :desc => N_("impact name")
param :summary, String, :desc => N_("summary")
param :generic, String, :desc => N_("generic")
param :reason, String, :desc => N_("reason")
param :total_risk, :number, :desc => N_("total risk")
param :reboot_required, :bool, :desc => N_("reboot required")
param :more_info, String, :desc => N_("more info")
param :rating, :number, :desc => N_("rating")
end

param :hits, Array, :desc => N_("Upload hits information") do
param :rule_id, String, :desc => N_("rule id"), :required => true
param :title, String, :desc => N_("rule title")
param :solution_url, String, :desc => N_("solution url")
param :total_risk, :number, :desc => N_("total risk")
param :likelihood, :number, :desc => N_("likelihood number")
param :publish_date, String, :desc => N_("publish date (YYYY-MM-DD)")
param :results_url, String, :desc => N_("result url")
end
param :details, String, :desc => N_("upload hits details json")
end

def upload_hits
host = Host.find_by(name: params.require(:host_name))
payload = payload_params.to_h
hits_service = ForemanRhCloud::UploadHits.new(host: host, uuid: params[:host_uuid], payload: payload)
hits_service.upload!
render json: {
action_status: 'success',
}, status: :ok
end

def payload_params
params.require(:payload).permit(
:details,
{
resolutions: [
:rule_id, :description, :needs_reboot, :resolution_risk, :resolution_type
],
rules: [
:rule_id, :description, :category_name, :impact_name, :summary, :generic,
:reason, :total_risk, :reboot_required, :more_info, :rating
],
hits: [
:rule_id, :title, :solution_url, :total_risk, :likelihood, :publish_date, :results_url
],
}
)
end
end
end
end
Expand Down
51 changes: 51 additions & 0 deletions app/services/foreman_rh_cloud/upload_hits.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
module ForemanRhCloud
class UploadHits
def initialize(host:, uuid: nil, payload:)

Check failure on line 3 in app/services/foreman_rh_cloud/upload_hits.rb

View workflow job for this annotation

GitHub Actions / Rubocop / Rubocop

Style/KeywordParametersOrder: Place optional keyword parameters at the end of the parameters list.
@host = host
@uuid = uuid
@payload = payload
end

def upload!
ActiveRecord::Base.transaction do
update_facets
update_hits
update_rules_and_resolutions
update_details
end
end

private

def update_facets
facet = InsightsFacet.find_or_create_by(host_id: @host.id)
facet.update!(uuid: @uuid) if @uuid.present?
@host.reload
end

def update_hits
facet = @host.insights
facet.hits.delete_all
hits = @payload[:hits]
# rubocop:disable Rails/SkipsModelValidations
facet.hits.insert_all(hits)
# rubocop:enable Rails/SkipsModelValidations
InsightsFacet.reset_counters(facet.id, :hits_count)
end

def update_rules_and_resolutions
# rubocop:disable Rails/SkipsModelValidations
::InsightsRule.upsert_all(@payload[:rules], unique_by: :rule_id)
rules = @payload[:rules].map { |rule| rule[:rule_id] }
::InsightsResolution.where(rule_id: rules).delete_all
::InsightsResolution.insert_all(@payload[:resolutions])
# rubocop:enable Rails/SkipsModelValidations
end

def update_details
fact_name = FactName.where(name: "insights::hit_details", short_name: 'insights_details').first_or_create
fact_value = @host.fact_values.where(fact_name: fact_name).first_or_create
fact_value.update(value: @payload[:details])
end
end
end
3 changes: 1 addition & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,12 @@

namespace 'rh_cloud' do
post 'enable_connector', to: 'inventory#enable_cloud_connector'

post 'cloud_request', to: 'cloud_request#update'
end

namespace 'advisor_engine' do
get 'host_details', to: 'advisor_engine#host_details'
# post 'upload_hits', to: 'advisor_engine#upload_hits'
patch 'upload_hits', to: 'advisor_engine#upload_hits'
end
end
end
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddUniqueIndexToRuleIdAndHostIdInInsightsHits < ActiveRecord::Migration[7.0]
def change
add_index :insights_hits, [:rule_id, :host_id], unique: true, name: 'index_insight_hits_on_rule_id_and_host_id'
end
end

0 comments on commit ff0ba10

Please sign in to comment.