Skip to content

Commit

Permalink
#9047 - Re-introduce provider FK to Circuit model
Browse files Browse the repository at this point in the history
  • Loading branch information
DanSheps committed Mar 27, 2023
1 parent c91d8bd commit c4e031e
Show file tree
Hide file tree
Showing 18 changed files with 107 additions and 111 deletions.
2 changes: 1 addition & 1 deletion docs/features/circuits.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ NetBox is ideal for managing your network's transit and peering providers and ci
flowchart TD
ASN --> Provider
Provider --> ProviderAccount --> Circuit
Provider --> ProviderNetwork
Provider --> ProviderNetwork & Circuit
CircuitType --> Circuit
click ASN "../../models/circuits/asn/"
Expand Down
7 changes: 4 additions & 3 deletions netbox/circuits/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ class Meta:

class CircuitSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail')
provider = NestedProviderSerializer()
provider_account = NestedProviderAccountSerializer()
status = ChoiceField(choices=CircuitStatusChoices, required=False)
type = NestedCircuitTypeSerializer()
Expand All @@ -115,9 +116,9 @@ class CircuitSerializer(NetBoxModelSerializer):
class Meta:
model = Circuit
fields = [
'id', 'url', 'display', 'cid', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date',
'commit_rate', 'description', 'termination_a', 'termination_z', 'comments', 'tags', 'custom_fields',
'created', 'last_updated',
'id', 'url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date',
'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', 'comments', 'tags',
'custom_fields', 'created', 'last_updated',
]


Expand Down
3 changes: 1 addition & 2 deletions netbox/circuits/filtersets.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,11 @@ class Meta:

class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account__provider',
queryset=Provider.objects.all(),
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account__provider__slug',
field_name='provider__slug',
queryset=Provider.objects.all(),
to_field_name='slug',
label=_('Provider (slug)'),
Expand Down
2 changes: 1 addition & 1 deletion netbox/circuits/forms/bulk_edit.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm):
model = Circuit
fieldsets = (
('Circuit', ('provider', 'type', 'status', 'description')),
('Service Parameters', ('install_date', 'termination_date', 'commit_rate')),
('Service Parameters', ('provider_account', 'install_date', 'termination_date', 'commit_rate')),
('Tenancy', ('tenant',)),
)
nullable_fields = (
Expand Down
9 changes: 7 additions & 2 deletions netbox/circuits/forms/bulk_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ class Meta:


class CircuitImportForm(NetBoxModelImportForm):
provider = CSVModelChoiceField(
queryset=Provider.objects.all(),
to_field_name='name',
help_text=_('Assigned provider')
)
provider_account = CSVModelChoiceField(
queryset=ProviderAccount.objects.all(),
to_field_name='name',
Expand All @@ -89,8 +94,8 @@ class CircuitImportForm(NetBoxModelImportForm):
class Meta:
model = Circuit
fields = [
'cid', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
'description', 'comments', 'tags'
'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date',
'commit_rate', 'description', 'comments', 'tags'
]


Expand Down
13 changes: 9 additions & 4 deletions netbox/circuits/forms/model_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,31 +87,36 @@ class Meta:


class CircuitForm(TenancyForm, NetBoxModelForm):
provider = DynamicModelChoiceField(
queryset=Provider.objects.all(),
selector=True
)
provider_account = DynamicModelChoiceField(
queryset=ProviderAccount.objects.all(),
initial_params={
'circuits': '$circuit'
},
query_params={
'provider': '$provider',
'provider_id': '$provider',
},
selector=True
selector=True,
required=False
)
type = DynamicModelChoiceField(
queryset=CircuitType.objects.all()
)
comments = CommentField()

fieldsets = (
('Circuit', ('provider_account', 'cid', 'type', 'status', 'description', 'tags')),
('Circuit', ('provider', 'provider_account', 'cid', 'type', 'status', 'description', 'tags')),
('Service Parameters', ('install_date', 'termination_date', 'commit_rate')),
('Tenancy', ('tenant_group', 'tenant')),
)

class Meta:
model = Circuit
fields = [
'cid', 'type', 'provider_account', 'status', 'install_date', 'termination_date', 'commit_rate',
'cid', 'type', 'provider', 'provider_account', 'status', 'install_date', 'termination_date', 'commit_rate',
'description', 'tenant_group', 'tenant', 'comments', 'tags',
]
widgets = {
Expand Down
45 changes: 4 additions & 41 deletions netbox/circuits/migrations/0042_provideraccount.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ def create_provideraccounts_from_providers(apps, schema_editor):
ProviderAccount = apps.get_model('circuits', 'ProviderAccount')

for provider in Provider.objects.all():
if provider.account is not None:
if provider.account:
provideraccount = ProviderAccount.objects.create(
name=f'{provider.name} {provider.account}' if provider.account else f'{provider.name}',
name=f'{provider.name} {provider.account}',
account=provider.account,
provider=provider,
)
Expand All @@ -34,22 +34,6 @@ def revert_provideraccounts_from_providers(apps, schema_editor):
provideraccount.provider.save()


def migrate_circuits_to_provideraccount(apps, schema_editor):
Circuit = apps.get_model('circuits', 'Circuit')
circuits = Circuit.objects.all()
for circuit in circuits:
circuit.provider_account = circuit.provider.accounts.order_by('pk').first()
circuit.save()


def migrate_circuits_from_provideraccount(apps, schema_editor):
Circuit = apps.get_model('circuits', 'Circuit')
circuits = Circuit.objects.all().order_by('pk')
for circuit in circuits:
circuit.provider = circuit.provider_account.provider
circuit.save()


class Migration(migrations.Migration):

dependencies = [
Expand Down Expand Up @@ -97,33 +81,12 @@ class Migration(migrations.Migration):
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.provideraccount', null=True, blank=True),
preserve_default=False,
),
migrations.AlterField(
model_name='circuit',
name='provider',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, related_name='circuits', to='circuits.provider', null=True, blank=True),
),
migrations.RunPython(
migrate_circuits_to_provideraccount, migrate_circuits_from_provideraccount
),
migrations.AlterField(
model_name='circuit',
name='provider_account',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.provideraccount'),
),
migrations.RemoveConstraint(
model_name='circuit',
name='circuits_circuit_unique_provider_cid',
),
migrations.AlterModelOptions(
name='circuit',
options={'ordering': ['provider_account', 'cid']},
options={'ordering': ['provider', 'provider_account', 'cid']},
),
migrations.AddConstraint(
model_name='circuit',
constraint=models.UniqueConstraint(fields=('provider_account', 'cid'), name='circuits_circuit_unique_provider_cid'),
),
migrations.RemoveField(
model_name='circuit',
name='provider',
constraint=models.UniqueConstraint(fields=('provider_account', 'cid'), name='circuits_circuit_unique_provideraccount_cid'),
),
]
26 changes: 22 additions & 4 deletions netbox/circuits/models/circuits.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,17 @@ class Circuit(PrimaryModel):
verbose_name='Circuit ID',
help_text=_("Unique circuit ID")
)
provider = models.ForeignKey(
to='circuits.Provider',
on_delete=models.PROTECT,
related_name='circuits'
)
provider_account = models.ForeignKey(
to='circuits.ProviderAccount',
on_delete=models.PROTECT,
related_name='circuits'
related_name='circuits',
blank=True,
null=True
)
type = models.ForeignKey(
to='CircuitType',
Expand Down Expand Up @@ -103,20 +110,26 @@ class Circuit(PrimaryModel):
)

clone_fields = (
'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate', 'description',
'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
'description',
)
prerequisite_models = (
'circuits.CircuitType',
'circuits.Provider',
'circuits.ProviderAccount',
)

class Meta:
ordering = ['provider_account', 'cid']
ordering = ['provider', 'provider_account', 'cid']
constraints = (
models.UniqueConstraint(
fields=('provider_account', 'cid'),
fields=('provider', 'cid'),
name='%(app_label)s_%(class)s_unique_provider_cid'
),
models.UniqueConstraint(
fields=('provider_account', 'cid'),
name='%(app_label)s_%(class)s_unique_provideraccount_cid'
),
)

def __str__(self):
Expand All @@ -128,6 +141,11 @@ def get_absolute_url(self):
def get_status_color(self):
return CircuitStatusChoices.colors.get(self.status)

def clean(self):
super().clean()
if self.provider_account and self.provider != self.provider_account.provider:
raise ValidationError("Provider must match ProviderAccount's provider")


class CircuitTermination(
CustomFieldsMixin,
Expand Down
7 changes: 3 additions & 4 deletions netbox/circuits/tables/circuits.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
verbose_name='Circuit ID'
)
provider = tables.Column(
accessor=Accessor('provider_account__provider'),
linkify=True
)
provider_account = tables.Column(
Expand All @@ -74,9 +73,9 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
class Meta(NetBoxTable.Meta):
model = Circuit
fields = (
'pk', 'id', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'tenant_group', 'termination_a', 'termination_z',
'install_date', 'termination_date', 'commit_rate', 'description', 'comments', 'contacts', 'tags', 'created',
'last_updated',
'pk', 'id', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'tenant_group',
'termination_a', 'termination_z', 'install_date', 'termination_date', 'commit_rate', 'description',
'comments', 'contacts', 'tags', 'created', 'last_updated',
)
default_columns = (
'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description',
Expand Down
15 changes: 9 additions & 6 deletions netbox/circuits/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,25 +119,28 @@ def setUpTestData(cls):
CircuitType.objects.bulk_create(circuit_types)

circuits = (
Circuit(cid='Circuit 1', provider_account=provider_accounts[0], type=circuit_types[0]),
Circuit(cid='Circuit 2', provider_account=provider_accounts[0], type=circuit_types[0]),
Circuit(cid='Circuit 3', provider_account=provider_accounts[0], type=circuit_types[0]),
Circuit(cid='Circuit 1', provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0]),
Circuit(cid='Circuit 2', provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0]),
Circuit(cid='Circuit 3', provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0]),
)
Circuit.objects.bulk_create(circuits)

cls.create_data = [
{
'cid': 'Circuit 4',
'provider': providers[1].pk,
'provider_account': provider_accounts[1].pk,
'type': circuit_types[1].pk,
},
{
'cid': 'Circuit 5',
'provider': providers[1].pk,
'provider_account': provider_accounts[1].pk,
'type': circuit_types[1].pk,
},
{
'cid': 'Circuit 6',
'provider': providers[1].pk,
'provider_account': provider_accounts[1].pk,
'type': circuit_types[1].pk,
},
Expand Down Expand Up @@ -174,9 +177,9 @@ def setUpTestData(cls):
ProviderNetwork.objects.bulk_create(provider_networks)

circuits = (
Circuit(cid='Circuit 1', provider_account=provider_account, type=circuit_type),
Circuit(cid='Circuit 2', provider_account=provider_account, type=circuit_type),
Circuit(cid='Circuit 3', provider_account=provider_account, type=circuit_type),
Circuit(cid='Circuit 1', provider=provider, provider_account=provider_account, type=circuit_type),
Circuit(cid='Circuit 2', provider=provider, provider_account=provider_account, type=circuit_type),
Circuit(cid='Circuit 3', provider=provider, provider_account=provider_account, type=circuit_type),
)
Circuit.objects.bulk_create(circuits)

Expand Down
30 changes: 15 additions & 15 deletions netbox/circuits/tests/test_filtersets.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ def setUpTestData(cls):
CircuitType.objects.bulk_create(circuit_types)

circuits = (
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Test Circuit 1'),
Circuit(provider_account=provider_accounts[1], type=circuit_types[1], cid='Test Circuit 1'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Test Circuit 1'),
Circuit(provider=providers[1], provider_account=provider_accounts[1], type=circuit_types[1], cid='Test Circuit 1'),
)
Circuit.objects.bulk_create(circuits)

Expand Down Expand Up @@ -215,12 +215,12 @@ def setUpTestData(cls):
ProviderNetwork.objects.bulk_create(provider_networks)

circuits = (
Circuit(provider_account=provider_accounts[0], tenant=tenants[0], type=circuit_types[0], cid='Test Circuit 1', install_date='2020-01-01', termination_date='2021-01-01', commit_rate=1000, status=CircuitStatusChoices.STATUS_ACTIVE, description='foobar1'),
Circuit(provider_account=provider_accounts[0], tenant=tenants[0], type=circuit_types[0], cid='Test Circuit 2', install_date='2020-01-02', termination_date='2021-01-02', commit_rate=2000, status=CircuitStatusChoices.STATUS_ACTIVE, description='foobar2'),
Circuit(provider_account=provider_accounts[0], tenant=tenants[1], type=circuit_types[0], cid='Test Circuit 3', install_date='2020-01-03', termination_date='2021-01-03', commit_rate=3000, status=CircuitStatusChoices.STATUS_PLANNED),
Circuit(provider_account=provider_accounts[1], tenant=tenants[1], type=circuit_types[1], cid='Test Circuit 4', install_date='2020-01-04', termination_date='2021-01-04', commit_rate=4000, status=CircuitStatusChoices.STATUS_PLANNED),
Circuit(provider_account=provider_accounts[1], tenant=tenants[2], type=circuit_types[1], cid='Test Circuit 5', install_date='2020-01-05', termination_date='2021-01-05', commit_rate=5000, status=CircuitStatusChoices.STATUS_OFFLINE),
Circuit(provider_account=provider_accounts[1], tenant=tenants[2], type=circuit_types[1], cid='Test Circuit 6', install_date='2020-01-06', termination_date='2021-01-06', commit_rate=6000, status=CircuitStatusChoices.STATUS_OFFLINE),
Circuit(provider=providers[0], provider_account=provider_accounts[0], tenant=tenants[0], type=circuit_types[0], cid='Test Circuit 1', install_date='2020-01-01', termination_date='2021-01-01', commit_rate=1000, status=CircuitStatusChoices.STATUS_ACTIVE, description='foobar1'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], tenant=tenants[0], type=circuit_types[0], cid='Test Circuit 2', install_date='2020-01-02', termination_date='2021-01-02', commit_rate=2000, status=CircuitStatusChoices.STATUS_ACTIVE, description='foobar2'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], tenant=tenants[1], type=circuit_types[0], cid='Test Circuit 3', install_date='2020-01-03', termination_date='2021-01-03', commit_rate=3000, status=CircuitStatusChoices.STATUS_PLANNED),
Circuit(provider=providers[1], provider_account=provider_accounts[1], tenant=tenants[1], type=circuit_types[1], cid='Test Circuit 4', install_date='2020-01-04', termination_date='2021-01-04', commit_rate=4000, status=CircuitStatusChoices.STATUS_PLANNED),
Circuit(provider=providers[1], provider_account=provider_accounts[1], tenant=tenants[2], type=circuit_types[1], cid='Test Circuit 5', install_date='2020-01-05', termination_date='2021-01-05', commit_rate=5000, status=CircuitStatusChoices.STATUS_OFFLINE),
Circuit(provider=providers[1], provider_account=provider_accounts[1], tenant=tenants[2], type=circuit_types[1], cid='Test Circuit 6', install_date='2020-01-06', termination_date='2021-01-06', commit_rate=6000, status=CircuitStatusChoices.STATUS_OFFLINE),
)
Circuit.objects.bulk_create(circuits)

Expand Down Expand Up @@ -355,13 +355,13 @@ def setUpTestData(cls):
ProviderNetwork.objects.bulk_create(provider_networks)

circuits = (
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 1'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 2'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 3'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 4'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 5'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 6'),
Circuit(provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 7'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 1'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 2'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 3'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 4'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 5'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 6'),
Circuit(provider=providers[0], provider_account=provider_accounts[0], type=circuit_types[0], cid='Circuit 7'),
)
Circuit.objects.bulk_create(circuits)

Expand Down
Loading

0 comments on commit c4e031e

Please sign in to comment.