From a0b376a6cac4ac118a0b646d3d4b9e5c40928c8e Mon Sep 17 00:00:00 2001 From: Jeff Bradberry Date: Mon, 6 May 2024 14:48:06 -0400 Subject: [PATCH] Set up a scenario where IG.use_role_id points to something no longer there This is actually happening for one customer, though it seems like it shouldn't be if the foreign key constraint is set back up properly. In order to recreate it, I had to add the constraint back with 'NOT VALID' added on to prevent the check. --- tools/scripts/ig-hotfix/test3.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tools/scripts/ig-hotfix/test3.py diff --git a/tools/scripts/ig-hotfix/test3.py b/tools/scripts/ig-hotfix/test3.py new file mode 100644 index 0000000000..2bf17d705e --- /dev/null +++ b/tools/scripts/ig-hotfix/test3.py @@ -0,0 +1,28 @@ +from django.db import connection +from awx.main.models import InstanceGroup + +InstanceGroup.objects.filter(name__in=('green', 'yellow', 'red', 'blue')).delete() + +green = InstanceGroup.objects.create(name='green') +red = InstanceGroup.objects.create(name='red') +yellow = InstanceGroup.objects.create(name='yellow') +blue = InstanceGroup.objects.create(name='blue') + +for ig in InstanceGroup.objects.all(): + print((ig.id, ig.name, ig.use_role_id)) + +with connection.cursor() as cursor: + cursor.execute("ALTER TABLE main_instancegroup DROP CONSTRAINT main_instancegroup_use_role_id_48ea7ecc_fk_main_rbac_roles_id") + + cursor.execute(f"UPDATE main_rbac_roles SET object_id = NULL WHERE id = {red.use_role_id}") + cursor.execute(f"DELETE FROM main_rbac_roles_parents WHERE from_role_id = {blue.use_role_id} OR to_role_id = {blue.use_role_id}") + cursor.execute(f"DELETE FROM main_rbac_role_ancestors WHERE ancestor_id = {blue.use_role_id} OR descendent_id = {blue.use_role_id}") + cursor.execute(f"DELETE FROM main_rbac_roles WHERE id = {blue.use_role_id}") + cursor.execute("UPDATE main_instancegroup SET use_role_id = NULL WHERE name = 'red'") + cursor.execute(f"UPDATE main_instancegroup SET use_role_id = {green.use_role_id} WHERE name = 'yellow'") + + cursor.execute("ALTER TABLE main_instancegroup ADD CONSTRAINT main_instancegroup_use_role_id_48ea7ecc_fk_main_rbac_roles_id FOREIGN KEY (use_role_id) REFERENCES public.main_rbac_roles(id) DEFERRABLE INITIALLY DEFERRED NOT VALID") + +print("=====================================") +for ig in InstanceGroup.objects.all(): + print((ig.id, ig.name, ig.use_role_id))