|
|
@@ -5,7 +5,7 @@ from django.db.backends.postgresql.psycopg_any import NumericRange
|
|
|
from django.test import TestCase, override_settings
|
|
|
from netaddr import IPNetwork, IPSet
|
|
|
|
|
|
-from dcim.models import Site, SiteGroup
|
|
|
+from dcim.models import Location, Region, Site, SiteGroup
|
|
|
from ipam.choices import *
|
|
|
from ipam.constants import SERVICE_PORT_MAX, SERVICE_PORT_MIN
|
|
|
from ipam.models import *
|
|
|
@@ -1262,6 +1262,80 @@ class PrefixTestCase(TestCase):
|
|
|
duplicate_prefix = Prefix(vrf=vrf, prefix=IPNetwork('192.0.2.0/24'))
|
|
|
self.assertRaises(ValidationError, duplicate_prefix.clean)
|
|
|
|
|
|
+ # Regression test for #22682
|
|
|
+ def test_deleting_site_group_does_not_delete_prefix_scoped_to_member_site(self):
|
|
|
+ sitegroup = SiteGroup.objects.create(name='Site Group 1', slug='site-group-1')
|
|
|
+ site = Site.objects.create(name='Site 1', slug='site-1', group=sitegroup)
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.0.0/24'), scope=site)
|
|
|
+
|
|
|
+ sitegroup.delete()
|
|
|
+
|
|
|
+ site.refresh_from_db()
|
|
|
+ prefix.refresh_from_db()
|
|
|
+ self.assertIsNone(site.group)
|
|
|
+ self.assertEqual(prefix.scope, site)
|
|
|
+ self.assertIsNone(prefix._site_group_id)
|
|
|
+
|
|
|
+ # Regression test for #22682
|
|
|
+ def test_deleting_region_does_not_delete_prefix_scoped_to_member_site(self):
|
|
|
+ region = Region.objects.create(name='Region 1', slug='region-1')
|
|
|
+ site = Site.objects.create(name='Site 2', slug='site-2', region=region)
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.1.0/24'), scope=site)
|
|
|
+
|
|
|
+ region.delete()
|
|
|
+
|
|
|
+ site.refresh_from_db()
|
|
|
+ prefix.refresh_from_db()
|
|
|
+ self.assertIsNone(site.region)
|
|
|
+ self.assertEqual(prefix.scope, site)
|
|
|
+ self.assertIsNone(prefix._region_id)
|
|
|
+
|
|
|
+ # Regression test for #22682
|
|
|
+ def test_deleting_site_group_does_not_delete_prefix_scoped_to_member_location(self):
|
|
|
+ sitegroup = SiteGroup.objects.create(name='Site Group 3', slug='site-group-3')
|
|
|
+ site = Site.objects.create(name='Site 3', slug='site-3', group=sitegroup)
|
|
|
+ location = Location.objects.create(name='Location 1', slug='location-1', site=site)
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.4.0/24'), scope=location)
|
|
|
+
|
|
|
+ sitegroup.delete()
|
|
|
+
|
|
|
+ site.refresh_from_db()
|
|
|
+ prefix.refresh_from_db()
|
|
|
+ self.assertIsNone(site.group)
|
|
|
+ self.assertEqual(prefix.scope, location)
|
|
|
+ self.assertIsNone(prefix._site_group_id)
|
|
|
+
|
|
|
+ # Regression test for #22682
|
|
|
+ def test_deleting_region_does_not_delete_prefix_scoped_to_member_location(self):
|
|
|
+ region = Region.objects.create(name='Region 3', slug='region-3')
|
|
|
+ site = Site.objects.create(name='Site 4', slug='site-4', region=region)
|
|
|
+ location = Location.objects.create(name='Location 2', slug='location-2', site=site)
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.5.0/24'), scope=location)
|
|
|
+
|
|
|
+ region.delete()
|
|
|
+
|
|
|
+ site.refresh_from_db()
|
|
|
+ prefix.refresh_from_db()
|
|
|
+ self.assertIsNone(site.region)
|
|
|
+ self.assertEqual(prefix.scope, location)
|
|
|
+ self.assertIsNone(prefix._region_id)
|
|
|
+
|
|
|
+ def test_deleting_site_group_scoped_to_it_directly_still_deletes_prefix(self):
|
|
|
+ sitegroup = SiteGroup.objects.create(name='Site Group 2', slug='site-group-2')
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.2.0/24'), scope=sitegroup)
|
|
|
+
|
|
|
+ sitegroup.delete()
|
|
|
+
|
|
|
+ self.assertFalse(Prefix.objects.filter(pk=prefix.pk).exists())
|
|
|
+
|
|
|
+ def test_deleting_region_scoped_to_it_directly_still_deletes_prefix(self):
|
|
|
+ region = Region.objects.create(name='Region 2', slug='region-2')
|
|
|
+ prefix = Prefix.objects.create(prefix=IPNetwork('10.0.3.0/24'), scope=region)
|
|
|
+
|
|
|
+ region.delete()
|
|
|
+
|
|
|
+ self.assertFalse(Prefix.objects.filter(pk=prefix.pk).exists())
|
|
|
+
|
|
|
|
|
|
class PrefixHierarchyTestCase(TestCase):
|
|
|
"""
|