27 from datetime
import datetime
29 from django.db
import models
31 from cm.models.storage
import Storage
32 from cm.models.user
import User
33 from cm.utils
import log
34 from cm.utils.exception
import CMException
35 from common.hardware
import disk_controllers, disk_controllers_reversed
36 from common.states
import image_states, storage_states, image_access
39 from typedmodels
import TypedModel
63 name = models.CharField(max_length=45)
64 description = models.CharField(max_length=512)
65 user = models.ForeignKey(User)
68 disk_dev = models.IntegerField(null=
True, blank=
True)
69 disk_controller = models.IntegerField(default=disk_controllers[
'scsi'])
71 creation_date = models.DateTimeField(default=datetime.now)
72 size = models.IntegerField(null=
True, blank=
True)
73 state = models.SmallIntegerField()
74 storage = models.ForeignKey(Storage, null=
True, blank=
True)
75 progress = models.IntegerField(default=100)
76 access = models.SmallIntegerField()
82 def create(cls, name, description, user, disk_dev, disk_controller, size=0, progress=100):
85 image.description = description
86 image.state = image_states[
'adding']
89 image.progress = progress
90 image.disk_dev = disk_dev
91 image.storage = Storage.get()
92 image.disk_controller = disk_controller
93 image.access = image_access[
'private']
117 d[
'image_id'] = self.id
118 d[
'user_id'] = self.user.id
119 d[
'name'] = self.
name
130 if self.
storage is None or self.storage.state != storage_states[
'ok']:
131 d[
'state'] = image_states[
'unavailable']
133 d[
'state'] = self.
state
135 if self.
size is not None:
136 d[
'size'] = self.
size
152 states = {
'init': (),
154 'failed': (
'init',
'adding',
'formatting',
'ok',
'unavailable',
'locked',
'deleted'),
155 'formatting': (
'adding'),
156 'ok': (
'formatting',
'adding',
'locked'),
159 'deleted': (
'ok',
'locked',
'failed'),
164 for s
in image_states.keys():
168 if self.storage.state == storage_states[
'locked']:
169 if state ==
'adding' or state ==
'formatting':
170 raise CMException(
'vm_wrong_state')
173 if not my_state
in states[state]
or my_state ==
False:
174 raise CMException(
'vm_wrong_state')
182 img_path =
'%d' % self.id
183 log.info(self.user.id,
'Storage: %s, user_id: %d, image_id: %s' % (self.storage.path, self.user.id, img_path))
184 return os.path.join(self.storage.path, str(self.user.id), img_path)
198 log.error(self.user.id,
'Cannot find disk controller')