1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

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', 'circuittermination', 'powerfeed']}, 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', 'circuittermination', 'powerfeed']}, 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',
),
]