30 from django.db
import models
32 from cm.models.user_network
import UserNetwork
33 from cm.utils
import log
34 from cm.utils.exception
import CMException
35 from common.states
import available_network_states
36 from netaddr
import IPNetwork
40 address = models.CharField(max_length=20)
41 mask = models.IntegerField()
42 state = models.IntegerField()
53 d[
'pool_id'] = self.id
56 d[
'state'] = self.
state
63 return IPNetwork(self.
address +
"/" + str(self.
mask))
70 for net
in self.usernetwork_set.all():
81 raise CMException(
'network_in_use')
83 for net
in self.usernetwork_set.all():
93 for network
in self.usernetwork_set.all():
94 networks.append(network.to_ipnetwork())
95 networks = sorted(networks)
97 log.debug(1,
'Networks: %s' % str(networks))
100 raise CMException(
'network_to_large')
102 if len(networks) == 0:
103 return IPNetwork(self.
address +
'/' + str(mask))
105 if IPNetwork(self.
address +
'/' + str(mask)).network < networks[0].network:
106 return IPNetwork(self.
address +
'/' + str(mask))
109 for i
in xrange(len(networks) - 1):
110 n = IPNetwork(str(networks[i].next().ip) +
"/" + str(mask))
111 if networks[i] < n
and n < networks[i + 1]:
115 n = IPNetwork(str(networks[-1].next().network) +
"/" + str(mask))
116 log.debug(1,
'Trying: %s' % str(n))
117 if networks[-1].network < n.network
and n.network < self.
to_ipnetwork().next().network:
121 raise CMException(
"network_unavailable")
129 user_networks = UserNetwork.objects.filter(user=user).all()
132 for network
in user_networks:
134 lease = network.get_unused()
137 log.debug(user.id,
'UserNetwork %s has no leases' % str(network.address))
140 log.debug(user.id,
'No lease found in existing networks. Allocating new UserNetwork')
141 for pool
in AvailableNetwork.objects.filter(state=available_network_states[
'ok']):
143 ipnet = pool.get_unused_ipnetwork(26)
145 log.debug(user.id,
'Allocated new user_network: %s' % str(ipnet))
146 network = UserNetwork()
148 network.mask = ipnet.prefixlen
149 network.address = str(ipnet.network)
150 network.name =
"Auto-generated network"
151 network.available_network = pool
156 lease = network.get_unused()
159 f = open(
'/tmp/trace',
'a')
160 traceback.print_exc(file=f)
162 log.debug(user.id,
"Cannot allocate new network in %s: %s" % (str(pool.address), str(e)))
165 raise CMException(
'available_network_not_found')
172 for net
in cls.objects.all():
173 networks.append(net.to_ipnetwork())
177 for i
in xrange(len(networks)):
178 if ipnet.prefixlen > networks[i].prefixlen
and ipnet > networks[i].previous()
and ipnet < networks[i].next():
180 elif ipnet.prefixlen < networks[i].prefixlen
and ipnet.previous() < networks[i]
and ipnet.next() > networks[i]: