Browse Source

Fixes #67: Improved Aggregate validation; extended aggregate documentation

Jeremy Stretch 8 years ago
parent
commit
6848a3dc81
2 changed files with 8 additions and 0 deletions
  1. 2 0
      docs/ipam.md
  2. 6 0
      netbox/ipam/models.py

+ 2 - 0
docs/ipam.md

@@ -32,6 +32,8 @@ Additionally, you might define an aggregate for each large swath of public IPv4
 
 Any prefixes you create in NetBox (discussed below) will be automatically organized under their respective aggregates. Any space within an aggregate which is not covered by an existing prefix will be annotated as available for allocation.
 
+Aggregates cannot overlap with one another; they can only exist in parallel. For instance, you cannot define both 10.0.0.0/8 and 10.16.0.0/16 as aggregates, because they overlap. 10.16.0.0/16 in this example would be created as a prefix.
+
 ### RIRs
 
 Regional Internet Registries (RIRs) are responsible for the allocation of global address space. The five RIRs are ARIN, RIPE, APNIC, LACNIC, and AFRINIC. However, some address space has been set aside for private or internal use only, such as defined in RFCs 1918 and 6598. NetBox considers these RFCs as a sort of RIR as well; that is, an authority which "owns" certain address space.

+ 6 - 0
netbox/ipam/models.py

@@ -121,6 +121,12 @@ class Aggregate(CreatedUpdatedModel):
                 raise ValidationError("{} is already covered by an existing aggregate ({})"
                                       .format(self.prefix, covering_aggregates[0]))
 
+            # Ensure that the aggregate being added does not cover an existing aggregate
+            covered_aggregates = Aggregate.objects.filter(prefix__net_contained=str(self.prefix))
+            if covered_aggregates:
+                raise ValidationError("{} is overlaps with an existing aggregate ({})"
+                                      .format(self.prefix, covered_aggregates[0]))
+
     def save(self, *args, **kwargs):
         if self.prefix:
             # Infer address family from IPNetwork object