1
0
mirror of https://github.com/peeringdb/peeringdb.git synced 2024-05-11 05:55:09 +00:00
Files
peeringdb-peeringdb/peeringdb_server/migrations/0023_netfac_local_asn.py
Matt Griswold ba6f9b6432 Qu1003 (#621)
* use new peeringdb client (1.0.0) for pdb_load_data sync (#599)

* drop django-mobi for lack of py3/dj2 support (#492)
remove django-forms-bootstrap for lack of py3/dj2 support (#492)

* black formatted

* django2.2 and py3 upgrade (#492)

* drop ixlans (#21) ui and api changes

* drop local_asn (#168)

* org search (#193)

* phone number validation (#50)

* implement help text tooltips (#228)

* Mark own ASN as transit-free (#394)

* py3 fix for `pdb_migrate_ixlans` command when writing migration report

* pdb_migrate_ixlans: properly handle py3 Runtime error if ixlan dict changes during iteration

* set rest DEFAULT_SCHEMA_CLASS to coreapi to fix swagger apidocs
fix migration 0027 missing from facsimile manifest

* fix swagger doc strings

* fix tests that were broken from api doc fixes

* fix UniqueFieldValidator for netixlan ipaddress validation that broke during django/drf upgrade

* fix org merge tool layout issues

* travis config

* update pipfile and lock

* black formatting

* update travis dist

* beta mode banner (#411)

* add beta banner template (#411)

* automatically scheduled sync may not always be on, add a flag that lets us reflect that state in the beta banner message
clean up beta banner implementation (#411)

* add tests for beta banner (#411)
2020-01-08 13:29:58 -06:00

117 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
# Generated by Django 1.11.23 on 2019-12-10 12:55
from __future__ import unicode_literals
from django.db import migrations
from django.db.utils import IntegrityError
from django.db.models import Count
def forwards_func(apps, schema_editor):
"""
since `local_asn` will no longer be included as part of the
unique key for netfac we need to remove any potential dupes
that may exist because of that
We do this by setting the related network to be the network that
matches the local_asn value
"""
NetworkFacility = apps.get_model("peeringdb_server", "NetworkFacility")
Network = apps.get_model("peeringdb_server", "Network")
removed_dupe = 0
asn_missing = 0
migrated = 0
print("\nmigrating netfacs")
for netfac in NetworkFacility.handleref.all():
if netfac.local_asn != netfac.network.asn:
# local_asn differs from related network asn
# next check if the network facility we are about
# to migrate already exists, if it does, skip it
qset = NetworkFacility.handleref.filter(
network__asn=netfac.local_asn,
facility_id=netfac.facility_id,
local_asn=netfac.local_asn,
)
if qset.exists():
notes = "Removed duplicate netfac for AS{} @ fac{}".format(
netfac.local_asn, netfac.facility_id
)
netfac.notes = notes
netfac.status = "deleted"
netfac.local_asn = None
netfac.save()
removed_dupe += 1
continue
net = Network.handleref.filter(asn=netfac.local_asn).first()
if net and netfac.status == "ok":
# set network object from local_asn
if net.status != netfac.status:
# network status doesnt match netfac status
# we update netfac status to match as that is the least
# destructive behaviour while allowing us to still
# resolve the unique constraint conflict
netfac.status = net.status
print(
"AS{}: netfac{} at facility {} has been moved to network AS{}, however status"
" between the two was mismatching and has been corrected, "
"but should be reviewed".format(
netfac.network.asn, netfac.facility.id, netfac.id, net.asn
)
)
netfac.network = net
netfac.save()
migrated += 1
else:
# could not find network with asn matching local_asn
# in this case we should drop the netfac and log it
notes = "AS{}: Could not correct non-existant local_asn AS{} @ fac{} ".format(
netfac.network.asn, netfac.local_asn, netfac.facility.id
)
if netfac.status == "ok":
print(notes)
asn_missing += 1
continue
print("Changed related network for {} netfacs".format(migrated))
print(
"Deleted {} netfacs for being dupes after removal of local_asn".format(
removed_dupe
)
)
print(
"Found {} netfacs where network matching local_asn did not exist".format(
asn_missing
)
)
class Migration(migrations.Migration):
dependencies = [
("peeringdb_server", "0022_ixlan_remove_auto_increment"),
]
operations = [
migrations.RunPython(forwards_func, migrations.RunPython.noop),
]