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