28 from django.db
import models
29 from django.template
import loader, Context
30 from netaddr
import IPNetwork, IPAddress
35 from cm.utils.exception
import CMException
36 from cm.utils
import log
37 from cm.settings
import DNS_DOMAIN
41 address = models.CharField(max_length=20)
42 user_network = models.ForeignKey(
'UserNetwork')
43 vm = models.ForeignKey(
'VM', null=
True, blank=
True)
54 d[
'lease_id'] = self.id
56 d[
'user_network_id'] = self.user_network.id
61 d[
'user_id'] = self.user_network.user.id
63 d[
'public_ip'] = self.publicip_set.all()[0].dict
71 network = IPNetwork(
'%s/30' % self.
address)
72 return str(network.network + 1)
76 network = IPNetwork(
'%s/30' % self.
address)
77 return str(network.network + 2)
81 if self.
vm ==
None or self.vm.node ==
None:
82 raise CMException(
'lease_not_attached')
83 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
84 s.connect((self.vm.node.address, 22))
85 return s.getsockname()[0]
93 return 'vm-%d' % self.vm.id
97 ip_hex =
'%08x' % IPAddress(self.
address).value
98 return '00:02:%s:%s:%s:%s' % (ip_hex[0:2], ip_hex[2:4], ip_hex[4:6], ip_hex[6:8])
101 template = loader.get_template(
'networking/routed.xml')
107 network_xml = template.render(context)
108 log.debug(self.user_network.user.id,
"Rendered network template:\n%s" % network_xml)
109 conn = libvirt.open(self.vm.node.conn_string)
110 net = conn.networkDefineXML(network_xml)
119 raise CMException(
'lease_detached')
123 conn = libvirt.open(self.vm.node.conn_string)
125 log.exception(self.user_network.user_id,
"Cannot connet to libvirt: ")
126 raise CMException(
'lease_detach')
130 lv_network = conn.networkLookupByName(
'net-%d-%d' % (self.vm.id, self.id))
132 log.error(self.user_network.user_id,
"Cannotfind libvirt network: %s" % str(e))
138 lv_network.undefine()
140 log.error(self.user_network.user_id,
"Cannot destroy or undefine libvirt network: %s" % str(e))
144 for public_lease
in self.publicip_set.all():
145 log.debug(self.user_network.user.id,
"\t...detaching public lease %s" % public_lease.address)
146 public_lease.unassign()