Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Halt upgrades if evr is not owned by foreman on external DB #953

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions definitions/checks/foreman/check_external_db_evr_permissions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
module Checks
module Foreman
class CheckExternalDbEvrPermissions < ForemanMaintain::Check
metadata do
label :external_db_evr_permissions
for_feature :foreman_database
description 'Check that external databases have proper EVR extension permissions'
tags :pre_upgrade
confine do
feature(:foreman_database) && !feature(:foreman_database).local? && feature(:katello)
end
end

def run
return true unless evr_exists?

error_msg = 'The evr extension is not owned by the foreman database owner. ' \
'Please run the following command on the external foreman database to fix it: ' \
'UPDATE pg_extension SET extowner = (SELECT oid FROM pg_authid WHERE ' \
"rolname='#{foreman_db_user}') WHERE extname='evr';"
fail!(error_msg) unless foreman_owns_evr?
end

private

def foreman_db_user
feature(:foreman_database).configuration['username'] || 'foreman'
end

def evr_exists?
evr_exists = feature(:foreman_database).query(query_for_evr_existence)
return false if evr_exists.empty?
return evr_exists.first['evr_exists'] == '1'
end

def foreman_owns_evr?
evr_owned_by_postgres = feature(:foreman_database).query(query_if_postgres_owns_evr)
unless evr_owned_by_postgres.empty?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it won't ever be empty, given at this point we do know the extension exists, so it must have some owner?
But it also doesn't hurt to play safe here :)

return evr_owned_by_postgres.first['evr_owned_by_postgres'] == '0'
end
failure_msg = 'Could not determine if the evr extension is owned by the ' \
'foreman database owner. Check that the foreman database is accessible ' \
"and that the database connection configuration is up to date."
fail!(failure_msg)
end

def query_for_evr_existence
<<-SQL
SELECT 1 AS evr_exists FROM pg_extension WHERE extname = 'evr'
SQL
end

def query_if_postgres_owns_evr
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically, this doesn't check whether postgres owns it, but whether foreman_db_user (not) owns it.

<<-SQL
SELECT CASE WHEN r.rolname = '#{foreman_db_user}' THEN 0 ELSE 1 END AS evr_owned_by_postgres
FROM pg_extension e JOIN pg_roles r ON e.extowner = r.oid WHERE e.extname = 'evr'
SQL
end
end
end
end
1 change: 1 addition & 0 deletions definitions/scenarios/foreman_upgrade.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def compose
Checks::Disk::AvailableSpaceCandlepin, # if candlepin
Checks::Disk::AvailableSpacePostgresql13,
Checks::Foreman::ValidateExternalDbVersion, # if external database
Checks::Foreman::CheckExternalDbEvrPermissions, # if external database
Checks::Foreman::CheckCorruptedRoles,
Checks::Foreman::CheckDuplicatePermissions,
Checks::Foreman::TuningRequirements, # if katello present
Expand Down
1 change: 1 addition & 0 deletions definitions/scenarios/satellite_upgrade.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def compose
Checks::Disk::AvailableSpace,
Checks::Disk::AvailableSpaceCandlepin, # if candlepin
Checks::Foreman::ValidateExternalDbVersion, # if external database
Checks::Foreman::CheckExternalDbEvrPermissions, # if external database
Checks::Foreman::CheckCorruptedRoles,
Checks::Foreman::CheckDuplicatePermissions,
Checks::Foreman::TuningRequirements, # if katello present
Expand Down
Loading