comparison venv/lib/python2.7/site-packages/boto/ec2/connection.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-2012 Mitch Garnaat http://garnaat.org/
2 # Copyright (c) 2010, Eucalyptus Systems, Inc.
3 # Copyright (c) 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish, dis-
9 # tribute, sublicense, and/or sell copies of the Software, and to permit
10 # persons to whom the Software is furnished to do so, subject to the fol-
11 # lowing conditions:
12 #
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
18 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
19 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 # IN THE SOFTWARE.
23
24 """
25 Represents a connection to the EC2 service.
26 """
27
28 import base64
29 import warnings
30 from datetime import datetime
31 from datetime import timedelta
32
33 import boto
34 from boto.auth import detect_potential_sigv4
35 from boto.connection import AWSQueryConnection
36 from boto.resultset import ResultSet
37 from boto.ec2.image import Image, ImageAttribute, CopyImage
38 from boto.ec2.instance import Reservation, Instance
39 from boto.ec2.instance import ConsoleOutput, InstanceAttribute
40 from boto.ec2.keypair import KeyPair
41 from boto.ec2.address import Address
42 from boto.ec2.volume import Volume, VolumeAttribute
43 from boto.ec2.snapshot import Snapshot
44 from boto.ec2.snapshot import SnapshotAttribute
45 from boto.ec2.zone import Zone
46 from boto.ec2.securitygroup import SecurityGroup
47 from boto.ec2.regioninfo import RegionInfo
48 from boto.ec2.instanceinfo import InstanceInfo
49 from boto.ec2.reservedinstance import ReservedInstancesOffering
50 from boto.ec2.reservedinstance import ReservedInstance
51 from boto.ec2.reservedinstance import ReservedInstanceListing
52 from boto.ec2.reservedinstance import ReservedInstancesConfiguration
53 from boto.ec2.reservedinstance import ModifyReservedInstancesResult
54 from boto.ec2.reservedinstance import ReservedInstancesModification
55 from boto.ec2.spotinstancerequest import SpotInstanceRequest
56 from boto.ec2.spotpricehistory import SpotPriceHistory
57 from boto.ec2.spotdatafeedsubscription import SpotDatafeedSubscription
58 from boto.ec2.bundleinstance import BundleInstanceTask
59 from boto.ec2.placementgroup import PlacementGroup
60 from boto.ec2.tag import Tag
61 from boto.ec2.instancetype import InstanceType
62 from boto.ec2.instancestatus import InstanceStatusSet
63 from boto.ec2.volumestatus import VolumeStatusSet
64 from boto.ec2.networkinterface import NetworkInterface
65 from boto.ec2.attributes import AccountAttribute, VPCAttribute
66 from boto.ec2.blockdevicemapping import BlockDeviceMapping, BlockDeviceType
67 from boto.exception import EC2ResponseError
68 from boto.compat import six
69
70 #boto.set_stream_logger('ec2')
71
72
73 class EC2Connection(AWSQueryConnection):
74
75 APIVersion = boto.config.get('Boto', 'ec2_version', '2014-10-01')
76 DefaultRegionName = boto.config.get('Boto', 'ec2_region_name', 'us-east-1')
77 DefaultRegionEndpoint = boto.config.get('Boto', 'ec2_region_endpoint',
78 'ec2.us-east-1.amazonaws.com')
79 ResponseError = EC2ResponseError
80
81 def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,
82 is_secure=True, host=None, port=None,
83 proxy=None, proxy_port=None,
84 proxy_user=None, proxy_pass=None, debug=0,
85 https_connection_factory=None, region=None, path='/',
86 api_version=None, security_token=None,
87 validate_certs=True, profile_name=None):
88 """
89 Init method to create a new connection to EC2.
90 """
91 if not region:
92 region = RegionInfo(self, self.DefaultRegionName,
93 self.DefaultRegionEndpoint)
94 self.region = region
95 super(EC2Connection, self).__init__(aws_access_key_id,
96 aws_secret_access_key,
97 is_secure, port, proxy, proxy_port,
98 proxy_user, proxy_pass,
99 self.region.endpoint, debug,
100 https_connection_factory, path,
101 security_token,
102 validate_certs=validate_certs,
103 profile_name=profile_name)
104 if api_version:
105 self.APIVersion = api_version
106
107 def _required_auth_capability(self):
108 return ['hmac-v4']
109
110 def get_params(self):
111 """
112 Returns a dictionary containing the value of all of the keyword
113 arguments passed when constructing this connection.
114 """
115 param_names = ['aws_access_key_id', 'aws_secret_access_key',
116 'is_secure', 'port', 'proxy', 'proxy_port',
117 'proxy_user', 'proxy_pass',
118 'debug', 'https_connection_factory']
119 params = {}
120 for name in param_names:
121 params[name] = getattr(self, name)
122 return params
123
124 def build_filter_params(self, params, filters):
125 if not isinstance(filters, dict):
126 filters = dict(filters)
127
128 i = 1
129 for name in filters:
130 aws_name = name
131 if not aws_name.startswith('tag:'):
132 aws_name = name.replace('_', '-')
133 params['Filter.%d.Name' % i] = aws_name
134 value = filters[name]
135 if not isinstance(value, list):
136 value = [value]
137 j = 1
138 for v in value:
139 params['Filter.%d.Value.%d' % (i, j)] = v
140 j += 1
141 i += 1
142
143 # Image methods
144
145 def get_all_images(self, image_ids=None, owners=None,
146 executable_by=None, filters=None, dry_run=False):
147 """
148 Retrieve all the EC2 images available on your account.
149
150 :type image_ids: list
151 :param image_ids: A list of strings with the image IDs wanted
152
153 :type owners: list
154 :param owners: A list of owner IDs, the special strings 'self',
155 'amazon', and 'aws-marketplace', may be used to describe
156 images owned by you, Amazon or AWS Marketplace
157 respectively
158
159 :type executable_by: list
160 :param executable_by: Returns AMIs for which the specified
161 user ID has explicit launch permissions
162
163 :type filters: dict
164 :param filters: Optional filters that can be used to limit the
165 results returned. Filters are provided in the form of a
166 dictionary consisting of filter names as the key and
167 filter values as the value. The set of allowable filter
168 names/values is dependent on the request being performed.
169 Check the EC2 API guide for details.
170
171 :type dry_run: bool
172 :param dry_run: Set to True if the operation should not actually run.
173
174 :rtype: list
175 :return: A list of :class:`boto.ec2.image.Image`
176 """
177 params = {}
178 if image_ids:
179 self.build_list_params(params, image_ids, 'ImageId')
180 if owners:
181 self.build_list_params(params, owners, 'Owner')
182 if executable_by:
183 self.build_list_params(params, executable_by, 'ExecutableBy')
184 if filters:
185 self.build_filter_params(params, filters)
186 if dry_run:
187 params['DryRun'] = 'true'
188 return self.get_list('DescribeImages', params,
189 [('item', Image)], verb='POST')
190
191 def get_all_kernels(self, kernel_ids=None, owners=None, dry_run=False):
192 """
193 Retrieve all the EC2 kernels available on your account.
194 Constructs a filter to allow the processing to happen server side.
195
196 :type kernel_ids: list
197 :param kernel_ids: A list of strings with the image IDs wanted
198
199 :type owners: list
200 :param owners: A list of owner IDs
201
202 :type dry_run: bool
203 :param dry_run: Set to True if the operation should not actually run.
204
205 :rtype: list
206 :return: A list of :class:`boto.ec2.image.Image`
207 """
208 params = {}
209 if kernel_ids:
210 self.build_list_params(params, kernel_ids, 'ImageId')
211 if owners:
212 self.build_list_params(params, owners, 'Owner')
213 filter = {'image-type': 'kernel'}
214 self.build_filter_params(params, filter)
215 if dry_run:
216 params['DryRun'] = 'true'
217 return self.get_list('DescribeImages', params,
218 [('item', Image)], verb='POST')
219
220 def get_all_ramdisks(self, ramdisk_ids=None, owners=None, dry_run=False):
221 """
222 Retrieve all the EC2 ramdisks available on your account.
223 Constructs a filter to allow the processing to happen server side.
224
225 :type ramdisk_ids: list
226 :param ramdisk_ids: A list of strings with the image IDs wanted
227
228 :type owners: list
229 :param owners: A list of owner IDs
230
231 :type dry_run: bool
232 :param dry_run: Set to True if the operation should not actually run.
233
234 :rtype: list
235 :return: A list of :class:`boto.ec2.image.Image`
236 """
237 params = {}
238 if ramdisk_ids:
239 self.build_list_params(params, ramdisk_ids, 'ImageId')
240 if owners:
241 self.build_list_params(params, owners, 'Owner')
242 filter = {'image-type': 'ramdisk'}
243 self.build_filter_params(params, filter)
244 if dry_run:
245 params['DryRun'] = 'true'
246 return self.get_list('DescribeImages', params,
247 [('item', Image)], verb='POST')
248
249 def get_image(self, image_id, dry_run=False):
250 """
251 Shortcut method to retrieve a specific image (AMI).
252
253 :type image_id: string
254 :param image_id: the ID of the Image to retrieve
255
256 :type dry_run: bool
257 :param dry_run: Set to True if the operation should not actually run.
258
259 :rtype: :class:`boto.ec2.image.Image`
260 :return: The EC2 Image specified or None if the image is not found
261 """
262 try:
263 return self.get_all_images(image_ids=[image_id], dry_run=dry_run)[0]
264 except IndexError: # None of those images available
265 return None
266
267 def register_image(self, name=None, description=None, image_location=None,
268 architecture=None, kernel_id=None, ramdisk_id=None,
269 root_device_name=None, block_device_map=None,
270 dry_run=False, virtualization_type=None,
271 sriov_net_support=None,
272 snapshot_id=None,
273 delete_root_volume_on_termination=False):
274 """
275 Register an image.
276
277 :type name: string
278 :param name: The name of the AMI. Valid only for EBS-based images.
279
280 :type description: string
281 :param description: The description of the AMI.
282
283 :type image_location: string
284 :param image_location: Full path to your AMI manifest in
285 Amazon S3 storage. Only used for S3-based AMI's.
286
287 :type architecture: string
288 :param architecture: The architecture of the AMI. Valid choices are:
289 * i386
290 * x86_64
291
292 :type kernel_id: string
293 :param kernel_id: The ID of the kernel with which to launch
294 the instances
295
296 :type root_device_name: string
297 :param root_device_name: The root device name (e.g. /dev/sdh)
298
299 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
300 :param block_device_map: A BlockDeviceMapping data structure
301 describing the EBS volumes associated with the Image.
302
303 :type dry_run: bool
304 :param dry_run: Set to True if the operation should not actually run.
305
306 :type virtualization_type: string
307 :param virtualization_type: The virutalization_type of the image.
308 Valid choices are:
309 * paravirtual
310 * hvm
311
312 :type sriov_net_support: string
313 :param sriov_net_support: Advanced networking support.
314 Valid choices are:
315 * simple
316
317 :type snapshot_id: string
318 :param snapshot_id: A snapshot ID for the snapshot to be used
319 as root device for the image. Mutually exclusive with
320 block_device_map, requires root_device_name
321
322 :type delete_root_volume_on_termination: bool
323 :param delete_root_volume_on_termination: Whether to delete the root
324 volume of the image after instance termination. Only applies when
325 creating image from snapshot_id. Defaults to False. Note that
326 leaving volumes behind after instance termination is not free.
327
328 :rtype: string
329 :return: The new image id
330 """
331 params = {}
332 if name:
333 params['Name'] = name
334 if description:
335 params['Description'] = description
336 if architecture:
337 params['Architecture'] = architecture
338 if kernel_id:
339 params['KernelId'] = kernel_id
340 if ramdisk_id:
341 params['RamdiskId'] = ramdisk_id
342 if image_location:
343 params['ImageLocation'] = image_location
344 if root_device_name:
345 params['RootDeviceName'] = root_device_name
346 if snapshot_id:
347 root_vol = BlockDeviceType(snapshot_id=snapshot_id,
348 delete_on_termination=delete_root_volume_on_termination)
349 block_device_map = BlockDeviceMapping()
350 block_device_map[root_device_name] = root_vol
351 if block_device_map:
352 block_device_map.ec2_build_list_params(params)
353 if dry_run:
354 params['DryRun'] = 'true'
355 if virtualization_type:
356 params['VirtualizationType'] = virtualization_type
357 if sriov_net_support:
358 params['SriovNetSupport'] = sriov_net_support
359
360 rs = self.get_object('RegisterImage', params, ResultSet, verb='POST')
361 image_id = getattr(rs, 'imageId', None)
362 return image_id
363
364 def deregister_image(self, image_id, delete_snapshot=False, dry_run=False):
365 """
366 Unregister an AMI.
367
368 :type image_id: string
369 :param image_id: the ID of the Image to unregister
370
371 :type delete_snapshot: bool
372 :param delete_snapshot: Set to True if we should delete the
373 snapshot associated with an EBS volume mounted at /dev/sda1
374
375 :type dry_run: bool
376 :param dry_run: Set to True if the operation should not actually run.
377
378 :rtype: bool
379 :return: True if successful
380 """
381 snapshot_id = None
382 if delete_snapshot:
383 image = self.get_image(image_id)
384 for key in image.block_device_mapping:
385 if key == "/dev/sda1":
386 snapshot_id = image.block_device_mapping[key].snapshot_id
387 break
388 params = {
389 'ImageId': image_id,
390 }
391 if dry_run:
392 params['DryRun'] = 'true'
393 result = self.get_status('DeregisterImage',
394 params, verb='POST')
395 if result and snapshot_id:
396 return result and self.delete_snapshot(snapshot_id)
397 return result
398
399 def create_image(self, instance_id, name,
400 description=None, no_reboot=False,
401 block_device_mapping=None, dry_run=False):
402 """
403 Will create an AMI from the instance in the running or stopped
404 state.
405
406 :type instance_id: string
407 :param instance_id: the ID of the instance to image.
408
409 :type name: string
410 :param name: The name of the new image
411
412 :type description: string
413 :param description: An optional human-readable string describing
414 the contents and purpose of the AMI.
415
416 :type no_reboot: bool
417 :param no_reboot: An optional flag indicating that the
418 bundling process should not attempt to shutdown the
419 instance before bundling. If this flag is True, the
420 responsibility of maintaining file system integrity is
421 left to the owner of the instance.
422
423 :type block_device_mapping: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
424 :param block_device_mapping: A BlockDeviceMapping data structure
425 describing the EBS volumes associated with the Image.
426
427 :type dry_run: bool
428 :param dry_run: Set to True if the operation should not actually run.
429
430 :rtype: string
431 :return: The new image id
432 """
433 params = {'InstanceId': instance_id,
434 'Name': name}
435 if description:
436 params['Description'] = description
437 if no_reboot:
438 params['NoReboot'] = 'true'
439 if block_device_mapping:
440 block_device_mapping.ec2_build_list_params(params)
441 if dry_run:
442 params['DryRun'] = 'true'
443 img = self.get_object('CreateImage', params, Image, verb='POST')
444 return img.id
445
446 # ImageAttribute methods
447
448 def get_image_attribute(self, image_id, attribute='launchPermission',
449 dry_run=False):
450 """
451 Gets an attribute from an image.
452
453 :type image_id: string
454 :param image_id: The Amazon image id for which you want info about
455
456 :type attribute: string
457 :param attribute: The attribute you need information about.
458 Valid choices are:
459 * launchPermission
460 * productCodes
461 * blockDeviceMapping
462
463 :type dry_run: bool
464 :param dry_run: Set to True if the operation should not actually run.
465
466 :rtype: :class:`boto.ec2.image.ImageAttribute`
467 :return: An ImageAttribute object representing the value of the
468 attribute requested
469 """
470 params = {'ImageId': image_id,
471 'Attribute': attribute}
472 if dry_run:
473 params['DryRun'] = 'true'
474 return self.get_object('DescribeImageAttribute', params,
475 ImageAttribute, verb='POST')
476
477 def modify_image_attribute(self, image_id, attribute='launchPermission',
478 operation='add', user_ids=None, groups=None,
479 product_codes=None, dry_run=False):
480 """
481 Changes an attribute of an image.
482
483 :type image_id: string
484 :param image_id: The image id you wish to change
485
486 :type attribute: string
487 :param attribute: The attribute you wish to change
488
489 :type operation: string
490 :param operation: Either add or remove (this is required for changing
491 launchPermissions)
492
493 :type user_ids: list
494 :param user_ids: The Amazon IDs of users to add/remove attributes
495
496 :type groups: list
497 :param groups: The groups to add/remove attributes
498
499 :type product_codes: list
500 :param product_codes: Amazon DevPay product code. Currently only one
501 product code can be associated with an AMI. Once
502 set, the product code cannot be changed or reset.
503
504 :type dry_run: bool
505 :param dry_run: Set to True if the operation should not actually run.
506
507 """
508 params = {'ImageId': image_id,
509 'Attribute': attribute,
510 'OperationType': operation}
511 if user_ids:
512 self.build_list_params(params, user_ids, 'UserId')
513 if groups:
514 self.build_list_params(params, groups, 'UserGroup')
515 if product_codes:
516 self.build_list_params(params, product_codes, 'ProductCode')
517 if dry_run:
518 params['DryRun'] = 'true'
519 return self.get_status('ModifyImageAttribute', params, verb='POST')
520
521 def reset_image_attribute(self, image_id, attribute='launchPermission',
522 dry_run=False):
523 """
524 Resets an attribute of an AMI to its default value.
525
526 :type image_id: string
527 :param image_id: ID of the AMI for which an attribute will be described
528
529 :type attribute: string
530 :param attribute: The attribute to reset
531
532 :type dry_run: bool
533 :param dry_run: Set to True if the operation should not actually run.
534
535 :rtype: bool
536 :return: Whether the operation succeeded or not
537 """
538 params = {'ImageId': image_id,
539 'Attribute': attribute}
540 if dry_run:
541 params['DryRun'] = 'true'
542 return self.get_status('ResetImageAttribute', params, verb='POST')
543
544 # Instance methods
545
546 def get_all_instances(self, instance_ids=None, filters=None, dry_run=False,
547 max_results=None):
548 """
549 Retrieve all the instance reservations associated with your account.
550
551 .. note::
552 This method's current behavior is deprecated in favor of
553 :meth:`get_all_reservations`. A future major release will change
554 :meth:`get_all_instances` to return a list of
555 :class:`boto.ec2.instance.Instance` objects as its name suggests.
556 To obtain that behavior today, use :meth:`get_only_instances`.
557
558 :type instance_ids: list
559 :param instance_ids: A list of strings of instance IDs
560
561 :type filters: dict
562 :param filters: Optional filters that can be used to limit the
563 results returned. Filters are provided in the form of a
564 dictionary consisting of filter names as the key and
565 filter values as the value. The set of allowable filter
566 names/values is dependent on the request being performed.
567 Check the EC2 API guide for details.
568
569 :type dry_run: bool
570 :param dry_run: Set to True if the operation should not actually run.
571
572 :type max_results: int
573 :param max_results: The maximum number of paginated instance
574 items per response.
575
576 :rtype: list
577 :return: A list of :class:`boto.ec2.instance.Reservation`
578
579 """
580 warnings.warn(('The current get_all_instances implementation will be '
581 'replaced with get_all_reservations.'),
582 PendingDeprecationWarning)
583 return self.get_all_reservations(instance_ids=instance_ids,
584 filters=filters, dry_run=dry_run,
585 max_results=max_results)
586
587 def get_only_instances(self, instance_ids=None, filters=None,
588 dry_run=False, max_results=None):
589 # A future release should rename this method to get_all_instances
590 # and make get_only_instances an alias for that.
591 """
592 Retrieve all the instances associated with your account.
593
594 :type instance_ids: list
595 :param instance_ids: A list of strings of instance IDs
596
597 :type filters: dict
598 :param filters: Optional filters that can be used to limit the
599 results returned. Filters are provided in the form of a
600 dictionary consisting of filter names as the key and
601 filter values as the value. The set of allowable filter
602 names/values is dependent on the request being performed.
603 Check the EC2 API guide for details.
604
605 :type dry_run: bool
606 :param dry_run: Set to True if the operation should not actually run.
607
608 :type max_results: int
609 :param max_results: The maximum number of paginated instance
610 items per response.
611
612 :rtype: list
613 :return: A list of :class:`boto.ec2.instance.Instance`
614 """
615 next_token = None
616 retval = []
617 while True:
618 reservations = self.get_all_reservations(instance_ids=instance_ids,
619 filters=filters,
620 dry_run=dry_run,
621 max_results=max_results,
622 next_token=next_token)
623 retval.extend([instance for reservation in reservations for
624 instance in reservation.instances])
625 next_token = reservations.next_token
626 if not next_token:
627 break
628
629 return retval
630
631 def get_all_reservations(self, instance_ids=None, filters=None,
632 dry_run=False, max_results=None, next_token=None):
633 """
634 Retrieve all the instance reservations associated with your account.
635
636 :type instance_ids: list
637 :param instance_ids: A list of strings of instance IDs
638
639 :type filters: dict
640 :param filters: Optional filters that can be used to limit the
641 results returned. Filters are provided in the form of a
642 dictionary consisting of filter names as the key and
643 filter values as the value. The set of allowable filter
644 names/values is dependent on the request being performed.
645 Check the EC2 API guide for details.
646
647 :type dry_run: bool
648 :param dry_run: Set to True if the operation should not actually run.
649
650 :type max_results: int
651 :param max_results: The maximum number of paginated instance
652 items per response.
653
654 :type next_token: str
655 :param next_token: A string specifying the next paginated set
656 of results to return.
657
658 :rtype: list
659 :return: A list of :class:`boto.ec2.instance.Reservation`
660 """
661 params = {}
662 if instance_ids:
663 self.build_list_params(params, instance_ids, 'InstanceId')
664 if filters:
665 if 'group-id' in filters:
666 gid = filters.get('group-id')
667 if not gid.startswith('sg-') or len(gid) != 11:
668 warnings.warn(
669 "The group-id filter now requires a security group "
670 "identifier (sg-*) instead of a group name. To filter "
671 "by group name use the 'group-name' filter instead.",
672 UserWarning)
673 self.build_filter_params(params, filters)
674 if dry_run:
675 params['DryRun'] = 'true'
676 if max_results is not None:
677 params['MaxResults'] = max_results
678 if next_token:
679 params['NextToken'] = next_token
680 return self.get_list('DescribeInstances', params,
681 [('item', Reservation)], verb='POST')
682
683 def get_all_instance_status(self, instance_ids=None,
684 max_results=None, next_token=None,
685 filters=None, dry_run=False,
686 include_all_instances=False):
687 """
688 Retrieve all the instances in your account scheduled for maintenance.
689
690 :type instance_ids: list
691 :param instance_ids: A list of strings of instance IDs
692
693 :type max_results: int
694 :param max_results: The maximum number of paginated instance
695 items per response.
696
697 :type next_token: str
698 :param next_token: A string specifying the next paginated set
699 of results to return.
700
701 :type filters: dict
702 :param filters: Optional filters that can be used to limit
703 the results returned. Filters are provided
704 in the form of a dictionary consisting of
705 filter names as the key and filter values
706 as the value. The set of allowable filter
707 names/values is dependent on the request
708 being performed. Check the EC2 API guide
709 for details.
710
711 :type dry_run: bool
712 :param dry_run: Set to True if the operation should not actually run.
713
714 :type include_all_instances: bool
715 :param include_all_instances: Set to True if all
716 instances should be returned. (Only running
717 instances are included by default.)
718
719 :rtype: list
720 :return: A list of instances that have maintenance scheduled.
721 """
722 params = {}
723 if instance_ids:
724 self.build_list_params(params, instance_ids, 'InstanceId')
725 if max_results:
726 params['MaxResults'] = max_results
727 if next_token:
728 params['NextToken'] = next_token
729 if filters:
730 self.build_filter_params(params, filters)
731 if dry_run:
732 params['DryRun'] = 'true'
733 if include_all_instances:
734 params['IncludeAllInstances'] = 'true'
735 return self.get_object('DescribeInstanceStatus', params,
736 InstanceStatusSet, verb='POST')
737
738 def run_instances(self, image_id, min_count=1, max_count=1,
739 key_name=None, security_groups=None,
740 user_data=None, addressing_type=None,
741 instance_type='m1.small', placement=None,
742 kernel_id=None, ramdisk_id=None,
743 monitoring_enabled=False, subnet_id=None,
744 block_device_map=None,
745 disable_api_termination=False,
746 instance_initiated_shutdown_behavior=None,
747 private_ip_address=None,
748 placement_group=None, client_token=None,
749 security_group_ids=None,
750 additional_info=None, instance_profile_name=None,
751 instance_profile_arn=None, tenancy=None,
752 ebs_optimized=False, network_interfaces=None,
753 dry_run=False):
754 """
755 Runs an image on EC2.
756
757 :type image_id: string
758 :param image_id: The ID of the image to run.
759
760 :type min_count: int
761 :param min_count: The minimum number of instances to launch.
762
763 :type max_count: int
764 :param max_count: The maximum number of instances to launch.
765
766 :type key_name: string
767 :param key_name: The name of the key pair with which to
768 launch instances.
769
770 :type security_groups: list of strings
771 :param security_groups: The names of the EC2 classic security groups
772 with which to associate instances
773
774 :type user_data: string
775 :param user_data: The Base64-encoded MIME user data to be made
776 available to the instance(s) in this reservation.
777
778 :type instance_type: string
779 :param instance_type: The type of instance to run:
780
781 * t1.micro
782 * m1.small
783 * m1.medium
784 * m1.large
785 * m1.xlarge
786 * m3.medium
787 * m3.large
788 * m3.xlarge
789 * m3.2xlarge
790 * c1.medium
791 * c1.xlarge
792 * m2.xlarge
793 * m2.2xlarge
794 * m2.4xlarge
795 * cr1.8xlarge
796 * hi1.4xlarge
797 * hs1.8xlarge
798 * cc1.4xlarge
799 * cg1.4xlarge
800 * cc2.8xlarge
801 * g2.2xlarge
802 * c3.large
803 * c3.xlarge
804 * c3.2xlarge
805 * c3.4xlarge
806 * c3.8xlarge
807 * i2.xlarge
808 * i2.2xlarge
809 * i2.4xlarge
810 * i2.8xlarge
811 * t2.micro
812 * t2.small
813 * t2.medium
814
815 :type placement: string
816 :param placement: The Availability Zone to launch the instance into.
817
818 :type kernel_id: string
819 :param kernel_id: The ID of the kernel with which to launch the
820 instances.
821
822 :type ramdisk_id: string
823 :param ramdisk_id: The ID of the RAM disk with which to launch the
824 instances.
825
826 :type monitoring_enabled: bool
827 :param monitoring_enabled: Enable detailed CloudWatch monitoring on
828 the instance.
829
830 :type subnet_id: string
831 :param subnet_id: The subnet ID within which to launch the instances
832 for VPC.
833
834 :type private_ip_address: string
835 :param private_ip_address: If you're using VPC, you can
836 optionally use this parameter to assign the instance a
837 specific available IP address from the subnet (e.g.,
838 10.0.0.25).
839
840 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
841 :param block_device_map: A BlockDeviceMapping data structure
842 describing the EBS volumes associated with the Image.
843
844 :type disable_api_termination: bool
845 :param disable_api_termination: If True, the instances will be locked
846 and will not be able to be terminated via the API.
847
848 :type instance_initiated_shutdown_behavior: string
849 :param instance_initiated_shutdown_behavior: Specifies whether the
850 instance stops or terminates on instance-initiated shutdown.
851 Valid values are:
852
853 * stop
854 * terminate
855
856 :type placement_group: string
857 :param placement_group: If specified, this is the name of the placement
858 group in which the instance(s) will be launched.
859
860 :type client_token: string
861 :param client_token: Unique, case-sensitive identifier you provide
862 to ensure idempotency of the request. Maximum 64 ASCII characters.
863
864 :type security_group_ids: list of strings
865 :param security_group_ids: The ID of the VPC security groups with
866 which to associate instances.
867
868 :type additional_info: string
869 :param additional_info: Specifies additional information to make
870 available to the instance(s).
871
872 :type tenancy: string
873 :param tenancy: The tenancy of the instance you want to
874 launch. An instance with a tenancy of 'dedicated' runs on
875 single-tenant hardware and can only be launched into a
876 VPC. Valid values are:"default" or "dedicated".
877 NOTE: To use dedicated tenancy you MUST specify a VPC
878 subnet-ID as well.
879
880 :type instance_profile_arn: string
881 :param instance_profile_arn: The Amazon resource name (ARN) of
882 the IAM Instance Profile (IIP) to associate with the instances.
883
884 :type instance_profile_name: string
885 :param instance_profile_name: The name of
886 the IAM Instance Profile (IIP) to associate with the instances.
887
888 :type ebs_optimized: bool
889 :param ebs_optimized: Whether the instance is optimized for
890 EBS I/O. This optimization provides dedicated throughput
891 to Amazon EBS and an optimized configuration stack to
892 provide optimal EBS I/O performance. This optimization
893 isn't available with all instance types.
894
895 :type network_interfaces: :class:`boto.ec2.networkinterface.NetworkInterfaceCollection`
896 :param network_interfaces: A NetworkInterfaceCollection data
897 structure containing the ENI specifications for the instance.
898
899 :type dry_run: bool
900 :param dry_run: Set to True if the operation should not actually run.
901
902 :rtype: Reservation
903 :return: The :class:`boto.ec2.instance.Reservation` associated with
904 the request for machines
905 """
906 params = {'ImageId': image_id,
907 'MinCount': min_count,
908 'MaxCount': max_count}
909 if key_name:
910 params['KeyName'] = key_name
911 if security_group_ids:
912 l = []
913 for group in security_group_ids:
914 if isinstance(group, SecurityGroup):
915 l.append(group.id)
916 else:
917 l.append(group)
918 self.build_list_params(params, l, 'SecurityGroupId')
919 if security_groups:
920 l = []
921 for group in security_groups:
922 if isinstance(group, SecurityGroup):
923 l.append(group.name)
924 else:
925 l.append(group)
926 self.build_list_params(params, l, 'SecurityGroup')
927 if user_data:
928 if isinstance(user_data, six.text_type):
929 user_data = user_data.encode('utf-8')
930 params['UserData'] = base64.b64encode(user_data).decode('utf-8')
931 if addressing_type:
932 params['AddressingType'] = addressing_type
933 if instance_type:
934 params['InstanceType'] = instance_type
935 if placement:
936 params['Placement.AvailabilityZone'] = placement
937 if placement_group:
938 params['Placement.GroupName'] = placement_group
939 if tenancy:
940 params['Placement.Tenancy'] = tenancy
941 if kernel_id:
942 params['KernelId'] = kernel_id
943 if ramdisk_id:
944 params['RamdiskId'] = ramdisk_id
945 if monitoring_enabled:
946 params['Monitoring.Enabled'] = 'true'
947 if subnet_id:
948 params['SubnetId'] = subnet_id
949 if private_ip_address:
950 params['PrivateIpAddress'] = private_ip_address
951 if block_device_map:
952 block_device_map.ec2_build_list_params(params)
953 if disable_api_termination:
954 params['DisableApiTermination'] = 'true'
955 if instance_initiated_shutdown_behavior:
956 val = instance_initiated_shutdown_behavior
957 params['InstanceInitiatedShutdownBehavior'] = val
958 if client_token:
959 params['ClientToken'] = client_token
960 if additional_info:
961 params['AdditionalInfo'] = additional_info
962 if instance_profile_name:
963 params['IamInstanceProfile.Name'] = instance_profile_name
964 if instance_profile_arn:
965 params['IamInstanceProfile.Arn'] = instance_profile_arn
966 if ebs_optimized:
967 params['EbsOptimized'] = 'true'
968 if network_interfaces:
969 network_interfaces.build_list_params(params)
970 if dry_run:
971 params['DryRun'] = 'true'
972 return self.get_object('RunInstances', params, Reservation,
973 verb='POST')
974
975 def terminate_instances(self, instance_ids=None, dry_run=False):
976 """
977 Terminate the instances specified
978
979 :type instance_ids: list
980 :param instance_ids: A list of strings of the Instance IDs to terminate
981
982 :type dry_run: bool
983 :param dry_run: Set to True if the operation should not actually run.
984
985 :rtype: list
986 :return: A list of the instances terminated
987 """
988 params = {}
989 if instance_ids:
990 self.build_list_params(params, instance_ids, 'InstanceId')
991 if dry_run:
992 params['DryRun'] = 'true'
993 return self.get_list('TerminateInstances', params,
994 [('item', Instance)], verb='POST')
995
996 def stop_instances(self, instance_ids=None, force=False, dry_run=False):
997 """
998 Stop the instances specified
999
1000 :type instance_ids: list
1001 :param instance_ids: A list of strings of the Instance IDs to stop
1002
1003 :type force: bool
1004 :param force: Forces the instance to stop
1005
1006 :type dry_run: bool
1007 :param dry_run: Set to True if the operation should not actually run.
1008
1009 :rtype: list
1010 :return: A list of the instances stopped
1011 """
1012 params = {}
1013 if force:
1014 params['Force'] = 'true'
1015 if instance_ids:
1016 self.build_list_params(params, instance_ids, 'InstanceId')
1017 if dry_run:
1018 params['DryRun'] = 'true'
1019 return self.get_list('StopInstances', params,
1020 [('item', Instance)], verb='POST')
1021
1022 def start_instances(self, instance_ids=None, dry_run=False):
1023 """
1024 Start the instances specified
1025
1026 :type instance_ids: list
1027 :param instance_ids: A list of strings of the Instance IDs to start
1028
1029 :type dry_run: bool
1030 :param dry_run: Set to True if the operation should not actually run.
1031
1032 :rtype: list
1033 :return: A list of the instances started
1034 """
1035 params = {}
1036 if instance_ids:
1037 self.build_list_params(params, instance_ids, 'InstanceId')
1038 if dry_run:
1039 params['DryRun'] = 'true'
1040 return self.get_list('StartInstances', params,
1041 [('item', Instance)], verb='POST')
1042
1043 def get_console_output(self, instance_id, dry_run=False):
1044 """
1045 Retrieves the console output for the specified instance.
1046
1047 :type instance_id: string
1048 :param instance_id: The instance ID of a running instance on the cloud.
1049
1050 :type dry_run: bool
1051 :param dry_run: Set to True if the operation should not actually run.
1052
1053 :rtype: :class:`boto.ec2.instance.ConsoleOutput`
1054 :return: The console output as a ConsoleOutput object
1055 """
1056 params = {}
1057 self.build_list_params(params, [instance_id], 'InstanceId')
1058 if dry_run:
1059 params['DryRun'] = 'true'
1060 return self.get_object('GetConsoleOutput', params,
1061 ConsoleOutput, verb='POST')
1062
1063 def reboot_instances(self, instance_ids=None, dry_run=False):
1064 """
1065 Reboot the specified instances.
1066
1067 :type instance_ids: list
1068 :param instance_ids: The instances to terminate and reboot
1069
1070 :type dry_run: bool
1071 :param dry_run: Set to True if the operation should not actually run.
1072
1073 """
1074 params = {}
1075 if instance_ids:
1076 self.build_list_params(params, instance_ids, 'InstanceId')
1077 if dry_run:
1078 params['DryRun'] = 'true'
1079 return self.get_status('RebootInstances', params)
1080
1081 def confirm_product_instance(self, product_code, instance_id,
1082 dry_run=False):
1083 """
1084 :type dry_run: bool
1085 :param dry_run: Set to True if the operation should not actually run.
1086
1087 """
1088 params = {'ProductCode': product_code,
1089 'InstanceId': instance_id}
1090 if dry_run:
1091 params['DryRun'] = 'true'
1092 rs = self.get_object('ConfirmProductInstance', params,
1093 ResultSet, verb='POST')
1094 return (rs.status, rs.ownerId)
1095
1096 # InstanceAttribute methods
1097
1098 def get_instance_attribute(self, instance_id, attribute, dry_run=False):
1099 """
1100 Gets an attribute from an instance.
1101
1102 :type instance_id: string
1103 :param instance_id: The Amazon id of the instance
1104
1105 :type attribute: string
1106 :param attribute: The attribute you need information about
1107 Valid choices are:
1108
1109 * instanceType
1110 * kernel
1111 * ramdisk
1112 * userData
1113 * disableApiTermination
1114 * instanceInitiatedShutdownBehavior
1115 * rootDeviceName
1116 * blockDeviceMapping
1117 * productCodes
1118 * sourceDestCheck
1119 * groupSet
1120 * ebsOptimized
1121 * sriovNetSupport
1122
1123 :type dry_run: bool
1124 :param dry_run: Set to True if the operation should not actually run.
1125
1126 :rtype: :class:`boto.ec2.image.InstanceAttribute`
1127 :return: An InstanceAttribute object representing the value of the
1128 attribute requested
1129 """
1130 params = {'InstanceId': instance_id}
1131 if attribute:
1132 params['Attribute'] = attribute
1133 if dry_run:
1134 params['DryRun'] = 'true'
1135 return self.get_object('DescribeInstanceAttribute', params,
1136 InstanceAttribute, verb='POST')
1137
1138 def modify_network_interface_attribute(self, interface_id, attr, value,
1139 attachment_id=None, dry_run=False):
1140 """
1141 Changes an attribute of a network interface.
1142
1143 :type interface_id: string
1144 :param interface_id: The interface id. Looks like 'eni-xxxxxxxx'
1145
1146 :type attr: string
1147 :param attr: The attribute you wish to change.
1148
1149 Learn more at http://docs.aws.amazon.com/AWSEC2/latest/API\
1150 Reference/ApiReference-query-ModifyNetworkInterfaceAttribute.html
1151
1152 * description - Textual description of interface
1153 * groupSet - List of security group ids or group objects
1154 * sourceDestCheck - Boolean
1155 * deleteOnTermination - Boolean. Must also specify attachment_id
1156
1157 :type value: string
1158 :param value: The new value for the attribute
1159
1160 :rtype: bool
1161 :return: Whether the operation succeeded or not
1162
1163 :type attachment_id: string
1164 :param attachment_id: If you're modifying DeleteOnTermination you must
1165 specify the attachment_id.
1166
1167 :type dry_run: bool
1168 :param dry_run: Set to True if the operation should not actually run.
1169
1170 """
1171 bool_reqs = (
1172 'deleteontermination',
1173 'sourcedestcheck',
1174 )
1175 if attr.lower() in bool_reqs:
1176 if isinstance(value, bool):
1177 if value:
1178 value = 'true'
1179 else:
1180 value = 'false'
1181 elif value not in ['true', 'false']:
1182 raise ValueError('%s must be a boolean, "true", or "false"!'
1183 % attr)
1184
1185 params = {'NetworkInterfaceId': interface_id}
1186
1187 # groupSet is handled differently from other arguments
1188 if attr.lower() == 'groupset':
1189 for idx, sg in enumerate(value):
1190 if isinstance(sg, SecurityGroup):
1191 sg = sg.id
1192 params['SecurityGroupId.%s' % (idx + 1)] = sg
1193 elif attr.lower() == 'description':
1194 params['Description.Value'] = value
1195 elif attr.lower() == 'sourcedestcheck':
1196 params['SourceDestCheck.Value'] = value
1197 elif attr.lower() == 'deleteontermination':
1198 params['Attachment.DeleteOnTermination'] = value
1199 if not attachment_id:
1200 raise ValueError('You must also specify an attachment_id')
1201 params['Attachment.AttachmentId'] = attachment_id
1202 else:
1203 raise ValueError('Unknown attribute "%s"' % (attr,))
1204
1205 if dry_run:
1206 params['DryRun'] = 'true'
1207 return self.get_status(
1208 'ModifyNetworkInterfaceAttribute', params, verb='POST')
1209
1210 def modify_instance_attribute(self, instance_id, attribute, value,
1211 dry_run=False):
1212 """
1213 Changes an attribute of an instance
1214
1215 :type instance_id: string
1216 :param instance_id: The instance id you wish to change
1217
1218 :type attribute: string
1219 :param attribute: The attribute you wish to change.
1220
1221 * instanceType - A valid instance type (m1.small)
1222 * kernel - Kernel ID (None)
1223 * ramdisk - Ramdisk ID (None)
1224 * userData - Base64 encoded String (None)
1225 * disableApiTermination - Boolean (true)
1226 * instanceInitiatedShutdownBehavior - stop|terminate
1227 * blockDeviceMapping - List of strings - ie: ['/dev/sda=false']
1228 * sourceDestCheck - Boolean (true)
1229 * groupSet - Set of Security Groups or IDs
1230 * ebsOptimized - Boolean (false)
1231 * sriovNetSupport - String - ie: 'simple'
1232
1233 :type value: string
1234 :param value: The new value for the attribute
1235
1236 :type dry_run: bool
1237 :param dry_run: Set to True if the operation should not actually run.
1238
1239 :rtype: bool
1240 :return: Whether the operation succeeded or not
1241 """
1242 # Allow a bool to be passed in for value of disableApiTermination
1243 bool_reqs = ('disableapitermination',
1244 'sourcedestcheck',
1245 'ebsoptimized')
1246 if attribute.lower() in bool_reqs:
1247 if isinstance(value, bool):
1248 if value:
1249 value = 'true'
1250 else:
1251 value = 'false'
1252
1253 params = {'InstanceId': instance_id}
1254
1255 # groupSet is handled differently from other arguments
1256 if attribute.lower() == 'groupset':
1257 for idx, sg in enumerate(value):
1258 if isinstance(sg, SecurityGroup):
1259 sg = sg.id
1260 params['GroupId.%s' % (idx + 1)] = sg
1261 elif attribute.lower() == 'blockdevicemapping':
1262 for idx, kv in enumerate(value):
1263 dev_name, _, flag = kv.partition('=')
1264 pre = 'BlockDeviceMapping.%d' % (idx + 1)
1265 params['%s.DeviceName' % pre] = dev_name
1266 params['%s.Ebs.DeleteOnTermination' % pre] = flag or 'true'
1267 else:
1268 # for backwards compatibility handle lowercase first letter
1269 attribute = attribute[0].upper() + attribute[1:]
1270 params['%s.Value' % attribute] = value
1271
1272 if dry_run:
1273 params['DryRun'] = 'true'
1274 return self.get_status('ModifyInstanceAttribute', params, verb='POST')
1275
1276 def reset_instance_attribute(self, instance_id, attribute, dry_run=False):
1277 """
1278 Resets an attribute of an instance to its default value.
1279
1280 :type instance_id: string
1281 :param instance_id: ID of the instance
1282
1283 :type attribute: string
1284 :param attribute: The attribute to reset. Valid values are:
1285 kernel|ramdisk
1286
1287 :type dry_run: bool
1288 :param dry_run: Set to True if the operation should not actually run.
1289
1290 :rtype: bool
1291 :return: Whether the operation succeeded or not
1292 """
1293 params = {'InstanceId': instance_id,
1294 'Attribute': attribute}
1295 if dry_run:
1296 params['DryRun'] = 'true'
1297 return self.get_status('ResetInstanceAttribute', params, verb='POST')
1298
1299 # Spot Instances
1300
1301 def get_all_spot_instance_requests(self, request_ids=None,
1302 filters=None, dry_run=False):
1303 """
1304 Retrieve all the spot instances requests associated with your account.
1305
1306 :type request_ids: list
1307 :param request_ids: A list of strings of spot instance request IDs
1308
1309 :type filters: dict
1310 :param filters: Optional filters that can be used to limit the
1311 results returned. Filters are provided in the form of a
1312 dictionary consisting of filter names as the key and
1313 filter values as the value. The set of allowable filter
1314 names/values is dependent on the request being performed.
1315 Check the EC2 API guide for details.
1316
1317 :type dry_run: bool
1318 :param dry_run: Set to True if the operation should not actually run.
1319
1320 :rtype: list
1321 :return: A list of
1322 :class:`boto.ec2.spotinstancerequest.SpotInstanceRequest`
1323 """
1324 params = {}
1325 if request_ids:
1326 self.build_list_params(params, request_ids, 'SpotInstanceRequestId')
1327 if filters:
1328 if 'launch.group-id' in filters:
1329 lgid = filters.get('launch.group-id')
1330 if not lgid.startswith('sg-') or len(lgid) != 11:
1331 warnings.warn(
1332 "The 'launch.group-id' filter now requires a security "
1333 "group id (sg-*) and no longer supports filtering by "
1334 "group name. Please update your filters accordingly.",
1335 UserWarning)
1336 self.build_filter_params(params, filters)
1337 if dry_run:
1338 params['DryRun'] = 'true'
1339 return self.get_list('DescribeSpotInstanceRequests', params,
1340 [('item', SpotInstanceRequest)], verb='POST')
1341
1342 def get_spot_price_history(self, start_time=None, end_time=None,
1343 instance_type=None, product_description=None,
1344 availability_zone=None, dry_run=False,
1345 max_results=None, next_token=None,
1346 filters=None):
1347 """
1348 Retrieve the recent history of spot instances pricing.
1349
1350 :type start_time: str
1351 :param start_time: An indication of how far back to provide price
1352 changes for. An ISO8601 DateTime string.
1353
1354 :type end_time: str
1355 :param end_time: An indication of how far forward to provide price
1356 changes for. An ISO8601 DateTime string.
1357
1358 :type instance_type: str
1359 :param instance_type: Filter responses to a particular instance type.
1360
1361 :type product_description: str
1362 :param product_description: Filter responses to a particular platform.
1363 Valid values are currently:
1364
1365 * Linux/UNIX
1366 * SUSE Linux
1367 * Windows
1368 * Linux/UNIX (Amazon VPC)
1369 * SUSE Linux (Amazon VPC)
1370 * Windows (Amazon VPC)
1371
1372 :type availability_zone: str
1373 :param availability_zone: The availability zone for which prices
1374 should be returned. If not specified, data for all
1375 availability zones will be returned.
1376
1377 :type dry_run: bool
1378 :param dry_run: Set to True if the operation should not actually run.
1379
1380 :type max_results: int
1381 :param max_results: The maximum number of paginated items
1382 per response.
1383
1384 :type next_token: str
1385 :param next_token: The next set of rows to return. This should
1386 be the value of the ``next_token`` attribute from a previous
1387 call to ``get_spot_price_history``.
1388
1389 :type filters: dict
1390 :param filters: Optional filters that can be used to limit the
1391 results returned. Filters are provided in the form of a
1392 dictionary consisting of filter names as the key and
1393 filter values as the value. The set of allowable filter
1394 names/values is dependent on the request being performed.
1395 Check the EC2 API guide for details.
1396
1397 :rtype: list
1398 :return: A list tuples containing price and timestamp.
1399 """
1400 params = {}
1401 if start_time:
1402 params['StartTime'] = start_time
1403 if end_time:
1404 params['EndTime'] = end_time
1405 if instance_type:
1406 params['InstanceType'] = instance_type
1407 if product_description:
1408 params['ProductDescription'] = product_description
1409 if availability_zone:
1410 params['AvailabilityZone'] = availability_zone
1411 if dry_run:
1412 params['DryRun'] = 'true'
1413 if max_results is not None:
1414 params['MaxResults'] = max_results
1415 if next_token:
1416 params['NextToken'] = next_token
1417 if filters:
1418 self.build_filter_params(params, filters)
1419 return self.get_list('DescribeSpotPriceHistory', params,
1420 [('item', SpotPriceHistory)], verb='POST')
1421
1422 def request_spot_instances(self, price, image_id, count=1, type='one-time',
1423 valid_from=None, valid_until=None,
1424 launch_group=None, availability_zone_group=None,
1425 key_name=None, security_groups=None,
1426 user_data=None, addressing_type=None,
1427 instance_type='m1.small', placement=None,
1428 kernel_id=None, ramdisk_id=None,
1429 monitoring_enabled=False, subnet_id=None,
1430 placement_group=None,
1431 block_device_map=None,
1432 instance_profile_arn=None,
1433 instance_profile_name=None,
1434 security_group_ids=None,
1435 ebs_optimized=False,
1436 network_interfaces=None, dry_run=False):
1437 """
1438 Request instances on the spot market at a particular price.
1439
1440 :type price: str
1441 :param price: The maximum price of your bid
1442
1443 :type image_id: string
1444 :param image_id: The ID of the image to run
1445
1446 :type count: int
1447 :param count: The of instances to requested
1448
1449 :type type: str
1450 :param type: Type of request. Can be 'one-time' or 'persistent'.
1451 Default is one-time.
1452
1453 :type valid_from: str
1454 :param valid_from: Start date of the request. An ISO8601 time string.
1455
1456 :type valid_until: str
1457 :param valid_until: End date of the request. An ISO8601 time string.
1458
1459 :type launch_group: str
1460 :param launch_group: If supplied, all requests will be fulfilled
1461 as a group.
1462
1463 :type availability_zone_group: str
1464 :param availability_zone_group: If supplied, all requests will be
1465 fulfilled within a single availability zone.
1466
1467 :type key_name: string
1468 :param key_name: The name of the key pair with which to
1469 launch instances
1470
1471 :type security_groups: list of strings
1472 :param security_groups: The names of the security groups with which to
1473 associate instances
1474
1475 :type user_data: string
1476 :param user_data: The user data passed to the launched instances
1477
1478 :type instance_type: string
1479 :param instance_type: The type of instance to run:
1480
1481 * t1.micro
1482 * m1.small
1483 * m1.medium
1484 * m1.large
1485 * m1.xlarge
1486 * m3.medium
1487 * m3.large
1488 * m3.xlarge
1489 * m3.2xlarge
1490 * c1.medium
1491 * c1.xlarge
1492 * m2.xlarge
1493 * m2.2xlarge
1494 * m2.4xlarge
1495 * cr1.8xlarge
1496 * hi1.4xlarge
1497 * hs1.8xlarge
1498 * cc1.4xlarge
1499 * cg1.4xlarge
1500 * cc2.8xlarge
1501 * g2.2xlarge
1502 * c3.large
1503 * c3.xlarge
1504 * c3.2xlarge
1505 * c3.4xlarge
1506 * c3.8xlarge
1507 * i2.xlarge
1508 * i2.2xlarge
1509 * i2.4xlarge
1510 * i2.8xlarge
1511 * t2.micro
1512 * t2.small
1513 * t2.medium
1514
1515 :type placement: string
1516 :param placement: The availability zone in which to launch
1517 the instances
1518
1519 :type kernel_id: string
1520 :param kernel_id: The ID of the kernel with which to launch the
1521 instances
1522
1523 :type ramdisk_id: string
1524 :param ramdisk_id: The ID of the RAM disk with which to launch the
1525 instances
1526
1527 :type monitoring_enabled: bool
1528 :param monitoring_enabled: Enable detailed CloudWatch monitoring on
1529 the instance.
1530
1531 :type subnet_id: string
1532 :param subnet_id: The subnet ID within which to launch the instances
1533 for VPC.
1534
1535 :type placement_group: string
1536 :param placement_group: If specified, this is the name of the placement
1537 group in which the instance(s) will be launched.
1538
1539 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
1540 :param block_device_map: A BlockDeviceMapping data structure
1541 describing the EBS volumes associated with the Image.
1542
1543 :type security_group_ids: list of strings
1544 :param security_group_ids: The ID of the VPC security groups with
1545 which to associate instances.
1546
1547 :type instance_profile_arn: string
1548 :param instance_profile_arn: The Amazon resource name (ARN) of
1549 the IAM Instance Profile (IIP) to associate with the instances.
1550
1551 :type instance_profile_name: string
1552 :param instance_profile_name: The name of
1553 the IAM Instance Profile (IIP) to associate with the instances.
1554
1555 :type ebs_optimized: bool
1556 :param ebs_optimized: Whether the instance is optimized for
1557 EBS I/O. This optimization provides dedicated throughput
1558 to Amazon EBS and an optimized configuration stack to
1559 provide optimal EBS I/O performance. This optimization
1560 isn't available with all instance types.
1561
1562 :type network_interfaces: list
1563 :param network_interfaces: A list of
1564 :class:`boto.ec2.networkinterface.NetworkInterfaceSpecification`
1565
1566 :type dry_run: bool
1567 :param dry_run: Set to True if the operation should not actually run.
1568
1569 :rtype: Reservation
1570 :return: The :class:`boto.ec2.spotinstancerequest.SpotInstanceRequest`
1571 associated with the request for machines
1572 """
1573 ls = 'LaunchSpecification'
1574 params = {'%s.ImageId' % ls: image_id,
1575 'Type': type,
1576 'SpotPrice': price}
1577 if count:
1578 params['InstanceCount'] = count
1579 if valid_from:
1580 params['ValidFrom'] = valid_from
1581 if valid_until:
1582 params['ValidUntil'] = valid_until
1583 if launch_group:
1584 params['LaunchGroup'] = launch_group
1585 if availability_zone_group:
1586 params['AvailabilityZoneGroup'] = availability_zone_group
1587 if key_name:
1588 params['%s.KeyName' % ls] = key_name
1589 if security_group_ids:
1590 l = []
1591 for group in security_group_ids:
1592 if isinstance(group, SecurityGroup):
1593 l.append(group.id)
1594 else:
1595 l.append(group)
1596 self.build_list_params(params, l,
1597 '%s.SecurityGroupId' % ls)
1598 if security_groups:
1599 l = []
1600 for group in security_groups:
1601 if isinstance(group, SecurityGroup):
1602 l.append(group.name)
1603 else:
1604 l.append(group)
1605 self.build_list_params(params, l, '%s.SecurityGroup' % ls)
1606 if user_data:
1607 params['%s.UserData' % ls] = base64.b64encode(user_data)
1608 if addressing_type:
1609 params['%s.AddressingType' % ls] = addressing_type
1610 if instance_type:
1611 params['%s.InstanceType' % ls] = instance_type
1612 if placement:
1613 params['%s.Placement.AvailabilityZone' % ls] = placement
1614 if kernel_id:
1615 params['%s.KernelId' % ls] = kernel_id
1616 if ramdisk_id:
1617 params['%s.RamdiskId' % ls] = ramdisk_id
1618 if monitoring_enabled:
1619 params['%s.Monitoring.Enabled' % ls] = 'true'
1620 if subnet_id:
1621 params['%s.SubnetId' % ls] = subnet_id
1622 if placement_group:
1623 params['%s.Placement.GroupName' % ls] = placement_group
1624 if block_device_map:
1625 block_device_map.ec2_build_list_params(params, '%s.' % ls)
1626 if instance_profile_name:
1627 params['%s.IamInstanceProfile.Name' % ls] = instance_profile_name
1628 if instance_profile_arn:
1629 params['%s.IamInstanceProfile.Arn' % ls] = instance_profile_arn
1630 if ebs_optimized:
1631 params['%s.EbsOptimized' % ls] = 'true'
1632 if network_interfaces:
1633 network_interfaces.build_list_params(params, prefix=ls + '.')
1634 if dry_run:
1635 params['DryRun'] = 'true'
1636 return self.get_list('RequestSpotInstances', params,
1637 [('item', SpotInstanceRequest)],
1638 verb='POST')
1639
1640 def cancel_spot_instance_requests(self, request_ids, dry_run=False):
1641 """
1642 Cancel the specified Spot Instance Requests.
1643
1644 :type request_ids: list
1645 :param request_ids: A list of strings of the Request IDs to terminate
1646
1647 :type dry_run: bool
1648 :param dry_run: Set to True if the operation should not actually run.
1649
1650 :rtype: list
1651 :return: A list of the instances terminated
1652 """
1653 params = {}
1654 if request_ids:
1655 self.build_list_params(params, request_ids, 'SpotInstanceRequestId')
1656 if dry_run:
1657 params['DryRun'] = 'true'
1658 return self.get_list('CancelSpotInstanceRequests', params,
1659 [('item', SpotInstanceRequest)], verb='POST')
1660
1661 def get_spot_datafeed_subscription(self, dry_run=False):
1662 """
1663 Return the current spot instance data feed subscription
1664 associated with this account, if any.
1665
1666 :type dry_run: bool
1667 :param dry_run: Set to True if the operation should not actually run.
1668
1669 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscription`
1670 :return: The datafeed subscription object or None
1671 """
1672 params = {}
1673 if dry_run:
1674 params['DryRun'] = 'true'
1675 return self.get_object('DescribeSpotDatafeedSubscription',
1676 params, SpotDatafeedSubscription, verb='POST')
1677
1678 def create_spot_datafeed_subscription(self, bucket, prefix, dry_run=False):
1679 """
1680 Create a spot instance datafeed subscription for this account.
1681
1682 :type bucket: str or unicode
1683 :param bucket: The name of the bucket where spot instance data
1684 will be written. The account issuing this request
1685 must have FULL_CONTROL access to the bucket
1686 specified in the request.
1687
1688 :type prefix: str or unicode
1689 :param prefix: An optional prefix that will be pre-pended to all
1690 data files written to the bucket.
1691
1692 :type dry_run: bool
1693 :param dry_run: Set to True if the operation should not actually run.
1694
1695 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscription`
1696 :return: The datafeed subscription object or None
1697 """
1698 params = {'Bucket': bucket}
1699 if prefix:
1700 params['Prefix'] = prefix
1701 if dry_run:
1702 params['DryRun'] = 'true'
1703 return self.get_object('CreateSpotDatafeedSubscription',
1704 params, SpotDatafeedSubscription, verb='POST')
1705
1706 def delete_spot_datafeed_subscription(self, dry_run=False):
1707 """
1708 Delete the current spot instance data feed subscription
1709 associated with this account
1710
1711 :type dry_run: bool
1712 :param dry_run: Set to True if the operation should not actually run.
1713
1714 :rtype: bool
1715 :return: True if successful
1716 """
1717 params = {}
1718 if dry_run:
1719 params['DryRun'] = 'true'
1720 return self.get_status('DeleteSpotDatafeedSubscription',
1721 params, verb='POST')
1722
1723 # Zone methods
1724
1725 def get_all_zones(self, zones=None, filters=None, dry_run=False):
1726 """
1727 Get all Availability Zones associated with the current region.
1728
1729 :type zones: list
1730 :param zones: Optional list of zones. If this list is present,
1731 only the Zones associated with these zone names
1732 will be returned.
1733
1734 :type filters: dict
1735 :param filters: Optional filters that can be used to limit
1736 the results returned. Filters are provided
1737 in the form of a dictionary consisting of
1738 filter names as the key and filter values
1739 as the value. The set of allowable filter
1740 names/values is dependent on the request
1741 being performed. Check the EC2 API guide
1742 for details.
1743
1744 :type dry_run: bool
1745 :param dry_run: Set to True if the operation should not actually run.
1746
1747 :rtype: list of :class:`boto.ec2.zone.Zone`
1748 :return: The requested Zone objects
1749 """
1750 params = {}
1751 if zones:
1752 self.build_list_params(params, zones, 'ZoneName')
1753 if filters:
1754 self.build_filter_params(params, filters)
1755 if dry_run:
1756 params['DryRun'] = 'true'
1757 return self.get_list('DescribeAvailabilityZones', params,
1758 [('item', Zone)], verb='POST')
1759
1760 # Address methods
1761
1762 def get_all_addresses(self, addresses=None, filters=None,
1763 allocation_ids=None, dry_run=False):
1764 """
1765 Get all EIP's associated with the current credentials.
1766
1767 :type addresses: list
1768 :param addresses: Optional list of addresses. If this list is present,
1769 only the Addresses associated with these addresses
1770 will be returned.
1771
1772 :type filters: dict
1773 :param filters: Optional filters that can be used to limit
1774 the results returned. Filters are provided
1775 in the form of a dictionary consisting of
1776 filter names as the key and filter values
1777 as the value. The set of allowable filter
1778 names/values is dependent on the request
1779 being performed. Check the EC2 API guide
1780 for details.
1781
1782 :type allocation_ids: list
1783 :param allocation_ids: Optional list of allocation IDs. If this list is
1784 present, only the Addresses associated with the given
1785 allocation IDs will be returned.
1786
1787 :type dry_run: bool
1788 :param dry_run: Set to True if the operation should not actually run.
1789
1790 :rtype: list of :class:`boto.ec2.address.Address`
1791 :return: The requested Address objects
1792 """
1793 params = {}
1794 if addresses:
1795 self.build_list_params(params, addresses, 'PublicIp')
1796 if allocation_ids:
1797 self.build_list_params(params, allocation_ids, 'AllocationId')
1798 if filters:
1799 self.build_filter_params(params, filters)
1800 if dry_run:
1801 params['DryRun'] = 'true'
1802 return self.get_list('DescribeAddresses', params, [('item', Address)], verb='POST')
1803
1804 def allocate_address(self, domain=None, dry_run=False):
1805 """
1806 Allocate a new Elastic IP address and associate it with your account.
1807
1808 :type domain: string
1809 :param domain: Optional string. If domain is set to "vpc" the address
1810 will be allocated to VPC . Will return address object with
1811 allocation_id.
1812
1813 :type dry_run: bool
1814 :param dry_run: Set to True if the operation should not actually run.
1815
1816 :rtype: :class:`boto.ec2.address.Address`
1817 :return: The newly allocated Address
1818 """
1819 params = {}
1820
1821 if domain is not None:
1822 params['Domain'] = domain
1823
1824 if dry_run:
1825 params['DryRun'] = 'true'
1826
1827 return self.get_object('AllocateAddress', params, Address, verb='POST')
1828
1829 def assign_private_ip_addresses(self, network_interface_id=None,
1830 private_ip_addresses=None,
1831 secondary_private_ip_address_count=None,
1832 allow_reassignment=False, dry_run=False):
1833 """
1834 Assigns one or more secondary private IP addresses to a network
1835 interface in Amazon VPC.
1836
1837 :type network_interface_id: string
1838 :param network_interface_id: The network interface to which the IP
1839 address will be assigned.
1840
1841 :type private_ip_addresses: list
1842 :param private_ip_addresses: Assigns the specified IP addresses as
1843 secondary IP addresses to the network interface.
1844
1845 :type secondary_private_ip_address_count: int
1846 :param secondary_private_ip_address_count: The number of secondary IP
1847 addresses to assign to the network interface. You cannot specify
1848 this parameter when also specifying private_ip_addresses.
1849
1850 :type allow_reassignment: bool
1851 :param allow_reassignment: Specifies whether to allow an IP address
1852 that is already assigned to another network interface or instance
1853 to be reassigned to the specified network interface.
1854
1855 :type dry_run: bool
1856 :param dry_run: Set to True if the operation should not actually run.
1857
1858 :rtype: bool
1859 :return: True if successful
1860 """
1861 params = {}
1862
1863 if network_interface_id is not None:
1864 params['NetworkInterfaceId'] = network_interface_id
1865
1866 if private_ip_addresses is not None:
1867 self.build_list_params(params, private_ip_addresses,
1868 'PrivateIpAddress')
1869 elif secondary_private_ip_address_count is not None:
1870 params['SecondaryPrivateIpAddressCount'] = \
1871 secondary_private_ip_address_count
1872
1873 if allow_reassignment:
1874 params['AllowReassignment'] = 'true'
1875
1876 if dry_run:
1877 params['DryRun'] = 'true'
1878
1879 return self.get_status('AssignPrivateIpAddresses', params, verb='POST')
1880
1881 def _associate_address(self, status, instance_id=None, public_ip=None,
1882 allocation_id=None, network_interface_id=None,
1883 private_ip_address=None, allow_reassociation=False,
1884 dry_run=False):
1885 params = {}
1886 if instance_id is not None:
1887 params['InstanceId'] = instance_id
1888 elif network_interface_id is not None:
1889 params['NetworkInterfaceId'] = network_interface_id
1890
1891 # Allocation id trumps public ip in order to associate with VPCs
1892 if allocation_id is not None:
1893 params['AllocationId'] = allocation_id
1894 elif public_ip is not None:
1895 params['PublicIp'] = public_ip
1896
1897 if private_ip_address is not None:
1898 params['PrivateIpAddress'] = private_ip_address
1899
1900 if allow_reassociation:
1901 params['AllowReassociation'] = 'true'
1902
1903 if dry_run:
1904 params['DryRun'] = 'true'
1905
1906 if status:
1907 return self.get_status('AssociateAddress', params, verb='POST')
1908 else:
1909 return self.get_object('AssociateAddress', params, Address,
1910 verb='POST')
1911
1912 def associate_address(self, instance_id=None, public_ip=None,
1913 allocation_id=None, network_interface_id=None,
1914 private_ip_address=None, allow_reassociation=False,
1915 dry_run=False):
1916 """
1917 Associate an Elastic IP address with a currently running instance.
1918 This requires one of ``public_ip`` or ``allocation_id`` depending
1919 on if you're associating a VPC address or a plain EC2 address.
1920
1921 When using an Allocation ID, make sure to pass ``None`` for ``public_ip``
1922 as EC2 expects a single parameter and if ``public_ip`` is passed boto
1923 will preference that instead of ``allocation_id``.
1924
1925 :type instance_id: string
1926 :param instance_id: The ID of the instance
1927
1928 :type public_ip: string
1929 :param public_ip: The public IP address for EC2 based allocations.
1930
1931 :type allocation_id: string
1932 :param allocation_id: The allocation ID for a VPC-based elastic IP.
1933
1934 :type network_interface_id: string
1935 :param network_interface_id: The network interface ID to which
1936 elastic IP is to be assigned to
1937
1938 :type private_ip_address: string
1939 :param private_ip_address: The primary or secondary private IP address
1940 to associate with the Elastic IP address.
1941
1942 :type allow_reassociation: bool
1943 :param allow_reassociation: Specify this option to allow an Elastic IP
1944 address that is already associated with another network interface
1945 or instance to be re-associated with the specified instance or
1946 interface.
1947
1948 :type dry_run: bool
1949 :param dry_run: Set to True if the operation should not actually run.
1950
1951 :rtype: bool
1952 :return: True if successful
1953 """
1954 return self._associate_address(True, instance_id=instance_id,
1955 public_ip=public_ip, allocation_id=allocation_id,
1956 network_interface_id=network_interface_id,
1957 private_ip_address=private_ip_address,
1958 allow_reassociation=allow_reassociation, dry_run=dry_run)
1959
1960 def associate_address_object(self, instance_id=None, public_ip=None,
1961 allocation_id=None, network_interface_id=None,
1962 private_ip_address=None, allow_reassociation=False,
1963 dry_run=False):
1964 """
1965 Associate an Elastic IP address with a currently running instance.
1966 This requires one of ``public_ip`` or ``allocation_id`` depending
1967 on if you're associating a VPC address or a plain EC2 address.
1968
1969 When using an Allocation ID, make sure to pass ``None`` for ``public_ip``
1970 as EC2 expects a single parameter and if ``public_ip`` is passed boto
1971 will preference that instead of ``allocation_id``.
1972
1973 :type instance_id: string
1974 :param instance_id: The ID of the instance
1975
1976 :type public_ip: string
1977 :param public_ip: The public IP address for EC2 based allocations.
1978
1979 :type allocation_id: string
1980 :param allocation_id: The allocation ID for a VPC-based elastic IP.
1981
1982 :type network_interface_id: string
1983 :param network_interface_id: The network interface ID to which
1984 elastic IP is to be assigned to
1985
1986 :type private_ip_address: string
1987 :param private_ip_address: The primary or secondary private IP address
1988 to associate with the Elastic IP address.
1989
1990 :type allow_reassociation: bool
1991 :param allow_reassociation: Specify this option to allow an Elastic IP
1992 address that is already associated with another network interface
1993 or instance to be re-associated with the specified instance or
1994 interface.
1995
1996 :type dry_run: bool
1997 :param dry_run: Set to True if the operation should not actually run.
1998
1999 :rtype: class:`boto.ec2.address.Address`
2000 :return: The associated address instance
2001 """
2002 return self._associate_address(False, instance_id=instance_id,
2003 public_ip=public_ip, allocation_id=allocation_id,
2004 network_interface_id=network_interface_id,
2005 private_ip_address=private_ip_address,
2006 allow_reassociation=allow_reassociation, dry_run=dry_run)
2007
2008 def disassociate_address(self, public_ip=None, association_id=None,
2009 dry_run=False):
2010 """
2011 Disassociate an Elastic IP address from a currently running instance.
2012
2013 :type public_ip: string
2014 :param public_ip: The public IP address for EC2 elastic IPs.
2015
2016 :type association_id: string
2017 :param association_id: The association ID for a VPC based elastic ip.
2018
2019 :type dry_run: bool
2020 :param dry_run: Set to True if the operation should not actually run.
2021
2022 :rtype: bool
2023 :return: True if successful
2024 """
2025 params = {}
2026
2027 # If there is an association id it trumps public ip
2028 # in order to successfully dissassociate with a VPC elastic ip
2029 if association_id is not None:
2030 params['AssociationId'] = association_id
2031 elif public_ip is not None:
2032 params['PublicIp'] = public_ip
2033
2034 if dry_run:
2035 params['DryRun'] = 'true'
2036
2037 return self.get_status('DisassociateAddress', params, verb='POST')
2038
2039 def release_address(self, public_ip=None, allocation_id=None,
2040 dry_run=False):
2041 """
2042 Free up an Elastic IP address. Pass a public IP address to
2043 release an EC2 Elastic IP address and an AllocationId to
2044 release a VPC Elastic IP address. You should only pass
2045 one value.
2046
2047 This requires one of ``public_ip`` or ``allocation_id`` depending
2048 on if you're associating a VPC address or a plain EC2 address.
2049
2050 When using an Allocation ID, make sure to pass ``None`` for ``public_ip``
2051 as EC2 expects a single parameter and if ``public_ip`` is passed boto
2052 will preference that instead of ``allocation_id``.
2053
2054 :type public_ip: string
2055 :param public_ip: The public IP address for EC2 elastic IPs.
2056
2057 :type allocation_id: string
2058 :param allocation_id: The Allocation ID for VPC elastic IPs.
2059
2060 :type dry_run: bool
2061 :param dry_run: Set to True if the operation should not actually run.
2062
2063 :rtype: bool
2064 :return: True if successful
2065 """
2066 params = {}
2067
2068 if public_ip is not None:
2069 params['PublicIp'] = public_ip
2070 elif allocation_id is not None:
2071 params['AllocationId'] = allocation_id
2072
2073 if dry_run:
2074 params['DryRun'] = 'true'
2075
2076 return self.get_status('ReleaseAddress', params, verb='POST')
2077
2078 def unassign_private_ip_addresses(self, network_interface_id=None,
2079 private_ip_addresses=None, dry_run=False):
2080 """
2081 Unassigns one or more secondary private IP addresses from a network
2082 interface in Amazon VPC.
2083
2084 :type network_interface_id: string
2085 :param network_interface_id: The network interface from which the
2086 secondary private IP address will be unassigned.
2087
2088 :type private_ip_addresses: list
2089 :param private_ip_addresses: Specifies the secondary private IP
2090 addresses that you want to unassign from the network interface.
2091
2092 :type dry_run: bool
2093 :param dry_run: Set to True if the operation should not actually run.
2094
2095 :rtype: bool
2096 :return: True if successful
2097 """
2098 params = {}
2099
2100 if network_interface_id is not None:
2101 params['NetworkInterfaceId'] = network_interface_id
2102
2103 if private_ip_addresses is not None:
2104 self.build_list_params(params, private_ip_addresses,
2105 'PrivateIpAddress')
2106
2107 if dry_run:
2108 params['DryRun'] = 'true'
2109
2110 return self.get_status('UnassignPrivateIpAddresses', params,
2111 verb='POST')
2112
2113 # Volume methods
2114
2115 def get_all_volumes(self, volume_ids=None, filters=None, dry_run=False):
2116 """
2117 Get all Volumes associated with the current credentials.
2118
2119 :type volume_ids: list
2120 :param volume_ids: Optional list of volume ids. If this list
2121 is present, only the volumes associated with
2122 these volume ids will be returned.
2123
2124 :type filters: dict
2125 :param filters: Optional filters that can be used to limit
2126 the results returned. Filters are provided
2127 in the form of a dictionary consisting of
2128 filter names as the key and filter values
2129 as the value. The set of allowable filter
2130 names/values is dependent on the request
2131 being performed. Check the EC2 API guide
2132 for details.
2133
2134 :type dry_run: bool
2135 :param dry_run: Set to True if the operation should not actually run.
2136
2137 :rtype: list of :class:`boto.ec2.volume.Volume`
2138 :return: The requested Volume objects
2139 """
2140 params = {}
2141 if volume_ids:
2142 self.build_list_params(params, volume_ids, 'VolumeId')
2143 if filters:
2144 self.build_filter_params(params, filters)
2145 if dry_run:
2146 params['DryRun'] = 'true'
2147 return self.get_list('DescribeVolumes', params,
2148 [('item', Volume)], verb='POST')
2149
2150 def get_all_volume_status(self, volume_ids=None,
2151 max_results=None, next_token=None,
2152 filters=None, dry_run=False):
2153 """
2154 Retrieve the status of one or more volumes.
2155
2156 :type volume_ids: list
2157 :param volume_ids: A list of strings of volume IDs
2158
2159 :type max_results: int
2160 :param max_results: The maximum number of paginated instance
2161 items per response.
2162
2163 :type next_token: str
2164 :param next_token: A string specifying the next paginated set
2165 of results to return.
2166
2167 :type filters: dict
2168 :param filters: Optional filters that can be used to limit
2169 the results returned. Filters are provided
2170 in the form of a dictionary consisting of
2171 filter names as the key and filter values
2172 as the value. The set of allowable filter
2173 names/values is dependent on the request
2174 being performed. Check the EC2 API guide
2175 for details.
2176
2177 :type dry_run: bool
2178 :param dry_run: Set to True if the operation should not actually run.
2179
2180 :rtype: list
2181 :return: A list of volume status.
2182 """
2183 params = {}
2184 if volume_ids:
2185 self.build_list_params(params, volume_ids, 'VolumeId')
2186 if max_results:
2187 params['MaxResults'] = max_results
2188 if next_token:
2189 params['NextToken'] = next_token
2190 if filters:
2191 self.build_filter_params(params, filters)
2192 if dry_run:
2193 params['DryRun'] = 'true'
2194 return self.get_object('DescribeVolumeStatus', params,
2195 VolumeStatusSet, verb='POST')
2196
2197 def enable_volume_io(self, volume_id, dry_run=False):
2198 """
2199 Enables I/O operations for a volume that had I/O operations
2200 disabled because the data on the volume was potentially inconsistent.
2201
2202 :type volume_id: str
2203 :param volume_id: The ID of the volume.
2204
2205 :type dry_run: bool
2206 :param dry_run: Set to True if the operation should not actually run.
2207
2208 :rtype: bool
2209 :return: True if successful
2210 """
2211 params = {'VolumeId': volume_id}
2212 if dry_run:
2213 params['DryRun'] = 'true'
2214 return self.get_status('EnableVolumeIO', params, verb='POST')
2215
2216 def get_volume_attribute(self, volume_id,
2217 attribute='autoEnableIO', dry_run=False):
2218 """
2219 Describes attribute of the volume.
2220
2221 :type volume_id: str
2222 :param volume_id: The ID of the volume.
2223
2224 :type attribute: str
2225 :param attribute: The requested attribute. Valid values are:
2226
2227 * autoEnableIO
2228
2229 :type dry_run: bool
2230 :param dry_run: Set to True if the operation should not actually run.
2231
2232 :rtype: list of :class:`boto.ec2.volume.VolumeAttribute`
2233 :return: The requested Volume attribute
2234 """
2235 params = {'VolumeId': volume_id, 'Attribute': attribute}
2236 if dry_run:
2237 params['DryRun'] = 'true'
2238 return self.get_object('DescribeVolumeAttribute', params,
2239 VolumeAttribute, verb='POST')
2240
2241 def modify_volume_attribute(self, volume_id, attribute, new_value,
2242 dry_run=False):
2243 """
2244 Changes an attribute of an Volume.
2245
2246 :type volume_id: string
2247 :param volume_id: The volume id you wish to change
2248
2249 :type attribute: string
2250 :param attribute: The attribute you wish to change. Valid values are:
2251 AutoEnableIO.
2252
2253 :type new_value: string
2254 :param new_value: The new value of the attribute.
2255
2256 :type dry_run: bool
2257 :param dry_run: Set to True if the operation should not actually run.
2258
2259 """
2260 params = {'VolumeId': volume_id}
2261 if attribute == 'AutoEnableIO':
2262 params['AutoEnableIO.Value'] = new_value
2263 if dry_run:
2264 params['DryRun'] = 'true'
2265 return self.get_status('ModifyVolumeAttribute', params, verb='POST')
2266
2267 def create_volume(self, size, zone, snapshot=None, volume_type=None,
2268 iops=None, encrypted=False, dry_run=False):
2269 """
2270 Create a new EBS Volume.
2271
2272 :type size: int
2273 :param size: The size of the new volume, in GiB
2274
2275 :type zone: string or :class:`boto.ec2.zone.Zone`
2276 :param zone: The availability zone in which the Volume will be created.
2277
2278 :type snapshot: string or :class:`boto.ec2.snapshot.Snapshot`
2279 :param snapshot: The snapshot from which the new Volume will be
2280 created.
2281
2282 :type volume_type: string
2283 :param volume_type: The type of the volume. (optional). Valid
2284 values are: standard | io1 | gp2.
2285
2286 :type iops: int
2287 :param iops: The provisioned IOPS you want to associate with
2288 this volume. (optional)
2289
2290 :type encrypted: bool
2291 :param encrypted: Specifies whether the volume should be encrypted.
2292 (optional)
2293
2294 :type dry_run: bool
2295 :param dry_run: Set to True if the operation should not actually run.
2296
2297 """
2298 if isinstance(zone, Zone):
2299 zone = zone.name
2300 params = {'AvailabilityZone': zone}
2301 if size:
2302 params['Size'] = size
2303 if snapshot:
2304 if isinstance(snapshot, Snapshot):
2305 snapshot = snapshot.id
2306 params['SnapshotId'] = snapshot
2307 if volume_type:
2308 params['VolumeType'] = volume_type
2309 if iops:
2310 params['Iops'] = str(iops)
2311 if encrypted:
2312 params['Encrypted'] = 'true'
2313 if dry_run:
2314 params['DryRun'] = 'true'
2315 return self.get_object('CreateVolume', params, Volume, verb='POST')
2316
2317 def delete_volume(self, volume_id, dry_run=False):
2318 """
2319 Delete an EBS volume.
2320
2321 :type volume_id: str
2322 :param volume_id: The ID of the volume to be delete.
2323
2324 :type dry_run: bool
2325 :param dry_run: Set to True if the operation should not actually run.
2326
2327 :rtype: bool
2328 :return: True if successful
2329 """
2330 params = {'VolumeId': volume_id}
2331 if dry_run:
2332 params['DryRun'] = 'true'
2333 return self.get_status('DeleteVolume', params, verb='POST')
2334
2335 def attach_volume(self, volume_id, instance_id, device, dry_run=False):
2336 """
2337 Attach an EBS volume to an EC2 instance.
2338
2339 :type volume_id: str
2340 :param volume_id: The ID of the EBS volume to be attached.
2341
2342 :type instance_id: str
2343 :param instance_id: The ID of the EC2 instance to which it will
2344 be attached.
2345
2346 :type device: str
2347 :param device: The device on the instance through which the
2348 volume will be exposted (e.g. /dev/sdh)
2349
2350 :type dry_run: bool
2351 :param dry_run: Set to True if the operation should not actually run.
2352
2353 :rtype: bool
2354 :return: True if successful
2355 """
2356 params = {'InstanceId': instance_id,
2357 'VolumeId': volume_id,
2358 'Device': device}
2359 if dry_run:
2360 params['DryRun'] = 'true'
2361 return self.get_status('AttachVolume', params, verb='POST')
2362
2363 def detach_volume(self, volume_id, instance_id=None,
2364 device=None, force=False, dry_run=False):
2365 """
2366 Detach an EBS volume from an EC2 instance.
2367
2368 :type volume_id: str
2369 :param volume_id: The ID of the EBS volume to be attached.
2370
2371 :type instance_id: str
2372 :param instance_id: The ID of the EC2 instance from which it will
2373 be detached.
2374
2375 :type device: str
2376 :param device: The device on the instance through which the
2377 volume is exposted (e.g. /dev/sdh)
2378
2379 :type force: bool
2380 :param force: Forces detachment if the previous detachment
2381 attempt did not occur cleanly. This option can lead to
2382 data loss or a corrupted file system. Use this option only
2383 as a last resort to detach a volume from a failed
2384 instance. The instance will not have an opportunity to
2385 flush file system caches nor file system meta data. If you
2386 use this option, you must perform file system check and
2387 repair procedures.
2388
2389 :type dry_run: bool
2390 :param dry_run: Set to True if the operation should not actually run.
2391
2392 :rtype: bool
2393 :return: True if successful
2394 """
2395 params = {'VolumeId': volume_id}
2396 if instance_id:
2397 params['InstanceId'] = instance_id
2398 if device:
2399 params['Device'] = device
2400 if force:
2401 params['Force'] = 'true'
2402 if dry_run:
2403 params['DryRun'] = 'true'
2404 return self.get_status('DetachVolume', params, verb='POST')
2405
2406 # Snapshot methods
2407
2408 def get_all_snapshots(self, snapshot_ids=None,
2409 owner=None, restorable_by=None,
2410 filters=None, dry_run=False):
2411 """
2412 Get all EBS Snapshots associated with the current credentials.
2413
2414 :type snapshot_ids: list
2415 :param snapshot_ids: Optional list of snapshot ids. If this list is
2416 present, only the Snapshots associated with
2417 these snapshot ids will be returned.
2418
2419 :type owner: str or list
2420 :param owner: If present, only the snapshots owned by the specified user(s)
2421 will be returned. Valid values are:
2422
2423 * self
2424 * amazon
2425 * AWS Account ID
2426
2427 :type restorable_by: str or list
2428 :param restorable_by: If present, only the snapshots that are restorable
2429 by the specified account id(s) will be returned.
2430
2431 :type filters: dict
2432 :param filters: Optional filters that can be used to limit
2433 the results returned. Filters are provided
2434 in the form of a dictionary consisting of
2435 filter names as the key and filter values
2436 as the value. The set of allowable filter
2437 names/values is dependent on the request
2438 being performed. Check the EC2 API guide
2439 for details.
2440
2441 :type dry_run: bool
2442 :param dry_run: Set to True if the operation should not actually run.
2443
2444 :rtype: list of :class:`boto.ec2.snapshot.Snapshot`
2445 :return: The requested Snapshot objects
2446 """
2447 params = {}
2448 if snapshot_ids:
2449 self.build_list_params(params, snapshot_ids, 'SnapshotId')
2450
2451 if owner:
2452 self.build_list_params(params, owner, 'Owner')
2453 if restorable_by:
2454 self.build_list_params(params, restorable_by, 'RestorableBy')
2455 if filters:
2456 self.build_filter_params(params, filters)
2457 if dry_run:
2458 params['DryRun'] = 'true'
2459 return self.get_list('DescribeSnapshots', params,
2460 [('item', Snapshot)], verb='POST')
2461
2462 def create_snapshot(self, volume_id, description=None, dry_run=False):
2463 """
2464 Create a snapshot of an existing EBS Volume.
2465
2466 :type volume_id: str
2467 :param volume_id: The ID of the volume to be snapshot'ed
2468
2469 :type description: str
2470 :param description: A description of the snapshot.
2471 Limited to 255 characters.
2472
2473 :type dry_run: bool
2474 :param dry_run: Set to True if the operation should not actually run.
2475
2476 :rtype: :class:`boto.ec2.snapshot.Snapshot`
2477 :return: The created Snapshot object
2478 """
2479 params = {'VolumeId': volume_id}
2480 if description:
2481 params['Description'] = description[0:255]
2482 if dry_run:
2483 params['DryRun'] = 'true'
2484 snapshot = self.get_object('CreateSnapshot', params,
2485 Snapshot, verb='POST')
2486 volume = self.get_all_volumes([volume_id], dry_run=dry_run)[0]
2487 volume_name = volume.tags.get('Name')
2488 if volume_name:
2489 snapshot.add_tag('Name', volume_name)
2490 return snapshot
2491
2492 def delete_snapshot(self, snapshot_id, dry_run=False):
2493 """
2494 :type dry_run: bool
2495 :param dry_run: Set to True if the operation should not actually run.
2496
2497 """
2498 params = {'SnapshotId': snapshot_id}
2499 if dry_run:
2500 params['DryRun'] = 'true'
2501 return self.get_status('DeleteSnapshot', params, verb='POST')
2502
2503 def copy_snapshot(self, source_region, source_snapshot_id,
2504 description=None, dry_run=False):
2505 """
2506 Copies a point-in-time snapshot of an Amazon Elastic Block Store
2507 (Amazon EBS) volume and stores it in Amazon Simple Storage Service
2508 (Amazon S3). You can copy the snapshot within the same region or from
2509 one region to another. You can use the snapshot to create new Amazon
2510 EBS volumes or Amazon Machine Images (AMIs).
2511
2512
2513 :type source_region: str
2514 :param source_region: The ID of the AWS region that contains the
2515 snapshot to be copied (e.g 'us-east-1', 'us-west-2', etc.).
2516
2517 :type source_snapshot_id: str
2518 :param source_snapshot_id: The ID of the Amazon EBS snapshot to copy
2519
2520 :type description: str
2521 :param description: A description of the new Amazon EBS snapshot.
2522
2523 :type dry_run: bool
2524 :param dry_run: Set to True if the operation should not actually run.
2525
2526 :rtype: str
2527 :return: The snapshot ID
2528
2529 """
2530 params = {
2531 'SourceRegion': source_region,
2532 'SourceSnapshotId': source_snapshot_id,
2533 }
2534 if description is not None:
2535 params['Description'] = description
2536 if dry_run:
2537 params['DryRun'] = 'true'
2538 snapshot = self.get_object('CopySnapshot', params, Snapshot,
2539 verb='POST')
2540 return snapshot.id
2541
2542 def trim_snapshots(self, hourly_backups=8, daily_backups=7,
2543 weekly_backups=4, monthly_backups=True):
2544 """
2545 Trim excess snapshots, based on when they were taken. More current
2546 snapshots are retained, with the number retained decreasing as you
2547 move back in time.
2548
2549 If ebs volumes have a 'Name' tag with a value, their snapshots
2550 will be assigned the same tag when they are created. The values
2551 of the 'Name' tags for snapshots are used by this function to
2552 group snapshots taken from the same volume (or from a series
2553 of like-named volumes over time) for trimming.
2554
2555 For every group of like-named snapshots, this function retains
2556 the newest and oldest snapshots, as well as, by default, the
2557 first snapshots taken in each of the last eight hours, the first
2558 snapshots taken in each of the last seven days, the first snapshots
2559 taken in the last 4 weeks (counting Midnight Sunday morning as
2560 the start of the week), and the first snapshot from the first
2561 day of each month forever.
2562
2563 :type hourly_backups: int
2564 :param hourly_backups: How many recent hourly backups should be saved.
2565
2566 :type daily_backups: int
2567 :param daily_backups: How many recent daily backups should be saved.
2568
2569 :type weekly_backups: int
2570 :param weekly_backups: How many recent weekly backups should be saved.
2571
2572 :type monthly_backups: int
2573 :param monthly_backups: How many monthly backups should be saved. Use True for no limit.
2574 """
2575
2576 # This function first builds up an ordered list of target times
2577 # that snapshots should be saved for (last 8 hours, last 7 days, etc.).
2578 # Then a map of snapshots is constructed, with the keys being
2579 # the snapshot / volume names and the values being arrays of
2580 # chronologically sorted snapshots.
2581 # Finally, for each array in the map, we go through the snapshot
2582 # array and the target time array in an interleaved fashion,
2583 # deleting snapshots whose start_times don't immediately follow a
2584 # target time (we delete a snapshot if there's another snapshot
2585 # that was made closer to the preceding target time).
2586
2587 now = datetime.utcnow()
2588 last_hour = datetime(now.year, now.month, now.day, now.hour)
2589 last_midnight = datetime(now.year, now.month, now.day)
2590 last_sunday = datetime(now.year, now.month, now.day) - timedelta(days=(now.weekday() + 1) % 7)
2591 start_of_month = datetime(now.year, now.month, 1)
2592
2593 target_backup_times = []
2594
2595 # there are no snapshots older than 1/1/2007
2596 oldest_snapshot_date = datetime(2007, 1, 1)
2597
2598 for hour in range(0, hourly_backups):
2599 target_backup_times.append(last_hour - timedelta(hours=hour))
2600
2601 for day in range(0, daily_backups):
2602 target_backup_times.append(last_midnight - timedelta(days=day))
2603
2604 for week in range(0, weekly_backups):
2605 target_backup_times.append(last_sunday - timedelta(weeks=week))
2606
2607 one_day = timedelta(days=1)
2608 monthly_snapshots_added = 0
2609 while (start_of_month > oldest_snapshot_date and
2610 (monthly_backups is True or
2611 monthly_snapshots_added < monthly_backups)):
2612 # append the start of the month to the list of
2613 # snapshot dates to save:
2614 target_backup_times.append(start_of_month)
2615 monthly_snapshots_added += 1
2616 # there's no timedelta setting for one month, so instead:
2617 # decrement the day by one, so we go to the final day of
2618 # the previous month...
2619 start_of_month -= one_day
2620 # ... and then go to the first day of that previous month:
2621 start_of_month = datetime(start_of_month.year,
2622 start_of_month.month, 1)
2623
2624 temp = []
2625
2626 for t in target_backup_times:
2627 if temp.__contains__(t) == False:
2628 temp.append(t)
2629
2630 # sort to make the oldest dates first, and make sure the month start
2631 # and last four week's start are in the proper order
2632 target_backup_times = sorted(temp)
2633
2634 # get all the snapshots, sort them by date and time, and
2635 # organize them into one array for each volume:
2636 all_snapshots = self.get_all_snapshots(owner = 'self')
2637 all_snapshots.sort(cmp = lambda x, y: cmp(x.start_time, y.start_time))
2638 snaps_for_each_volume = {}
2639 for snap in all_snapshots:
2640 # the snapshot name and the volume name are the same.
2641 # The snapshot name is set from the volume
2642 # name at the time the snapshot is taken
2643 volume_name = snap.tags.get('Name')
2644 if volume_name:
2645 # only examine snapshots that have a volume name
2646 snaps_for_volume = snaps_for_each_volume.get(volume_name)
2647 if not snaps_for_volume:
2648 snaps_for_volume = []
2649 snaps_for_each_volume[volume_name] = snaps_for_volume
2650 snaps_for_volume.append(snap)
2651
2652 # Do a running comparison of snapshot dates to desired time
2653 #periods, keeping the oldest snapshot in each
2654 # time period and deleting the rest:
2655 for volume_name in snaps_for_each_volume:
2656 snaps = snaps_for_each_volume[volume_name]
2657 snaps = snaps[:-1] # never delete the newest snapshot
2658 time_period_number = 0
2659 snap_found_for_this_time_period = False
2660 for snap in snaps:
2661 check_this_snap = True
2662 while check_this_snap and time_period_number < target_backup_times.__len__():
2663 snap_date = datetime.strptime(snap.start_time,
2664 '%Y-%m-%dT%H:%M:%S.000Z')
2665 if snap_date < target_backup_times[time_period_number]:
2666 # the snap date is before the cutoff date.
2667 # Figure out if it's the first snap in this
2668 # date range and act accordingly (since both
2669 #date the date ranges and the snapshots
2670 # are sorted chronologically, we know this
2671 #snapshot isn't in an earlier date range):
2672 if snap_found_for_this_time_period == True:
2673 if not snap.tags.get('preserve_snapshot'):
2674 # as long as the snapshot wasn't marked
2675 # with the 'preserve_snapshot' tag, delete it:
2676 try:
2677 self.delete_snapshot(snap.id)
2678 boto.log.info('Trimmed snapshot %s (%s)' % (snap.tags['Name'], snap.start_time))
2679 except EC2ResponseError:
2680 boto.log.error('Attempt to trim snapshot %s (%s) failed. Possible result of a race condition with trimming on another server?' % (snap.tags['Name'], snap.start_time))
2681 # go on and look at the next snapshot,
2682 #leaving the time period alone
2683 else:
2684 # this was the first snapshot found for this
2685 #time period. Leave it alone and look at the
2686 # next snapshot:
2687 snap_found_for_this_time_period = True
2688 check_this_snap = False
2689 else:
2690 # the snap is after the cutoff date. Check it
2691 # against the next cutoff date
2692 time_period_number += 1
2693 snap_found_for_this_time_period = False
2694
2695 def get_snapshot_attribute(self, snapshot_id,
2696 attribute='createVolumePermission',
2697 dry_run=False):
2698 """
2699 Get information about an attribute of a snapshot. Only one attribute
2700 can be specified per call.
2701
2702 :type snapshot_id: str
2703 :param snapshot_id: The ID of the snapshot.
2704
2705 :type attribute: str
2706 :param attribute: The requested attribute. Valid values are:
2707
2708 * createVolumePermission
2709
2710 :type dry_run: bool
2711 :param dry_run: Set to True if the operation should not actually run.
2712
2713 :rtype: list of :class:`boto.ec2.snapshotattribute.SnapshotAttribute`
2714 :return: The requested Snapshot attribute
2715 """
2716 params = {'Attribute': attribute}
2717 if snapshot_id:
2718 params['SnapshotId'] = snapshot_id
2719 if dry_run:
2720 params['DryRun'] = 'true'
2721 return self.get_object('DescribeSnapshotAttribute', params,
2722 SnapshotAttribute, verb='POST')
2723
2724 def modify_snapshot_attribute(self, snapshot_id,
2725 attribute='createVolumePermission',
2726 operation='add', user_ids=None, groups=None,
2727 dry_run=False):
2728 """
2729 Changes an attribute of an image.
2730
2731 :type snapshot_id: string
2732 :param snapshot_id: The snapshot id you wish to change
2733
2734 :type attribute: string
2735 :param attribute: The attribute you wish to change. Valid values are:
2736 createVolumePermission
2737
2738 :type operation: string
2739 :param operation: Either add or remove (this is required for changing
2740 snapshot ermissions)
2741
2742 :type user_ids: list
2743 :param user_ids: The Amazon IDs of users to add/remove attributes
2744
2745 :type groups: list
2746 :param groups: The groups to add/remove attributes. The only valid
2747 value at this time is 'all'.
2748
2749 :type dry_run: bool
2750 :param dry_run: Set to True if the operation should not actually run.
2751
2752 """
2753 params = {'SnapshotId': snapshot_id,
2754 'Attribute': attribute,
2755 'OperationType': operation}
2756 if user_ids:
2757 self.build_list_params(params, user_ids, 'UserId')
2758 if groups:
2759 self.build_list_params(params, groups, 'UserGroup')
2760 if dry_run:
2761 params['DryRun'] = 'true'
2762 return self.get_status('ModifySnapshotAttribute', params, verb='POST')
2763
2764 def reset_snapshot_attribute(self, snapshot_id,
2765 attribute='createVolumePermission',
2766 dry_run=False):
2767 """
2768 Resets an attribute of a snapshot to its default value.
2769
2770 :type snapshot_id: string
2771 :param snapshot_id: ID of the snapshot
2772
2773 :type attribute: string
2774 :param attribute: The attribute to reset
2775
2776 :type dry_run: bool
2777 :param dry_run: Set to True if the operation should not actually run.
2778
2779 :rtype: bool
2780 :return: Whether the operation succeeded or not
2781 """
2782 params = {'SnapshotId': snapshot_id,
2783 'Attribute': attribute}
2784 if dry_run:
2785 params['DryRun'] = 'true'
2786 return self.get_status('ResetSnapshotAttribute', params, verb='POST')
2787
2788 # Keypair methods
2789
2790 def get_all_key_pairs(self, keynames=None, filters=None, dry_run=False):
2791 """
2792 Get all key pairs associated with your account.
2793
2794 :type keynames: list
2795 :param keynames: A list of the names of keypairs to retrieve.
2796 If not provided, all key pairs will be returned.
2797
2798 :type filters: dict
2799 :param filters: Optional filters that can be used to limit the
2800 results returned. Filters are provided in the form of a
2801 dictionary consisting of filter names as the key and
2802 filter values as the value. The set of allowable filter
2803 names/values is dependent on the request being performed.
2804 Check the EC2 API guide for details.
2805
2806 :type dry_run: bool
2807 :param dry_run: Set to True if the operation should not actually run.
2808
2809 :rtype: list
2810 :return: A list of :class:`boto.ec2.keypair.KeyPair`
2811 """
2812 params = {}
2813 if keynames:
2814 self.build_list_params(params, keynames, 'KeyName')
2815 if filters:
2816 self.build_filter_params(params, filters)
2817 if dry_run:
2818 params['DryRun'] = 'true'
2819 return self.get_list('DescribeKeyPairs', params,
2820 [('item', KeyPair)], verb='POST')
2821
2822 def get_key_pair(self, keyname, dry_run=False):
2823 """
2824 Convenience method to retrieve a specific keypair (KeyPair).
2825
2826 :type keyname: string
2827 :param keyname: The name of the keypair to retrieve
2828
2829 :type dry_run: bool
2830 :param dry_run: Set to True if the operation should not actually run.
2831
2832 :rtype: :class:`boto.ec2.keypair.KeyPair`
2833 :return: The KeyPair specified or None if it is not found
2834 """
2835 try:
2836 return self.get_all_key_pairs(
2837 keynames=[keyname],
2838 dry_run=dry_run
2839 )[0]
2840 except self.ResponseError as e:
2841 if e.code == 'InvalidKeyPair.NotFound':
2842 return None
2843 else:
2844 raise
2845
2846 def create_key_pair(self, key_name, dry_run=False):
2847 """
2848 Create a new key pair for your account.
2849 This will create the key pair within the region you
2850 are currently connected to.
2851
2852 :type key_name: string
2853 :param key_name: The name of the new keypair
2854
2855 :type dry_run: bool
2856 :param dry_run: Set to True if the operation should not actually run.
2857
2858 :rtype: :class:`boto.ec2.keypair.KeyPair`
2859 :return: The newly created :class:`boto.ec2.keypair.KeyPair`.
2860 The material attribute of the new KeyPair object
2861 will contain the the unencrypted PEM encoded RSA private key.
2862 """
2863 params = {'KeyName': key_name}
2864 if dry_run:
2865 params['DryRun'] = 'true'
2866 return self.get_object('CreateKeyPair', params, KeyPair, verb='POST')
2867
2868 def delete_key_pair(self, key_name, dry_run=False):
2869 """
2870 Delete a key pair from your account.
2871
2872 :type key_name: string
2873 :param key_name: The name of the keypair to delete
2874
2875 :type dry_run: bool
2876 :param dry_run: Set to True if the operation should not actually run.
2877
2878 """
2879 params = {'KeyName': key_name}
2880 if dry_run:
2881 params['DryRun'] = 'true'
2882 return self.get_status('DeleteKeyPair', params, verb='POST')
2883
2884 def import_key_pair(self, key_name, public_key_material, dry_run=False):
2885 """
2886 imports the public key from an RSA key pair that you created
2887 with a third-party tool.
2888
2889 Supported formats:
2890
2891 * OpenSSH public key format (e.g., the format
2892 in ~/.ssh/authorized_keys)
2893
2894 * Base64 encoded DER format
2895
2896 * SSH public key file format as specified in RFC4716
2897
2898 DSA keys are not supported. Make sure your key generator is
2899 set up to create RSA keys.
2900
2901 Supported lengths: 1024, 2048, and 4096.
2902
2903 :type key_name: string
2904 :param key_name: The name of the new keypair
2905
2906 :type public_key_material: string
2907 :param public_key_material: The public key. You must base64 encode
2908 the public key material before sending
2909 it to AWS.
2910
2911 :type dry_run: bool
2912 :param dry_run: Set to True if the operation should not actually run.
2913
2914 :rtype: :class:`boto.ec2.keypair.KeyPair`
2915 :return: A :class:`boto.ec2.keypair.KeyPair` object representing
2916 the newly imported key pair. This object will contain only
2917 the key name and the fingerprint.
2918 """
2919 public_key_material = base64.b64encode(public_key_material)
2920 params = {'KeyName': key_name,
2921 'PublicKeyMaterial': public_key_material}
2922 if dry_run:
2923 params['DryRun'] = 'true'
2924 return self.get_object('ImportKeyPair', params, KeyPair, verb='POST')
2925
2926 # SecurityGroup methods
2927
2928 def get_all_security_groups(self, groupnames=None, group_ids=None,
2929 filters=None, dry_run=False):
2930 """
2931 Get all security groups associated with your account in a region.
2932
2933 :type groupnames: list
2934 :param groupnames: A list of the names of security groups to retrieve.
2935 If not provided, all security groups will be
2936 returned.
2937
2938 :type group_ids: list
2939 :param group_ids: A list of IDs of security groups to retrieve for
2940 security groups within a VPC.
2941
2942 :type filters: dict
2943 :param filters: Optional filters that can be used to limit
2944 the results returned. Filters are provided
2945 in the form of a dictionary consisting of
2946 filter names as the key and filter values
2947 as the value. The set of allowable filter
2948 names/values is dependent on the request
2949 being performed. Check the EC2 API guide
2950 for details.
2951
2952 :type dry_run: bool
2953 :param dry_run: Set to True if the operation should not actually run.
2954
2955 :rtype: list
2956 :return: A list of :class:`boto.ec2.securitygroup.SecurityGroup`
2957 """
2958 params = {}
2959 if groupnames is not None:
2960 self.build_list_params(params, groupnames, 'GroupName')
2961 if group_ids is not None:
2962 self.build_list_params(params, group_ids, 'GroupId')
2963 if filters is not None:
2964 self.build_filter_params(params, filters)
2965 if dry_run:
2966 params['DryRun'] = 'true'
2967 return self.get_list('DescribeSecurityGroups', params,
2968 [('item', SecurityGroup)], verb='POST')
2969
2970 def create_security_group(self, name, description, vpc_id=None,
2971 dry_run=False):
2972 """
2973 Create a new security group for your account.
2974 This will create the security group within the region you
2975 are currently connected to.
2976
2977 :type name: string
2978 :param name: The name of the new security group
2979
2980 :type description: string
2981 :param description: The description of the new security group
2982
2983 :type vpc_id: string
2984 :param vpc_id: The ID of the VPC to create the security group in,
2985 if any.
2986
2987 :type dry_run: bool
2988 :param dry_run: Set to True if the operation should not actually run.
2989
2990 :rtype: :class:`boto.ec2.securitygroup.SecurityGroup`
2991 :return: The newly created :class:`boto.ec2.securitygroup.SecurityGroup`.
2992 """
2993 params = {'GroupName': name,
2994 'GroupDescription': description}
2995
2996 if vpc_id is not None:
2997 params['VpcId'] = vpc_id
2998
2999 if dry_run:
3000 params['DryRun'] = 'true'
3001
3002 group = self.get_object('CreateSecurityGroup', params,
3003 SecurityGroup, verb='POST')
3004 group.name = name
3005 group.description = description
3006 if vpc_id is not None:
3007 group.vpc_id = vpc_id
3008 return group
3009
3010 def delete_security_group(self, name=None, group_id=None, dry_run=False):
3011 """
3012 Delete a security group from your account.
3013
3014 :type name: string
3015 :param name: The name of the security group to delete.
3016
3017 :type group_id: string
3018 :param group_id: The ID of the security group to delete within
3019 a VPC.
3020
3021 :type dry_run: bool
3022 :param dry_run: Set to True if the operation should not actually run.
3023
3024 :rtype: bool
3025 :return: True if successful.
3026 """
3027 params = {}
3028
3029 if name is not None:
3030 params['GroupName'] = name
3031 elif group_id is not None:
3032 params['GroupId'] = group_id
3033
3034 if dry_run:
3035 params['DryRun'] = 'true'
3036
3037 return self.get_status('DeleteSecurityGroup', params, verb='POST')
3038
3039 def authorize_security_group_deprecated(self, group_name,
3040 src_security_group_name=None,
3041 src_security_group_owner_id=None,
3042 ip_protocol=None,
3043 from_port=None, to_port=None,
3044 cidr_ip=None, dry_run=False):
3045 """
3046 NOTE: This method uses the old-style request parameters
3047 that did not allow a port to be specified when
3048 authorizing a group.
3049
3050 :type group_name: string
3051 :param group_name: The name of the security group you are adding
3052 the rule to.
3053
3054 :type src_security_group_name: string
3055 :param src_security_group_name: The name of the security group you are
3056 granting access to.
3057
3058 :type src_security_group_owner_id: string
3059 :param src_security_group_owner_id: The ID of the owner of the security
3060 group you are granting access to.
3061
3062 :type ip_protocol: string
3063 :param ip_protocol: Either tcp | udp | icmp
3064
3065 :type from_port: int
3066 :param from_port: The beginning port number you are enabling
3067
3068 :type to_port: int
3069 :param to_port: The ending port number you are enabling
3070
3071 :type to_port: string
3072 :param to_port: The CIDR block you are providing access to.
3073 See http://goo.gl/Yj5QC
3074
3075 :type dry_run: bool
3076 :param dry_run: Set to True if the operation should not actually run.
3077
3078 :rtype: bool
3079 :return: True if successful.
3080 """
3081 params = {'GroupName': group_name}
3082 if src_security_group_name:
3083 params['SourceSecurityGroupName'] = src_security_group_name
3084 if src_security_group_owner_id:
3085 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id
3086 if ip_protocol:
3087 params['IpProtocol'] = ip_protocol
3088 if from_port:
3089 params['FromPort'] = from_port
3090 if to_port:
3091 params['ToPort'] = to_port
3092 if cidr_ip:
3093 params['CidrIp'] = cidr_ip
3094 if dry_run:
3095 params['DryRun'] = 'true'
3096 return self.get_status('AuthorizeSecurityGroupIngress', params)
3097
3098 def authorize_security_group(self, group_name=None,
3099 src_security_group_name=None,
3100 src_security_group_owner_id=None,
3101 ip_protocol=None,
3102 from_port=None, to_port=None,
3103 cidr_ip=None, group_id=None,
3104 src_security_group_group_id=None,
3105 dry_run=False):
3106 """
3107 Add a new rule to an existing security group.
3108 You need to pass in either src_security_group_name and
3109 src_security_group_owner_id OR ip_protocol, from_port, to_port,
3110 and cidr_ip. In other words, either you are authorizing another
3111 group or you are authorizing some ip-based rule.
3112
3113 :type group_name: string
3114 :param group_name: The name of the security group you are adding
3115 the rule to.
3116
3117 :type src_security_group_name: string
3118 :param src_security_group_name: The name of the security group you are
3119 granting access to.
3120
3121 :type src_security_group_owner_id: string
3122 :param src_security_group_owner_id: The ID of the owner of the security
3123 group you are granting access to.
3124
3125 :type ip_protocol: string
3126 :param ip_protocol: Either tcp | udp | icmp
3127
3128 :type from_port: int
3129 :param from_port: The beginning port number you are enabling
3130
3131 :type to_port: int
3132 :param to_port: The ending port number you are enabling
3133
3134 :type cidr_ip: string or list of strings
3135 :param cidr_ip: The CIDR block you are providing access to.
3136 See http://goo.gl/Yj5QC
3137
3138 :type group_id: string
3139 :param group_id: ID of the EC2 or VPC security group to
3140 modify. This is required for VPC security groups and can
3141 be used instead of group_name for EC2 security groups.
3142
3143 :type src_security_group_group_id: string
3144 :param src_security_group_group_id: The ID of the security
3145 group you are granting access to. Can be used instead of
3146 src_security_group_name
3147
3148 :type dry_run: bool
3149 :param dry_run: Set to True if the operation should not actually run.
3150
3151 :rtype: bool
3152 :return: True if successful.
3153 """
3154 if src_security_group_name:
3155 if from_port is None and to_port is None and ip_protocol is None:
3156 return self.authorize_security_group_deprecated(
3157 group_name, src_security_group_name,
3158 src_security_group_owner_id)
3159
3160 params = {}
3161
3162 if group_name:
3163 params['GroupName'] = group_name
3164 if group_id:
3165 params['GroupId'] = group_id
3166 if src_security_group_name:
3167 param_name = 'IpPermissions.1.Groups.1.GroupName'
3168 params[param_name] = src_security_group_name
3169 if src_security_group_owner_id:
3170 param_name = 'IpPermissions.1.Groups.1.UserId'
3171 params[param_name] = src_security_group_owner_id
3172 if src_security_group_group_id:
3173 param_name = 'IpPermissions.1.Groups.1.GroupId'
3174 params[param_name] = src_security_group_group_id
3175 if ip_protocol:
3176 params['IpPermissions.1.IpProtocol'] = ip_protocol
3177 if from_port is not None:
3178 params['IpPermissions.1.FromPort'] = from_port
3179 if to_port is not None:
3180 params['IpPermissions.1.ToPort'] = to_port
3181 if cidr_ip:
3182 if not isinstance(cidr_ip, list):
3183 cidr_ip = [cidr_ip]
3184 for i, single_cidr_ip in enumerate(cidr_ip):
3185 params['IpPermissions.1.IpRanges.%d.CidrIp' % (i + 1)] = \
3186 single_cidr_ip
3187 if dry_run:
3188 params['DryRun'] = 'true'
3189
3190 return self.get_status('AuthorizeSecurityGroupIngress',
3191 params, verb='POST')
3192
3193 def authorize_security_group_egress(self,
3194 group_id,
3195 ip_protocol,
3196 from_port=None,
3197 to_port=None,
3198 src_group_id=None,
3199 cidr_ip=None,
3200 dry_run=False):
3201 """
3202 The action adds one or more egress rules to a VPC security
3203 group. Specifically, this action permits instances in a
3204 security group to send traffic to one or more destination
3205 CIDR IP address ranges, or to one or more destination
3206 security groups in the same VPC.
3207
3208 :type dry_run: bool
3209 :param dry_run: Set to True if the operation should not actually run.
3210
3211 """
3212 params = {
3213 'GroupId': group_id,
3214 'IpPermissions.1.IpProtocol': ip_protocol
3215 }
3216
3217 if from_port is not None:
3218 params['IpPermissions.1.FromPort'] = from_port
3219 if to_port is not None:
3220 params['IpPermissions.1.ToPort'] = to_port
3221 if src_group_id is not None:
3222 params['IpPermissions.1.Groups.1.GroupId'] = src_group_id
3223 if cidr_ip is not None:
3224 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip
3225 if dry_run:
3226 params['DryRun'] = 'true'
3227
3228 return self.get_status('AuthorizeSecurityGroupEgress',
3229 params, verb='POST')
3230
3231 def revoke_security_group_deprecated(self, group_name,
3232 src_security_group_name=None,
3233 src_security_group_owner_id=None,
3234 ip_protocol=None,
3235 from_port=None, to_port=None,
3236 cidr_ip=None, dry_run=False):
3237 """
3238 NOTE: This method uses the old-style request parameters
3239 that did not allow a port to be specified when
3240 authorizing a group.
3241
3242 Remove an existing rule from an existing security group.
3243 You need to pass in either src_security_group_name and
3244 src_security_group_owner_id OR ip_protocol, from_port, to_port,
3245 and cidr_ip. In other words, either you are revoking another
3246 group or you are revoking some ip-based rule.
3247
3248 :type group_name: string
3249 :param group_name: The name of the security group you are removing
3250 the rule from.
3251
3252 :type src_security_group_name: string
3253 :param src_security_group_name: The name of the security group you are
3254 revoking access to.
3255
3256 :type src_security_group_owner_id: string
3257 :param src_security_group_owner_id: The ID of the owner of the security
3258 group you are revoking access to.
3259
3260 :type ip_protocol: string
3261 :param ip_protocol: Either tcp | udp | icmp
3262
3263 :type from_port: int
3264 :param from_port: The beginning port number you are disabling
3265
3266 :type to_port: int
3267 :param to_port: The ending port number you are disabling
3268
3269 :type to_port: string
3270 :param to_port: The CIDR block you are revoking access to.
3271 http://goo.gl/Yj5QC
3272
3273 :type dry_run: bool
3274 :param dry_run: Set to True if the operation should not actually run.
3275
3276 :rtype: bool
3277 :return: True if successful.
3278 """
3279 params = {'GroupName': group_name}
3280 if src_security_group_name:
3281 params['SourceSecurityGroupName'] = src_security_group_name
3282 if src_security_group_owner_id:
3283 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id
3284 if ip_protocol:
3285 params['IpProtocol'] = ip_protocol
3286 if from_port:
3287 params['FromPort'] = from_port
3288 if to_port:
3289 params['ToPort'] = to_port
3290 if cidr_ip:
3291 params['CidrIp'] = cidr_ip
3292 if dry_run:
3293 params['DryRun'] = 'true'
3294 return self.get_status('RevokeSecurityGroupIngress', params)
3295
3296 def revoke_security_group(self, group_name=None,
3297 src_security_group_name=None,
3298 src_security_group_owner_id=None,
3299 ip_protocol=None, from_port=None, to_port=None,
3300 cidr_ip=None, group_id=None,
3301 src_security_group_group_id=None, dry_run=False):
3302 """
3303 Remove an existing rule from an existing security group.
3304 You need to pass in either src_security_group_name and
3305 src_security_group_owner_id OR ip_protocol, from_port, to_port,
3306 and cidr_ip. In other words, either you are revoking another
3307 group or you are revoking some ip-based rule.
3308
3309 :type group_name: string
3310 :param group_name: The name of the security group you are removing
3311 the rule from.
3312
3313 :type src_security_group_name: string
3314 :param src_security_group_name: The name of the security group you are
3315 revoking access to.
3316
3317 :type src_security_group_owner_id: string
3318 :param src_security_group_owner_id: The ID of the owner of the security
3319 group you are revoking access to.
3320
3321 :type ip_protocol: string
3322 :param ip_protocol: Either tcp | udp | icmp
3323
3324 :type from_port: int
3325 :param from_port: The beginning port number you are disabling
3326
3327 :type to_port: int
3328 :param to_port: The ending port number you are disabling
3329
3330 :type cidr_ip: string
3331 :param cidr_ip: The CIDR block you are revoking access to.
3332 See http://goo.gl/Yj5QC
3333
3334 :type group_id: string
3335 :param group_id: ID of the EC2 or VPC security group to
3336 modify. This is required for VPC security groups and can
3337 be used instead of group_name for EC2 security groups.
3338
3339 :type src_security_group_group_id: string
3340 :param src_security_group_group_id: The ID of the security group
3341 for which you are revoking access. Can be used instead
3342 of src_security_group_name
3343
3344 :type dry_run: bool
3345 :param dry_run: Set to True if the operation should not actually run.
3346
3347 :rtype: bool
3348 :return: True if successful.
3349 """
3350 if src_security_group_name:
3351 if from_port is None and to_port is None and ip_protocol is None:
3352 return self.revoke_security_group_deprecated(
3353 group_name, src_security_group_name,
3354 src_security_group_owner_id)
3355 params = {}
3356 if group_name is not None:
3357 params['GroupName'] = group_name
3358 if group_id is not None:
3359 params['GroupId'] = group_id
3360 if src_security_group_name:
3361 param_name = 'IpPermissions.1.Groups.1.GroupName'
3362 params[param_name] = src_security_group_name
3363 if src_security_group_group_id:
3364 param_name = 'IpPermissions.1.Groups.1.GroupId'
3365 params[param_name] = src_security_group_group_id
3366 if src_security_group_owner_id:
3367 param_name = 'IpPermissions.1.Groups.1.UserId'
3368 params[param_name] = src_security_group_owner_id
3369 if ip_protocol:
3370 params['IpPermissions.1.IpProtocol'] = ip_protocol
3371 if from_port is not None:
3372 params['IpPermissions.1.FromPort'] = from_port
3373 if to_port is not None:
3374 params['IpPermissions.1.ToPort'] = to_port
3375 if cidr_ip:
3376 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip
3377 if dry_run:
3378 params['DryRun'] = 'true'
3379 return self.get_status('RevokeSecurityGroupIngress',
3380 params, verb='POST')
3381
3382 def revoke_security_group_egress(self,
3383 group_id,
3384 ip_protocol,
3385 from_port=None,
3386 to_port=None,
3387 src_group_id=None,
3388 cidr_ip=None, dry_run=False):
3389 """
3390 Remove an existing egress rule from an existing VPC security
3391 group. You need to pass in an ip_protocol, from_port and
3392 to_port range only if the protocol you are using is
3393 port-based. You also need to pass in either a src_group_id or
3394 cidr_ip.
3395
3396 :type group_name: string
3397 :param group_id: The name of the security group you are removing
3398 the rule from.
3399
3400 :type ip_protocol: string
3401 :param ip_protocol: Either tcp | udp | icmp | -1
3402
3403 :type from_port: int
3404 :param from_port: The beginning port number you are disabling
3405
3406 :type to_port: int
3407 :param to_port: The ending port number you are disabling
3408
3409 :type src_group_id: src_group_id
3410 :param src_group_id: The source security group you are
3411 revoking access to.
3412
3413 :type cidr_ip: string
3414 :param cidr_ip: The CIDR block you are revoking access to.
3415 See http://goo.gl/Yj5QC
3416
3417 :type dry_run: bool
3418 :param dry_run: Set to True if the operation should not actually run.
3419
3420 :rtype: bool
3421 :return: True if successful.
3422 """
3423
3424 params = {}
3425 if group_id:
3426 params['GroupId'] = group_id
3427 if ip_protocol:
3428 params['IpPermissions.1.IpProtocol'] = ip_protocol
3429 if from_port is not None:
3430 params['IpPermissions.1.FromPort'] = from_port
3431 if to_port is not None:
3432 params['IpPermissions.1.ToPort'] = to_port
3433 if src_group_id is not None:
3434 params['IpPermissions.1.Groups.1.GroupId'] = src_group_id
3435 if cidr_ip:
3436 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip
3437 if dry_run:
3438 params['DryRun'] = 'true'
3439 return self.get_status('RevokeSecurityGroupEgress',
3440 params, verb='POST')
3441
3442 #
3443 # Regions
3444 #
3445
3446 def get_all_regions(self, region_names=None, filters=None, dry_run=False):
3447 """
3448 Get all available regions for the EC2 service.
3449
3450 :type region_names: list of str
3451 :param region_names: Names of regions to limit output
3452
3453 :type filters: dict
3454 :param filters: Optional filters that can be used to limit
3455 the results returned. Filters are provided
3456 in the form of a dictionary consisting of
3457 filter names as the key and filter values
3458 as the value. The set of allowable filter
3459 names/values is dependent on the request
3460 being performed. Check the EC2 API guide
3461 for details.
3462
3463 :type dry_run: bool
3464 :param dry_run: Set to True if the operation should not actually run.
3465
3466 :rtype: list
3467 :return: A list of :class:`boto.ec2.regioninfo.RegionInfo`
3468 """
3469 params = {}
3470 if region_names:
3471 self.build_list_params(params, region_names, 'RegionName')
3472 if filters:
3473 self.build_filter_params(params, filters)
3474 if dry_run:
3475 params['DryRun'] = 'true'
3476 regions = self.get_list('DescribeRegions', params,
3477 [('item', RegionInfo)], verb='POST')
3478 for region in regions:
3479 region.connection_cls = EC2Connection
3480 return regions
3481
3482 #
3483 # Reservation methods
3484 #
3485
3486 def get_all_reserved_instances_offerings(self,
3487 reserved_instances_offering_ids=None,
3488 instance_type=None,
3489 availability_zone=None,
3490 product_description=None,
3491 filters=None,
3492 instance_tenancy=None,
3493 offering_type=None,
3494 include_marketplace=None,
3495 min_duration=None,
3496 max_duration=None,
3497 max_instance_count=None,
3498 next_token=None,
3499 max_results=None,
3500 dry_run=False):
3501 """
3502 Describes Reserved Instance offerings that are available for purchase.
3503
3504 :type reserved_instances_offering_ids: list
3505 :param reserved_instances_id: One or more Reserved Instances
3506 offering IDs.
3507
3508 :type instance_type: str
3509 :param instance_type: Displays Reserved Instances of the specified
3510 instance type.
3511
3512 :type availability_zone: str
3513 :param availability_zone: Displays Reserved Instances within the
3514 specified Availability Zone.
3515
3516 :type product_description: str
3517 :param product_description: Displays Reserved Instances with the
3518 specified product description.
3519
3520 :type filters: dict
3521 :param filters: Optional filters that can be used to limit
3522 the results returned. Filters are provided
3523 in the form of a dictionary consisting of
3524 filter names as the key and filter values
3525 as the value. The set of allowable filter
3526 names/values is dependent on the request
3527 being performed. Check the EC2 API guide
3528 for details.
3529
3530 :type instance_tenancy: string
3531 :param instance_tenancy: The tenancy of the Reserved Instance offering.
3532 A Reserved Instance with tenancy of dedicated will run on
3533 single-tenant hardware and can only be launched within a VPC.
3534
3535 :type offering_type: string
3536 :param offering_type: The Reserved Instance offering type. Valid
3537 Values: `"Heavy Utilization" | "Medium Utilization" | "Light
3538 Utilization"`
3539
3540 :type include_marketplace: bool
3541 :param include_marketplace: Include Marketplace offerings in the
3542 response.
3543
3544 :type min_duration: int :param min_duration: Minimum duration (in
3545 seconds) to filter when searching for offerings.
3546
3547 :type max_duration: int
3548 :param max_duration: Maximum duration (in seconds) to filter when
3549 searching for offerings.
3550
3551 :type max_instance_count: int
3552 :param max_instance_count: Maximum number of instances to filter when
3553 searching for offerings.
3554
3555 :type next_token: string
3556 :param next_token: Token to use when requesting the next paginated set
3557 of offerings.
3558
3559 :type max_results: int
3560 :param max_results: Maximum number of offerings to return per call.
3561
3562 :type dry_run: bool
3563 :param dry_run: Set to True if the operation should not actually run.
3564
3565 :rtype: list
3566 :return: A list of
3567 :class:`boto.ec2.reservedinstance.ReservedInstancesOffering`.
3568
3569 """
3570 params = {}
3571 if reserved_instances_offering_ids is not None:
3572 self.build_list_params(params, reserved_instances_offering_ids,
3573 'ReservedInstancesOfferingId')
3574 if instance_type:
3575 params['InstanceType'] = instance_type
3576 if availability_zone:
3577 params['AvailabilityZone'] = availability_zone
3578 if product_description:
3579 params['ProductDescription'] = product_description
3580 if filters:
3581 self.build_filter_params(params, filters)
3582 if instance_tenancy is not None:
3583 params['InstanceTenancy'] = instance_tenancy
3584 if offering_type is not None:
3585 params['OfferingType'] = offering_type
3586 if include_marketplace is not None:
3587 if include_marketplace:
3588 params['IncludeMarketplace'] = 'true'
3589 else:
3590 params['IncludeMarketplace'] = 'false'
3591 if min_duration is not None:
3592 params['MinDuration'] = str(min_duration)
3593 if max_duration is not None:
3594 params['MaxDuration'] = str(max_duration)
3595 if max_instance_count is not None:
3596 params['MaxInstanceCount'] = str(max_instance_count)
3597 if next_token is not None:
3598 params['NextToken'] = next_token
3599 if max_results is not None:
3600 params['MaxResults'] = str(max_results)
3601 if dry_run:
3602 params['DryRun'] = 'true'
3603
3604 return self.get_list('DescribeReservedInstancesOfferings',
3605 params, [('item', ReservedInstancesOffering)],
3606 verb='POST')
3607
3608 def get_all_reserved_instances(self, reserved_instances_id=None,
3609 filters=None, dry_run=False):
3610 """
3611 Describes one or more of the Reserved Instances that you purchased.
3612
3613 :type reserved_instance_ids: list
3614 :param reserved_instance_ids: A list of the reserved instance ids that
3615 will be returned. If not provided, all reserved instances
3616 will be returned.
3617
3618 :type filters: dict
3619 :param filters: Optional filters that can be used to limit the
3620 results returned. Filters are provided in the form of a
3621 dictionary consisting of filter names as the key and
3622 filter values as the value. The set of allowable filter
3623 names/values is dependent on the request being performed.
3624 Check the EC2 API guide for details.
3625
3626 :type dry_run: bool
3627 :param dry_run: Set to True if the operation should not actually run.
3628
3629 :rtype: list
3630 :return: A list of :class:`boto.ec2.reservedinstance.ReservedInstance`
3631 """
3632 params = {}
3633 if reserved_instances_id:
3634 self.build_list_params(params, reserved_instances_id,
3635 'ReservedInstancesId')
3636 if filters:
3637 self.build_filter_params(params, filters)
3638 if dry_run:
3639 params['DryRun'] = 'true'
3640 return self.get_list('DescribeReservedInstances',
3641 params, [('item', ReservedInstance)], verb='POST')
3642
3643 def purchase_reserved_instance_offering(self,
3644 reserved_instances_offering_id,
3645 instance_count=1, limit_price=None,
3646 dry_run=False):
3647 """
3648 Purchase a Reserved Instance for use with your account.
3649 ** CAUTION **
3650 This request can result in large amounts of money being charged to your
3651 AWS account. Use with caution!
3652
3653 :type reserved_instances_offering_id: string
3654 :param reserved_instances_offering_id: The offering ID of the Reserved
3655 Instance to purchase
3656
3657 :type instance_count: int
3658 :param instance_count: The number of Reserved Instances to purchase.
3659 Default value is 1.
3660
3661 :type limit_price: tuple
3662 :param instance_count: Limit the price on the total order.
3663 Must be a tuple of (amount, currency_code), for example:
3664 (100.0, 'USD').
3665
3666 :type dry_run: bool
3667 :param dry_run: Set to True if the operation should not actually run.
3668
3669 :rtype: :class:`boto.ec2.reservedinstance.ReservedInstance`
3670 :return: The newly created Reserved Instance
3671 """
3672 params = {
3673 'ReservedInstancesOfferingId': reserved_instances_offering_id,
3674 'InstanceCount': instance_count}
3675 if limit_price is not None:
3676 params['LimitPrice.Amount'] = str(limit_price[0])
3677 params['LimitPrice.CurrencyCode'] = str(limit_price[1])
3678 if dry_run:
3679 params['DryRun'] = 'true'
3680 return self.get_object('PurchaseReservedInstancesOffering', params,
3681 ReservedInstance, verb='POST')
3682
3683 def create_reserved_instances_listing(self, reserved_instances_id,
3684 instance_count, price_schedules,
3685 client_token, dry_run=False):
3686 """Creates a new listing for Reserved Instances.
3687
3688 Creates a new listing for Amazon EC2 Reserved Instances that will be
3689 sold in the Reserved Instance Marketplace. You can submit one Reserved
3690 Instance listing at a time.
3691
3692 The Reserved Instance Marketplace matches sellers who want to resell
3693 Reserved Instance capacity that they no longer need with buyers who
3694 want to purchase additional capacity. Reserved Instances bought and
3695 sold through the Reserved Instance Marketplace work like any other
3696 Reserved Instances.
3697
3698 If you want to sell your Reserved Instances, you must first register as
3699 a Seller in the Reserved Instance Marketplace. After completing the
3700 registration process, you can create a Reserved Instance Marketplace
3701 listing of some or all of your Reserved Instances, and specify the
3702 upfront price you want to receive for them. Your Reserved Instance
3703 listings then become available for purchase.
3704
3705 :type reserved_instances_id: string
3706 :param reserved_instances_id: The ID of the Reserved Instance that
3707 will be listed.
3708
3709 :type instance_count: int
3710 :param instance_count: The number of instances that are a part of a
3711 Reserved Instance account that will be listed in the Reserved
3712 Instance Marketplace. This number should be less than or equal to
3713 the instance count associated with the Reserved Instance ID
3714 specified in this call.
3715
3716 :type price_schedules: List of tuples
3717 :param price_schedules: A list specifying the price of the Reserved
3718 Instance for each month remaining in the Reserved Instance term.
3719 Each tuple contains two elements, the price and the term. For
3720 example, for an instance that 11 months remaining in its term,
3721 we can have a price schedule with an upfront price of $2.50.
3722 At 8 months remaining we can drop the price down to $2.00.
3723 This would be expressed as::
3724
3725 price_schedules=[('2.50', 11), ('2.00', 8)]
3726
3727 :type client_token: string
3728 :param client_token: Unique, case-sensitive identifier you provide
3729 to ensure idempotency of the request. Maximum 64 ASCII characters.
3730
3731 :type dry_run: bool
3732 :param dry_run: Set to True if the operation should not actually run.
3733
3734 :rtype: list
3735 :return: A list of
3736 :class:`boto.ec2.reservedinstance.ReservedInstanceListing`
3737
3738 """
3739 params = {
3740 'ReservedInstancesId': reserved_instances_id,
3741 'InstanceCount': str(instance_count),
3742 'ClientToken': client_token,
3743 }
3744 for i, schedule in enumerate(price_schedules):
3745 price, term = schedule
3746 params['PriceSchedules.%s.Price' % i] = str(price)
3747 params['PriceSchedules.%s.Term' % i] = str(term)
3748 if dry_run:
3749 params['DryRun'] = 'true'
3750 return self.get_list('CreateReservedInstancesListing',
3751 params, [('item', ReservedInstanceListing)], verb='POST')
3752
3753 def cancel_reserved_instances_listing(self,
3754 reserved_instances_listing_ids=None,
3755 dry_run=False):
3756 """Cancels the specified Reserved Instance listing.
3757
3758 :type reserved_instances_listing_ids: List of strings
3759 :param reserved_instances_listing_ids: The ID of the
3760 Reserved Instance listing to be cancelled.
3761
3762 :type dry_run: bool
3763 :param dry_run: Set to True if the operation should not actually run.
3764
3765 :rtype: list
3766 :return: A list of
3767 :class:`boto.ec2.reservedinstance.ReservedInstanceListing`
3768
3769 """
3770 params = {}
3771 if reserved_instances_listing_ids is not None:
3772 self.build_list_params(params, reserved_instances_listing_ids,
3773 'ReservedInstancesListingId')
3774 if dry_run:
3775 params['DryRun'] = 'true'
3776 return self.get_list('CancelReservedInstancesListing',
3777 params, [('item', ReservedInstanceListing)], verb='POST')
3778
3779 def build_configurations_param_list(self, params, target_configurations):
3780 for offset, tc in enumerate(target_configurations):
3781 prefix = 'ReservedInstancesConfigurationSetItemType.%d.' % offset
3782 if tc.availability_zone is not None:
3783 params[prefix + 'AvailabilityZone'] = tc.availability_zone
3784 if tc.platform is not None:
3785 params[prefix + 'Platform'] = tc.platform
3786 if tc.instance_count is not None:
3787 params[prefix + 'InstanceCount'] = tc.instance_count
3788 if tc.instance_type is not None:
3789 params[prefix + 'InstanceType'] = tc.instance_type
3790
3791 def modify_reserved_instances(self, client_token, reserved_instance_ids,
3792 target_configurations):
3793 """
3794 Modifies the specified Reserved Instances.
3795
3796 :type client_token: string
3797 :param client_token: A unique, case-sensitive, token you provide to
3798 ensure idempotency of your modification request.
3799
3800 :type reserved_instance_ids: List of strings
3801 :param reserved_instance_ids: The IDs of the Reserved Instances to
3802 modify.
3803
3804 :type target_configurations: List of :class:`boto.ec2.reservedinstance.ReservedInstancesConfiguration`
3805 :param target_configurations: The configuration settings for the
3806 modified Reserved Instances.
3807
3808 :rtype: string
3809 :return: The unique ID for the submitted modification request.
3810 """
3811 params = {
3812 'ClientToken': client_token,
3813 }
3814 if reserved_instance_ids is not None:
3815 self.build_list_params(params, reserved_instance_ids,
3816 'ReservedInstancesId')
3817 if target_configurations is not None:
3818 self.build_configurations_param_list(params, target_configurations)
3819 mrir = self.get_object(
3820 'ModifyReservedInstances',
3821 params,
3822 ModifyReservedInstancesResult,
3823 verb='POST'
3824 )
3825 return mrir.modification_id
3826
3827 def describe_reserved_instances_modifications(self,
3828 reserved_instances_modification_ids=None, next_token=None,
3829 filters=None):
3830 """
3831 A request to describe the modifications made to Reserved Instances in
3832 your account.
3833
3834 :type reserved_instances_modification_ids: list
3835 :param reserved_instances_modification_ids: An optional list of
3836 Reserved Instances modification IDs to describe.
3837
3838 :type next_token: str
3839 :param next_token: A string specifying the next paginated set
3840 of results to return.
3841
3842 :type filters: dict
3843 :param filters: Optional filters that can be used to limit the
3844 results returned. Filters are provided in the form of a
3845 dictionary consisting of filter names as the key and
3846 filter values as the value. The set of allowable filter
3847 names/values is dependent on the request being performed.
3848 Check the EC2 API guide for details.
3849
3850 :rtype: list
3851 :return: A list of :class:`boto.ec2.reservedinstance.ReservedInstance`
3852 """
3853 params = {}
3854 if reserved_instances_modification_ids:
3855 self.build_list_params(params, reserved_instances_modification_ids,
3856 'ReservedInstancesModificationId')
3857 if next_token:
3858 params['NextToken'] = next_token
3859 if filters:
3860 self.build_filter_params(params, filters)
3861 return self.get_list('DescribeReservedInstancesModifications',
3862 params, [('item', ReservedInstancesModification)],
3863 verb='POST')
3864
3865 #
3866 # Monitoring
3867 #
3868
3869 def monitor_instances(self, instance_ids, dry_run=False):
3870 """
3871 Enable detailed CloudWatch monitoring for the supplied instances.
3872
3873 :type instance_id: list of strings
3874 :param instance_id: The instance ids
3875
3876 :type dry_run: bool
3877 :param dry_run: Set to True if the operation should not actually run.
3878
3879 :rtype: list
3880 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
3881 """
3882 params = {}
3883 self.build_list_params(params, instance_ids, 'InstanceId')
3884 if dry_run:
3885 params['DryRun'] = 'true'
3886 return self.get_list('MonitorInstances', params,
3887 [('item', InstanceInfo)], verb='POST')
3888
3889 def monitor_instance(self, instance_id, dry_run=False):
3890 """
3891 Deprecated Version, maintained for backward compatibility.
3892 Enable detailed CloudWatch monitoring for the supplied instance.
3893
3894 :type instance_id: string
3895 :param instance_id: The instance id
3896
3897 :type dry_run: bool
3898 :param dry_run: Set to True if the operation should not actually run.
3899
3900 :rtype: list
3901 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
3902 """
3903 return self.monitor_instances([instance_id], dry_run=dry_run)
3904
3905 def unmonitor_instances(self, instance_ids, dry_run=False):
3906 """
3907 Disable CloudWatch monitoring for the supplied instance.
3908
3909 :type instance_id: list of string
3910 :param instance_id: The instance id
3911
3912 :type dry_run: bool
3913 :param dry_run: Set to True if the operation should not actually run.
3914
3915 :rtype: list
3916 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
3917 """
3918 params = {}
3919 self.build_list_params(params, instance_ids, 'InstanceId')
3920 if dry_run:
3921 params['DryRun'] = 'true'
3922 return self.get_list('UnmonitorInstances', params,
3923 [('item', InstanceInfo)], verb='POST')
3924
3925 def unmonitor_instance(self, instance_id, dry_run=False):
3926 """
3927 Deprecated Version, maintained for backward compatibility.
3928 Disable detailed CloudWatch monitoring for the supplied instance.
3929
3930 :type instance_id: string
3931 :param instance_id: The instance id
3932
3933 :type dry_run: bool
3934 :param dry_run: Set to True if the operation should not actually run.
3935
3936 :rtype: list
3937 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
3938 """
3939 return self.unmonitor_instances([instance_id], dry_run=dry_run)
3940
3941 #
3942 # Bundle Windows Instances
3943 #
3944
3945 def bundle_instance(self, instance_id,
3946 s3_bucket,
3947 s3_prefix,
3948 s3_upload_policy, dry_run=False):
3949 """
3950 Bundle Windows instance.
3951
3952 :type instance_id: string
3953 :param instance_id: The instance id
3954
3955 :type s3_bucket: string
3956 :param s3_bucket: The bucket in which the AMI should be stored.
3957
3958 :type s3_prefix: string
3959 :param s3_prefix: The beginning of the file name for the AMI.
3960
3961 :type s3_upload_policy: string
3962 :param s3_upload_policy: Base64 encoded policy that specifies condition
3963 and permissions for Amazon EC2 to upload the
3964 user's image into Amazon S3.
3965
3966 :type dry_run: bool
3967 :param dry_run: Set to True if the operation should not actually run.
3968
3969 """
3970
3971 params = {'InstanceId': instance_id,
3972 'Storage.S3.Bucket': s3_bucket,
3973 'Storage.S3.Prefix': s3_prefix,
3974 'Storage.S3.UploadPolicy': s3_upload_policy}
3975 s3auth = boto.auth.get_auth_handler(None, boto.config,
3976 self.provider, ['s3'])
3977 params['Storage.S3.AWSAccessKeyId'] = self.aws_access_key_id
3978 signature = s3auth.sign_string(s3_upload_policy)
3979 params['Storage.S3.UploadPolicySignature'] = signature
3980 if dry_run:
3981 params['DryRun'] = 'true'
3982 return self.get_object('BundleInstance', params,
3983 BundleInstanceTask, verb='POST')
3984
3985 def get_all_bundle_tasks(self, bundle_ids=None, filters=None,
3986 dry_run=False):
3987 """
3988 Retrieve current bundling tasks. If no bundle id is specified, all
3989 tasks are retrieved.
3990
3991 :type bundle_ids: list
3992 :param bundle_ids: A list of strings containing identifiers for
3993 previously created bundling tasks.
3994
3995 :type filters: dict
3996 :param filters: Optional filters that can be used to limit
3997 the results returned. Filters are provided
3998 in the form of a dictionary consisting of
3999 filter names as the key and filter values
4000 as the value. The set of allowable filter
4001 names/values is dependent on the request
4002 being performed. Check the EC2 API guide
4003 for details.
4004
4005 :type dry_run: bool
4006 :param dry_run: Set to True if the operation should not actually run.
4007
4008 """
4009 params = {}
4010 if bundle_ids:
4011 self.build_list_params(params, bundle_ids, 'BundleId')
4012 if filters:
4013 self.build_filter_params(params, filters)
4014 if dry_run:
4015 params['DryRun'] = 'true'
4016 return self.get_list('DescribeBundleTasks', params,
4017 [('item', BundleInstanceTask)], verb='POST')
4018
4019 def cancel_bundle_task(self, bundle_id, dry_run=False):
4020 """
4021 Cancel a previously submitted bundle task
4022
4023 :type bundle_id: string
4024 :param bundle_id: The identifier of the bundle task to cancel.
4025
4026 :type dry_run: bool
4027 :param dry_run: Set to True if the operation should not actually run.
4028
4029 """
4030 params = {'BundleId': bundle_id}
4031 if dry_run:
4032 params['DryRun'] = 'true'
4033 return self.get_object('CancelBundleTask', params,
4034 BundleInstanceTask, verb='POST')
4035
4036 def get_password_data(self, instance_id, dry_run=False):
4037 """
4038 Get encrypted administrator password for a Windows instance.
4039
4040 :type instance_id: string
4041 :param instance_id: The identifier of the instance to retrieve the
4042 password for.
4043
4044 :type dry_run: bool
4045 :param dry_run: Set to True if the operation should not actually run.
4046
4047 """
4048 params = {'InstanceId': instance_id}
4049 if dry_run:
4050 params['DryRun'] = 'true'
4051 rs = self.get_object('GetPasswordData', params, ResultSet, verb='POST')
4052 return rs.passwordData
4053
4054 #
4055 # Cluster Placement Groups
4056 #
4057
4058 def get_all_placement_groups(self, groupnames=None, filters=None,
4059 dry_run=False):
4060 """
4061 Get all placement groups associated with your account in a region.
4062
4063 :type groupnames: list
4064 :param groupnames: A list of the names of placement groups to retrieve.
4065 If not provided, all placement groups will be
4066 returned.
4067
4068 :type filters: dict
4069 :param filters: Optional filters that can be used to limit
4070 the results returned. Filters are provided
4071 in the form of a dictionary consisting of
4072 filter names as the key and filter values
4073 as the value. The set of allowable filter
4074 names/values is dependent on the request
4075 being performed. Check the EC2 API guide
4076 for details.
4077
4078 :type dry_run: bool
4079 :param dry_run: Set to True if the operation should not actually run.
4080
4081 :rtype: list
4082 :return: A list of :class:`boto.ec2.placementgroup.PlacementGroup`
4083 """
4084 params = {}
4085 if groupnames:
4086 self.build_list_params(params, groupnames, 'GroupName')
4087 if filters:
4088 self.build_filter_params(params, filters)
4089 if dry_run:
4090 params['DryRun'] = 'true'
4091 return self.get_list('DescribePlacementGroups', params,
4092 [('item', PlacementGroup)], verb='POST')
4093
4094 def create_placement_group(self, name, strategy='cluster', dry_run=False):
4095 """
4096 Create a new placement group for your account.
4097 This will create the placement group within the region you
4098 are currently connected to.
4099
4100 :type name: string
4101 :param name: The name of the new placement group
4102
4103 :type strategy: string
4104 :param strategy: The placement strategy of the new placement group.
4105 Currently, the only acceptable value is "cluster".
4106
4107 :type dry_run: bool
4108 :param dry_run: Set to True if the operation should not actually run.
4109
4110 :rtype: bool
4111 :return: True if successful
4112 """
4113 params = {'GroupName': name, 'Strategy': strategy}
4114 if dry_run:
4115 params['DryRun'] = 'true'
4116 group = self.get_status('CreatePlacementGroup', params, verb='POST')
4117 return group
4118
4119 def delete_placement_group(self, name, dry_run=False):
4120 """
4121 Delete a placement group from your account.
4122
4123 :type key_name: string
4124 :param key_name: The name of the keypair to delete
4125
4126 :type dry_run: bool
4127 :param dry_run: Set to True if the operation should not actually run.
4128
4129 """
4130 params = {'GroupName': name}
4131 if dry_run:
4132 params['DryRun'] = 'true'
4133 return self.get_status('DeletePlacementGroup', params, verb='POST')
4134
4135 # Tag methods
4136
4137 def build_tag_param_list(self, params, tags):
4138 keys = sorted(tags.keys())
4139 i = 1
4140 for key in keys:
4141 value = tags[key]
4142 params['Tag.%d.Key' % i] = key
4143 if value is not None:
4144 params['Tag.%d.Value' % i] = value
4145 i += 1
4146
4147 def get_all_tags(self, filters=None, dry_run=False, max_results=None):
4148 """
4149 Retrieve all the metadata tags associated with your account.
4150
4151 :type filters: dict
4152 :param filters: Optional filters that can be used to limit
4153 the results returned. Filters are provided
4154 in the form of a dictionary consisting of
4155 filter names as the key and filter values
4156 as the value. The set of allowable filter
4157 names/values is dependent on the request
4158 being performed. Check the EC2 API guide
4159 for details.
4160
4161 :type dry_run: bool
4162 :param dry_run: Set to True if the operation should not actually run.
4163
4164 :type max_results: int
4165 :param max_results: The maximum number of paginated instance
4166 items per response.
4167
4168 :rtype: list
4169 :return: A list of :class:`boto.ec2.tag.Tag` objects
4170 """
4171 params = {}
4172 if filters:
4173 self.build_filter_params(params, filters)
4174 if dry_run:
4175 params['DryRun'] = 'true'
4176 if max_results is not None:
4177 params['MaxResults'] = max_results
4178 return self.get_list('DescribeTags', params,
4179 [('item', Tag)], verb='POST')
4180
4181 def create_tags(self, resource_ids, tags, dry_run=False):
4182 """
4183 Create new metadata tags for the specified resource ids.
4184
4185 :type resource_ids: list
4186 :param resource_ids: List of strings
4187
4188 :type tags: dict
4189 :param tags: A dictionary containing the name/value pairs.
4190 If you want to create only a tag name, the
4191 value for that tag should be the empty string
4192 (e.g. '').
4193
4194 :type dry_run: bool
4195 :param dry_run: Set to True if the operation should not actually run.
4196
4197 """
4198 params = {}
4199 self.build_list_params(params, resource_ids, 'ResourceId')
4200 self.build_tag_param_list(params, tags)
4201 if dry_run:
4202 params['DryRun'] = 'true'
4203 return self.get_status('CreateTags', params, verb='POST')
4204
4205 def delete_tags(self, resource_ids, tags, dry_run=False):
4206 """
4207 Delete metadata tags for the specified resource ids.
4208
4209 :type resource_ids: list
4210 :param resource_ids: List of strings
4211
4212 :type tags: dict or list
4213 :param tags: Either a dictionary containing name/value pairs
4214 or a list containing just tag names.
4215 If you pass in a dictionary, the values must
4216 match the actual tag values or the tag will
4217 not be deleted. If you pass in a value of None
4218 for the tag value, all tags with that name will
4219 be deleted.
4220
4221 :type dry_run: bool
4222 :param dry_run: Set to True if the operation should not actually run.
4223
4224 """
4225 if isinstance(tags, list):
4226 tags = {}.fromkeys(tags, None)
4227 params = {}
4228 self.build_list_params(params, resource_ids, 'ResourceId')
4229 self.build_tag_param_list(params, tags)
4230 if dry_run:
4231 params['DryRun'] = 'true'
4232 return self.get_status('DeleteTags', params, verb='POST')
4233
4234 # Network Interface methods
4235
4236 def get_all_network_interfaces(self, network_interface_ids=None, filters=None, dry_run=False):
4237 """
4238 Retrieve all of the Elastic Network Interfaces (ENI's)
4239 associated with your account.
4240
4241 :type network_interface_ids: list
4242 :param network_interface_ids: a list of strings representing ENI IDs
4243
4244 :type filters: dict
4245 :param filters: Optional filters that can be used to limit
4246 the results returned. Filters are provided
4247 in the form of a dictionary consisting of
4248 filter names as the key and filter values
4249 as the value. The set of allowable filter
4250 names/values is dependent on the request
4251 being performed. Check the EC2 API guide
4252 for details.
4253
4254 :type dry_run: bool
4255 :param dry_run: Set to True if the operation should not actually run.
4256
4257 :rtype: list
4258 :return: A list of :class:`boto.ec2.networkinterface.NetworkInterface`
4259 """
4260 params = {}
4261 if network_interface_ids:
4262 self.build_list_params(params, network_interface_ids, 'NetworkInterfaceId')
4263 if filters:
4264 self.build_filter_params(params, filters)
4265 if dry_run:
4266 params['DryRun'] = 'true'
4267 return self.get_list('DescribeNetworkInterfaces', params,
4268 [('item', NetworkInterface)], verb='POST')
4269
4270 def create_network_interface(self, subnet_id, private_ip_address=None,
4271 description=None, groups=None, dry_run=False):
4272 """
4273 Creates a network interface in the specified subnet.
4274
4275 :type subnet_id: str
4276 :param subnet_id: The ID of the subnet to associate with the
4277 network interface.
4278
4279 :type private_ip_address: str
4280 :param private_ip_address: The private IP address of the
4281 network interface. If not supplied, one will be chosen
4282 for you.
4283
4284 :type description: str
4285 :param description: The description of the network interface.
4286
4287 :type groups: list
4288 :param groups: Lists the groups for use by the network interface.
4289 This can be either a list of group ID's or a list of
4290 :class:`boto.ec2.securitygroup.SecurityGroup` objects.
4291
4292 :type dry_run: bool
4293 :param dry_run: Set to True if the operation should not actually run.
4294
4295 :rtype: :class:`boto.ec2.networkinterface.NetworkInterface`
4296 :return: The newly created network interface.
4297 """
4298 params = {'SubnetId': subnet_id}
4299 if private_ip_address:
4300 params['PrivateIpAddress'] = private_ip_address
4301 if description:
4302 params['Description'] = description
4303 if groups:
4304 ids = []
4305 for group in groups:
4306 if isinstance(group, SecurityGroup):
4307 ids.append(group.id)
4308 else:
4309 ids.append(group)
4310 self.build_list_params(params, ids, 'SecurityGroupId')
4311 if dry_run:
4312 params['DryRun'] = 'true'
4313 return self.get_object('CreateNetworkInterface', params,
4314 NetworkInterface, verb='POST')
4315
4316 def attach_network_interface(self, network_interface_id,
4317 instance_id, device_index, dry_run=False):
4318 """
4319 Attaches a network interface to an instance.
4320
4321 :type network_interface_id: str
4322 :param network_interface_id: The ID of the network interface to attach.
4323
4324 :type instance_id: str
4325 :param instance_id: The ID of the instance that will be attached
4326 to the network interface.
4327
4328 :type device_index: int
4329 :param device_index: The index of the device for the network
4330 interface attachment on the instance.
4331
4332 :type dry_run: bool
4333 :param dry_run: Set to True if the operation should not actually run.
4334
4335 """
4336 params = {'NetworkInterfaceId': network_interface_id,
4337 'InstanceId': instance_id,
4338 'DeviceIndex': device_index}
4339 if dry_run:
4340 params['DryRun'] = 'true'
4341 return self.get_status('AttachNetworkInterface', params, verb='POST')
4342
4343 def detach_network_interface(self, attachment_id, force=False,
4344 dry_run=False):
4345 """
4346 Detaches a network interface from an instance.
4347
4348 :type attachment_id: str
4349 :param attachment_id: The ID of the attachment.
4350
4351 :type force: bool
4352 :param force: Set to true to force a detachment.
4353
4354 :type dry_run: bool
4355 :param dry_run: Set to True if the operation should not actually run.
4356
4357 """
4358 params = {'AttachmentId': attachment_id}
4359 if force:
4360 params['Force'] = 'true'
4361 if dry_run:
4362 params['DryRun'] = 'true'
4363 return self.get_status('DetachNetworkInterface', params, verb='POST')
4364
4365 def delete_network_interface(self, network_interface_id, dry_run=False):
4366 """
4367 Delete the specified network interface.
4368
4369 :type network_interface_id: str
4370 :param network_interface_id: The ID of the network interface to delete.
4371
4372 :type dry_run: bool
4373 :param dry_run: Set to True if the operation should not actually run.
4374
4375 """
4376 params = {'NetworkInterfaceId': network_interface_id}
4377 if dry_run:
4378 params['DryRun'] = 'true'
4379 return self.get_status('DeleteNetworkInterface', params, verb='POST')
4380
4381 def get_all_instance_types(self):
4382 """
4383 Get all instance_types available on this cloud (eucalyptus specific)
4384
4385 :rtype: list of :class:`boto.ec2.instancetype.InstanceType`
4386 :return: The requested InstanceType objects
4387 """
4388 params = {}
4389 return self.get_list('DescribeInstanceTypes', params, [('item', InstanceType)], verb='POST')
4390
4391 def copy_image(self, source_region, source_image_id, name=None,
4392 description=None, client_token=None, dry_run=False):
4393 """
4394 :type dry_run: bool
4395 :param dry_run: Set to True if the operation should not actually run.
4396 :rtype: :class:`boto.ec2.image.CopyImage`
4397 :return: Object containing the image_id of the copied image.
4398 """
4399 params = {
4400 'SourceRegion': source_region,
4401 'SourceImageId': source_image_id,
4402 }
4403 if name is not None:
4404 params['Name'] = name
4405 if description is not None:
4406 params['Description'] = description
4407 if client_token is not None:
4408 params['ClientToken'] = client_token
4409 if dry_run:
4410 params['DryRun'] = 'true'
4411 return self.get_object('CopyImage', params, CopyImage,
4412 verb='POST')
4413
4414 def describe_account_attributes(self, attribute_names=None, dry_run=False):
4415 """
4416 :type dry_run: bool
4417 :param dry_run: Set to True if the operation should not actually run.
4418
4419 """
4420 params = {}
4421 if attribute_names is not None:
4422 self.build_list_params(params, attribute_names, 'AttributeName')
4423 if dry_run:
4424 params['DryRun'] = 'true'
4425 return self.get_list('DescribeAccountAttributes', params,
4426 [('item', AccountAttribute)], verb='POST')
4427
4428 def describe_vpc_attribute(self, vpc_id, attribute=None, dry_run=False):
4429 """
4430 :type dry_run: bool
4431 :param dry_run: Set to True if the operation should not actually run.
4432
4433 """
4434 params = {
4435 'VpcId': vpc_id
4436 }
4437 if attribute is not None:
4438 params['Attribute'] = attribute
4439 if dry_run:
4440 params['DryRun'] = 'true'
4441 return self.get_object('DescribeVpcAttribute', params,
4442 VPCAttribute, verb='POST')
4443
4444 def modify_vpc_attribute(self, vpc_id, enable_dns_support=None,
4445 enable_dns_hostnames=None, dry_run=False):
4446 """
4447 :type dry_run: bool
4448 :param dry_run: Set to True if the operation should not actually run.
4449
4450 """
4451 params = {
4452 'VpcId': vpc_id
4453 }
4454 if enable_dns_support is not None:
4455 params['EnableDnsSupport.Value'] = (
4456 'true' if enable_dns_support else 'false')
4457 if enable_dns_hostnames is not None:
4458 params['EnableDnsHostnames.Value'] = (
4459 'true' if enable_dns_hostnames else 'false')
4460 if dry_run:
4461 params['DryRun'] = 'true'
4462 return self.get_status('ModifyVpcAttribute', params, verb='POST')
4463
4464 def get_all_classic_link_instances(self, instance_ids=None, filters=None,
4465 dry_run=False, max_results=None,
4466 next_token=None):
4467 """
4468 Get all of your linked EC2-Classic instances. This request only
4469 returns information about EC2-Classic instances linked to
4470 a VPC through ClassicLink
4471
4472 :type instance_ids: list
4473 :param instance_ids: A list of strings of instance IDs. Must be
4474 instances linked to a VPC through ClassicLink.
4475
4476 :type filters: dict
4477 :param filters: Optional filters that can be used to limit the
4478 results returned. Filters are provided in the form of a
4479 dictionary consisting of filter names as the key and
4480 filter values as the value. The set of allowable filter
4481 names/values is dependent on the request being performed.
4482 Check the EC2 API guide for details.
4483
4484 :type dry_run: bool
4485 :param dry_run: Set to True if the operation should not actually run.
4486
4487 :type max_results: int
4488 :param max_results: The maximum number of paginated instance
4489 items per response.
4490
4491 :rtype: list
4492 :return: A list of :class:`boto.ec2.instance.Instance`
4493 """
4494 params = {}
4495 if instance_ids:
4496 self.build_list_params(params, instance_ids, 'InstanceId')
4497 if filters:
4498 self.build_filter_params(params, filters)
4499 if dry_run:
4500 params['DryRun'] = 'true'
4501 if max_results is not None:
4502 params['MaxResults'] = max_results
4503 if next_token:
4504 params['NextToken'] = next_token
4505 return self.get_list('DescribeClassicLinkInstances', params,
4506 [('item', Instance)], verb='POST')