Ejemplo n.º 1
0
    def __init__(self, network):
        """Initialize a new IPv4 address pool from an L{objects.Network} object.

    @type network: L{objects.Network}
    @param network: the network object from which the pool will be generated

    """
        self.network = None
        self.gateway = None
        self.network6 = None
        self.gateway6 = None

        self.net = network

        self.network = ipaddr.IPNetwork(self.net.network)
        if self.network.numhosts > IPV4_NETWORK_MAX_NUM_HOSTS:
            raise errors.AddressPoolError(
                "A big network with %s host(s) is currently"
                " not supported. please specify at most a"
                " /%s network" %
                (str(self.network.numhosts), IPV4_NETWORK_MAX_SIZE))

        if self.network.numhosts < IPV4_NETWORK_MIN_NUM_HOSTS:
            raise errors.AddressPoolError(
                "A network with only %s host(s) is too"
                " small, please specify at least a /%s"
                " network" %
                (str(self.network.numhosts), IPV4_NETWORK_MIN_SIZE))
        if self.net.gateway:
            self.gateway = ipaddr.IPAddress(self.net.gateway)

        if self.net.network6:
            self.network6 = ipaddr.IPv6Network(self.net.network6)
        if self.net.gateway6:
            self.gateway6 = ipaddr.IPv6Address(self.net.gateway6)

        if self.net.reservations:
            self.reservations = bitarray(self.net.reservations)
        else:
            self.reservations = bitarray(self.network.numhosts)
            # pylint: disable=E1103
            self.reservations.setall(False)

        if self.net.ext_reservations:
            self.ext_reservations = bitarray(self.net.ext_reservations)
        else:
            self.ext_reservations = bitarray(self.network.numhosts)
            # pylint: disable=E1103
            self.ext_reservations.setall(False)

        assert len(self.reservations) == self.network.numhosts
        assert len(self.ext_reservations) == self.network.numhosts
Ejemplo n.º 2
0
    def _GetAddrIndex(self, address):
        addr = ipaddr.IPAddress(address)

        if not addr in self.network:
            raise errors.AddressPoolError("%s does not contain %s" %
                                          (self.network, addr))

        return int(addr) - int(self.network.network)
Ejemplo n.º 3
0
    def GenerateFree(self):
        """Returns the first free address of the network.

    @raise errors.AddressPoolError: Pool is full

    """
        idx = self.all_reservations.search(self.FREE, 1)
        if idx:
            return str(self.network[idx[0]])
        else:
            raise errors.AddressPoolError("%s is full" % self.network)
Ejemplo n.º 4
0
    def GetFreeAddress(self):
        """Returns the first available address.

    """
        if self.IsFull():
            raise errors.AddressPoolError("%s is full" % self.network)

        idx = self.all_reservations.index(False)
        address = str(self.network[idx])
        self.Reserve(address)
        return address
Ejemplo n.º 5
0
    def Release(self, address, external=False):
        """Release a given address reservation.

    """
        if not self.IsReserved(address, external):
            if external:
                msg = "IP %s is not externally reserved" % address
            else:
                msg = "IP %s is not used by an instance" % address
            raise errors.AddressPoolError(msg)

        self._Mark(address, value=False, external=external)
Ejemplo n.º 6
0
    def Reserve(self, address, external=False):
        """Mark an address as used.

    """
        if self.IsReserved(address, external):
            if external:
                msg = "IP %s is already externally reserved" % address
            else:
                msg = "IP %s is already used by an instance" % address
            raise errors.AddressPoolError(msg)

        self._Mark(address, external=external)