19 from ec2.base.action
import Action, CLMException
20 from ec2.error
import MissingParameter, InvalidAMIID, InvalidParameterValue, \
21 InvalidInstanceID, InvalidVolumeID, InvalidVolume, InvalidFilter, InvalidID, \
23 from ec2.helpers.entities
import Entity
24 from ec2.helpers.filters
import validateEc2Filters
25 from ec2.helpers.parse
import parseFilters, parseSequenceArguments, parseID
26 from ec2.helpers.query
import get_instance_tags, get_volume_tags, \
27 get_volume_name_tag, get_instance_name_tag
29 """@package src.ec2.universal
30 EC2 actions common for more than one resource
32 @copyright Copyright (c) 2014 Institute of Nuclear Physics PAS <http://www.ifj.edu.pl/>
33 @author Łukasz Chrząszcz <l.chrzaszcz@gmail.com>
41 for param, value
in self.parameters.iteritems():
42 if param.startswith(
'ResourceId'):
43 resource_ids.append(value)
44 elif param.startswith(
'Tag.')
and param.endswith(
'Key'):
45 tag_value = self.parameters.get(
'Tag.' + param[4:-4] +
'.Value')
47 raise InvalidParameterValue
49 raise MissingParameter(parameter=
'Tag.' + param[4:-4] +
'.Value')
50 tags.append({
'Name': tag_value})
56 for resource
in resource_ids:
57 if resource.startswith(
'vol-'):
60 volume = self.cluster_manager.user.storage_image.get_by_id({
'storage_image_id':resource[4:]})
61 except CLMException,error :
62 raise InvalidVolume.NotFound
64 self.cluster_manager.user.storage_image.edit({
'storage_image_id':resource[4:],
66 'description' : volume[
'description'],
67 'disk_controller' : volume[
'disk_controller']})
68 elif resource.startswith(
'i-'):
71 instance = self.cluster_manager.user.vm.get_by_id({
'vm_id': resource[2:]})
72 except CLMException, error:
73 raise InvalidInstanceID.NotFound(image_id=resource)
75 self.cluster_manager.user.vm.edit({
'vm_id': resource[2:],
77 'description' : instance[
'description']})
79 raise InvalidParameterValue
87 available_filters = [
'key',
'resource-id',
'resoure-type',
'value']
90 if self.parameters.get(
'MaxResults'):
91 raise UnknownParameter(parameter=
'MaxResults')
93 if self.parameters.get(
'NextToken'):
94 raise UnknownParameter(parameter=
'NextToken')
106 if filters.get(
'key'):
107 for key
in filters[
'key']:
112 if filters.get(
'resource-id'):
113 for filter
in filters[
'resource-id']:
114 if filter.startswith(
'vol-')
and (
not filters.get(
'resource-type')
or filters.get(
'resource-type') ==
'volume'):
116 elif filter.startswith(
'i-')
and (
not filters.get(
'resource-type')
or filters.get(
'resource-type') ==
'instance'):
118 elif filters.get(
'resource-type'):
119 for filter
in filters[
'resource-type']:
120 if filter ==
'instance':
122 elif filter ==
'volume':
124 del filters[
'resource-type']
128 if filters.get(
'value'):
129 tags = [tag
for tag
in tags
if tag[
'value']
in filters[
'value']]
140 tagValue = self.parameters.get(
'Tag.0.Value')
143 raise MissingParameter(parameter=
'ResourceId.X')
146 raise MissingParameter(parameter=
'Tag.X.Key')
148 if len(tagNames) != 1:
151 if tagNames[0] !=
'Name':
158 for resource
in resourceIds:
160 if resource.startswith(
'i-'):
161 instance_id = parseID(resource, Entity.instance)
163 raise InvalidInstanceID.Malformed
165 instance = self.cluster_manager.user.vm.get_by_id({
'vm_id':instance_id})
166 except CLMException, error:
167 raise InvalidInstanceID.NotFound(image_id=instance_id)
169 if tagValue
and tagValue != instance[
'name']:
171 self.cluster_manager.user.vm.edit({
'vm_id': instance_id,
'name':
'i-' + instance_id,
'description': instance[
'description']})
173 elif resource.startswith(
'vol-'):
174 volume_id = parseID(resource, Entity.volume)
176 raise InvalidVolumeID.Malformed
179 volume = self.cluster_manager.user.storage_image.get_by_id({
'storage_image_id':volume_id})
180 except CLMException, error:
181 raise InvalidVolume.NotFound()
183 if tagValue
and tagValue != volume[
'name']:
186 self.cluster_manager.user.storage_image.edit({
'storage_image_id' : volume_id,
187 'name' :
'vol-' + volume_id,
188 'description':volume[
'description'],
189 'disk_controller':volume[
'disk_controller']})