comparison venv/lib/python2.7/site-packages/boto/ec2/image.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 # Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
2 # Copyright (c) 2010, Eucalyptus Systems, Inc.
3 #
4 # Permission is hereby granted, free of charge, to any person obtaining a
5 # copy of this software and associated documentation files (the
6 # "Software"), to deal in the Software without restriction, including
7 # without limitation the rights to use, copy, modify, merge, publish, dis-
8 # tribute, sublicense, and/or sell copies of the Software, and to permit
9 # persons to whom the Software is furnished to do so, subject to the fol-
10 # lowing conditions:
11 #
12 # The above copyright notice and this permission notice shall be included
13 # in all copies or substantial portions of the Software.
14 #
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
18 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 # IN THE SOFTWARE.
22
23 from boto.ec2.ec2object import EC2Object, TaggedEC2Object
24 from boto.ec2.blockdevicemapping import BlockDeviceMapping
25
26
27 class ProductCodes(list):
28 def startElement(self, name, attrs, connection):
29 pass
30
31 def endElement(self, name, value, connection):
32 if name == 'productCode':
33 self.append(value)
34
35
36 class BillingProducts(list):
37 def startElement(self, name, attrs, connection):
38 pass
39
40 def endElement(self, name, value, connection):
41 if name == 'billingProduct':
42 self.append(value)
43
44
45 class Image(TaggedEC2Object):
46 """
47 Represents an EC2 Image
48 """
49
50 def __init__(self, connection=None):
51 super(Image, self).__init__(connection)
52 self.id = None
53 self.location = None
54 self.state = None
55 self.ownerId = None # for backwards compatibility
56 self.owner_id = None
57 self.owner_alias = None
58 self.is_public = False
59 self.architecture = None
60 self.platform = None
61 self.type = None
62 self.kernel_id = None
63 self.ramdisk_id = None
64 self.name = None
65 self.description = None
66 self.product_codes = ProductCodes()
67 self.billing_products = BillingProducts()
68 self.block_device_mapping = None
69 self.root_device_type = None
70 self.root_device_name = None
71 self.virtualization_type = None
72 self.hypervisor = None
73 self.instance_lifecycle = None
74 self.sriov_net_support = None
75
76 def __repr__(self):
77 return 'Image:%s' % self.id
78
79 def startElement(self, name, attrs, connection):
80 retval = super(Image, self).startElement(name, attrs, connection)
81 if retval is not None:
82 return retval
83 if name == 'blockDeviceMapping':
84 self.block_device_mapping = BlockDeviceMapping()
85 return self.block_device_mapping
86 elif name == 'productCodes':
87 return self.product_codes
88 elif name == 'billingProducts':
89 return self.billing_products
90 else:
91 return None
92
93 def endElement(self, name, value, connection):
94 if name == 'imageId':
95 self.id = value
96 elif name == 'imageLocation':
97 self.location = value
98 elif name == 'imageState':
99 self.state = value
100 elif name == 'imageOwnerId':
101 self.ownerId = value # for backwards compatibility
102 self.owner_id = value
103 elif name == 'isPublic':
104 if value == 'false':
105 self.is_public = False
106 elif value == 'true':
107 self.is_public = True
108 else:
109 raise Exception(
110 'Unexpected value of isPublic %s for image %s' % (
111 value,
112 self.id
113 )
114 )
115 elif name == 'architecture':
116 self.architecture = value
117 elif name == 'imageType':
118 self.type = value
119 elif name == 'kernelId':
120 self.kernel_id = value
121 elif name == 'ramdiskId':
122 self.ramdisk_id = value
123 elif name == 'imageOwnerAlias':
124 self.owner_alias = value
125 elif name == 'platform':
126 self.platform = value
127 elif name == 'name':
128 self.name = value
129 elif name == 'description':
130 self.description = value
131 elif name == 'rootDeviceType':
132 self.root_device_type = value
133 elif name == 'rootDeviceName':
134 self.root_device_name = value
135 elif name == 'virtualizationType':
136 self.virtualization_type = value
137 elif name == 'hypervisor':
138 self.hypervisor = value
139 elif name == 'instanceLifecycle':
140 self.instance_lifecycle = value
141 elif name == 'sriovNetSupport':
142 self.sriov_net_support = value
143 else:
144 setattr(self, name, value)
145
146 def _update(self, updated):
147 self.__dict__.update(updated.__dict__)
148
149 def update(self, validate=False, dry_run=False):
150 """
151 Update the image's state information by making a call to fetch
152 the current image attributes from the service.
153
154 :type validate: bool
155 :param validate: By default, if EC2 returns no data about the
156 image the update method returns quietly. If
157 the validate param is True, however, it will
158 raise a ValueError exception if no data is
159 returned from EC2.
160 """
161 rs = self.connection.get_all_images([self.id], dry_run=dry_run)
162 if len(rs) > 0:
163 img = rs[0]
164 if img.id == self.id:
165 self._update(img)
166 elif validate:
167 raise ValueError('%s is not a valid Image ID' % self.id)
168 return self.state
169
170 def run(self, min_count=1, max_count=1, key_name=None,
171 security_groups=None, user_data=None,
172 addressing_type=None, instance_type='m1.small', placement=None,
173 kernel_id=None, ramdisk_id=None,
174 monitoring_enabled=False, subnet_id=None,
175 block_device_map=None,
176 disable_api_termination=False,
177 instance_initiated_shutdown_behavior=None,
178 private_ip_address=None,
179 placement_group=None, security_group_ids=None,
180 additional_info=None, instance_profile_name=None,
181 instance_profile_arn=None, tenancy=None, dry_run=False):
182
183 """
184 Runs this instance.
185
186 :type min_count: int
187 :param min_count: The minimum number of instances to start
188
189 :type max_count: int
190 :param max_count: The maximum number of instances to start
191
192 :type key_name: string
193 :param key_name: The name of the key pair with which to
194 launch instances.
195
196 :type security_groups: list of strings
197 :param security_groups: The names of the security groups with which to
198 associate instances.
199
200 :type user_data: string
201 :param user_data: The Base64-encoded MIME user data to be made
202 available to the instance(s) in this reservation.
203
204 :type instance_type: string
205 :param instance_type: The type of instance to run:
206
207 * t1.micro
208 * m1.small
209 * m1.medium
210 * m1.large
211 * m1.xlarge
212 * m3.medium
213 * m3.large
214 * m3.xlarge
215 * m3.2xlarge
216 * c1.medium
217 * c1.xlarge
218 * m2.xlarge
219 * m2.2xlarge
220 * m2.4xlarge
221 * cr1.8xlarge
222 * hi1.4xlarge
223 * hs1.8xlarge
224 * cc1.4xlarge
225 * cg1.4xlarge
226 * cc2.8xlarge
227 * g2.2xlarge
228 * c3.large
229 * c3.xlarge
230 * c3.2xlarge
231 * c3.4xlarge
232 * c3.8xlarge
233 * i2.xlarge
234 * i2.2xlarge
235 * i2.4xlarge
236 * i2.8xlarge
237 * t2.micro
238 * t2.small
239 * t2.medium
240
241 :type placement: string
242 :param placement: The Availability Zone to launch the instance into.
243
244 :type kernel_id: string
245 :param kernel_id: The ID of the kernel with which to launch the
246 instances.
247
248 :type ramdisk_id: string
249 :param ramdisk_id: The ID of the RAM disk with which to launch the
250 instances.
251
252 :type monitoring_enabled: bool
253 :param monitoring_enabled: Enable CloudWatch monitoring on
254 the instance.
255
256 :type subnet_id: string
257 :param subnet_id: The subnet ID within which to launch the instances
258 for VPC.
259
260 :type private_ip_address: string
261 :param private_ip_address: If you're using VPC, you can
262 optionally use this parameter to assign the instance a
263 specific available IP address from the subnet (e.g.,
264 10.0.0.25).
265
266 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
267 :param block_device_map: A BlockDeviceMapping data structure
268 describing the EBS volumes associated with the Image.
269
270 :type disable_api_termination: bool
271 :param disable_api_termination: If True, the instances will be locked
272 and will not be able to be terminated via the API.
273
274 :type instance_initiated_shutdown_behavior: string
275 :param instance_initiated_shutdown_behavior: Specifies whether the
276 instance stops or terminates on instance-initiated shutdown.
277 Valid values are:
278
279 * stop
280 * terminate
281
282 :type placement_group: string
283 :param placement_group: If specified, this is the name of the placement
284 group in which the instance(s) will be launched.
285
286 :type additional_info: string
287 :param additional_info: Specifies additional information to make
288 available to the instance(s).
289
290 :type security_group_ids: list of strings
291 :param security_group_ids: The ID of the VPC security groups with
292 which to associate instances.
293
294 :type instance_profile_name: string
295 :param instance_profile_name: The name of
296 the IAM Instance Profile (IIP) to associate with the instances.
297
298 :type instance_profile_arn: string
299 :param instance_profile_arn: The Amazon resource name (ARN) of
300 the IAM Instance Profile (IIP) to associate with the instances.
301
302 :type tenancy: string
303 :param tenancy: The tenancy of the instance you want to
304 launch. An instance with a tenancy of 'dedicated' runs on
305 single-tenant hardware and can only be launched into a
306 VPC. Valid values are:"default" or "dedicated".
307 NOTE: To use dedicated tenancy you MUST specify a VPC
308 subnet-ID as well.
309
310 :rtype: Reservation
311 :return: The :class:`boto.ec2.instance.Reservation` associated with
312 the request for machines
313
314 """
315
316 return self.connection.run_instances(self.id, min_count, max_count,
317 key_name, security_groups,
318 user_data, addressing_type,
319 instance_type, placement,
320 kernel_id, ramdisk_id,
321 monitoring_enabled, subnet_id,
322 block_device_map, disable_api_termination,
323 instance_initiated_shutdown_behavior,
324 private_ip_address, placement_group,
325 security_group_ids=security_group_ids,
326 additional_info=additional_info,
327 instance_profile_name=instance_profile_name,
328 instance_profile_arn=instance_profile_arn,
329 tenancy=tenancy, dry_run=dry_run)
330
331 def deregister(self, delete_snapshot=False, dry_run=False):
332 return self.connection.deregister_image(
333 self.id,
334 delete_snapshot,
335 dry_run=dry_run
336 )
337
338 def get_launch_permissions(self, dry_run=False):
339 img_attrs = self.connection.get_image_attribute(
340 self.id,
341 'launchPermission',
342 dry_run=dry_run
343 )
344 return img_attrs.attrs
345
346 def set_launch_permissions(self, user_ids=None, group_names=None,
347 dry_run=False):
348 return self.connection.modify_image_attribute(self.id,
349 'launchPermission',
350 'add',
351 user_ids,
352 group_names,
353 dry_run=dry_run)
354
355 def remove_launch_permissions(self, user_ids=None, group_names=None,
356 dry_run=False):
357 return self.connection.modify_image_attribute(self.id,
358 'launchPermission',
359 'remove',
360 user_ids,
361 group_names,
362 dry_run=dry_run)
363
364 def reset_launch_attributes(self, dry_run=False):
365 return self.connection.reset_image_attribute(
366 self.id,
367 'launchPermission',
368 dry_run=dry_run
369 )
370
371 def get_kernel(self, dry_run=False):
372 img_attrs = self.connection.get_image_attribute(
373 self.id,
374 'kernel',
375 dry_run=dry_run
376 )
377 return img_attrs.kernel
378
379 def get_ramdisk(self, dry_run=False):
380 img_attrs = self.connection.get_image_attribute(
381 self.id,
382 'ramdisk',
383 dry_run=dry_run
384 )
385 return img_attrs.ramdisk
386
387
388 class ImageAttribute(object):
389 def __init__(self, parent=None):
390 self.name = None
391 self.kernel = None
392 self.ramdisk = None
393 self.attrs = {}
394
395 def startElement(self, name, attrs, connection):
396 if name == 'blockDeviceMapping':
397 self.attrs['block_device_mapping'] = BlockDeviceMapping()
398 return self.attrs['block_device_mapping']
399 else:
400 return None
401
402 def endElement(self, name, value, connection):
403 if name == 'launchPermission':
404 self.name = 'launch_permission'
405 elif name == 'group':
406 if 'groups' in self.attrs:
407 self.attrs['groups'].append(value)
408 else:
409 self.attrs['groups'] = [value]
410 elif name == 'userId':
411 if 'user_ids' in self.attrs:
412 self.attrs['user_ids'].append(value)
413 else:
414 self.attrs['user_ids'] = [value]
415 elif name == 'productCode':
416 if 'product_codes' in self.attrs:
417 self.attrs['product_codes'].append(value)
418 else:
419 self.attrs['product_codes'] = [value]
420 elif name == 'imageId':
421 self.image_id = value
422 elif name == 'kernel':
423 self.kernel = value
424 elif name == 'ramdisk':
425 self.ramdisk = value
426 else:
427 setattr(self, name, value)
428
429
430 class CopyImage(object):
431 def __init__(self, parent=None):
432 self._parent = parent
433 self.image_id = None
434
435 def startElement(self, name, attrs, connection):
436 pass
437
438 def endElement(self, name, value, connection):
439 if name == 'imageId':
440 self.image_id = value