24 from cm.models.image
import Image
25 from cm.utils
import log
26 from cm.utils.exception
import CMException
27 from common.hardware
import disk_controllers_reversed
28 from common.states
import image_states, storage_states, image_access, vm_states
59 d[
'disk_dev'] =
'cdrom%d' % self.
disk_dev
63 d[
'iso_image_id'] = self.id
68 vms = self.vm_set.filter(state__in=[vm_states[
'running'], vm_states[
'running']])
73 vm_names.append(vm.name)
76 d[
'vm_names'] = vm_names
93 def get(user_id, iso_image_id):
96 image = IsoImage.objects.get(pk=iso_image_id)
98 raise CMException(
'iso_image_get')
101 if image.state != image_states[
'ok']
and image.storage.state != storage_states[
'ok']:
102 raise CMException(
'image_unavailable')
104 image.has_access(user_id)
122 image = IsoImage.objects.get(pk=iso_image_id)
124 raise CMException(
'iso_image_get')
141 if self.user.id != user_id:
142 if self.
access == image_access[
'private']:
143 raise CMException(
'iso_image_permission')
147 if self.vm_set.exclude(state__in=[vm_states[
'closed'], vm_states[
'erased']]).exists():
148 raise CMException(
'image_attached')
162 domain = vm.lv_domain()
163 log.debug(self.user.id, self.disk_controller)
164 disk_controller_name = disk_controllers_reversed[self.disk_controller]
167 attached_devices = [d.disk_dev
for d
in IsoImage.objects.filter(vm_id__exact=vm.id)]
171 if free_dev == attached_devices:
172 raise CMException(
'iso_image_attach')
175 device_desc =
"""<disk type='file' device='disk'>
176 <driver name='qemu' type='raw'/>
177 <source file='%(path)s'/>
178 <target dev='%(dev)s' bus='%(bus)s'/>
179 <alias name='%(bus)s-%(dev)s'/>
183 'dev':
'sd%s' % free_dev,
184 'bus': disk_controller_name
186 log.debug(self.user.id, device_desc)
187 domain.attachDevice(device_desc)
189 log.exception(self.user.id,
'iso attach')
190 raise CMException(
'iso_image_attach')
208 domain = vm.lv_domain()
209 disk_controller_name = disk_controllers_reversed[self.disk_controller]
212 device_desc =
"""<disk type='file' device='disk'>
213 <driver name='qemu' type='raw'/>
214 <source file='%(path)s'/>
215 <target dev='%(dev)s' bus='%(bus)s'/>
216 <alias name='%(bus)s-%(dev)s'/>
220 'dev':
'sd%s' % chr(self.
disk_dev + 96),
221 'bus': disk_controller_name
223 domain.detachDevice(device_desc)
225 log.exception(self.user.id,
'iso detach')
226 raise CMException(
'iso_image_detach')
233 def create(cls, name, description, user, disk_dev, disk_controller):
234 image = Image.create(cls, name=name, description=description, user=user, disk_dev=disk_dev, disk_controller=disk_controller)