0016_replicate_interfaces.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import sys
  2. from django.db import migrations
  3. def replicate_interfaces(apps, schema_editor):
  4. ContentType = apps.get_model('contenttypes', 'ContentType')
  5. TaggedItem = apps.get_model('extras', 'TaggedItem')
  6. Interface = apps.get_model('dcim', 'Interface')
  7. IPAddress = apps.get_model('ipam', 'IPAddress')
  8. VMInterface = apps.get_model('virtualization', 'VMInterface')
  9. interface_ct = ContentType.objects.get_for_model(Interface)
  10. vminterface_ct = ContentType.objects.get_for_model(VMInterface)
  11. # Replicate dcim.Interface instances assigned to VirtualMachines
  12. original_interfaces = Interface.objects.filter(virtual_machine__isnull=False)
  13. for interface in original_interfaces:
  14. vm_interface = VMInterface(
  15. virtual_machine=interface.virtual_machine,
  16. name=interface.name,
  17. enabled=interface.enabled,
  18. mac_address=interface.mac_address,
  19. mtu=interface.mtu,
  20. mode=interface.mode,
  21. description=interface.description,
  22. untagged_vlan=interface.untagged_vlan,
  23. )
  24. vm_interface.save()
  25. # Copy tagged VLANs
  26. vm_interface.tagged_vlans.set(interface.tagged_vlans.all())
  27. # Reassign tags to the new instance
  28. TaggedItem.objects.filter(
  29. content_type=interface_ct, object_id=interface.pk
  30. ).update(
  31. content_type=vminterface_ct, object_id=vm_interface.pk
  32. )
  33. # Update any assigned IPAddresses
  34. IPAddress.objects.filter(assigned_object_id=interface.pk).update(
  35. assigned_object_type=vminterface_ct,
  36. assigned_object_id=vm_interface.pk
  37. )
  38. replicated_count = VMInterface.objects.count()
  39. if 'test' not in sys.argv:
  40. print(f"\n Replicated {replicated_count} interfaces ", end='', flush=True)
  41. # Verify that all interfaces have been replicated
  42. assert replicated_count == original_interfaces.count(), "Replicated interfaces count does not match original count!"
  43. # Delete original VM interfaces
  44. original_interfaces.delete()
  45. class Migration(migrations.Migration):
  46. dependencies = [
  47. ('ipam', '0037_ipaddress_assignment'),
  48. ('virtualization', '0015_vminterface'),
  49. ]
  50. operations = [
  51. migrations.RunPython(
  52. code=replicate_interfaces
  53. ),
  54. ]