27 from django.db
import models
29 from cm.models.image
import Image
30 from cm.utils
import log
31 from cm.utils.exception
import CMException
32 from common.hardware
import video_devices, network_devices, \
33 video_devices_reversed, network_devices_reversed
34 from common.states
import image_access, vm_states
35 from cm.utils
import message
61 platform = models.IntegerField()
64 network_device = models.IntegerField(default=network_devices[
'virtio'])
65 video_device = models.IntegerField(default=video_devices[
'cirrus'])
68 def create(cls, name, description, user, platform, disk_controller, network_device, video_device):
69 image = Image.create(cls, name=name, description=description, user=user, size=0, progress=0,
70 disk_dev=1, disk_controller=disk_controller)
71 image.platform = platform
72 image.access = image_access[
'private']
73 image.network_device = network_device
74 image.video_device = video_device
93 if self.disk_dev
is not None:
94 d[
'disk_dev'] =
'sd%s' % chr(self.disk_dev + 96)
99 d[
'user_id'] = self.user.id
101 d[
'disk_controller'] = self.disk_controller
103 d[
'system_image_id'] = self.id
107 d[
'vms'] = list(self.vm_set.filter(state__in=[vm_states[
'running'], vm_states[
'running']]).values_list(
'id', flat=
True))
or []
110 grouplist = self.systemimagegroup_set.values_list(
'group_id', flat=
True)
111 d[
'group_id'] = grouplist[0]
if len(grouplist) > 0
else ''
113 d[
'disk_controller'] = self.disk_controller
139 def get(user_id, sys_image_id, groups=None):
142 image = SystemImage.objects.get(pk=sys_image_id)
144 raise CMException(
'system_image_get')
151 image.has_access(user_id, groups)
169 image = SystemImage.objects.get(pk=sys_image_id)
171 raise CMException(
'system_image_get')
189 if self.user.id != user_id:
190 if self.
access == image_access[
'private']:
191 raise CMException(
'system_image_permission')
194 elif self.
access == image_access[
'group']
and ((groups
is None)
or (not(self.systemimagegroup_set.filter(group_id__in=groups).exists()))):
195 raise CMException(
'system_image_permission')
210 log.error(self.user.id,
'Cannot find video device')
225 log.error(self.user.id,
'Cannot find network device')
234 log.debug(vm.user.id,
"Copy image by ssh")
235 log.debug(vm.user.id, str([
'ssh', vm.node.ssh_string,
'cp %s /images/%d' % (vm.system_image.path, vm.id)]))
237 if subprocess.call([
'ssh', vm.node.ssh_string,
'cp %s /images/%d' % (vm.system_image.path, vm.id)]):
238 message.error(vm.user_id,
'vm_create', {
'id': vm.id,
'name': vm.name})
239 raise CMException(
'vm_create')
241 if subprocess.call([
'ssh', vm.node.ssh_string,
'chmod a+rw /images/%d' % vm.id]):
242 message.error(vm.user_id,
'vm_create', {
'id': vm.id,
'name': vm.name})
243 raise CMException(
'vm_create')
252 log.debug(vm.user.id,
"Preparing temporary storage pool")
253 if not os.path.exists(os.path.dirname(image.path)):
254 os.makedirs(os.path.dirname(image.path))
255 log.debug(vm.user.id, str([
'ssh', vm.node.ssh_string,
'cp /images/%d %s' % (vm.id, image.path)]))
257 if subprocess.call([
'ssh', vm.node.ssh_string,
'cp /images/%d %s' % (vm.id, image.path)]):
258 raise CMException(
'image_copy_to_storage')