19 from common.hardware
import disk_filesystems, disk_controllers
20 from common.states
import image_access, image_types
21 from datetime
import datetime
22 from ec2.base.action
import Action, CLMException
23 from ec2.error
import MissingParameter, UndefinedError, InvalidVolumeID, \
24 DiskImageSizeTooLarge, InvalidParameterValue, VolumeInUse, InvalidVolume, \
25 InvalidInstanceID, InvalidFilter, InvalidAttachment
26 from ec2.helpers.entities
import Entity
27 from ec2.helpers.filters
import applyEc2Filters, validateEc2Filters
28 from ec2.helpers.parse
import parseFilters, parseID, parseIDs, parseClmDate
30 """@package src.ec2.volume
31 EC2 actions for volumes
33 @author Oleksandr Gituliar <gituliar@gmail.com>
34 @author Łukasz Chrząszcz <l.chrzaszcz@gmail.com>
49 if clm_volume_state == 0:
56 size = int(self.parameters[
'Size']);
57 except KeyError, error:
58 raise MissingParameter(parameter=error.args[0])
59 except ValueError, error:
60 raise InvalidParameterValue
62 ext4_id = disk_filesystems[
'ext4']
68 'name' :
'EC2 Volume',
69 'size' : size * SIZE_RATIO,
70 'filesystem' : ext4_id,
71 'disk_controller' : disk_controllers[
'virtio'],
72 'description' :
'Storage created by EC2 API'
74 volume = self.cluster_manager.user.storage_image.create(volume_dict)
75 except CLMException, error:
76 if error.status ==
'image_create':
78 if error.status ==
'user_storage_limit':
79 raise DiskImageSizeTooLarge
83 edit_dict = {
'storage_image_id' : volume[
'storage_image_id'],
84 'name' :
'vol-' + str(volume[
'storage_image_id']),
85 'description' :
'Storage created by EC2 API',
86 'disk_controller' : disk_controllers[
'virtio']}
89 self.cluster_manager.user.storage_image.edit( edit_dict )
91 print 'Changing name for newly created storage image failed!'
95 'volume_id' : volume[
'storage_image_id'],
101 translation_filters = {
'size' :
'size',
102 'volume-id' :
'volumeId',
105 available_filters = [
'size',
'volume-id',
'status']
110 for param, value
in self.parameters.iteritems():
111 if param.startswith(
'VolumeId'):
112 volume_ids.append(value)
114 raise InvalidParameterValue
117 volume_ids = parseIDs(volume_ids, Entity.volume)
119 raise InvalidParameterValue
131 clm_volumes += self.cluster_manager.user.storage_image.get_list()
136 for volume_id
in volume_ids:
137 clm_volumes.append(self.cluster_manager.user.storage_image.get_by_id({
'storage_image_id':volume_id}))
138 except CLMException, error:
139 if error.status ==
'storage_image_get':
140 raise InvalidVolume.NotFound
144 for clm_volume
in clm_volumes:
145 create_time = clm_volume[
'creation_date']
148 'createTime': parseClmDate(create_time),
149 'size': clm_volume[
'size'] / SIZE_RATIO,
151 'volume-id': clm_volume[
'storage_image_id'],
154 'value': clm_volume[
'name']
157 volumes.append(volume)
160 if filters.get(
'size'):
161 for size
in filters[
'size']:
162 size = str(int(size) / SIZE_RATIO)
164 if filters.get(
'status'):
165 for state
in filters[
'status']:
166 state = [k
for k, v
in STATE.iteritems()
if v == STATE.get(state) ]
197 volume_id_ec2 = self.parameters[
'VolumeId']
198 volume_id = parseID(volume_id_ec2, Entity.volume)
200 raise InvalidParameterValue
201 volume_id = int(volume_id)
202 except KeyError, error:
203 raise InvalidVolumeID.Malformed
206 instance_id_ec2 = self.parameters[
'InstanceId']
207 instance_id = parseID(instance_id_ec2, Entity.instance)
209 raise InvalidParameterValue
210 instance_id = int(instance_id)
211 except KeyError, error:
212 raise MissingParameter(parameter=error.args[0])
214 except ValueError, error:
215 raise InvalidVolumeID.Malformed
218 self.cluster_manager.user.storage_image.attach({
'storage_image_id' : volume_id ,
219 'vm_id' : instance_id})
220 except CLMException, error:
221 if error.status ==
'image_attached':
223 if error.status ==
'storage_image_get':
224 raise InvalidVolume.NotFound
225 if error.status ==
'user_permission' or error.status ==
'vm_get':
226 raise InvalidInstanceID.NotFound(image_id=instance_id_ec2)
228 if error.status ==
'storage_image_attach':
232 return {
'volume_id' : volume_id_ec2,
233 'instance_id' : instance_id_ec2,
234 'device' :
'not implemented',
235 'status' :
'attaching'}
242 volume_id = self.parameters[
'VolumeId']
243 volume_id = parseID(volume_id, Entity.volume)
245 raise InvalidParameterValue
246 volume_id = int(volume_id)
247 except KeyError, error:
248 raise MissingParameter(parameter=error.args[0])
249 except ValueError, error:
250 raise InvalidParameterValue
253 instance_id_ec2 = self.parameters.get(
'InstanceId')
254 instance_id = instance_id_ec2
256 instance_id = parseID(instance_id_ec2, Entity.instance)
258 raise InvalidParameterValue
259 instance_id = int(instance_id)
261 self.cluster_manager.user.storage_image.detach({
'storage_image_id' : volume_id,
'vm_id' : instance_id })
262 except CLMException, error:
263 if error.status ==
'storage_image_detach':
265 if error.status ==
'image_attached':
267 if error.status ==
'storage_image_get':
268 raise InvalidVolume.NotFound
269 if error.status ==
'user_permission' or error.status ==
'vm_get':
270 raise InvalidInstanceID.NotFound(image_id=instance_id)
274 volume_dict = self.cluster_manager.user.storage_image.get_by_id({
'storage_image_id':volume_id})
275 if volume_dict[
'vm_id']
is None:
276 raise InvalidAttachment.NotFound
277 self.cluster_manager.user.storage_image.detach({
'storage_image_id' : volume_id,
'vm_id' : volume_dict[
'vm_id'] })
278 except CLMException, error:
279 if error.status ==
'storage_image_detach':
281 if error.status ==
'image_attached':
283 if error.status ==
'storage_image_get':
284 raise InvalidVolume.NotFound
285 if error.status ==
'user_permission' or error.status ==
'vm_get':
286 raise InvalidInstanceID.NotFound(image_id=instance_id)
289 return {
'volume_id':volume_id,
290 'instance_id' : instance_id}
295 volume_id = self.parameters[
'VolumeId']
296 volume_id = parseID(volume_id, Entity.volume)
298 raise InvalidParameterValue
299 volume_id = int(volume_id)
301 raise MissingParameter(parameter=
'VolumeId')
303 raise InvalidVolumeID.Malformed(image_id=volume_id)
306 self.cluster_manager.user.storage_image.delete({
'storage_image_id' : volume_id})
307 except CLMException, error:
308 if error.status ==
'storage_image_get' or error.status ==
'image_permission':
309 raise InvalidVolume.NotFound
310 if error.status ==
'image_attached':