23 from django.db
import models
25 from cm.models.image
import Image
26 from cm.models.vm
import VM
27 from cm.utils
import log
28 from cm.utils.exception
import CMException
49 vm = models.ForeignKey(VM, null=
True, blank=
True)
52 def create(cls, name, description, user, disk_controller, size=0):
53 image = Image.create(cls, name=name, description=description, user=user, size=size, progress=0, disk_dev=1, disk_controller=disk_controller)
72 d[
'storage_image_id'] = self.id
78 d[
'vm_id'] = self.vm.id
if self.
vm else ''
79 d[
'vm_name'] = self.vm.name
if self.
vm else ''
94 def get(user_id, disk_image_id):
97 image = StorageImage.objects.get(pk=disk_image_id)
99 raise CMException(
'storage_image_get')
101 image.has_access(user_id)
122 if self.user.id != user_id:
123 raise CMException(
'storage_image_permission')
140 image = StorageImage.objects.get(pk=disk_image_id)
142 raise CMException(
'storage_image_get')
159 domain = vm.lv_domain()
160 log.debug(self.user.id, self.disk_controller)
163 attached_devices = [d.disk_dev
for d
in StorageImage.objects.filter(vm_id__exact=vm.id)]
168 for i
in range(2, 12):
169 if not i
in attached_devices:
174 raise CMException(
'storage_image_attach')
177 device_desc =
"""<disk type='file' device='disk'>
178 <driver name='qemu' type='raw'/>
179 <source file='%(path)s'/>
180 <target dev='%(dev)s' bus='%(bus)s'/>
181 <alias name='%(bus)s-%(dev)s'/>
185 'dev':
'sd%s' % chr(free_dev + 98),
186 'bus': self.disk_controller_name
188 log.debug(self.user.id, device_desc)
189 domain.attachDevice(device_desc)
191 log.exception(self.user.id,
'storage attach')
192 raise CMException(
'storage_image_attach')
210 domain = vm.lv_domain()
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 + 98),
221 'bus': self.disk_controller_name
223 domain.detachDevice(device_desc)
225 log.exception(self.user.id,
'storage detach')
226 raise CMException(
'storage_image_detach')
234 raise CMException(
'image_attached')
237 domain = self.vm.domain()
239 device_desc =
"""<disk type='file' device='disk'>
240 <driver name='qemu' type='raw'/>
241 <source file='%(path)s'/>
242 <target dev='%(dev)s' bus='%(bus)s'/>
243 <alias name='%(bus)s-%(dev)s'/>
247 'dev':
'sd%s' % chr(self.
disk_dev + 98),
248 'bus': self.disk_controller_name
250 domain.detachDevice(device_desc)
252 log.exception(self.user.id,
'storage detach')