Revision 92d2d1ce snf-cyclades-app/synnefo/db/models.py

b/snf-cyclades-app/synnefo/db/models.py
531 531
            if not backend_exists:
532 532
                BackendNetwork.objects.create(backend=backend, network=self)
533 533

  
534
    def get_pool(self, with_lock=True):
534
    def get_pool(self, locked=True):
535 535
        try:
536 536
            subnet = self.subnets.get(ipversion=4, deleted=False)
537 537
        except Subnet.DoesNotExist:
538 538
            raise pools.EmptyPool
539
        return subnet.get_pool(locked=locked)
540

  
541
    def allocate_address(self, userid):
539 542
        try:
540
            pool = subnet.ip_pools.all()[0]
541
        except IndexError:
542
            pool = IPPoolTable.objects.create(available_map='',
543
                                              reserved_map='',
544
                                              size=0,
545
                                              subnet=subnet)
546
        objects = IPPoolTable.objects
547
        if with_lock:
548
            objects = objects.select_for_update()
549
        return objects.get(id=pool.id)
543
            subnet = self.subnets.get(ipversion=4, deleted=False)
544
        except Subnet.DoesNotExist:
545
            raise pools.EmptyPool
546
        return subnet.allocate_address(userid)
550 547

  
551 548
    def reserve_address(self, address):
552 549
        pool = self.get_pool()
......
601 598
    def __unicode__(self):
602 599
        return "<Subnet %s, Network: %s>" % (self.id, self.network_id)
603 600

  
601
    def get_pool(self, locked=True):
602
        if self.ipversion == 6:
603
            raise Exception("IPv6 Subnets have no IP Pool.")
604
        ip_pools = self.ip_pools
605
        if locked:
606
            ip_pools = ip_pools.select_for_update()
607
        return ip_pools.all()[0].pool
608

  
609
    def allocate_address(self, userid):
610
        pool = self.get_pool(locked=True)
611
        address = pool.get()
612
        pool.save()
613
        return IPAddress.objects.create(network=self.network, subnet=self,
614
                                        address=address, userid=userid)
615

  
604 616

  
605 617
class BackendNetwork(models.Model):
606 618
    OPER_STATES = (
......
755 767
        """Return the backend id by prepending backend-prefix."""
756 768
        return "%snic-%s" % (settings.BACKEND_PREFIX_ID, str(self.id))
757 769

  
770
    @property
771
    def ipv4_address(self):
772
        try:
773
            return self.ips.get(subnet__ipversion=4).address
774
        except IPAddress.DoesNotExist:
775
            return None
776

  
758 777

  
759 778
class SecurityGroup(models.Model):
760 779
    SECURITY_GROUP_NAME_LENGTH = 128

Also available in: Unified diff