19 from common.states
import ec2names, vm_states, image_access
20 from ec2.base.action
import Action, CLMException
21 from ec2.error
import InvalidAMIID, InvalidKeyPair, MissingParameter, \
22 InvalidParameterValue, InvalidInstanceID, InvalidVolumeID, InternalError, \
23 UndefinedError, InvalidFilter, ResourceLimitExceeded, InvalidVolume
24 from ec2.helpers.entities
import Entity
25 from ec2.helpers.filters
import applyEc2Filters, validateEc2Filters
26 from ec2.helpers.parse
import parseSequenceIntArguments, parseFilters, parseIDs, \
27 parseID, parseSequenceArguments, parseClmDate
29 """@package src.ec2.instance
30 EC2 actions for instances
32 @copyright Copyright (c) 2012 Institute of Nuclear Physics PAS <http://www.ifj.edu.pl/>
33 @author Oleksandr Gituliar <gituliar@gmail.com>
34 @author Rafał Grzymkowski
36 @author Łukasz Chrząszcz <l.chrzaszcz@gmail.com>
42 2: (32,
'shutting-down'),
43 3: (48,
'terminated'),
56 available_filters = [
'image-id',
'instance-id',
'reservation-id']
67 instance_id = self.parameters.get(
'InstanceId.' + str(counter),
None)
69 if instance_id
is None:
72 instance_id = parseID(instance_id, Entity.instance)
73 if instance_id
is None:
74 raise InvalidParameterValue
78 instance = int(instance_id)
80 raise InvalidParameterValue
82 clm_instances.append({
'vm_id':instance })
86 clm_instances = self.cluster_manager.user.vm.get_list()
90 for clm_instance
in clm_instances:
91 clm_instance = self.cluster_manager.user.vm.get_by_id({
'vm_id': clm_instance[
'vm_id']})
92 if clm_instance[
'state'] == vm_states[
'closed']:
93 raise InvalidInstanceID.NotFound(image_id=clm_instance[
'vm_id'])
95 private_ip_address =
None
96 if clm_instance[
'leases']:
97 private_ip_address = clm_instance[
'leases'][0].
get(
'address')
100 'image-id': clm_instance[
'image_id'],
101 'instance-id': clm_instance[
'vm_id'],
103 'code': CLM_STATES[clm_instance[
'state']][0],
104 'name': CLM_STATES[clm_instance[
'state']][1]},
105 'launchTime': parseClmDate(clm_instance[
'start_time']),
106 'template_name': clm_instance[
'template_name'],
107 'ownerId': clm_instance[
'user_id'],
109 'availabilityZone': self.cluster_manager.name},
110 'privateIpAddress': private_ip_address,
111 'reservation-id': clm_instance[
'reservation_id'],
114 'value': clm_instance[
'name']
118 public_ip = clm_instance[
'leases'][0][
'public_ip']
119 ec2_instance[
'ipAddress'] = public_ip.get(
'ip')
if public_ip
else None
120 ec2_instances.append(ec2_instance)
121 except CLMException, error:
122 if error.status ==
'vm_get' or error.status ==
'user_permission':
123 raise InvalidInstanceID.NotFound(image_id=clm_instance[
'vm_id'])
127 owner_id = ec2_instances[0][
'ownerId']
129 reservation_filter =
None
130 if filters
and filters.get(
'reservation-id'):
131 reservation_filter = {
'reservation-id': filters[
'reservation-id'] }
132 del filters[
'reservation-id']
136 reservations_ids = []
137 for ec2_instance
in ec2_instances:
138 reservation_ids = int(ec2_instance[
'reservation-id'])
139 if reservation_ids
not in reservations_ids:
140 reservations_ids.append(reservation_ids)
143 for reservation
in reservations_ids:
144 reservations.append({
'reservation-id' : reservation,
145 'ownerId' : owner_id,
146 'instances': [instance
for instance
in ec2_instances
if instance[
'reservation-id'] == reservation]
149 if reservation_filter:
152 return {
'reservations' : reservations}
158 image_id = self.parameters[
'ImageId']
159 image_id = parseID(image_id, Entity.image)
161 raise InvalidAMIID.Malformed
163 image_id = int(image_id)
165 raise MissingParameter(parameter=
'ImageId')
167 raise InvalidAMIID.Malformed
170 instance_type = self.parameters.get(
'InstanceType',
'm1.small')
171 key_name = self.parameters.get(
'KeyName')
172 user_data = self.parameters.get(
'UserData',
None)
175 for template
in self.cluster_manager.user.template.get_list():
176 if template.get(
'ec2name') == ec2names.get(instance_type):
178 template_id = int(template[
'template_id'])
182 'count': int(self.parameters.get(
'MinCount', 1)),
183 'description':
'created by EC2 API',
184 'image_id': image_id,
186 'template_id': template_id
if template_id
is not None else 1,
191 'user_data' : user_data
196 key = self.cluster_manager.user.key.get({
'name':key_name})
197 except CLMException, error:
198 if error.status ==
'ssh_key_get':
199 raise InvalidKeyPair.NotFound(key_name=key_name)
200 machine[
'ssh_key'] = key[
'data']
201 machine[
'ssh_username'] =
'root'
204 device_mapping_counter = 1
210 volume = self.parameters.get(
'BlockDeviceMapping.' +
211 str(device_mapping_counter) +
217 volume = parseID(volume, Entity.volume)
219 raise InvalidParameterValue
221 device_mapping_counter += 1
223 volumes.append(int(volume))
225 raise InvalidVolumeID.Malformed
228 machine[
'disk_list'] = volumes
237 instances = self.cluster_manager.user.vm.create(machine)
239 except CLMException, error:
240 if error.status ==
'vm_create':
242 if error.status ==
'system_image_get' or error.status ==
'image_permission':
243 raise InvalidAMIID.NotFound(image_id=image_id)
244 if error.status ==
'storage_image_get':
245 raise InvalidVolume.NotFound
246 if error.status ==
'user_cpu_limit':
247 raise ResourceLimitExceeded(resource=
"CPU")
248 if error.status ==
'user_memory_limit':
249 raise ResourceLimitExceeded(resource=
"RAM")
250 if error.status ==
'user_storage_limit':
251 raise ResourceLimitExceeded(resource=
"Storage")
252 if error.status ==
'image_unavailable':
253 raise InvalidAMIID.Unavailable
258 reservation_id = instances[0][
'vm_id']
259 instance_ids = [instance[
'vm_id']
for instance
in instances]
260 print 'instance_ids:', instance_ids
262 for instance_id
in instance_ids:
268 edit_response = self.cluster_manager.user.vm.edit({
'vm_id': instance_id,
269 'name':
'i-' + str(instance_id),
270 'description':
'created by EC2 API' })
274 'reservationId' : reservation_id,
277 'instanceId': instance_id,
278 'instance_type': instance_type,
279 }
for instance_id
in instance_ids]
288 for param, value
in self.parameters.iteritems():
289 if param.startswith(
'InstanceId'):
291 value = parseID(value, Entity.instance)
293 raise InvalidParameterValue
294 instance_ids.append(int(value))
296 raise InvalidInstanceID.Malformed(image_id=value)
298 raise MissingParameter(parameter=
'InstanceId')
301 none = self.cluster_manager.user.vm.destroy({
'vm_ids': instance_ids})
302 except CLMException, error:
303 if error.status ==
'vm_get' or error.status ==
'user_permission':
304 raise InvalidInstanceID.NotFound(image_id=0)
311 }
for instance_id
in instance_ids],
319 raise MissingParameter(parameter=
'InstanceId')
320 instances = parseIDs(instances, Entity.instance)
322 raise InvalidParameterValue
325 raise InvalidInstanceID.Malformed(image_id=0)
328 none = self.cluster_manager.user.vm.reset({
'vm_ids':instances })
329 except CLMException, error:
330 if error.status ==
'user_permission' or error.status ==
'vm_get':
331 raise InvalidInstanceID.NotFound(image_id=0)