Bug #32673
closedMigrations fail with 'could not create unique index "index_lookup_values_on_lookup_key_id_and_match"' error
Description
Cloned from https://bugzilla.redhat.com/show_bug.cgi?id=1960530
Description of problem:
While attempting to upgrade the Foreman from 2.1 to 2.2 version, It fails at the db:migrate stage with this error
PG::UniqueViolation: ERROR: could not create unique index "index_lookup_values_on_lookup_key_id_and_match"
DETAIL: Key (lookup_key_id, match)=(146, fqdn=myhost.example.com) is duplicated.
Version-Release number of selected component (if applicable):
Foreman 2.2 [ 2.1 to 2.2 upgrade ]
How reproducible:
Under specific circumstances i.e. when lookup_values table has duplicate record
Steps to reproduce:
1. Install and configure Foreman 2.1
2. Import some puppet modules and create some puppet smart class overrides
3. Find a way to create a duplicate override record of one of the puppet smart class parameters inside lookup_values table
4. Perform the upgrade to 2.2
Actual Results:
db:migrate stage will fail at following
StandardError: An error has occurred, this and all later migrations canceled:
PG::UniqueViolation: ERROR: could not create unique index "index_lookup_values_on_lookup_key_id_and_match"
DETAIL: Key (lookup_key_id, match)=(146, fqdn=myhost.example.com) is duplicated.
/opt/theforeman/tfm/root/usr/share/gems/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/postgresql/database_statements.rb:92:in `async_exec'
/opt/theforeman/tfm/root/usr/share/gems/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/postgresql/database_statements.rb:92:in `block (2 levels) in execute'
/opt/theforeman/tfm/root/usr/share/gems/gems/activesupport-6.0.3.4/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
Expected results:
Before the db:migrate happens, these inconsistencies should be properly detected, printed and if needed cleared up.
Additional Information:
Manual Solution present i.e. to identify the duplicate record and delete the one which is not needed.
See https://community.theforeman.org/t/upgrade-from-foreman-2-1-to-2-2-failed-with-postgres-error/21443 for more details