28 from common.states
import farm_states
29 from cm.models.vm
import VM
30 from cm.utils
import log
31 from django.db
import transaction
32 from cm.utils
import message
40 threading.Thread.__init__(self)
46 log.info(0,
"Terminate vm %d" % (self.vm.id))
47 return self._Thread__stop()
67 log.info(self.vm.user_id,
"Copy image from %s to %s" % (self.vm.system_image.path, self.vm.path))
68 self.vm.system_image.copy_to_node(self.
vm)
70 log.exception(self.vm.user_id,
'Libvirt error for %d: %s' % (self.vm.id, e))
71 self.vm.set_state(
'failed')
72 message.error(self.vm.user_id,
'vm_create', {
'id': self.vm.id,
'name': self.vm.name})
74 self.vm.save(update_fields=[
'state'])
78 log.debug(self.vm.user_id,
"Attaching network")
80 for lease
in self.vm.lease_set.all():
83 log.exception(self.vm.user_id,
"Cannot create network")
84 self.vm.set_state(
'failed')
85 self.vm.save(update_fields=[
'state'])
86 message.error(self.vm.user_id,
'vm_create', {
'id': self.vm.id,
'name': self.vm.name})
91 log.info(self.vm.user_id,
"Connecting libvirt and generating template")
93 conn = libvirt.open(self.vm.node.conn_string)
94 tmpl = self.vm.libvirt_template()
95 log.debug(self.vm.user_id,
"Create from template: %s" % tmpl)
97 log.exception(self.vm.user_id,
"Cannot connect to libvirt")
98 self.vm.set_state(
'failed')
99 message.error(self.vm.user_id,
'vm_create', {
'id': self.vm.id,
'name': self.vm.name})
101 self.vm.save(update_fields=[
'state'])
104 log.info(self.vm.user_id,
"Creating libvirt domain")
106 domain = conn.createXML(tmpl, 0)
107 self.vm.libvirt_id = domain.ID()
108 self.vm.save(update_fields=[
'libvirt_id'])
109 log.debug(self.vm.user_id,
"New domain id: %d" % domain.ID())
111 log.exception(self.vm.user_id,
'Libvirt error: %s' % e)
112 self.vm.set_state(
'failed')
113 message.error(self.vm.user_id,
'vm_create', {
'id': self.vm.id,
'name': self.vm.name})
115 self.vm.save(update_fields=[
'state'])
119 self.vm.set_state(
'running')
120 if self.vm.is_head():
122 self.vm.farm.state = farm_states[
'init_head']
131 self.vm.set_state(
'failed')
133 message.error(self.vm.user_id,
'vm_create', {
'id': self.vm.id,
'name': self.vm.name})
134 log.exception(self.vm.user_id,
'Domain not started: %s' % str(e))
135 self.vm.save(update_fields=[
'state'])
139 self.vm.save(update_fields=[
'state'])
141 log.exception(self.vm.user_id,
'Cannot update database: %s' % str(e))
154 vm = VM.objects.get(pk=self.vm.id)
156 log.exception(0,
'Cannot find vm %d: %s' % (self.vm.id, e))
158 log.debug(vm.user_id,
"VM Destroy")
177 log.debug(self.vm.user_id,
"VM Reboot")
179 self.vm.set_state(
'restart')
183 log.exception(self.vm.user_id,
'Cannot set vm state')
187 domain = self.vm.lv_domain()
189 self.vm.libvirt_id = domain.ID()
192 message.error(self.vm.user_id,
'vm_restart', {
'id': self.vm.id,
'name': self.vm.name})
193 self.vm.set_state(
'failed')
194 log.exception(self.vm.user_id,
'Cannot restart machine')
199 log.exception(self.vm.user_id,
'Cannot update libvirt ID')
205 self.vm.set_state(
'running')
209 log.exception(self.vm.user_id,
'Cannot set vm state')
221 with transaction.commit_manually():
223 if self.
action ==
'create':
225 elif self.
action ==
'delete':
227 elif self.
action ==
'reset':
231 log.exception(0,
'thread_exception')
232 transaction.rollback()