mirror of
				https://github.com/netbox-community/netbox.git
				synced 2024-05-10 07:54:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			323 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import sys
 | |
| 
 | |
| from django.db import migrations, models
 | |
| import django.db.models.deletion
 | |
| 
 | |
| import utilities.fields
 | |
| 
 | |
| 
 | |
| def console_connections_to_cables(apps, schema_editor):
 | |
|     """
 | |
|     Copy all existing console connections as Cables
 | |
|     """
 | |
|     ContentType = apps.get_model('contenttypes', 'ContentType')
 | |
|     ConsolePort = apps.get_model('dcim', 'ConsolePort')
 | |
|     ConsoleServerPort = apps.get_model('dcim', 'ConsoleServerPort')
 | |
|     Cable = apps.get_model('dcim', 'Cable')
 | |
| 
 | |
|     # Load content types
 | |
|     consoleport_type = ContentType.objects.get_for_model(ConsolePort)
 | |
|     consoleserverport_type = ContentType.objects.get_for_model(ConsoleServerPort)
 | |
| 
 | |
|     # Create a new Cable instance from each console connection
 | |
|     if 'test' not in sys.argv:
 | |
|         print("\n    Adding console connections... ", end='', flush=True)
 | |
|     for consoleport in ConsolePort.objects.filter(connected_endpoint__isnull=False):
 | |
| 
 | |
|         # Create the new Cable
 | |
|         cable = Cable.objects.create(
 | |
|             termination_a_type=consoleport_type,
 | |
|             termination_a_id=consoleport.id,
 | |
|             termination_b_type=consoleserverport_type,
 | |
|             termination_b_id=consoleport.connected_endpoint_id,
 | |
|             status=consoleport.connection_status
 | |
|         )
 | |
| 
 | |
|         # Cache the Cable on its two termination points
 | |
|         ConsolePort.objects.filter(pk=consoleport.id).update(
 | |
|             cable=cable
 | |
|         )
 | |
|         ConsoleServerPort.objects.filter(pk=consoleport.connected_endpoint_id).update(
 | |
|             connection_status=consoleport.connection_status,
 | |
|             cable=cable
 | |
|         )
 | |
| 
 | |
|     cable_count = Cable.objects.filter(termination_a_type=consoleport_type).count()
 | |
|     if 'test' not in sys.argv:
 | |
|         print("{} cables created".format(cable_count))
 | |
| 
 | |
|     # Normalize connection_status for all non-connected ConsolePorts
 | |
|     ConsolePort.objects.filter(connected_endpoint__isnull=True).update(connection_status=None)
 | |
| 
 | |
| 
 | |
| def power_connections_to_cables(apps, schema_editor):
 | |
|     """
 | |
|     Copy all existing power connections as Cables
 | |
|     """
 | |
|     ContentType = apps.get_model('contenttypes', 'ContentType')
 | |
|     PowerPort = apps.get_model('dcim', 'PowerPort')
 | |
|     PowerOutlet = apps.get_model('dcim', 'PowerOutlet')
 | |
|     Cable = apps.get_model('dcim', 'Cable')
 | |
| 
 | |
|     # Load content types
 | |
|     powerport_type = ContentType.objects.get_for_model(PowerPort)
 | |
|     poweroutlet_type = ContentType.objects.get_for_model(PowerOutlet)
 | |
| 
 | |
|     # Create a new Cable instance from each power connection
 | |
|     if 'test' not in sys.argv:
 | |
|         print("    Adding power connections... ", end='', flush=True)
 | |
|     for powerport in PowerPort.objects.filter(connected_endpoint__isnull=False):
 | |
| 
 | |
|         # Create the new Cable
 | |
|         cable = Cable.objects.create(
 | |
|             termination_a_type=powerport_type,
 | |
|             termination_a_id=powerport.id,
 | |
|             termination_b_type=poweroutlet_type,
 | |
|             termination_b_id=powerport.connected_endpoint_id,
 | |
|             status=powerport.connection_status
 | |
|         )
 | |
| 
 | |
|         # Cache the Cable on its two termination points
 | |
|         PowerPort.objects.filter(pk=powerport.id).update(
 | |
|             cable=cable
 | |
|         )
 | |
|         PowerOutlet.objects.filter(pk=powerport.connected_endpoint_id).update(
 | |
|             connection_status=powerport.connection_status,
 | |
|             cable=cable
 | |
|         )
 | |
| 
 | |
|     cable_count = Cable.objects.filter(termination_a_type=powerport_type).count()
 | |
|     if 'test' not in sys.argv:
 | |
|         print("{} cables created".format(cable_count))
 | |
| 
 | |
|     # Normalize connection_status for all non-connected PowerPorts
 | |
|     PowerPort.objects.filter(connected_endpoint__isnull=True).update(connection_status=None)
 | |
| 
 | |
| 
 | |
| def interface_connections_to_cables(apps, schema_editor):
 | |
|     """
 | |
|     Copy all InterfaceConnections as Cables
 | |
|     """
 | |
|     ContentType = apps.get_model('contenttypes', 'ContentType')
 | |
|     Interface = apps.get_model('dcim', 'Interface')
 | |
|     InterfaceConnection = apps.get_model('dcim', 'InterfaceConnection')
 | |
|     Cable = apps.get_model('dcim', 'Cable')
 | |
| 
 | |
|     # Load content types
 | |
|     interface_type = ContentType.objects.get_for_model(Interface)
 | |
| 
 | |
|     # Create a new Cable instance from each InterfaceConnection
 | |
|     if 'test' not in sys.argv:
 | |
|         print("    Adding interface connections... ", end='', flush=True)
 | |
|     for conn in InterfaceConnection.objects.all():
 | |
| 
 | |
|         # Create the new Cable
 | |
|         cable = Cable.objects.create(
 | |
|             termination_a_type=interface_type,
 | |
|             termination_a_id=conn.interface_a_id,
 | |
|             termination_b_type=interface_type,
 | |
|             termination_b_id=conn.interface_b_id,
 | |
|             status=conn.connection_status
 | |
|         )
 | |
| 
 | |
|         # Cache the connected Cable on each Interface
 | |
|         Interface.objects.filter(pk=conn.interface_a_id).update(
 | |
|             _connected_interface=conn.interface_b,
 | |
|             connection_status=conn.connection_status,
 | |
|             cable=cable
 | |
|         )
 | |
|         Interface.objects.filter(pk=conn.interface_b_id).update(
 | |
|             _connected_interface=conn.interface_a,
 | |
|             connection_status=conn.connection_status,
 | |
|             cable=cable
 | |
|         )
 | |
| 
 | |
|     cable_count = Cable.objects.filter(termination_a_type=interface_type).count()
 | |
|     if 'test' not in sys.argv:
 | |
|         print("{} cables created".format(cable_count))
 | |
| 
 | |
| 
 | |
| def delete_interfaceconnection_content_type(apps, schema_editor):
 | |
|     """
 | |
|     Delete the ContentType for the InterfaceConnection model. (This is not done automatically upon model deletion.)
 | |
|     """
 | |
|     ContentType = apps.get_model('contenttypes', 'ContentType')
 | |
|     InterfaceConnection = apps.get_model('dcim', 'InterfaceConnection')
 | |
|     ContentType.objects.get_for_model(InterfaceConnection).delete()
 | |
| 
 | |
| 
 | |
| class Migration(migrations.Migration):
 | |
|     atomic = False
 | |
| 
 | |
|     dependencies = [
 | |
|         ('contenttypes', '0002_remove_content_type_name'),
 | |
|         ('circuits', '0006_terminations'),
 | |
|         ('dcim', '0065_front_rear_ports'),
 | |
|     ]
 | |
| 
 | |
|     operations = [
 | |
| 
 | |
|         # Create the Cable model
 | |
|         migrations.CreateModel(
 | |
|             name='Cable',
 | |
|             options={'ordering': ['pk']},
 | |
|             fields=[
 | |
|                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
 | |
|                 ('created', models.DateField(auto_now_add=True, null=True)),
 | |
|                 ('last_updated', models.DateTimeField(auto_now=True, null=True)),
 | |
|                 ('termination_a_id', models.PositiveIntegerField()),
 | |
|                 ('termination_b_id', models.PositiveIntegerField()),
 | |
|                 ('type', models.PositiveSmallIntegerField(blank=True, null=True)),
 | |
|                 ('status', models.BooleanField(default=True)),
 | |
|                 ('label', models.CharField(blank=True, max_length=100)),
 | |
|                 ('color', utilities.fields.ColorField(blank=True, max_length=6)),
 | |
|                 ('length', models.PositiveSmallIntegerField(blank=True, null=True)),
 | |
|                 ('length_unit', models.PositiveSmallIntegerField(blank=True, null=True)),
 | |
|                 ('_abs_length', models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True)),
 | |
|                 ('termination_a_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
 | |
|                 ('termination_b_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
 | |
|             ],
 | |
|         ),
 | |
|         migrations.AlterUniqueTogether(
 | |
|             name='cable',
 | |
|             unique_together={('termination_b_type', 'termination_b_id'), ('termination_a_type', 'termination_a_id')},
 | |
|         ),
 | |
| 
 | |
|         # Alter console port models
 | |
|         migrations.RenameField(
 | |
|             model_name='consoleport',
 | |
|             old_name='cs_port',
 | |
|             new_name='connected_endpoint'
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='consoleport',
 | |
|             name='device',
 | |
|             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.Device'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='consoleport',
 | |
|             name='connected_endpoint',
 | |
|             field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_endpoint', to='dcim.ConsoleServerPort'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='consoleport',
 | |
|             name='connection_status',
 | |
|             field=models.NullBooleanField(),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='consoleport',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='consoleserverport',
 | |
|             name='device',
 | |
|             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.Device'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='consoleserverport',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='consoleserverport',
 | |
|             name='connection_status',
 | |
|             field=models.NullBooleanField(),
 | |
|         ),
 | |
| 
 | |
|         # Alter power port models
 | |
|         migrations.RenameField(
 | |
|             model_name='powerport',
 | |
|             old_name='power_outlet',
 | |
|             new_name='connected_endpoint'
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='powerport',
 | |
|             name='device',
 | |
|             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.Device'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='powerport',
 | |
|             name='connected_endpoint',
 | |
|             field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_endpoint', to='dcim.PowerOutlet'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='powerport',
 | |
|             name='connection_status',
 | |
|             field=models.NullBooleanField(),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='powerport',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
|         migrations.AlterField(
 | |
|             model_name='poweroutlet',
 | |
|             name='device',
 | |
|             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.Device'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='poweroutlet',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='poweroutlet',
 | |
|             name='connection_status',
 | |
|             field=models.NullBooleanField(),
 | |
|         ),
 | |
| 
 | |
|         # Alter the Interface model
 | |
|         migrations.AddField(
 | |
|             model_name='interface',
 | |
|             name='_connected_circuittermination',
 | |
|             field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.CircuitTermination'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='interface',
 | |
|             name='_connected_interface',
 | |
|             field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Interface'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='interface',
 | |
|             name='connection_status',
 | |
|             field=models.NullBooleanField(),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='interface',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
| 
 | |
|         # Alter front/rear port models
 | |
|         migrations.AddField(
 | |
|             model_name='frontport',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
|         migrations.AddField(
 | |
|             model_name='rearport',
 | |
|             name='cable',
 | |
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
 | |
|         ),
 | |
| 
 | |
|         # Copy console/power/interface connections as Cables
 | |
|         migrations.RunPython(console_connections_to_cables),
 | |
|         migrations.RunPython(power_connections_to_cables),
 | |
|         migrations.RunPython(interface_connections_to_cables),
 | |
| 
 | |
|         # Delete the InterfaceConnection model and its ContentType
 | |
|         migrations.RunPython(delete_interfaceconnection_content_type),
 | |
|         migrations.RemoveField(
 | |
|             model_name='interfaceconnection',
 | |
|             name='interface_a',
 | |
|         ),
 | |
|         migrations.RemoveField(
 | |
|             model_name='interfaceconnection',
 | |
|             name='interface_b',
 | |
|         ),
 | |
|         migrations.DeleteModel(
 | |
|             name='InterfaceConnection',
 | |
|         ),
 | |
|     ]
 |