Implemented AC-22, hosts and child groups are migrated to a group's parent when the group is deleted or marked inactive.

This commit is contained in:
Chris Church
2013-07-27 01:06:09 -04:00
parent d78bc8fb19
commit 764d2ff94d
2 changed files with 92 additions and 2 deletions

View File

@@ -8,7 +8,7 @@ import threading
# Django
from django.contrib.auth.models import User
from django.db import DatabaseError
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.db.models.signals import post_save, pre_delete, post_delete, m2m_changed
from django.dispatch import receiver
# Django-REST-Framework
@@ -75,3 +75,45 @@ m2m_changed.connect(update_inventory_has_active_failures, sender=Group.hosts.thr
m2m_changed.connect(update_inventory_has_active_failures, sender=Group.parents.through)
post_save.connect(update_inventory_has_active_failures, sender=Job)
post_delete.connect(update_inventory_has_active_failures, sender=Job)
# Migrate hosts, groups to parent group(s) whenever a group is deleted or
# marked as inactive.
@receiver(pre_delete, sender=Group)
def save_related_pks_before_group_delete(sender, **kwargs):
instance = kwargs['instance']
instance._saved_parents_pks = set(instance.parents.values_list('pk', flat=True))
instance._saved_hosts_pks = set(instance.hosts.values_list('pk', flat=True))
instance._saved_children_pks = set(instance.children.values_list('pk', flat=True))
@receiver(post_delete, sender=Group)
def migrate_children_from_deleted_group_to_parent_groups(sender, **kwargs):
instance = kwargs['instance']
parents_pks = getattr(instance, '_saved_parents_pks', [])
hosts_pks = getattr(instance, '_saved_hosts_pks', [])
children_pks = getattr(instance, '_saved_children_pks', [])
for parent_group in Group.objects.filter(pk__in=parents_pks):
for child_host in Host.objects.filter(pk__in=hosts_pks):
logger.debug('adding host %s to parent %s after group deletion',
child_host, parent_group)
parent_group.hosts.add(child_host)
for child_group in Group.objects.filter(pk__in=children_pks):
logger.debug('adding group %s to parent %s after group deletion',
child_group, parent_group)
parent_group.children.add(child_group)
@receiver(post_save, sender=Group)
def migrate_children_from_inactive_group_to_parent_groups(sender, **kwargs):
instance = kwargs['instance']
if instance.active:
return
for parent_group in instance.parents.all():
for child_host in instance.hosts.all():
logger.debug('moving host %s to parent %s after making group %s inactive',
child_host, parent_group, instance)
parent_group.hosts.add(child_host)
for child_group in instance.children.all():
logger.debug('moving group %s to parent %s after making group %s inactive',
child_group, parent_group, instance)
parent_group.children.add(child_group)
parent_group.children.remove(instance)