From 76828978e2cd865e532f5fa5e2192c7a80d388ba Mon Sep 17 00:00:00 2001 From: Bernhard Suttner Date: Wed, 14 Feb 2024 10:25:00 +0100 Subject: [PATCH] Fixes #37166 - Add procedure to remove corrupted host statuses --- .../foreman/remove_corrupted_host_statuses.rb | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 definitions/procedures/foreman/remove_corrupted_host_statuses.rb diff --git a/definitions/procedures/foreman/remove_corrupted_host_statuses.rb b/definitions/procedures/foreman/remove_corrupted_host_statuses.rb new file mode 100644 index 000000000..b846c6f79 --- /dev/null +++ b/definitions/procedures/foreman/remove_corrupted_host_statuses.rb @@ -0,0 +1,43 @@ +module Procedures::Foreman + class RemoveCorruptedHostStatuses < ForemanMaintain::Procedure + metadata do + for_feature :foreman_database + description 'Remove corrupted host statuses' + end + + def run + corrupted = collect_host_status_with_type_nil + if corrupted.empty? + skip("No corrupted host status. Everything fine. Exit.") + end + + print("Detected corrupted host statuses:\n") + corrupted.each do |s| + print("Host #{s['host_name']} has corrupted host_status with id #{s['host_status_id']}\n") + end + + answer = ask_decision("Do you want to remove the statuses", actions_msg: 'y(yes), q(quit)') + abort! unless answer == :yes + + with_spinner('Removing corrupted host statuses') do + delete_host_status_with_type_nil + end + end + + private + + def collect_host_status_with_type_nil + feature(:foreman_database).query( + "SELECT hosts.name AS host_name, host_status.id AS host_status_id + FROM hosts, host_status + WHERE host_status.type IS NULL AND hosts.id = host_status.host_id" + ) + end + + def delete_host_status_with_type_nil + feature(:foreman_database).psql( + "DELETE FROM host_status WHERE type IS NULL" + ) + end + end +end